summaryrefslogtreecommitdiffstats
path: root/drivers/net/rtl8169.c
diff options
context:
space:
mode:
authorLucas Stach <dev@lynxeye.de>2014-11-02 21:13:44 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2014-11-03 09:36:30 +0100
commit7d60a02034bb8816c74d2bbddc0d0981024bed66 (patch)
tree618e9868164a0a6c654f5fc5b19a6d8646d0e008 /drivers/net/rtl8169.c
parentfd378e779b790c739675ffad8a43da54081c6956 (diff)
downloadbarebox-7d60a02034bb8816c74d2bbddc0d0981024bed66.tar.gz
barebox-7d60a02034bb8816c74d2bbddc0d0981024bed66.tar.xz
net: rtl8169: clean receive buffer after net handler
The processing of the buffer might change some data, which will eventually trigger a cache writeback later on, corrupting data written by the network chip. Clean the cache range to make sure there is no writeback pending. 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.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/net/rtl8169.c b/drivers/net/rtl8169.c
index 0cd576315b..5702900e49 100644
--- a/drivers/net/rtl8169.c
+++ b/drivers/net/rtl8169.c
@@ -233,6 +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);
memset(priv->tx_desc, 0, NUM_TX_DESC * sizeof(struct bufdesc));
memset(priv->rx_desc, 0, NUM_RX_DESC * sizeof(struct bufdesc));
@@ -421,6 +423,15 @@ static int rtl8169_eth_rx(struct eth_device *edev)
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);
+
if (entry == NUM_RX_DESC - 1)
priv->rx_desc[entry].status = BD_STAT_OWN |
BD_STAT_EOR | PKT_BUF_SIZE;