diff options
author | Lucas Stach <dev@lynxeye.de> | 2015-03-05 22:50:07 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2015-03-06 07:52:02 +0100 |
commit | 2addec7bc328937cf64ef9fa33401eaebbbf6a62 (patch) | |
tree | 0a0c70324cadb4583d0fb14c401899ddb2f55321 | |
parent | f777398dc5a3152a4402e29cc504a8372986f5a3 (diff) | |
download | barebox-2addec7bc328937cf64ef9fa33401eaebbbf6a62.tar.gz barebox-2addec7bc328937cf64ef9fa33401eaebbbf6a62.tar.xz |
net: arc-emac: 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>
-rw-r--r-- | drivers/net/arc_emac.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/drivers/net/arc_emac.c b/drivers/net/arc_emac.c index 40516a593f..2d6215e46f 100644 --- a/drivers/net/arc_emac.c +++ b/drivers/net/arc_emac.c @@ -16,7 +16,6 @@ * GNU General Public License for more details. */ -#include <asm/mmu.h> #include <clock.h> #include <common.h> #include <dma.h> @@ -195,6 +194,8 @@ static int arc_emac_open(struct eth_device *edev) rxbd->data = cpu_to_le32(rxbuf); /* Return ownership to EMAC */ + dma_sync_single_for_device((unsigned long)rxbuf, PKTSIZE, + DMA_FROM_DEVICE); rxbd->info = cpu_to_le32(FOR_EMAC | PKTSIZE); *last_rx_bd = (*last_rx_bd + 1) % RX_BD_NUM; @@ -244,7 +245,7 @@ static int arc_emac_send(struct eth_device *edev, void *data, int length) length = EMAC_ZLEN; } - dma_flush_range((unsigned long)data, (unsigned long)data + length); + dma_sync_single_for_device((unsigned long)data, length, DMA_TO_DEVICE); bd->data = cpu_to_le32(data); bd->info = cpu_to_le32(FOR_EMAC | FIRST_OR_LAST_MASK | length); @@ -253,6 +254,8 @@ static int arc_emac_send(struct eth_device *edev, void *data, int length) ret = wait_on_timeout(20 * MSECOND, (arc_reg_get(priv, R_STATUS) & TXINT_MASK) != 0); + dma_sync_single_for_cpu((unsigned long)data, length, DMA_TO_DEVICE); + if (ret) { dev_err(&edev->dev, "transmit timeout\n"); return ret; @@ -294,18 +297,19 @@ static int arc_emac_recv(struct eth_device *edev) printk(KERN_DEBUG "incomplete packet received\n"); /* Return ownership to EMAC */ - rxbd->info = cpu_to_le32(FOR_EMAC | PKTSIZE); continue; } pktlen = info & LEN_MASK; - /* invalidate current receive buffer */ - dma_inv_range((unsigned long)rxbd->data, - (unsigned long)rxbd->data + pktlen); + dma_sync_single_for_cpu((unsigned long)rxbd->data, pktlen, + DMA_FROM_DEVICE); net_receive(edev, (unsigned char *)rxbd->data, pktlen); + dma_sync_single_for_device((unsigned long)rxbd->data, pktlen, + DMA_FROM_DEVICE); + rxbd->info = cpu_to_le32(FOR_EMAC | PKTSIZE); } |