diff options
author | Lucas Stach <dev@lynxeye.de> | 2015-03-05 22:50:15 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2015-03-06 07:53:48 +0100 |
commit | ece91a7d1db34b3e0804ad49b48849f438f8e437 (patch) | |
tree | 63da0c6045c30d3da55a6ebc03d73ca07ba410ff /drivers/net/rtl8169.c | |
parent | e82daca1348198e57517a021843d6d1b43de4c50 (diff) | |
download | barebox-ece91a7d1db34b3e0804ad49b48849f438f8e437.tar.gz barebox-ece91a7d1db34b3e0804ad49b48849f438f8e437.tar.xz |
net: rtl8169: convert to streaming DMA ops
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@lynxeye.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/net/rtl8169.c')
-rw-r--r-- | drivers/net/rtl8169.c | 30 |
1 files changed, 13 insertions, 17 deletions
diff --git a/drivers/net/rtl8169.c b/drivers/net/rtl8169.c index e465e23352..d6a761087c 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), DMA_ADDRESS_BROKEN); 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 | |