* [PATCH 01/11] net/enetfec: fix file descriptor leak on read error
2025-10-06 8:03 [PATCH 00/11] net/enetc: various fixes and enhancements Hemant Agrawal
@ 2025-10-06 8:04 ` Hemant Agrawal
2025-10-06 8:04 ` [PATCH 02/11] net/enetfec: fix out-of-bounds access in UIO mapping Hemant Agrawal
` (9 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Hemant Agrawal @ 2025-10-06 8:04 UTC (permalink / raw)
To: dev, stephen, david.marchand; +Cc: stable
The file descriptor was not closed when a read error occurred while
reading the first line from a UIO device file. This could lead to
resource leakage. The patch ensures the descriptor is closed in
case of read failure.
Fixes: b84fdd39638b ("net/enetfec: support UIO")
Cc: stable@dpdk.org
Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
drivers/net/enetfec/enet_uio.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/net/enetfec/enet_uio.c b/drivers/net/enetfec/enet_uio.c
index 9f4e896985..23cb4e7e93 100644
--- a/drivers/net/enetfec/enet_uio.c
+++ b/drivers/net/enetfec/enet_uio.c
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2021 NXP
+ * Copyright 2021,2024 NXP
*/
#include <stdbool.h>
@@ -66,13 +66,16 @@ file_read_first_line(const char root[], const char subdir[],
"%s/%s/%s", root, subdir, filename);
fd = open(absolute_file_name, O_RDONLY);
- if (fd <= 0)
+ if (fd < 0) {
ENETFEC_PMD_ERR("Error opening file %s", absolute_file_name);
+ return fd;
+ }
/* read UIO device name from first line in file */
ret = read(fd, line, FEC_UIO_MAX_DEVICE_FILE_NAME_LENGTH);
if (ret <= 0) {
ENETFEC_PMD_ERR("Error reading file %s", absolute_file_name);
+ close(fd);
return ret;
}
close(fd);
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 02/11] net/enetfec: fix out-of-bounds access in UIO mapping
2025-10-06 8:03 [PATCH 00/11] net/enetc: various fixes and enhancements Hemant Agrawal
2025-10-06 8:04 ` [PATCH 01/11] net/enetfec: fix file descriptor leak on read error Hemant Agrawal
@ 2025-10-06 8:04 ` Hemant Agrawal
2025-10-06 8:04 ` [PATCH 03/11] net/enetfec: fix buffer descriptor size configuration Hemant Agrawal
` (8 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Hemant Agrawal @ 2025-10-06 8:04 UTC (permalink / raw)
To: dev, stephen, david.marchand; +Cc: Vanshika Shukla, stable
From: Vanshika Shukla <vanshika.shukla@nxp.com>
NXP internal Coverity flagged a potential out-of-bounds
access due to invalid mapping size. This patch adds a check to
ensure the mapping size is within valid bounds before proceeding
with memory mapping.
Fixes: b84fdd39638b ("net/enetfec: support UIO")
Cc: stable@dpdk.org
Signed-off-by: Vanshika Shukla <vanshika.shukla@nxp.com>
---
drivers/net/enetfec/enet_uio.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/net/enetfec/enet_uio.c b/drivers/net/enetfec/enet_uio.c
index 23cb4e7e93..f32d5e1b1e 100644
--- a/drivers/net/enetfec/enet_uio.c
+++ b/drivers/net/enetfec/enet_uio.c
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2021,2024 NXP
+ * Copyright 2021,2024-2025 NXP
*/
#include <stdbool.h>
@@ -142,6 +142,10 @@ uio_map_mem(int uio_device_fd, int uio_device_id,
}
/* Read mapping size and physical address expressed in hexa(base 16) */
uio_map_size = strtol(uio_map_size_str, NULL, 16);
+ if (uio_map_size <= 0 || uio_map_size > INT_MAX) {
+ ENETFEC_PMD_ERR("Invalid mapping size: %u.", uio_map_size);
+ return NULL;
+ }
uio_map_p_addr = strtol(uio_map_p_addr_str, NULL, 16);
if (uio_map_id == 0) {
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 03/11] net/enetfec: fix buffer descriptor size configuration
2025-10-06 8:03 [PATCH 00/11] net/enetc: various fixes and enhancements Hemant Agrawal
2025-10-06 8:04 ` [PATCH 01/11] net/enetfec: fix file descriptor leak on read error Hemant Agrawal
2025-10-06 8:04 ` [PATCH 02/11] net/enetfec: fix out-of-bounds access in UIO mapping Hemant Agrawal
@ 2025-10-06 8:04 ` Hemant Agrawal
2025-10-06 8:04 ` [PATCH 04/11] net/enetfec: fix incorrect Tx queue free logic Hemant Agrawal
` (7 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Hemant Agrawal @ 2025-10-06 8:04 UTC (permalink / raw)
To: dev, stephen, david.marchand; +Cc: stable
The driver previously allowed arbitrary descriptor counts, which could
lead to misaligned buffer allocations. This patch enforces the use of
fixed descriptor ring sizes for both RX and TX queues, ensuring proper
buffer allocation and avoiding potential runtime issues.
Fixes: bb5b5bf1e5c6 ("net/enetfec: support queue configuration")
Cc: stable@dpdk.org
Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
drivers/net/enetfec/enet_ethdev.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/enetfec/enet_ethdev.c b/drivers/net/enetfec/enet_ethdev.c
index 7c2926409e..f7a45fcd4d 100644
--- a/drivers/net/enetfec/enet_ethdev.c
+++ b/drivers/net/enetfec/enet_ethdev.c
@@ -384,7 +384,7 @@ enetfec_tx_queue_setup(struct rte_eth_dev *dev,
return -ENOMEM;
}
- if (nb_desc > MAX_TX_BD_RING_SIZE) {
+ if (nb_desc != MAX_TX_BD_RING_SIZE) {
nb_desc = MAX_TX_BD_RING_SIZE;
ENETFEC_PMD_WARN("modified the nb_desc to MAX_TX_BD_RING_SIZE");
}
@@ -462,7 +462,7 @@ enetfec_rx_queue_setup(struct rte_eth_dev *dev,
return -ENOMEM;
}
- if (nb_rx_desc > MAX_RX_BD_RING_SIZE) {
+ if (nb_rx_desc != MAX_RX_BD_RING_SIZE) {
nb_rx_desc = MAX_RX_BD_RING_SIZE;
ENETFEC_PMD_WARN("modified the nb_desc to MAX_RX_BD_RING_SIZE");
}
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 04/11] net/enetfec: fix incorrect Tx queue free logic
2025-10-06 8:03 [PATCH 00/11] net/enetc: various fixes and enhancements Hemant Agrawal
` (2 preceding siblings ...)
2025-10-06 8:04 ` [PATCH 03/11] net/enetfec: fix buffer descriptor size configuration Hemant Agrawal
@ 2025-10-06 8:04 ` Hemant Agrawal
2025-10-06 8:04 ` [PATCH 05/11] net/enetfec: fix checksum flag handling and error return Hemant Agrawal
` (6 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Hemant Agrawal @ 2025-10-06 8:04 UTC (permalink / raw)
To: dev, stephen, david.marchand; +Cc: stable
The TX queue cleanup mistakenly freed RX queue pointers instead of TX
queue pointers. This patch corrects the loop to free the correct memory.
Fixes: ecae71571b0d ("net/enetfec: support Rx/Tx")
Cc: stable@dpdk.org
Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
drivers/net/enetfec/enet_ethdev.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/enetfec/enet_ethdev.c b/drivers/net/enetfec/enet_ethdev.c
index f7a45fcd4d..16f36a53f1 100644
--- a/drivers/net/enetfec/enet_ethdev.c
+++ b/drivers/net/enetfec/enet_ethdev.c
@@ -350,7 +350,7 @@ enet_free_queue(struct rte_eth_dev *dev)
for (i = 0; i < dev->data->nb_rx_queues; i++)
rte_free(fep->rx_queues[i]);
for (i = 0; i < dev->data->nb_tx_queues; i++)
- rte_free(fep->rx_queues[i]);
+ rte_free(fep->tx_queues[i]);
}
static const unsigned short offset_des_active_rxq[] = {
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 05/11] net/enetfec: fix checksum flag handling and error return
2025-10-06 8:03 [PATCH 00/11] net/enetc: various fixes and enhancements Hemant Agrawal
` (3 preceding siblings ...)
2025-10-06 8:04 ` [PATCH 04/11] net/enetfec: fix incorrect Tx queue free logic Hemant Agrawal
@ 2025-10-06 8:04 ` Hemant Agrawal
2025-10-06 8:04 ` [PATCH 06/11] net/enetfec: fix to reject multi-queue configuration Hemant Agrawal
` (5 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Hemant Agrawal @ 2025-10-06 8:04 UTC (permalink / raw)
To: dev, stephen, david.marchand; +Cc: stable
- Corrects the logic for setting RX checksum flags based on error status.
- Updates TX checksum offload condition to check for TX flags.
- Fixes incorrect error return in RX queue setup by replacing `errno`
with `-ENOMEM`.
Fixes: ecae71571b0d ("net/enetfec: support Rx/Tx")
Cc: stable@dpdk.org
Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
drivers/net/enetfec/enet_rxtx.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/drivers/net/enetfec/enet_rxtx.c b/drivers/net/enetfec/enet_rxtx.c
index 0aea8b240d..ea2c28a26b 100644
--- a/drivers/net/enetfec/enet_rxtx.c
+++ b/drivers/net/enetfec/enet_rxtx.c
@@ -121,10 +121,11 @@ enetfec_recv_pkts(void *rxq1, struct rte_mbuf **rx_pkts,
(rxq->fep->flag_csum & RX_FLAG_CSUM_EN)) {
if ((rte_read32(&ebdp->bd_esc) &
rte_cpu_to_le_32(RX_FLAG_CSUM_ERR)) == 0) {
- /* don't check it */
- mbuf->ol_flags = RTE_MBUF_F_RX_IP_CKSUM_BAD;
- } else {
+ /* No checksum error - checksum is good */
mbuf->ol_flags = RTE_MBUF_F_RX_IP_CKSUM_GOOD;
+ } else {
+ /* Checksum error detected */
+ mbuf->ol_flags = RTE_MBUF_F_RX_IP_CKSUM_BAD;
}
}
@@ -238,7 +239,8 @@ enetfec_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
if (txq->fep->bufdesc_ex) {
struct bufdesc_ex *ebdp = (struct bufdesc_ex *)bdp;
- if (mbuf->ol_flags == RTE_MBUF_F_RX_IP_CKSUM_GOOD)
+ if (mbuf->ol_flags & (RTE_MBUF_F_TX_IP_CKSUM | RTE_MBUF_F_TX_TCP_CKSUM |
+ RTE_MBUF_F_TX_UDP_CKSUM | RTE_MBUF_F_TX_SCTP_CKSUM))
estatus |= TX_BD_PINS | TX_BD_IINS;
rte_write32(0, &ebdp->bd_bdu);
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 06/11] net/enetfec: fix to reject multi-queue configuration
2025-10-06 8:03 [PATCH 00/11] net/enetc: various fixes and enhancements Hemant Agrawal
` (4 preceding siblings ...)
2025-10-06 8:04 ` [PATCH 05/11] net/enetfec: fix checksum flag handling and error return Hemant Agrawal
@ 2025-10-06 8:04 ` Hemant Agrawal
2025-10-06 8:04 ` [PATCH 07/11] net/enetfec: fix memory leak in Rx buffer cleanup Hemant Agrawal
` (4 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Hemant Agrawal @ 2025-10-06 8:04 UTC (permalink / raw)
To: dev, stephen, david.marchand; +Cc: stable
The enetfec PMD currently supports only a single TX queue. This patch
adds a check to prevent users from configuring more than one queue,
ensuring predictable behavior and avoiding unsupported configurations.
Fixes: bb5b5bf1e5c6 ("net/enetfec: support queue configuration")
Cc: stable@dpdk.org
Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
drivers/net/enetfec/enet_ethdev.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/net/enetfec/enet_ethdev.c b/drivers/net/enetfec/enet_ethdev.c
index 16f36a53f1..bcecab828e 100644
--- a/drivers/net/enetfec/enet_ethdev.c
+++ b/drivers/net/enetfec/enet_ethdev.c
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2020-2021 NXP
+ * Copyright 2020-2021,2023 NXP
*/
#include <inttypes.h>
@@ -377,6 +377,11 @@ enetfec_tx_queue_setup(struct rte_eth_dev *dev,
sizeof(struct bufdesc);
unsigned int dsize_log2 = rte_fls_u64(dsize) - 1;
+ if (queue_idx > 0) {
+ ENETFEC_PMD_ERR("Multi queue not supported");
+ return -EINVAL;
+ }
+
/* allocate transmit queue */
txq = rte_zmalloc(NULL, sizeof(*txq), RTE_CACHE_LINE_SIZE);
if (txq == NULL) {
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 07/11] net/enetfec: fix memory leak in Rx buffer cleanup
2025-10-06 8:03 [PATCH 00/11] net/enetc: various fixes and enhancements Hemant Agrawal
` (5 preceding siblings ...)
2025-10-06 8:04 ` [PATCH 06/11] net/enetfec: fix to reject multi-queue configuration Hemant Agrawal
@ 2025-10-06 8:04 ` Hemant Agrawal
2025-10-06 8:04 ` [PATCH 08/11] net/enetfec: fix to add check for Rx/Tx deferred queue Hemant Agrawal
` (3 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Hemant Agrawal @ 2025-10-06 8:04 UTC (permalink / raw)
To: dev, stephen, david.marchand; +Cc: stable
The RX buffer cleanup logic did not check for NULL before freeing mbufs,
which could lead to undefined behavior. This patch adds a NULL check
before freeing each mbuf.
Fixes: ecae71571b0d ("net/enetfec: support Rx/Tx")
Cc: stable@dpdk.org
Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
drivers/net/enetfec/enet_ethdev.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/drivers/net/enetfec/enet_ethdev.c b/drivers/net/enetfec/enet_ethdev.c
index bcecab828e..60bb4f7ebd 100644
--- a/drivers/net/enetfec/enet_ethdev.c
+++ b/drivers/net/enetfec/enet_ethdev.c
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2020-2021,2023 NXP
+ * Copyright 2020-2021,2023-2024 NXP
*/
#include <inttypes.h>
@@ -172,8 +172,10 @@ enet_free_buffers(struct rte_eth_dev *dev)
bdp = rxq->bd.base;
for (i = 0; i < rxq->bd.ring_size; i++) {
mbuf = rxq->rx_mbuf[i];
- rxq->rx_mbuf[i] = NULL;
- rte_pktmbuf_free(mbuf);
+ if (mbuf) {
+ rxq->rx_mbuf[i] = NULL;
+ rte_pktmbuf_free(mbuf);
+ }
bdp = enet_get_nextdesc(bdp, &rxq->bd);
}
}
@@ -547,7 +549,7 @@ enetfec_rx_queue_setup(struct rte_eth_dev *dev,
}
}
rte_free(rxq);
- return errno;
+ return -ENOMEM;
}
static const struct eth_dev_ops enetfec_ops = {
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 08/11] net/enetfec: fix to add check for Rx/Tx deferred queue
2025-10-06 8:03 [PATCH 00/11] net/enetc: various fixes and enhancements Hemant Agrawal
` (6 preceding siblings ...)
2025-10-06 8:04 ` [PATCH 07/11] net/enetfec: fix memory leak in Rx buffer cleanup Hemant Agrawal
@ 2025-10-06 8:04 ` Hemant Agrawal
2025-10-06 8:04 ` [PATCH 09/11] net/enetfec: handle cache for forwarded packets Hemant Agrawal
` (2 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Hemant Agrawal @ 2025-10-06 8:04 UTC (permalink / raw)
To: dev, stephen, david.marchand; +Cc: stable
This patch adds a check to reject configuration of Tx deferred start,
which is not supported by the enetfec PMD. This ensures that unsupported
features are explicitly handled and reported.
Fixes: bb5b5bf1e5c6 ("net/enetfec: support queue configuration")
Cc: stable@dpdk.org
Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
drivers/net/enetfec/enet_ethdev.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/net/enetfec/enet_ethdev.c b/drivers/net/enetfec/enet_ethdev.c
index 60bb4f7ebd..6d4d3e0fc2 100644
--- a/drivers/net/enetfec/enet_ethdev.c
+++ b/drivers/net/enetfec/enet_ethdev.c
@@ -384,6 +384,12 @@ enetfec_tx_queue_setup(struct rte_eth_dev *dev,
return -EINVAL;
}
+ /* Tx deferred start is not supported */
+ if (tx_conf->tx_deferred_start) {
+ ENETFEC_PMD_ERR("Tx deferred start not supported");
+ return -EINVAL;
+ }
+
/* allocate transmit queue */
txq = rte_zmalloc(NULL, sizeof(*txq), RTE_CACHE_LINE_SIZE);
if (txq == NULL) {
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 09/11] net/enetfec: handle cache for forwarded packets
2025-10-06 8:03 [PATCH 00/11] net/enetc: various fixes and enhancements Hemant Agrawal
` (7 preceding siblings ...)
2025-10-06 8:04 ` [PATCH 08/11] net/enetfec: fix to add check for Rx/Tx deferred queue Hemant Agrawal
@ 2025-10-06 8:04 ` Hemant Agrawal
2025-10-06 8:04 ` [PATCH 10/11] net/enetfec: support to set MAC address Hemant Agrawal
2025-10-06 8:04 ` [PATCH 11/11] net/enetfec: add software packet type parsing and cleanup Hemant Agrawal
10 siblings, 0 replies; 12+ messages in thread
From: Hemant Agrawal @ 2025-10-06 8:04 UTC (permalink / raw)
To: dev, stephen, david.marchand
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@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
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 10/11] net/enetfec: support to set MAC address
2025-10-06 8:03 [PATCH 00/11] net/enetc: various fixes and enhancements Hemant Agrawal
` (8 preceding siblings ...)
2025-10-06 8:04 ` [PATCH 09/11] net/enetfec: handle cache for forwarded packets Hemant Agrawal
@ 2025-10-06 8:04 ` Hemant Agrawal
2025-10-06 8:04 ` [PATCH 11/11] net/enetfec: add software packet type parsing and cleanup Hemant Agrawal
10 siblings, 0 replies; 12+ messages in thread
From: Hemant Agrawal @ 2025-10-06 8:04 UTC (permalink / raw)
To: dev, stephen, david.marchand
This patch adds the support of mac_addr_set.
Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
drivers/net/enetfec/enet_ethdev.c | 76 ++++++++++++++++---------------
drivers/net/enetfec/enet_ethdev.h | 30 ++++++++++++
2 files changed, 69 insertions(+), 37 deletions(-)
diff --git a/drivers/net/enetfec/enet_ethdev.c b/drivers/net/enetfec/enet_ethdev.c
index 6d4d3e0fc2..959d5d4a6e 100644
--- a/drivers/net/enetfec/enet_ethdev.c
+++ b/drivers/net/enetfec/enet_ethdev.c
@@ -14,30 +14,6 @@
#include "enet_regs.h"
#include "enet_uio.h"
-#define ENETFEC_NAME_PMD net_enetfec
-
-/* FEC receive acceleration */
-#define ENETFEC_RACC_IPDIS RTE_BIT32(1)
-#define ENETFEC_RACC_PRODIS RTE_BIT32(2)
-#define ENETFEC_RACC_SHIFT16 RTE_BIT32(7)
-#define ENETFEC_RACC_OPTIONS (ENETFEC_RACC_IPDIS | \
- ENETFEC_RACC_PRODIS)
-
-#define ENETFEC_PAUSE_FLAG_AUTONEG 0x1
-#define ENETFEC_PAUSE_FLAG_ENABLE 0x2
-
-/* Pause frame field and FIFO threshold */
-#define ENETFEC_FCE RTE_BIT32(5)
-#define ENETFEC_RSEM_V 0x84
-#define ENETFEC_RSFL_V 16
-#define ENETFEC_RAEM_V 0x8
-#define ENETFEC_RAFL_V 0x8
-#define ENETFEC_OPD_V 0xFFF0
-
-/* Extended buffer descriptor */
-#define ENETFEC_EXTENDED_BD 0
-#define NUM_OF_BD_QUEUES 6
-
/* Supported Rx offloads */
static uint64_t dev_rx_offloads_sup =
RTE_ETH_RX_OFFLOAD_CHECKSUM |
@@ -298,8 +274,7 @@ enetfec_multicast_enable(struct rte_eth_dev *dev)
/* Set a MAC change in hardware. */
static int
-enetfec_set_mac_address(struct rte_eth_dev *dev,
- struct rte_ether_addr *addr)
+enetfec_set_mac_address(struct rte_eth_dev *dev, struct rte_ether_addr *addr)
{
struct enetfec_private *fep = dev->data->dev_private;
@@ -588,15 +563,15 @@ enetfec_eth_init(struct rte_eth_dev *dev)
static int
pmd_enetfec_probe(struct rte_vdev_device *vdev)
{
+ char eth_name[ENETFEC_ETH_NAMESIZE];
struct rte_eth_dev *dev = NULL;
struct enetfec_private *fep;
- const char *name;
- int rc;
- int i;
+ uint16_t *mac, high_mac = 0;
+ struct rte_ether_addr addr;
+ uint32_t tmac, low_mac = 0;
unsigned int bdsize;
- struct rte_ether_addr macaddr = {
- .addr_bytes = { 0x1, 0x1, 0x1, 0x1, 0x1, 0x1 }
- };
+ const char *name;
+ int rc, i;
name = rte_vdev_device_name(vdev);
ENETFEC_PMD_LOG(INFO, "Initializing pmd_fec for %s", name);
@@ -637,8 +612,12 @@ pmd_enetfec_probe(struct rte_vdev_device *vdev)
fep->bd_addr_p = fep->bd_addr_p + bdsize;
}
+ /* Allocate memory for storing MAC addresses */
+ snprintf(eth_name, sizeof(eth_name), "enetfec_eth_mac_%d",
+ dev->data->port_id);
+
/* Copy the station address into the dev structure, */
- dev->data->mac_addrs = rte_zmalloc("mac_addr", RTE_ETHER_ADDR_LEN, 0);
+ dev->data->mac_addrs = rte_zmalloc(eth_name, RTE_ETHER_ADDR_LEN, 0);
if (dev->data->mac_addrs == NULL) {
ENETFEC_PMD_ERR("Failed to allocate mem %d to store MAC addresses",
RTE_ETHER_ADDR_LEN);
@@ -646,10 +625,33 @@ pmd_enetfec_probe(struct rte_vdev_device *vdev)
goto err;
}
- /*
- * Set default mac address
- */
- enetfec_set_mac_address(dev, &macaddr);
+ /* Set mac address */
+ mac = (uint16_t *)addr.addr_bytes;
+ low_mac = (uint32_t)rte_read32((uint8_t *)fep->hw_baseaddr_v + ENETFEC_PALR);
+ *mac = (uint16_t)low_mac;
+ mac++;
+ *mac = (uint16_t)(low_mac >> ENETFEC_MAC_SHIFT);
+ mac++;
+ tmac = (uint32_t)rte_read32((uint8_t *)fep->hw_baseaddr_v + ENETFEC_PAUR);
+ *mac = (uint16_t)(tmac >> ENETFEC_MAC_SHIFT);
+ high_mac = (uint16_t)(*mac);
+
+ if ((high_mac | low_mac) == 0 || (high_mac | low_mac) == ENETFEC_MAC_RESET) {
+ uint8_t *first_byte;
+
+ mac = (uint16_t *)addr.addr_bytes;
+ tmac = (uint32_t)rte_rand();
+ first_byte = (uint8_t *)&tmac;
+ *first_byte &= (uint8_t)~RTE_ETHER_GROUP_ADDR; /* clear multicast bit */
+ *first_byte |= RTE_ETHER_LOCAL_ADMIN_ADDR; /* set local assignment bit (IEEE802) */
+ *mac = (uint16_t)tmac;
+ mac++;
+ *mac = (uint16_t)(tmac >> ENETFEC_MAC_SHIFT);
+ mac++;
+ *mac = (uint16_t)rte_rand();
+ }
+
+ enetfec_set_mac_address(dev, &addr);
fep->bufdesc_ex = ENETFEC_EXTENDED_BD;
rc = enetfec_eth_init(dev);
diff --git a/drivers/net/enetfec/enet_ethdev.h b/drivers/net/enetfec/enet_ethdev.h
index ee5c244c91..4c063d1799 100644
--- a/drivers/net/enetfec/enet_ethdev.h
+++ b/drivers/net/enetfec/enet_ethdev.h
@@ -20,6 +20,36 @@
#define OPT_FRAME_SIZE (PKT_MAX_BUF_SIZE << 16)
#define ENETFEC_MAX_RX_PKT_LEN 3000
+#define ENETFEC_NAME_PMD net_enetfec
+
+/* eth name size */
+#define ENETFEC_ETH_NAMESIZE 20
+#define ENETFEC_MAC_SHIFT 16
+/* mac addr reset */
+#define ENETFEC_MAC_RESET 0xFFFFFFFF
+
+/* FEC receive acceleration */
+#define ENETFEC_RACC_IPDIS RTE_BIT32(1)
+#define ENETFEC_RACC_PRODIS RTE_BIT32(2)
+#define ENETFEC_RACC_SHIFT16 RTE_BIT32(7)
+#define ENETFEC_RACC_OPTIONS (ENETFEC_RACC_IPDIS | \
+ ENETFEC_RACC_PRODIS)
+
+#define ENETFEC_PAUSE_FLAG_AUTONEG 0x1
+#define ENETFEC_PAUSE_FLAG_ENABLE 0x2
+
+/* Pause frame field and FIFO threshold */
+#define ENETFEC_FCE RTE_BIT32(5)
+#define ENETFEC_RSEM_V 0x84
+#define ENETFEC_RSFL_V 16
+#define ENETFEC_RAEM_V 0x8
+#define ENETFEC_RAFL_V 0x8
+#define ENETFEC_OPD_V 0xFFF0
+
+/* Extended buffer descriptor */
+#define ENETFEC_EXTENDED_BD 0
+#define NUM_OF_BD_QUEUES 6
+
#define __iomem
#if defined(RTE_ARCH_ARM)
#if defined(RTE_ARCH_64)
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 11/11] net/enetfec: add software packet type parsing and cleanup
2025-10-06 8:03 [PATCH 00/11] net/enetc: various fixes and enhancements Hemant Agrawal
` (9 preceding siblings ...)
2025-10-06 8:04 ` [PATCH 10/11] net/enetfec: support to set MAC address Hemant Agrawal
@ 2025-10-06 8:04 ` Hemant Agrawal
10 siblings, 0 replies; 12+ messages in thread
From: Hemant Agrawal @ 2025-10-06 8:04 UTC (permalink / raw)
To: dev, stephen, david.marchand
This patch adds software-based parsing for Ethernet packet types,
specifically identifying IPv4 and IPv6 packets. This is a temporary
solution until hardware-based parsing is implemented.
Additionally, variable declarations in `enetfec_recv_pkts()` are
reordered to follow reverse Christmas tree style for better readability.
Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
drivers/net/enetfec/enet_rxtx.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/drivers/net/enetfec/enet_rxtx.c b/drivers/net/enetfec/enet_rxtx.c
index 95767b561e..91a231af6c 100644
--- a/drivers/net/enetfec/enet_rxtx.c
+++ b/drivers/net/enetfec/enet_rxtx.c
@@ -17,12 +17,13 @@ enetfec_recv_pkts(void *rxq1, struct rte_mbuf **rx_pkts,
uint16_t nb_pkts)
{
struct rte_mempool *pool;
- struct bufdesc *bdp;
struct rte_mbuf *mbuf, *new_mbuf = NULL;
unsigned short status;
unsigned short pkt_len;
int pkt_received = 0, index = 0;
+ struct rte_ether_hdr *eth;
void *data, *mbuf_data;
+ struct bufdesc *bdp;
uint16_t vlan_tag;
struct bufdesc_ex *ebdp = NULL;
bool vlan_packet_rcvd = false;
@@ -92,6 +93,16 @@ enetfec_recv_pkts(void *rxq1, struct rte_mbuf **rx_pkts,
data = rte_pktmbuf_adj(mbuf, 2);
rx_pkts[pkt_received] = mbuf;
+
+ /* Assuming Ethernet packets, doing software packet type parsing.
+ * To be replaced by HW packet parsing
+ */
+ eth = rte_pktmbuf_mtod(mbuf, struct rte_ether_hdr *);
+ mbuf->packet_type = RTE_PTYPE_L2_ETHER;
+ if (rte_be_to_cpu_16(eth->ether_type) == RTE_ETHER_TYPE_IPV4)
+ mbuf->packet_type |= RTE_PTYPE_L3_IPV4;
+ if (rte_be_to_cpu_16(eth->ether_type) == RTE_ETHER_TYPE_IPV6)
+ mbuf->packet_type |= RTE_PTYPE_L3_IPV6;
pkt_received++;
/* Extract the enhanced buffer descriptor */
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread