Move to the common streaming DMA ops in order to get rid of the direct usage of the ARM MMU functions for the cache maintenance. Signed-off-by: Lucas Stach <dev@xxxxxxxxxx> --- drivers/net/Kconfig | 1 + drivers/net/rtl8169.c | 30 +++++++++++++----------------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index adb7008..42ffa65 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig @@ -167,6 +167,7 @@ config DRIVER_NET_RTL8139 config DRIVER_NET_RTL8169 bool "RealTek RTL-8169 PCI Ethernet driver" depends on PCI + depends on HAS_DMA select PHYLIB help This is a driver for the Fast Ethernet PCI network cards based on diff --git a/drivers/net/rtl8169.c b/drivers/net/rtl8169.c index 638e049..f44dc5a 100644 --- a/drivers/net/rtl8169.c +++ b/drivers/net/rtl8169.c @@ -14,7 +14,6 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include <asm/mmu.h> #include <common.h> #include <dma.h> #include <init.h> @@ -234,8 +233,8 @@ static void rtl8169_init_ring(struct rtl8169_priv *priv) priv->rx_desc = dma_alloc_coherent(NUM_RX_DESC * sizeof(struct bufdesc)); priv->rx_buf = malloc(NUM_RX_DESC * PKT_BUF_SIZE); - dma_clean_range((unsigned long)priv->rx_buf, - (unsigned long)priv->rx_buf + NUM_RX_DESC * PKT_BUF_SIZE); + dma_sync_single_for_device((unsigned long)priv->rx_buf, + NUM_RX_DESC * PKT_BUF_SIZE, DMA_FROM_DEVICE); memset((void *)priv->tx_desc, 0, NUM_TX_DESC * sizeof(struct bufdesc)); memset((void *)priv->rx_desc, 0, NUM_RX_DESC * sizeof(struct bufdesc)); @@ -366,8 +365,8 @@ static int rtl8169_eth_send(struct eth_device *edev, void *packet, if (packet_length < ETH_ZLEN) memset(priv->tx_buf + entry * PKT_BUF_SIZE, 0, ETH_ZLEN); memcpy(priv->tx_buf + entry * PKT_BUF_SIZE, packet, packet_length); - dma_flush_range((unsigned long)priv->tx_buf + entry * PKT_BUF_SIZE, - (unsigned long)priv->tx_buf + (entry + 1) * PKT_BUF_SIZE); + dma_sync_single_for_device((unsigned long)priv->tx_buf + entry * + PKT_BUF_SIZE, PKT_BUF_SIZE, DMA_TO_DEVICE); priv->tx_desc[entry].buf_Haddr = 0; priv->tx_desc[entry].buf_addr = @@ -388,6 +387,9 @@ static int rtl8169_eth_send(struct eth_device *edev, void *packet, while (priv->tx_desc[entry].status & BD_STAT_OWN) ; + dma_sync_single_for_cpu((unsigned long)priv->tx_buf + entry * + PKT_BUF_SIZE, PKT_BUF_SIZE, DMA_TO_DEVICE); + priv->cur_tx++; return 0; @@ -405,22 +407,16 @@ static int rtl8169_eth_rx(struct eth_device *edev) if (!(priv->rx_desc[entry].status & BD_STAT_RX_RES)) { pkt_size = (priv->rx_desc[entry].status & 0x1fff) - 4; - dma_inv_range((unsigned long)priv->rx_buf - + entry * PKT_BUF_SIZE, - (unsigned long)priv->rx_buf - + entry * PKT_BUF_SIZE + pkt_size); + dma_sync_single_for_cpu((unsigned long)priv->rx_buf + + entry * PKT_BUF_SIZE, + pkt_size, DMA_FROM_DEVICE); net_receive(edev, priv->rx_buf + entry * PKT_BUF_SIZE, pkt_size); - /* - * the buffer is going to be reused by HW, make sure to - * clean out any potentially modified data - */ - dma_clean_range((unsigned long)priv->rx_buf - + entry * PKT_BUF_SIZE, - (unsigned long)priv->rx_buf - + entry * PKT_BUF_SIZE + pkt_size); + dma_sync_single_for_device((unsigned long)priv->rx_buf + + entry * PKT_BUF_SIZE, + pkt_size, DMA_FROM_DEVICE); if (entry == NUM_RX_DESC - 1) priv->rx_desc[entry].status = BD_STAT_OWN | -- 2.1.0 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox