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 <[email protected]> --- 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

