[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