summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Liu <jim.t90615@gmail.com>2024-04-08 16:49:02 +0800
committerTom Rini <trini@konsulko.com>2024-04-12 13:59:12 -0600
commit3d98b8c504e158d708ca806b4aac9d40757e8c01 (patch)
treeb8722c61ad9a4ab7feec11320350a9b922b31b1c
parentb4e9b524f785e21b6db45bd86eb580aebd02e1c2 (diff)
net: designware: Invalidate RX buffer cache before freeing the DMA descriptor
In IPv6 context, the ICMP and UDP checksum byte in the RX packet is initially set to 0, recaclculated, and then re-inserted. This process can result in a dirty cache line. To prevent issues, it is essential to invalidate cache for the RX buffer before freeing the descriptor for next DMA transfer. This ensure that the dirty cache line doesn't inadvertently written back due to cache eviction, there by corrupting the RX buffer Signed-off-by: Parvathi Bhogaraju <pbhogaraju@microsoft.com> Signed-off-by: Jim Liu <JJLIU0@nuvoton.com>
-rw-r--r--drivers/net/designware.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/net/designware.c b/drivers/net/designware.c
index c222197b114..03b531c6672 100644
--- a/drivers/net/designware.c
+++ b/drivers/net/designware.c
@@ -554,6 +554,11 @@ static int _dw_free_pkt(struct dw_eth_dev *priv)
ulong desc_start = (ulong)desc_p;
ulong desc_end = desc_start +
roundup(sizeof(*desc_p), ARCH_DMA_MINALIGN);
+ ulong data_start = desc_p->dmamac_addr;
+ ulong data_end = data_start + roundup(CFG_ETH_BUFSIZE, ARCH_DMA_MINALIGN);
+
+ /* Invalidate the descriptor buffer data */
+ invalidate_dcache_range(data_start, data_end);
/*
* Make the current descriptor valid again and go to