patch 'net/bnxt: support statistics query when port is stopped' has been queued to stable release 25.11.1
Kevin Traynor
ktraynor at redhat.com
Thu Mar 19 11:02:20 CET 2026
Hi,
FYI, your patch has been queued to stable release 25.11.1
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/23/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/kevintraynor/dpdk-stable
This queued commit can be viewed at:
https://github.com/kevintraynor/dpdk-stable/commit/d87710e399e8d6f6de62cd5f5a5316b562ca3a26
Thanks.
Kevin
---
>From d87710e399e8d6f6de62cd5f5a5316b562ca3a26 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 3c618c6e82..6601ddf575 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -787,5 +787,5 @@ static int bnxt_update_phy_setting(struct bnxt *bp)
}
-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 */
@@ -797,4 +797,8 @@ static void bnxt_free_prev_ring_stats(struct bnxt *bp)
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);
@@ -805,15 +809,17 @@ 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)
@@ -832,15 +838,17 @@ static int bnxt_alloc_prev_ring_stats(struct bnxt *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;
@@ -849,5 +857,5 @@ static int bnxt_alloc_prev_ring_stats(struct bnxt *bp)
error:
- bnxt_free_prev_ring_stats(bp);
+ bnxt_free_prev_ring_stats_ext(bp);
return -ENOMEM;
}
@@ -1759,5 +1767,4 @@ static int bnxt_dev_stop(struct rte_eth_dev *eth_dev)
bnxt_hwrm_if_change(bp, false);
- bnxt_free_prev_ring_stats(bp);
rte_free(bp->mark_table);
bp->mark_table = NULL;
@@ -1967,4 +1974,6 @@ static int bnxt_dev_close_op(struct rte_eth_dev *eth_dev)
ret = bnxt_dev_stop(eth_dev);
+ bnxt_free_prev_ring_stats_ext(bp);
+ bnxt_free_prev_ring_stats(bp);
bnxt_uninit_resources(bp, false);
diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c
index 0cef22b5ec..ac5cbbae0c 100644
--- a/drivers/net/bnxt/bnxt_hwrm.c
+++ b/drivers/net/bnxt/bnxt_hwrm.c
@@ -5357,4 +5357,33 @@ static void bnxt_update_prev_stat(uint64_t *cntr, uint64_t *prev_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)
@@ -5363,5 +5392,17 @@ int bnxt_hwrm_ring_stats(struct bnxt *bp, uint32_t cid, int idx,
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);
@@ -5373,6 +5414,4 @@ int bnxt_hwrm_ring_stats(struct bnxt *bp, uint32_t cid, int idx,
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,
@@ -5423,6 +5462,4 @@ int bnxt_hwrm_ring_stats(struct bnxt *bp, uint32_t cid, int idx,
&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,
@@ -5459,4 +5496,36 @@ int bnxt_hwrm_ring_stats(struct bnxt *bp, uint32_t cid, int idx,
}
+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)
@@ -5466,4 +5535,17 @@ int bnxt_hwrm_ring_stats_ext(struct bnxt *bp, uint32_t cid, int idx,
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);
@@ -5474,6 +5556,4 @@ int bnxt_hwrm_ring_stats_ext(struct bnxt *bp, uint32_t cid, int idx,
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,
@@ -5532,6 +5612,4 @@ int bnxt_hwrm_ring_stats_ext(struct bnxt *bp, uint32_t cid, int idx,
&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,
diff --git a/drivers/net/bnxt/bnxt_stats.c b/drivers/net/bnxt/bnxt_stats.c
index 88cfbaf9ff..7b96cf0df9 100644
--- a/drivers/net/bnxt/bnxt_stats.c
+++ b/drivers/net/bnxt/bnxt_stats.c
@@ -718,7 +718,4 @@ int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,
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, qstats);
--
2.53.0
---
Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- - 2026-03-19 10:01:07.783495037 +0000
+++ 0022-net-bnxt-support-statistics-query-when-port-is-stopp.patch 2026-03-19 10:01:07.084331262 +0000
@@ -1 +1 @@
-From 898248fc42871748ae068e94b7a4d6aed28dec5f Mon Sep 17 00:00:00 2001
+From d87710e399e8d6f6de62cd5f5a5316b562ca3a26 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 3c618c6e82..6601ddf575 100644
@@ -104 +104 @@
-@@ -1768,5 +1776,4 @@ static int bnxt_dev_stop(struct rte_eth_dev *eth_dev)
+@@ -1759,5 +1767,4 @@ static int bnxt_dev_stop(struct rte_eth_dev *eth_dev)
@@ -110 +110 @@
-@@ -1999,4 +2006,6 @@ static int bnxt_dev_close_op(struct rte_eth_dev *eth_dev)
+@@ -1967,4 +1974,6 @@ static int bnxt_dev_close_op(struct rte_eth_dev *eth_dev)
@@ -118 +118 @@
-index 3632bebbd6..53b0c8ec25 100644
+index 0cef22b5ec..ac5cbbae0c 100644
More information about the stable
mailing list