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 <[email protected]>
---
 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
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to