[PATCH 09/11] net/enetfec: handle cache for forwarded packets

Hemant Agrawal hemant.agrawal at nxp.com
Mon Oct 6 10:04:08 CEST 2025


Previously, only cache flush (`dc cvac`) was used for packet buffers,
which could result in stale data being read when buffers were reused.
This patch replaces it with flush and invalidate (`dc civac`) to ensure
data consistency for forwarded packets.

Termination packets are excluded from this change as they are not freed
by the driver and do not require cache invalidation.

Signed-off-by: Hemant Agrawal <hemant.agrawal at nxp.com>
---
 drivers/net/enetfec/enet_ethdev.h | 29 ++++++++++++++++++++++-------
 drivers/net/enetfec/enet_rxtx.c   |  4 ++--
 2 files changed, 24 insertions(+), 9 deletions(-)

diff --git a/drivers/net/enetfec/enet_ethdev.h b/drivers/net/enetfec/enet_ethdev.h
index 4e196b8552..ee5c244c91 100644
--- a/drivers/net/enetfec/enet_ethdev.h
+++ b/drivers/net/enetfec/enet_ethdev.h
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2020-2021 NXP
+ * Copyright 2020-2024 NXP
  */
 
 #ifndef __ENETFEC_ETHDEV_H__
@@ -23,17 +23,32 @@
 #define __iomem
 #if defined(RTE_ARCH_ARM)
 #if defined(RTE_ARCH_64)
-#define dcbf(p) { asm volatile("dc cvac, %0" : : "r"(p) : "memory"); }
-#define dcbf_64(p) dcbf(p)
+/* Flush */
+#define dccvac(p) { asm volatile("dc cvac, %0" : : "r"(p) : "memory"); }
+#define dccvac_64(p) dccvac(p)
+/* Invalidate(Not working on A35 core) */
+#define dcivac(p) { asm volatile("dc ivac, %0" : : "r"(p) : "memory"); }
+#define dcivac_64(p) dcivac(p)
+/* Flush and Invalidate */
+#define dccivac(p) { asm volatile("dc civac, %0" : : "r"(p) : "memory"); }
+#define dccivac_64(p) dccivac(p)
 
 #else /* RTE_ARCH_32 */
-#define dcbf(p) RTE_SET_USED(p)
-#define dcbf_64(p) dcbf(p)
+#define dccvac(p) RTE_SET_USED(p)
+#define dccvac_64(p) dccvac(p)
+#define dcivac(p) RTE_SET_USED(p)
+#define dcivac_64(p) dcivac(p)
+#define dccivac(p) RTE_SET_USED(p)
+#define dccivac_64(p) dccivac(p)
 #endif
 
 #else
-#define dcbf(p) RTE_SET_USED(p)
-#define dcbf_64(p) dcbf(p)
+#define dccvac(p) RTE_SET_USED(p)
+#define dccvac_64(p) dccvac(p)
+#define dcivac(p) RTE_SET_USED(p)
+#define dcivac_64(p) dcivac(p)
+#define dccivac(p) RTE_SET_USED(p)
+#define dccivac_64(p) dccivac(p)
 #endif
 
 /*
diff --git a/drivers/net/enetfec/enet_rxtx.c b/drivers/net/enetfec/enet_rxtx.c
index ea2c28a26b..95767b561e 100644
--- a/drivers/net/enetfec/enet_rxtx.c
+++ b/drivers/net/enetfec/enet_rxtx.c
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2021 NXP
+ * Copyright 2021-2024 NXP
  */
 
 #include <rte_mbuf.h>
@@ -230,7 +230,7 @@ enetfec_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 		status |= (TX_BD_LAST);
 		data = rte_pktmbuf_mtod(mbuf, void *);
 		for (i = 0; i <= buflen; i += RTE_CACHE_LINE_SIZE)
-			dcbf(data + i);
+			dccivac(data + i);
 
 		rte_write32(rte_cpu_to_le_32(rte_pktmbuf_iova(mbuf)),
 			    &bdp->bd_bufaddr);
-- 
2.25.1



More information about the dev mailing list