patch 'net/bnxt: support statistics query when port is stopped' has been queued to stable release 24.11.5
luca.boccassi at gmail.com
luca.boccassi at gmail.com
Thu Mar 19 23:02:08 CET 2026
Hi,
FYI, your patch has been queued to stable release 24.11.5
Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 03/21/26. So please
shout if anyone has objections.
Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.
Queued patches are on a temporary branch at:
https://github.com/bluca/dpdk-stable
This queued commit can be viewed at:
https://github.com/bluca/dpdk-stable/commit/1c7afe5771038924c71b00c20650ef0269c4e908
Thanks.
Luca Boccassi
---
>From 1c7afe5771038924c71b00c20650ef0269c4e908 Mon Sep 17 00:00:00 2001
From: Ajit Khaparde <ajit.khaparde at broadcom.com>
Date: Mon, 2 Mar 2026 12:51:57 -0700
Subject: [PATCH] net/bnxt: support statistics query when port is stopped
[ upstream commit 898248fc42871748ae068e94b7a4d6aed28dec5f ]
Currently the driver returns an error if stats are requested
when the port is stopped.
But some applications may need to get the port stats even if
the port is stopped.
Allow the get stats command to show the existing stats
if the port is stopped.
When the port is started the driver will get the stats from
the firmware.
Signed-off-by: Ajit Khaparde <ajit.khaparde at broadcom.com>
Signed-off-by: Mohammad Shuab Siddique <mohammad-shuab.siddique at broadcom.com>
---
drivers/net/bnxt/bnxt_ethdev.c | 47 ++++++++++-------
drivers/net/bnxt/bnxt_hwrm.c | 94 +++++++++++++++++++++++++++++++---
drivers/net/bnxt/bnxt_stats.c | 3 --
3 files changed, 114 insertions(+), 30 deletions(-)
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index a63a9af91e..b1e789a0fd 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -785,7 +785,7 @@ static int bnxt_update_phy_setting(struct bnxt *bp)
return rc;
}
-static void bnxt_free_prev_ring_stats(struct bnxt *bp)
+static void bnxt_free_prev_ring_stats_ext(struct bnxt *bp)
{
/* tpa v2 devices use ext variant local struct */
if (BNXT_TPA_V2_P7(bp)) {
@@ -795,6 +795,10 @@ static void bnxt_free_prev_ring_stats(struct bnxt *bp)
bp->prev_tx_ring_stats_ext = NULL;
return;
}
+}
+
+static void bnxt_free_prev_ring_stats(struct bnxt *bp)
+{
rte_free(bp->prev_rx_ring_stats);
rte_free(bp->prev_tx_ring_stats);
bp->prev_rx_ring_stats = NULL;
@@ -803,17 +807,19 @@ static void bnxt_free_prev_ring_stats(struct bnxt *bp)
static int bnxt_alloc_prev_ring_ext_stats(struct bnxt *bp)
{
- bp->prev_rx_ring_stats_ext = rte_zmalloc("bnxt_prev_rx_ring_stats_ext",
- sizeof(struct bnxt_ring_stats_ext) *
- bp->rx_cp_nr_rings,
- 0);
+ if (bp->prev_rx_ring_stats_ext == NULL)
+ bp->prev_rx_ring_stats_ext = rte_zmalloc("bnxt_prev_rx_ring_stats_ext",
+ sizeof(struct bnxt_ring_stats_ext) *
+ bp->rx_cp_nr_rings,
+ 0);
if (bp->prev_rx_ring_stats_ext == NULL)
return -ENOMEM;
- bp->prev_tx_ring_stats_ext = rte_zmalloc("bnxt_prev_tx_ring_stats_ext",
- sizeof(struct bnxt_ring_stats_ext) *
- bp->tx_cp_nr_rings,
- 0);
+ if (bp->prev_tx_ring_stats_ext == NULL)
+ bp->prev_tx_ring_stats_ext = rte_zmalloc("bnxt_prev_tx_ring_stats_ext",
+ sizeof(struct bnxt_ring_stats_ext) *
+ bp->tx_cp_nr_rings,
+ 0);
if (bp->tx_cp_nr_rings > 0 && bp->prev_tx_ring_stats_ext == NULL)
goto error;
@@ -830,24 +836,26 @@ static int bnxt_alloc_prev_ring_stats(struct bnxt *bp)
if (BNXT_TPA_V2_P7(bp))
return bnxt_alloc_prev_ring_ext_stats(bp);
- bp->prev_rx_ring_stats = rte_zmalloc("bnxt_prev_rx_ring_stats",
- sizeof(struct bnxt_ring_stats) *
- bp->rx_cp_nr_rings,
- 0);
+ if (bp->prev_rx_ring_stats == NULL)
+ bp->prev_rx_ring_stats = rte_zmalloc("bnxt_prev_rx_ring_stats",
+ sizeof(struct bnxt_ring_stats) *
+ bp->rx_cp_nr_rings,
+ 0);
if (bp->prev_rx_ring_stats == NULL)
return -ENOMEM;
- bp->prev_tx_ring_stats = rte_zmalloc("bnxt_prev_tx_ring_stats",
- sizeof(struct bnxt_ring_stats) *
- bp->tx_cp_nr_rings,
- 0);
+ if (bp->prev_tx_ring_stats == NULL)
+ bp->prev_tx_ring_stats = rte_zmalloc("bnxt_prev_tx_ring_stats",
+ sizeof(struct bnxt_ring_stats) *
+ bp->tx_cp_nr_rings,
+ 0);
if (bp->tx_cp_nr_rings > 0 && bp->prev_tx_ring_stats == NULL)
goto error;
return 0;
error:
- bnxt_free_prev_ring_stats(bp);
+ bnxt_free_prev_ring_stats_ext(bp);
return -ENOMEM;
}
@@ -1756,7 +1764,6 @@ static int bnxt_dev_stop(struct rte_eth_dev *eth_dev)
bnxt_shutdown_nic(bp);
bnxt_hwrm_if_change(bp, false);
- bnxt_free_prev_ring_stats(bp);
rte_free(bp->mark_table);
bp->mark_table = NULL;
@@ -1947,6 +1954,8 @@ static int bnxt_dev_close_op(struct rte_eth_dev *eth_dev)
if (eth_dev->data->dev_started)
ret = bnxt_dev_stop(eth_dev);
+ bnxt_free_prev_ring_stats_ext(bp);
+ bnxt_free_prev_ring_stats(bp);
bnxt_uninit_resources(bp, false);
bnxt_drv_uninit(bp);
diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c
index 9ae678b5fd..0a2cd28340 100644
--- a/drivers/net/bnxt/bnxt_hwrm.c
+++ b/drivers/net/bnxt/bnxt_hwrm.c
@@ -5380,13 +5380,54 @@ static void bnxt_update_prev_stat(uint64_t *cntr, uint64_t *prev_cntr)
*prev_cntr = *cntr;
}
+static void bnxt_get_prev_tx_stats(struct bnxt_ring_stats *ring_stats,
+ struct bnxt_ring_stats *prev_stats)
+{
+ ring_stats->tx_ucast_pkts = prev_stats->tx_ucast_pkts;
+ ring_stats->tx_mcast_pkts = prev_stats->tx_mcast_pkts;
+ ring_stats->tx_bcast_pkts = prev_stats->tx_bcast_pkts;
+ ring_stats->tx_ucast_bytes = prev_stats->tx_ucast_bytes;
+ ring_stats->tx_mcast_bytes = prev_stats->tx_mcast_bytes;
+ ring_stats->tx_bcast_bytes = prev_stats->tx_bcast_bytes;
+ ring_stats->tx_discard_pkts = prev_stats->tx_discard_pkts;
+}
+
+static void bnxt_get_prev_rx_stats(struct bnxt_ring_stats *ring_stats,
+ struct bnxt_ring_stats *prev_stats)
+{
+ ring_stats->rx_ucast_pkts = prev_stats->rx_ucast_pkts;
+ ring_stats->rx_mcast_pkts = prev_stats->rx_mcast_pkts;
+ ring_stats->rx_bcast_pkts = prev_stats->rx_bcast_pkts;
+ ring_stats->rx_ucast_bytes = prev_stats->rx_ucast_bytes;
+ ring_stats->rx_mcast_bytes = prev_stats->rx_mcast_bytes;
+ ring_stats->rx_bcast_bytes = prev_stats->rx_bcast_bytes;
+ ring_stats->rx_discard_pkts = prev_stats->rx_discard_pkts;
+ ring_stats->rx_error_pkts = prev_stats->rx_error_pkts;
+ ring_stats->rx_agg_pkts = prev_stats->rx_agg_pkts;
+ ring_stats->rx_agg_bytes = prev_stats->rx_agg_bytes;
+ ring_stats->rx_agg_events = prev_stats->rx_agg_events;
+ ring_stats->rx_agg_aborts = prev_stats->rx_agg_aborts;
+}
+
int bnxt_hwrm_ring_stats(struct bnxt *bp, uint32_t cid, int idx,
struct bnxt_ring_stats *ring_stats, bool rx)
{
int rc = 0;
struct hwrm_stat_ctx_query_input req = {.req_type = 0};
struct hwrm_stat_ctx_query_output *resp = bp->hwrm_cmd_resp_addr;
+ struct bnxt_ring_stats *prev_stats = &bp->prev_rx_ring_stats[idx];
+ if (!rx)
+ prev_stats = &bp->prev_tx_ring_stats[idx];
+
+ if (!bp->eth_dev->data->dev_started) {
+ if (rx)
+ bnxt_get_prev_rx_stats(ring_stats, prev_stats);
+ else
+ bnxt_get_prev_tx_stats(ring_stats, prev_stats);
+
+ return 0;
+ }
HWRM_PREP(&req, HWRM_STAT_CTX_QUERY, BNXT_USE_CHIMP_MB);
req.stat_ctx_id = rte_cpu_to_le_32(cid);
@@ -5396,8 +5437,6 @@ int bnxt_hwrm_ring_stats(struct bnxt *bp, uint32_t cid, int idx,
HWRM_CHECK_RESULT();
if (rx) {
- struct bnxt_ring_stats *prev_stats = &bp->prev_rx_ring_stats[idx];
-
ring_stats->rx_ucast_pkts = rte_le_to_cpu_64(resp->rx_ucast_pkts);
bnxt_update_prev_stat(&ring_stats->rx_ucast_pkts,
&prev_stats->rx_ucast_pkts);
@@ -5446,8 +5485,6 @@ int bnxt_hwrm_ring_stats(struct bnxt *bp, uint32_t cid, int idx,
bnxt_update_prev_stat(&ring_stats->rx_agg_aborts,
&prev_stats->rx_agg_aborts);
} else {
- struct bnxt_ring_stats *prev_stats = &bp->prev_tx_ring_stats[idx];
-
ring_stats->tx_ucast_pkts = rte_le_to_cpu_64(resp->tx_ucast_pkts);
bnxt_update_prev_stat(&ring_stats->tx_ucast_pkts,
&prev_stats->tx_ucast_pkts);
@@ -5482,6 +5519,38 @@ int bnxt_hwrm_ring_stats(struct bnxt *bp, uint32_t cid, int idx,
return rc;
}
+static void bnxt_get_prev_rx_stats_ext(struct bnxt_ring_stats_ext *ring_stats,
+ struct bnxt_ring_stats_ext *prev_stats)
+{
+ ring_stats->rx_ucast_pkts = prev_stats->rx_ucast_pkts;
+ ring_stats->rx_mcast_pkts = prev_stats->rx_mcast_pkts;
+ ring_stats->rx_bcast_pkts = prev_stats->rx_bcast_pkts;
+ ring_stats->rx_ucast_bytes = prev_stats->rx_ucast_bytes;
+ ring_stats->rx_mcast_bytes = prev_stats->rx_mcast_bytes;
+ ring_stats->rx_bcast_bytes = prev_stats->rx_bcast_bytes;
+ ring_stats->rx_discard_pkts = prev_stats->rx_discard_pkts;
+ ring_stats->rx_error_pkts = prev_stats->rx_error_pkts;
+ ring_stats->rx_tpa_eligible_pkt = prev_stats->rx_tpa_eligible_pkt;
+ ring_stats->rx_tpa_eligible_bytes = prev_stats->rx_tpa_eligible_bytes;
+ ring_stats->rx_tpa_pkt = prev_stats->rx_tpa_pkt;
+ ring_stats->rx_tpa_bytes = prev_stats->rx_tpa_bytes;
+ ring_stats->rx_tpa_errors = prev_stats->rx_tpa_errors;
+ ring_stats->rx_tpa_events = prev_stats->rx_tpa_events;
+}
+
+static void bnxt_get_prev_tx_stats_ext(struct bnxt_ring_stats_ext *ring_stats,
+ struct bnxt_ring_stats_ext *prev_stats)
+{
+ ring_stats->tx_ucast_pkts = prev_stats->tx_ucast_pkts;
+ ring_stats->tx_mcast_pkts = prev_stats->tx_mcast_pkts;
+ ring_stats->tx_bcast_pkts = prev_stats->tx_bcast_pkts;
+ ring_stats->tx_ucast_bytes = prev_stats->tx_ucast_bytes;
+ ring_stats->tx_mcast_bytes = prev_stats->tx_mcast_bytes;
+ ring_stats->tx_bcast_bytes = prev_stats->tx_bcast_bytes;
+ ring_stats->tx_discard_pkts = prev_stats->tx_discard_pkts;
+ ring_stats->tx_error_pkts = prev_stats->tx_error_pkts;
+}
+
int bnxt_hwrm_ring_stats_ext(struct bnxt *bp, uint32_t cid, int idx,
struct bnxt_ring_stats_ext *ring_stats, bool rx)
{
@@ -5489,6 +5558,19 @@ int bnxt_hwrm_ring_stats_ext(struct bnxt *bp, uint32_t cid, int idx,
struct hwrm_stat_ext_ctx_query_input req = {.req_type = 0};
struct hwrm_stat_ext_ctx_query_output *resp = bp->hwrm_cmd_resp_addr;
+ struct bnxt_ring_stats_ext *prev_stats = &bp->prev_rx_ring_stats_ext[idx];
+
+ if (!rx)
+ prev_stats = &bp->prev_tx_ring_stats_ext[idx];
+
+ if (!bp->eth_dev->data->dev_started) {
+ if (rx)
+ bnxt_get_prev_rx_stats_ext(ring_stats, prev_stats);
+ else
+ bnxt_get_prev_tx_stats_ext(ring_stats, prev_stats);
+
+ return 0;
+ }
HWRM_PREP(&req, HWRM_STAT_EXT_CTX_QUERY, BNXT_USE_CHIMP_MB);
req.stat_ctx_id = rte_cpu_to_le_32(cid);
@@ -5497,8 +5579,6 @@ int bnxt_hwrm_ring_stats_ext(struct bnxt *bp, uint32_t cid, int idx,
HWRM_CHECK_RESULT();
if (rx) {
- struct bnxt_ring_stats_ext *prev_stats = &bp->prev_rx_ring_stats_ext[idx];
-
ring_stats->rx_ucast_pkts = rte_le_to_cpu_64(resp->rx_ucast_pkts);
bnxt_update_prev_stat(&ring_stats->rx_ucast_pkts,
&prev_stats->rx_ucast_pkts);
@@ -5555,8 +5635,6 @@ int bnxt_hwrm_ring_stats_ext(struct bnxt *bp, uint32_t cid, int idx,
bnxt_update_prev_stat(&ring_stats->rx_tpa_events,
&prev_stats->rx_tpa_events);
} else {
- struct bnxt_ring_stats_ext *prev_stats = &bp->prev_tx_ring_stats_ext[idx];
-
ring_stats->tx_ucast_pkts = rte_le_to_cpu_64(resp->tx_ucast_pkts);
bnxt_update_prev_stat(&ring_stats->tx_ucast_pkts,
&prev_stats->tx_ucast_pkts);
diff --git a/drivers/net/bnxt/bnxt_stats.c b/drivers/net/bnxt/bnxt_stats.c
index 9d7cdf925d..e114fe466c 100644
--- a/drivers/net/bnxt/bnxt_stats.c
+++ b/drivers/net/bnxt/bnxt_stats.c
@@ -701,9 +701,6 @@ int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,
if (rc)
return rc;
- if (!eth_dev->data->dev_started)
- return -EIO;
-
if (BNXT_TPA_V2_P7(bp))
return bnxt_stats_get_ext(eth_dev, bnxt_stats);
--
2.47.3
---
Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- - 2026-03-19 22:00:48.410405639 +0000
+++ 0016-net-bnxt-support-statistics-query-when-port-is-stopp.patch 2026-03-19 22:00:47.790359368 +0000
@@ -1 +1 @@
-From 898248fc42871748ae068e94b7a4d6aed28dec5f Mon Sep 17 00:00:00 2001
+From 1c7afe5771038924c71b00c20650ef0269c4e908 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 898248fc42871748ae068e94b7a4d6aed28dec5f ]
+
@@ -15,2 +16,0 @@
-Cc: stable at dpdk.org
-
@@ -26 +26 @@
-index 6f962f8b73..b677f9491d 100644
+index a63a9af91e..b1e789a0fd 100644
@@ -29 +29 @@
-@@ -786,7 +786,7 @@ static int bnxt_update_phy_setting(struct bnxt *bp)
+@@ -785,7 +785,7 @@ static int bnxt_update_phy_setting(struct bnxt *bp)
@@ -38 +38 @@
-@@ -796,6 +796,10 @@ static void bnxt_free_prev_ring_stats(struct bnxt *bp)
+@@ -795,6 +795,10 @@ static void bnxt_free_prev_ring_stats(struct bnxt *bp)
@@ -49 +49 @@
-@@ -804,17 +808,19 @@ static void bnxt_free_prev_ring_stats(struct bnxt *bp)
+@@ -803,17 +807,19 @@ static void bnxt_free_prev_ring_stats(struct bnxt *bp)
@@ -77 +77 @@
-@@ -831,24 +837,26 @@ static int bnxt_alloc_prev_ring_stats(struct bnxt *bp)
+@@ -830,24 +836,26 @@ static int bnxt_alloc_prev_ring_stats(struct bnxt *bp)
@@ -113 +113 @@
-@@ -1767,7 +1775,6 @@ static int bnxt_dev_stop(struct rte_eth_dev *eth_dev)
+@@ -1756,7 +1764,6 @@ static int bnxt_dev_stop(struct rte_eth_dev *eth_dev)
@@ -121 +121 @@
-@@ -1998,6 +2005,8 @@ static int bnxt_dev_close_op(struct rte_eth_dev *eth_dev)
+@@ -1947,6 +1954,8 @@ static int bnxt_dev_close_op(struct rte_eth_dev *eth_dev)
@@ -131 +131 @@
-index 3632bebbd6..53b0c8ec25 100644
+index 9ae678b5fd..0a2cd28340 100644
@@ -134 +134 @@
-@@ -5356,13 +5356,54 @@ static void bnxt_update_prev_stat(uint64_t *cntr, uint64_t *prev_cntr)
+@@ -5380,13 +5380,54 @@ static void bnxt_update_prev_stat(uint64_t *cntr, uint64_t *prev_cntr)
@@ -189 +189 @@
-@@ -5372,8 +5413,6 @@ int bnxt_hwrm_ring_stats(struct bnxt *bp, uint32_t cid, int idx,
+@@ -5396,8 +5437,6 @@ int bnxt_hwrm_ring_stats(struct bnxt *bp, uint32_t cid, int idx,
@@ -198 +198 @@
-@@ -5422,8 +5461,6 @@ int bnxt_hwrm_ring_stats(struct bnxt *bp, uint32_t cid, int idx,
+@@ -5446,8 +5485,6 @@ int bnxt_hwrm_ring_stats(struct bnxt *bp, uint32_t cid, int idx,
@@ -207 +207 @@
-@@ -5458,6 +5495,38 @@ int bnxt_hwrm_ring_stats(struct bnxt *bp, uint32_t cid, int idx,
+@@ -5482,6 +5519,38 @@ int bnxt_hwrm_ring_stats(struct bnxt *bp, uint32_t cid, int idx,
@@ -246 +246 @@
-@@ -5465,6 +5534,19 @@ int bnxt_hwrm_ring_stats_ext(struct bnxt *bp, uint32_t cid, int idx,
+@@ -5489,6 +5558,19 @@ int bnxt_hwrm_ring_stats_ext(struct bnxt *bp, uint32_t cid, int idx,
@@ -266 +266 @@
-@@ -5473,8 +5555,6 @@ int bnxt_hwrm_ring_stats_ext(struct bnxt *bp, uint32_t cid, int idx,
+@@ -5497,8 +5579,6 @@ int bnxt_hwrm_ring_stats_ext(struct bnxt *bp, uint32_t cid, int idx,
@@ -275 +275 @@
-@@ -5531,8 +5611,6 @@ int bnxt_hwrm_ring_stats_ext(struct bnxt *bp, uint32_t cid, int idx,
+@@ -5555,8 +5635,6 @@ int bnxt_hwrm_ring_stats_ext(struct bnxt *bp, uint32_t cid, int idx,
@@ -285 +285 @@
-index 88cfbaf9ff..7b96cf0df9 100644
+index 9d7cdf925d..e114fe466c 100644
@@ -288 +288 @@
-@@ -717,9 +717,6 @@ int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,
+@@ -701,9 +701,6 @@ int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,
@@ -296 +296 @@
- return bnxt_stats_get_ext(eth_dev, bnxt_stats, qstats);
+ return bnxt_stats_get_ext(eth_dev, bnxt_stats);
More information about the stable
mailing list