]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
net: designware: Invalidate RX buffer cache before freeing the DMA descriptor
authorJim Liu <jim.t90615@gmail.com>
Mon, 8 Apr 2024 08:49:02 +0000 (16:49 +0800)
committerTom Rini <trini@konsulko.com>
Fri, 12 Apr 2024 19:59:12 +0000 (13:59 -0600)
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>
drivers/net/designware.c

index c222197b114ba377d3b2aec0f8068d1827f53643..03b531c6672c011b4e01e3a2a7b18f0c1de081da 100644 (file)
@@ -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