summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLucas Stach <dev@lynxeye.de>2015-03-05 22:50:15 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2015-03-06 07:53:48 +0100
commitece91a7d1db34b3e0804ad49b48849f438f8e437 (patch)
tree63da0c6045c30d3da55a6ebc03d73ca07ba410ff
parente82daca1348198e57517a021843d6d1b43de4c50 (diff)
downloadbarebox-ece91a7d1db34b3e0804ad49b48849f438f8e437.tar.gz
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>
-rw-r--r--drivers/net/Kconfig1
-rw-r--r--drivers/net/rtl8169.c30
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 e465e23..d6a7610 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 |