<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
Hi,</div>
<div id="appendonsend"></div>
<div style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
<br>
</div>
<hr style="display: inline-block; width: 98%;">
<div id="divRplyFwdMsg">
<div style="direction: ltr; font-family: Calibri, sans-serif; font-size: 11pt; color: rgb(0, 0, 0);" class="elementToProof">
<b>From:</b> Bruce Richardson <bruce.richardson@intel.com><br>
<b>Sent:</b> Tuesday, September 23, 2025 10:12 PM<br>
<b>To:</b> dev@dpdk.org <dev@dpdk.org><br>
<b>Cc:</b> Bruce Richardson <bruce.richardson@intel.com>; John W. Linville <linville@tuxdriver.com>; Ciara Loftus <ciara.loftus@intel.com>; Maryam Tahhan <mtahhan@redhat.com>; shepard.siegel <shepard.siegel@atomicrules.com>; Ed Czeck <ed.czeck@atomicrules.com>;
 John Miller <john.miller@atomicrules.com>; Igor Russkikh <irusskikh@marvell.com>; Steven Webster <steven.webster@windriver.com>; Matt Peters <matt.peters@windriver.com>; Selwin Sebastian <selwin.sebastian@amd.com>; Julien Aube <julien_dpdk@jaube.fr>; Ajit
 Khaparde <ajit.khaparde@broadcom.com>; Somnath Kotur <somnath.kotur@broadcom.com>; Chas Williams <3chas3@gmail.com>; Min Hu (Connor) <humin29@huawei.com>; Nithin Dabilpuram <ndabilpuram@marvell.com>; Kiran Kumar K <kirankumark@marvell.com>; Sunil Kumar Kori
 <skori@marvell.com>; Satha Rao <skoteshwar@marvell.com>; Harman Kalra <hkalra@marvell.com>; Potnuri Bharat Teja <bharat@chelsio.com>; Hemant Agrawal <hemant.agrawal@nxp.com>; Sachin Saxena <sachin.saxena@nxp.com>; Shai Brandes <shaibran@amazon.com>; Evgeny
 Schemeilin <evgenys@amazon.com>; Ron Beider <rbeider@amazon.com>; Amit Bernstein <amitbern@amazon.com>; Wajeeh Atrash <atrwajee@amazon.com>; Gagandeep Singh <g.singh@nxp.com>; Apeksha Gupta <apeksha.gupta@nxp.com>; John Daley <johndale@cisco.com>; Hyong Youb
 Kim <hyonkim@cisco.com>; Gaetan Rivet <grive@u256.net>; Jeroen de Borst <jeroendb@google.com>; Joshua Washington <joshwash@google.com>; Ziyang Xuan <xuanziyang2@huawei.com>; Xiaoyun Wang <cloud.wangxiaoyun@huawei.com>; Xingui Yang <yangxingui@huawei.com>;
 Chengwen Feng <fengchengwen@huawei.com>; Praveen Shetty <praveen.shetty@intel.com>; Vladimir Medvedkin <vladimir.medvedkin@intel.com>; Anatoly Burakov <anatoly.burakov@intel.com>; Jingjing Wu <jingjing.wu@intel.com>; Xu, Rosen <rosen.xu@altera.com>; Andrew
 Boyer <andrew.boyer@amd.com>; Long Li <longli@microsoft.com>; Wei Hu <weh@microsoft.com>; Jakub Grajciar <jgrajcia@cisco.com>; Matan Azrad <matan@nvidia.com>; Viacheslav Ovsiienko <viacheslavo@nvidia.com>; Dariusz Sosnowski <dsosnowski@nvidia.com>; Bing Zhao
 <bingz@nvidia.com>; Ori Kam <orika@nvidia.com>; Suanming Mou <suanmingm@nvidia.com>; Zyta Szpak <zyta@marvell.com>; Liron Himi <lironh@marvell.com>; Chaoyong He <chaoyong.he@corigine.com>; Jiawen Wu <jiawenwu@trustnetic.com>; Zaiyu Wang <zaiyuwang@trustnetic.com>;
 Christian Koue Muf <ckm@napatech.com>; Serhii Iliushyk <sil-plv@napatech.com>; Tetsuya Mukawa <mtetsuyah@gmail.com>; Vamsi Attunuru <vattunuru@marvell.com>; Devendra Singh Rawat <dsinghrawat@marvell.com>; Alok Prasad <palok@marvell.com>; Howard Wang <howard_wang@realsil.com.cn>;
 Chunhao Lin <hau@realtek.com>; Xing Wang <xing_wang@realsil.com.cn>; Wenbo Cao <caowenbo@mucse.com>; Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>; Stephen Hemminger <stephen@networkplumber.org>; Jerin Jacob <jerinj@marvell.com>; Maciej Czekaj <mczekaj@marvell.com>;
 Jian Wang <jianwang@trustnetic.com>; Maxime Coquelin <maxime.coquelin@redhat.com>; Chenbo Xia <chenbox@nvidia.com>; Jochen Behrens <jochen.behrens@broadcom.com>; Renyong Wan <wanry@yunsilicon.com>; Na Na <nana@yunsilicon.com>; Rong Qian <qianr@yunsilicon.com>;
 Xiaoxiong Zhang <zhangxx@yunsilicon.com>; Dongwei Xu <xudw@yunsilicon.com>; Junlong Wang <wang.junlong1@zte.com.cn>; Lijie Shan <shan.lijie@zte.com.cn><br>
<b>Subject:</b> [RFC PATCH 4/6] drivers/net: update to remove queue stats from eth stats</div>
<div style="direction: ltr;"> </div>
</div>
<div style="font-size: 11pt;" class="elementToProof">Now that we have removed the queue stats from the ethdev stats, we need<br>
to update the various PMDs to take account of the changes.<br>
<br>
Update each stats_get function to take the extra parameters for qstats,<br>
just marking it as unused if the driver does not fill in queue stats.<br>
For those that do complete queue stats, update the structure reference<br>
as appropriate.<br>
<br>
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com><br>
---<br>
 drivers/net/af_packet/rte_eth_af_packet.c     |  13 +-<br>
 drivers/net/af_xdp/rte_eth_af_xdp.c           |  35 +++--<br>
 drivers/net/ark/ark_ethdev.c                  |  36 +++--<br>
 drivers/net/ark/ark_ethdev_rx.c               |  14 +-<br>
 drivers/net/ark/ark_ethdev_rx.h               |   3 +-<br>
 drivers/net/ark/ark_ethdev_tx.c               |  12 +-<br>
 drivers/net/ark/ark_ethdev_tx.h               |   3 +-<br>
 drivers/net/atlantic/atl_ethdev.c             |  19 +--<br>
 drivers/net/atlantic/atl_types.h              |   1 +<br>
 drivers/net/avp/avp_ethdev.c                  |  20 ++-<br>
 drivers/net/axgbe/axgbe_ethdev.c              |  22 +--<br>
 drivers/net/axgbe/axgbe_ethdev.h              |   1 +<br>
 drivers/net/bnx2x/bnx2x_ethdev.c              |   3 +-<br>
 drivers/net/bnxt/bnxt_reps.c                  |  14 +-<br>
 drivers/net/bnxt/bnxt_reps.h                  |   2 +-<br>
 drivers/net/bnxt/bnxt_stats.c                 | 133 ++++++++++--------<br>
 drivers/net/bnxt/bnxt_stats.h                 |   2 +-<br>
 drivers/net/bonding/rte_eth_bond_pmd.c        |  14 +-<br>
 drivers/net/cnxk/cnxk_ethdev.h                |   3 +-<br>
 drivers/net/cnxk/cnxk_rep.h                   |   3 +-<br>
 drivers/net/cnxk/cnxk_rep_ops.c               |  15 +-<br>
 drivers/net/cnxk/cnxk_stats.c                 |  49 ++++---<br>
 drivers/net/cxgbe/cxgbe_ethdev.c              |   3 +-<br>
 drivers/net/cxgbe/cxgbevf_ethdev.c            |   3 +-<br>
 drivers/net/dpaa/dpaa_ethdev.c                |   3 +-<br>
 drivers/net/dpaa2/dpaa2_ethdev.c              |  28 ++--<br>
 drivers/net/ena/ena_ethdev.c                  |  46 +++---<br>
 drivers/net/enetc/enetc_ethdev.c              |   4 +-<br>
 drivers/net/enetfec/enet_ethdev.c             |   3 +-<br>
 drivers/net/enic/enic.h                       |   3 +-<br>
 drivers/net/enic/enic_ethdev.c                |   4 +-<br>
 drivers/net/enic/enic_main.c                  |   3 +-<br>
 drivers/net/enic/enic_vf_representor.c        |   3 +-<br>
 drivers/net/failsafe/failsafe_ether.c         |   9 --<br>
 drivers/net/failsafe/failsafe_ops.c           |   3 +-<br>
 drivers/net/gve/gve_ethdev.c                  |   4 +-<br>
 drivers/net/hinic/hinic_pmd_ethdev.c          |  64 ++++++---<br>
 drivers/net/hns3/hns3_stats.c                 |   4 +-<br>
 drivers/net/hns3/hns3_stats.h                 |   3 +-<br>
 drivers/net/intel/cpfl/cpfl_ethdev.c          |   3 +-<br>
 drivers/net/intel/e1000/em_ethdev.c           |   7 +-<br>
 drivers/net/intel/e1000/igb_ethdev.c          |  14 +-<br>
 drivers/net/intel/e1000/igc_ethdev.c          |  33 +++--<br>
 drivers/net/intel/fm10k/fm10k_ethdev.c        |  27 ++--<br>
 drivers/net/intel/i40e/i40e_ethdev.c          |   5 +-<br>
 drivers/net/intel/i40e/i40e_vf_representor.c  |   2 +-<br>
 drivers/net/intel/iavf/iavf_ethdev.c          |   5 +-<br>
 drivers/net/intel/ice/ice_dcf_ethdev.c        |   3 +-<br>
 drivers/net/intel/ice/ice_ethdev.c            |   5 +-<br>
 drivers/net/intel/idpf/idpf_ethdev.c          |   3 +-<br>
 drivers/net/intel/ipn3ke/ipn3ke_representor.c |   3 +-<br>
 drivers/net/intel/ixgbe/ixgbe_ethdev.c        |  29 ++--<br>
 drivers/net/ionic/ionic_ethdev.c              |   6 +-<br>
 drivers/net/ionic/ionic_lif.c                 |  35 +++--<br>
 drivers/net/ionic/ionic_lif.h                 |   3 +-<br>
 drivers/net/mana/mana.c                       |  15 +-<br>
 drivers/net/memif/rte_eth_memif.c             |  15 +-<br>
 drivers/net/mlx4/mlx4.h                       |   3 +-<br>
 drivers/net/mlx4/mlx4_ethdev.c                |  17 +--<br>
 drivers/net/mlx5/mlx5.h                       |   3 +-<br>
 drivers/net/mlx5/mlx5_stats.c                 |  17 +--<br>
 drivers/net/mvneta/mvneta_ethdev.c            |   5 +-<br>
 drivers/net/mvpp2/mrvl_ethdev.c               |  23 +--<br>
 drivers/net/netvsc/hn_ethdev.c                |  17 +--<br>
 drivers/net/netvsc/hn_var.h                   |   3 +-<br>
 drivers/net/netvsc/hn_vf.c                    |   3 +-<br>
 drivers/net/nfp/flower/nfp_flower.c           |   8 +-<br>
 .../net/nfp/flower/nfp_flower_representor.c   |  19 +--<br>
 .../net/nfp/flower/nfp_flower_representor.h   |   3 +<br>
 drivers/net/nfp/nfp_net_common.c              |  46 +++---<br>
 drivers/net/nfp/nfp_net_common.h              |   4 +-<br>
 drivers/net/ngbe/ngbe_ethdev.c                |  53 +++----<br>
 drivers/net/ngbe/ngbe_ethdev_vf.c             |   5 +-<br>
 drivers/net/ntnic/ntnic_ethdev.c              |  22 +--<br>
 drivers/net/null/rte_eth_null.c               |  15 +-<br>
 drivers/net/octeon_ep/otx_ep_ethdev.c         |  17 ++-<br>
 drivers/net/octeontx/octeontx_ethdev.c        |   3 +-<br>
 drivers/net/pcap/pcap_ethdev.c                |  23 +--<br>
 drivers/net/pfe/pfe_ethdev.c                  |   3 +-<br>
 drivers/net/qede/qede_ethdev.c                |  23 ++-<br>
 drivers/net/r8169/r8169_ethdev.c              |   6 +-<br>
 drivers/net/ring/rte_eth_ring.c               |  13 +-<br>
 drivers/net/rnp/rnp_ethdev.c                  |  15 +-<br>
 drivers/net/sfc/sfc_ethdev.c                  |   3 +-<br>
 drivers/net/sfc/sfc_repr.c                    |   3 +-<br>
 drivers/net/tap/rte_eth_tap.c                 |  23 +--<br>
 drivers/net/thunderx/nicvf_ethdev.c           |  27 ++--<br>
 drivers/net/txgbe/txgbe_ethdev.c              |  53 +++----<br>
 drivers/net/txgbe/txgbe_ethdev_vf.c           |   5 +-<br>
 drivers/net/vhost/rte_eth_vhost.c             |  26 ++--<br>
 drivers/net/virtio/virtio_ethdev.c            |  23 +--<br>
 drivers/net/vmxnet3/vmxnet3_ethdev.c          |  20 +--<br>
 drivers/net/xsc/xsc_ethdev.c                  |  19 +--<br>
 drivers/net/zxdh/zxdh_ethdev_ops.c            |  39 ++---<br>
 drivers/net/zxdh/zxdh_ethdev_ops.h            |   3 +-<br>
 95 files changed, 828 insertions(+), 605 deletions(-)<br>
<br>
diff --git a/drivers/net/af_packet/rte_eth_af_packet.c b/drivers/net/af_packet/rte_eth_af_packet.c<br>
index 85bc1201b4..88eb705a48 100644<br>
--- a/drivers/net/af_packet/rte_eth_af_packet.c<br>
+++ b/drivers/net/af_packet/rte_eth_af_packet.c<br>
@@ -426,7 +426,7 @@ packet_drop_count(int sockfd)<br>
 }<br>
 <br>
 static int<br>
-eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats, struct eth_queue_stats *qstats)<br>
 {<br>
         unsigned int i;<br>
         unsigned long rx_total = 0, rx_dropped_total = 0, rx_nombuf_total = 0;<br>
@@ -448,11 +448,12 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
                 tx_err_total += internal->tx_queue[i].err_pkts;<br>
                 tx_bytes_total += internal->tx_queue[i].tx_bytes;<br>
 <br>
-               if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
-                       stats->q_ipackets[i] = internal->rx_queue[i].rx_pkts;<br>
-                       stats->q_ibytes[i] = internal->rx_queue[i].rx_bytes;<br>
-                       stats->q_opackets[i] = internal->tx_queue[i].tx_pkts;<br>
-                       stats->q_obytes[i] = internal->tx_queue[i].tx_bytes;<br>
+               if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                       qstats->q_ipackets[i] = internal->rx_queue[i].rx_pkts;<br>
+                       qstats->q_ibytes[i] = internal->rx_queue[i].rx_bytes;<br>
+                       qstats->q_opackets[i] = internal->tx_queue[i].tx_pkts;<br>
+                       qstats->q_obytes[i] = internal->tx_queue[i].tx_bytes;<br>
+                       qstats->q_errors[i] = internal->rx_queue[i].rx_nombuf;<br>
                 }<br>
         }<br>
 <br>
diff --git a/drivers/net/af_xdp/rte_eth_af_xdp.c b/drivers/net/af_xdp/rte_eth_af_xdp.c<br>
index f68895c93c..f2a8fb95d1 100644<br>
--- a/drivers/net/af_xdp/rte_eth_af_xdp.c<br>
+++ b/drivers/net/af_xdp/rte_eth_af_xdp.c<br>
@@ -892,7 +892,8 @@ eth_dev_info(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)<br>
 }<br>
 <br>
 static int<br>
-eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats)<br>
 {<br>
         struct pmd_internals *internals = dev->data->dev_private;<br>
         struct pmd_process_private *process_private = dev->process_private;<br>
@@ -901,20 +902,25 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
         struct pkt_tx_queue *txq;<br>
         socklen_t optlen;<br>
         int i, ret, fd;<br>
+       unsigned long ipackets = 0, ibytes = 0, opackets = 0, obytes = 0;<br>
+       unsigned long oerrors = 0, imissed = 0;<br>
 <br>
         for (i = 0; i < dev->data->nb_rx_queues; i++) {<br>
                 optlen = sizeof(struct xdp_statistics);<br>
                 rxq = &internals->rx_queues[i];<br>
                 txq = rxq->pair;<br>
-               stats->q_ipackets[i] = rxq->stats.rx_pkts;<br>
-               stats->q_ibytes[i] = rxq->stats.rx_bytes;<br>
 <br>
-               stats->q_opackets[i] = txq->stats.tx_pkts;<br>
-               stats->q_obytes[i] = txq->stats.tx_bytes;<br>
+               if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                       qstats->q_ipackets[i] = rxq->stats.rx_pkts;<br>
+                       qstats->q_ibytes[i] = rxq->stats.rx_bytes;<br>
+                       qstats->q_opackets[i] = txq->stats.tx_pkts;<br>
+                       qstats->q_obytes[i] = txq->stats.tx_bytes;<br>
+                       qstats->q_errors[i] = 0; /* Not used */<br>
+               }<br>
 <br>
-               stats->ipackets += stats->q_ipackets[i];<br>
-               stats->ibytes += stats->q_ibytes[i];<br>
-               stats->oerrors += txq->stats.tx_dropped;<br>
+               ipackets += rxq->stats.rx_pkts;<br>
+               ibytes += rxq->stats.rx_bytes;<br>
+               oerrors += txq->stats.tx_dropped;<br>
                 fd = process_private->rxq_xsk_fds[i];<br>
                 ret = fd >= 0 ? getsockopt(fd, SOL_XDP, XDP_STATISTICS,<br>
                                            &xdp_stats, &optlen) : -1;<br>
@@ -922,12 +928,19 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
                         AF_XDP_LOG_LINE(ERR, "getsockopt() failed for XDP_STATISTICS.");<br>
                         return -1;<br>
                 }<br>
-               stats->imissed += xdp_stats.rx_dropped - rxq->stats.imissed_offset;<br>
+               imissed += xdp_stats.rx_dropped - rxq->stats.imissed_offset;<br>
 <br>
-               stats->opackets += stats->q_opackets[i];<br>
-               stats->obytes += stats->q_obytes[i];<br>
+               opackets += txq->stats.tx_pkts;<br>
+               obytes += txq->stats.tx_bytes;<br>
         }<br>
 <br>
+       stats->ipackets = ipackets;<br>
+       stats->ibytes = ibytes;<br>
+       stats->opackets = opackets;<br>
+       stats->obytes = obytes;<br>
+       stats->oerrors = oerrors;<br>
+       stats->imissed = imissed;<br>
+<br>
         return 0;<br>
 }<br>
 <br>
diff --git a/drivers/net/ark/ark_ethdev.c b/drivers/net/ark/ark_ethdev.c<br>
index c029dc46b3..02d6683ab9 100644<br>
--- a/drivers/net/ark/ark_ethdev.c<br>
+++ b/drivers/net/ark/ark_ethdev.c<br>
@@ -37,7 +37,8 @@ static int eth_ark_dev_link_update(struct rte_eth_dev *dev,<br>
 static int eth_ark_dev_set_link_up(struct rte_eth_dev *dev);<br>
 static int eth_ark_dev_set_link_down(struct rte_eth_dev *dev);<br>
 static int eth_ark_dev_stats_get(struct rte_eth_dev *dev,<br>
-                                 struct rte_eth_stats *stats);<br>
+                                 struct rte_eth_stats *stats,<br>
+                                 struct eth_queue_stats *qstats);<br>
 static int eth_ark_dev_stats_reset(struct rte_eth_dev *dev);<br>
 static int eth_ark_set_default_mac_addr(struct rte_eth_dev *dev,<br>
                                          struct rte_ether_addr *mac_addr);<br>
@@ -780,25 +781,36 @@ eth_ark_dev_set_link_down(struct rte_eth_dev *dev)<br>
 }<br>
 <br>
 static int<br>
-eth_ark_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+eth_ark_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats)<br>
 {<br>
         uint16_t i;<br>
         struct ark_adapter *ark = dev->data->dev_private;<br>
+       struct rte_eth_dev_data *data = dev->data;<br>
 <br>
-       stats->ipackets = 0;<br>
-       stats->ibytes = 0;<br>
-       stats->opackets = 0;<br>
-       stats->obytes = 0;<br>
-       stats->imissed = 0;<br>
-       stats->oerrors = 0;<br>
+       /* Initialize stats to 0 */<br>
+       memset(stats, 0, sizeof(*stats));<br>
 <br>
-       for (i = 0; i < dev->data->nb_tx_queues; i++)<br>
-               eth_tx_queue_stats_get(dev->data->tx_queues[i], stats);<br>
-       for (i = 0; i < dev->data->nb_rx_queues; i++)<br>
-               eth_rx_queue_stats_get(dev->data->rx_queues[i], stats);<br>
+       if (qstats)<br>
+               memset(qstats, 0, sizeof(*qstats));<br>
+<br>
+       /* Get stats for each RX queue */<br>
+       for (i = 0; i < data->nb_rx_queues; i++) {<br>
+               if (data->rx_queues[i])<br>
+                       eth_rx_queue_stats_get(data->rx_queues[i], stats, qstats);<br>
+       }<br>
+<br>
+       /* Get stats for each TX queue */<br>
+       for (i = 0; i < data->nb_tx_queues; i++) {<br>
+               if (data->tx_queues[i])<br>
+                       eth_tx_queue_stats_get(data->tx_queues[i], stats, qstats);<br>
+       }<br>
+<br>
+       /* Call user extension if registered */<br>
         if (ark->user_ext.stats_get)<br>
                 return ark->user_ext.stats_get(dev, stats,<br>
                         ark->user_data[dev->data->port_id]);<br>
+<br>
         return 0;<br>
 }<br>
 <br>
diff --git a/drivers/net/ark/ark_ethdev_rx.c b/drivers/net/ark/ark_ethdev_rx.c<br>
index 2fff0ffded..d7d480ac90 100644<br>
--- a/drivers/net/ark/ark_ethdev_rx.c<br>
+++ b/drivers/net/ark/ark_ethdev_rx.c<br>
@@ -560,13 +560,14 @@ eth_ark_dev_rx_queue_release(void *vqueue)<br>
 }<br>
 <br>
 void<br>
-eth_rx_queue_stats_get(void *vqueue, struct rte_eth_stats *stats)<br>
+eth_rx_queue_stats_get(void *vqueue, struct rte_eth_stats *stats,<br>
+                     struct eth_queue_stats *qstats)<br>
 {<br>
         struct ark_rx_queue *queue;<br>
         struct ark_udm_t *udm;<br>
 <br>
         queue = vqueue;<br>
-       if (queue == 0)<br>
+       if (queue == NULL)<br>
                 return;<br>
         udm = queue->udm;<br>
 <br>
@@ -574,12 +575,15 @@ eth_rx_queue_stats_get(void *vqueue, struct rte_eth_stats *stats)<br>
         uint64_t ipackets = ark_udm_packets(udm);<br>
         uint64_t idropped = ark_udm_dropped(queue->udm);<br>
 <br>
-       stats->q_ipackets[queue->queue_index] = ipackets;<br>
-       stats->q_ibytes[queue->queue_index] = ibytes;<br>
-       stats->q_errors[queue->queue_index] = idropped;<br>
         stats->ipackets += ipackets;<br>
         stats->ibytes += ibytes;<br>
         stats->imissed += idropped;<br>
+<br>
+       if (qstats && queue->queue_index < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+               qstats->q_ipackets[queue->queue_index] = ipackets;<br>
+               qstats->q_ibytes[queue->queue_index] = ibytes;<br>
+               qstats->q_errors[queue->queue_index] = idropped;<br>
+       }<br>
 }<br>
 <br>
 void<br>
diff --git a/drivers/net/ark/ark_ethdev_rx.h b/drivers/net/ark/ark_ethdev_rx.h<br>
index 12d4f61637..27b87445b1 100644<br>
--- a/drivers/net/ark/ark_ethdev_rx.h<br>
+++ b/drivers/net/ark/ark_ethdev_rx.h<br>
@@ -23,7 +23,8 @@ int eth_ark_rx_start_queue(struct rte_eth_dev *dev, uint16_t queue_id);<br>
 uint16_t eth_ark_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,<br>
                            uint16_t nb_pkts);<br>
 void eth_ark_dev_rx_queue_release(void *rx_queue);<br>
-void eth_rx_queue_stats_get(void *vqueue, struct rte_eth_stats *stats);<br>
+void eth_rx_queue_stats_get(void *vqueue, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats);<br>
 void eth_rx_queue_stats_reset(void *vqueue);<br>
 void eth_ark_rx_dump_queue(struct rte_eth_dev *dev, uint16_t queue_id,<br>
                            const char *msg);<br>
diff --git a/drivers/net/ark/ark_ethdev_tx.c b/drivers/net/ark/ark_ethdev_tx.c<br>
index ca6cd297a1..5c22de6080 100644<br>
--- a/drivers/net/ark/ark_ethdev_tx.c<br>
+++ b/drivers/net/ark/ark_ethdev_tx.c<br>
@@ -415,23 +415,29 @@ free_completed_tx(struct ark_tx_queue *queue)<br>
 <br>
 /* ************************************************************************* */<br>
 void<br>
-eth_tx_queue_stats_get(void *vqueue, struct rte_eth_stats *stats)<br>
+eth_tx_queue_stats_get(void *vqueue, struct rte_eth_stats *stats,<br>
+                     struct eth_queue_stats *qstats)<br>
 {<br>
         struct ark_tx_queue *queue;<br>
         struct ark_ddm_t *ddm;<br>
         uint64_t bytes, pkts;<br>
 <br>
         queue = vqueue;<br>
+       if (queue == NULL)<br>
+               return;<br>
         ddm = queue->ddm;<br>
 <br>
         bytes = ark_ddm_queue_byte_count(ddm);<br>
         pkts = ark_ddm_queue_pkt_count(ddm);<br>
 <br>
-       stats->q_opackets[queue->queue_index] = pkts;<br>
-       stats->q_obytes[queue->queue_index] = bytes;<br>
         stats->opackets += pkts;<br>
         stats->obytes += bytes;<br>
         stats->oerrors += queue->tx_errors;<br>
+<br>
+       if (qstats && queue->queue_index < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+               qstats->q_opackets[queue->queue_index] = pkts;<br>
+               qstats->q_obytes[queue->queue_index] = bytes;<br>
+       }<br>
 }<br>
 <br>
 void<br>
diff --git a/drivers/net/ark/ark_ethdev_tx.h b/drivers/net/ark/ark_ethdev_tx.h<br>
index 7134dbfeed..639ee8adb4 100644<br>
--- a/drivers/net/ark/ark_ethdev_tx.h<br>
+++ b/drivers/net/ark/ark_ethdev_tx.h<br>
@@ -21,7 +21,8 @@ int eth_ark_tx_queue_setup(struct rte_eth_dev *dev,<br>
 void eth_ark_tx_queue_release(void *vtx_queue);<br>
 int eth_ark_tx_queue_stop(struct rte_eth_dev *dev, uint16_t queue_id);<br>
 int eth_ark_tx_queue_start(struct rte_eth_dev *dev, uint16_t queue_id);<br>
-void eth_tx_queue_stats_get(void *vqueue, struct rte_eth_stats *stats);<br>
+void eth_tx_queue_stats_get(void *vqueue, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats);<br>
 void eth_tx_queue_stats_reset(void *vqueue);<br>
 <br>
 #endif<br>
diff --git a/drivers/net/atlantic/atl_ethdev.c b/drivers/net/atlantic/atl_ethdev.c<br>
index 9cde935834..2925dc2478 100644<br>
--- a/drivers/net/atlantic/atl_ethdev.c<br>
+++ b/drivers/net/atlantic/atl_ethdev.c<br>
@@ -33,7 +33,7 @@ static int atl_dev_xstats_get_names(struct rte_eth_dev *dev __rte_unused,<br>
                                     unsigned int size);<br>
 <br>
 static int atl_dev_stats_get(struct rte_eth_dev *dev,<br>
-                               struct rte_eth_stats *stats);<br>
+                               struct rte_eth_stats *stats, struct eth_queue_stats *qstats);<br>
 <br>
 static int atl_dev_xstats_get(struct rte_eth_dev *dev,<br>
                               struct rte_eth_xstat *stats, unsigned int n);<br>
@@ -930,7 +930,8 @@ int atl_macsec_select_rxsa(struct rte_eth_dev *dev,<br>
 }<br>
 <br>
 static int<br>
-atl_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+atl_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+                 struct eth_queue_stats *qstats)<br>
 {<br>
         struct atl_adapter *adapter = ATL_DEV_TO_ADAPTER(dev);<br>
         struct aq_hw_s *hw = &adapter->hw;<br>
@@ -951,12 +952,14 @@ atl_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
 <br>
         stats->rx_nombuf = swstats->rx_nombuf;<br>
 <br>
-       for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {<br>
-               stats->q_ipackets[i] = swstats->q_ipackets[i];<br>
-               stats->q_opackets[i] = swstats->q_opackets[i];<br>
-               stats->q_ibytes[i] = swstats->q_ibytes[i];<br>
-               stats->q_obytes[i] = swstats->q_obytes[i];<br>
-               stats->q_errors[i] = swstats->q_errors[i];<br>
+       if (qstats != NULL) {<br>
+               for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {<br>
+                       qstats->q_ipackets[i] = swstats->q_ipackets[i];<br>
+                       qstats->q_opackets[i] = swstats->q_opackets[i];<br>
+                       qstats->q_ibytes[i] = swstats->q_ibytes[i];<br>
+                       qstats->q_obytes[i] = swstats->q_obytes[i];<br>
+                       qstats->q_errors[i] = swstats->q_errors[i];<br>
+               }<br>
         }<br>
         return 0;<br>
 }<br>
diff --git a/drivers/net/atlantic/atl_types.h b/drivers/net/atlantic/atl_types.h<br>
index e813d9f326..dfd7016600 100644<br>
--- a/drivers/net/atlantic/atl_types.h<br>
+++ b/drivers/net/atlantic/atl_types.h<br>
@@ -13,6 +13,7 @@<br>
 #include <pthread.h><br>
 <br>
 #include <rte_common.h><br>
+#include <ethdev_driver.h><br>
 <br>
 typedef uint8_t         u8;<br>
 typedef int8_t          s8;<br>
diff --git a/drivers/net/avp/avp_ethdev.c b/drivers/net/avp/avp_ethdev.c<br>
index ed44c1645d..3bc5171336 100644<br>
--- a/drivers/net/avp/avp_ethdev.c<br>
+++ b/drivers/net/avp/avp_ethdev.c<br>
@@ -79,7 +79,8 @@ static void avp_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid);<br>
 static void avp_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid);<br>
 <br>
 static int avp_dev_stats_get(struct rte_eth_dev *dev,<br>
-                             struct rte_eth_stats *stats);<br>
+                             struct rte_eth_stats *stats,<br>
+                             struct eth_queue_stats *qstats);<br>
 static int avp_dev_stats_reset(struct rte_eth_dev *dev);<br>
 <br>
 <br>
@@ -2241,7 +2242,8 @@ avp_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask)<br>
 }<br>
 <br>
 static int<br>
-avp_dev_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats)<br>
+avp_dev_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats,<br>
+                 struct eth_queue_stats *qstats)<br>
 {<br>
         struct avp_dev *avp = AVP_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);<br>
         unsigned int i;<br>
@@ -2254,9 +2256,11 @@ avp_dev_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats)<br>
                         stats->ibytes += rxq->bytes;<br>
                         stats->ierrors += rxq->errors;<br>
 <br>
-                       stats->q_ipackets[i] += rxq->packets;<br>
-                       stats->q_ibytes[i] += rxq->bytes;<br>
-                       stats->q_errors[i] += rxq->errors;<br>
+                       if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                               qstats->q_ipackets[i] += rxq->packets;<br>
+                               qstats->q_ibytes[i] += rxq->bytes;<br>
+                               qstats->q_errors[i] += rxq->errors;<br>
+                       }<br>
                 }<br>
         }<br>
 <br>
@@ -2268,8 +2272,10 @@ avp_dev_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats)<br>
                         stats->obytes += txq->bytes;<br>
                         stats->oerrors += txq->errors;<br>
 <br>
-                       stats->q_opackets[i] += txq->packets;<br>
-                       stats->q_obytes[i] += txq->bytes;<br>
+                       if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                               qstats->q_opackets[i] += txq->packets;<br>
+                               qstats->q_obytes[i] += txq->bytes;<br>
+                       }<br>
                 }<br>
         }<br>
 <br>
diff --git a/drivers/net/axgbe/axgbe_ethdev.c b/drivers/net/axgbe/axgbe_ethdev.c<br>
index bc73536604..31d35ff182 100644<br>
--- a/drivers/net/axgbe/axgbe_ethdev.c<br>
+++ b/drivers/net/axgbe/axgbe_ethdev.c<br>
@@ -51,7 +51,8 @@ static int axgbe_dev_link_update(struct rte_eth_dev *dev,<br>
 static int axgbe_dev_get_regs(struct rte_eth_dev *dev,<br>
                               struct rte_dev_reg_info *regs);<br>
 static int axgbe_dev_stats_get(struct rte_eth_dev *dev,<br>
-                               struct rte_eth_stats *stats);<br>
+                               struct rte_eth_stats *stats,<br>
+                               struct eth_queue_stats *qstats);<br>
 static int axgbe_dev_stats_reset(struct rte_eth_dev *dev);<br>
 static int axgbe_dev_xstats_get(struct rte_eth_dev *dev,<br>
                                 struct rte_eth_xstat *stats,<br>
@@ -1133,7 +1134,7 @@ axgbe_dev_xstats_reset(struct rte_eth_dev *dev)<br>
 <br>
 static int<br>
 axgbe_dev_stats_get(struct rte_eth_dev *dev,<br>
-                   struct rte_eth_stats *stats)<br>
+                   struct rte_eth_stats *stats, struct eth_queue_stats *qstats)<br>
 {<br>
         struct axgbe_rx_queue *rxq;<br>
         struct axgbe_tx_queue *txq;<br>
@@ -1148,14 +1149,16 @@ axgbe_dev_stats_get(struct rte_eth_dev *dev,<br>
         for (i = 0; i < dev->data->nb_rx_queues; i++) {<br>
                 rxq = dev->data->rx_queues[i];<br>
                 if (rxq) {<br>
-                       stats->q_ipackets[i] = rxq->pkts;<br>
                         stats->ipackets += rxq->pkts;<br>
-                       stats->q_ibytes[i] = rxq->bytes;<br>
                         stats->ibytes += rxq->bytes;<br>
                         stats->rx_nombuf += rxq->rx_mbuf_alloc_failed;<br>
-                       stats->q_errors[i] = rxq->errors<br>
-                               + rxq->rx_mbuf_alloc_failed;<br>
                         stats->ierrors += rxq->errors;<br>
+<br>
+                       if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                               qstats->q_ipackets[i] = rxq->pkts;<br>
+                               qstats->q_ibytes[i] = rxq->bytes;<br>
+                               qstats->q_errors[i] = rxq->errors + rxq->rx_mbuf_alloc_failed;<br>
+                       }<br>
                 } else {<br>
                         PMD_DRV_LOG_LINE(DEBUG, "Rx queue not setup for port %d",<br>
                                         dev->data->port_id);<br>
@@ -1165,11 +1168,14 @@ axgbe_dev_stats_get(struct rte_eth_dev *dev,<br>
         for (i = 0; i < dev->data->nb_tx_queues; i++) {<br>
                 txq = dev->data->tx_queues[i];<br>
                 if (txq) {<br>
-                       stats->q_opackets[i] = txq->pkts;<br>
                         stats->opackets += txq->pkts;<br>
-                       stats->q_obytes[i] = txq->bytes;<br>
                         stats->obytes += txq->bytes;<br>
                         stats->oerrors += txq->errors;<br>
+<br>
+                       if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                               qstats->q_opackets[i] = txq->pkts;<br>
+                               qstats->q_obytes[i] = txq->bytes;<br>
+                       }<br>
                 } else {<br>
                         PMD_DRV_LOG_LINE(DEBUG, "Tx queue not setup for port %d",<br>
                                         dev->data->port_id);<br>
diff --git a/drivers/net/axgbe/axgbe_ethdev.h b/drivers/net/axgbe/axgbe_ethdev.h<br>
index 5cd4317d7a..b94a7f3562 100644<br>
--- a/drivers/net/axgbe/axgbe_ethdev.h<br>
+++ b/drivers/net/axgbe/axgbe_ethdev.h<br>
@@ -8,6 +8,7 @@<br>
 <br>
 #include <rte_mempool.h><br>
 #include <rte_lcore.h><br>
+#include <ethdev_driver.h><br>
 #include "axgbe_common.h"<br>
 #include "rte_time.h"<br>
 <br>
diff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c<br>
index 1327cbe912..5e2e555525 100644<br>
--- a/drivers/net/bnx2x/bnx2x_ethdev.c<br>
+++ b/drivers/net/bnx2x/bnx2x_ethdev.c<br>
@@ -427,7 +427,8 @@ bnx2xvf_dev_link_update(struct rte_eth_dev *dev, __rte_unused int wait_to_comple<br>
 }<br>
 <br>
 static int<br>
-bnx2x_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+bnx2x_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+                   struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct bnx2x_softc *sc = dev->data->dev_private;<br>
         uint32_t brb_truncate_discard;<br>
diff --git a/drivers/net/bnxt/bnxt_reps.c b/drivers/net/bnxt/bnxt_reps.c<br>
index 6f5c3f80eb..bd3bfb8209 100644<br>
--- a/drivers/net/bnxt/bnxt_reps.c<br>
+++ b/drivers/net/bnxt/bnxt_reps.c<br>
@@ -877,7 +877,7 @@ void bnxt_rep_tx_queue_release_op(struct rte_eth_dev *dev, uint16_t queue_idx)<br>
 }<br>
 <br>
 int bnxt_rep_stats_get_op(struct rte_eth_dev *eth_dev,<br>
-                            struct rte_eth_stats *stats)<br>
+                            struct rte_eth_stats *stats, struct eth_queue_stats *qstats)<br>
 {<br>
         struct bnxt_representor *rep_bp = eth_dev->data->dev_private;<br>
         unsigned int i;<br>
@@ -890,11 +890,13 @@ int bnxt_rep_stats_get_op(struct rte_eth_dev *eth_dev,<br>
                 stats->ipackets += rep_bp->rx_pkts[i];<br>
                 stats->imissed += rep_bp->rx_drop_pkts[i];<br>
 <br>
-               stats->q_ipackets[i] = rep_bp->rx_pkts[i];<br>
-               stats->q_ibytes[i] = rep_bp->rx_bytes[i];<br>
-               stats->q_opackets[i] = rep_bp->tx_pkts[i];<br>
-               stats->q_obytes[i] = rep_bp->tx_bytes[i];<br>
-               stats->q_errors[i] = rep_bp->rx_drop_pkts[i];<br>
+               if (qstats) {<br>
+                       qstats->q_ipackets[i] = rep_bp->rx_pkts[i];<br>
+                       qstats->q_ibytes[i] = rep_bp->rx_bytes[i];<br>
+                       qstats->q_opackets[i] = rep_bp->tx_pkts[i];<br>
+                       qstats->q_obytes[i] = rep_bp->tx_bytes[i];<br>
+                       qstats->q_errors[i] = rep_bp->rx_drop_pkts[i];<br>
+               }<br>
         }<br>
 <br>
         return 0;<br>
diff --git a/drivers/net/bnxt/bnxt_reps.h b/drivers/net/bnxt/bnxt_reps.h<br>
index 3f2db9d1ae..1615ecf11c 100644<br>
--- a/drivers/net/bnxt/bnxt_reps.h<br>
+++ b/drivers/net/bnxt/bnxt_reps.h<br>
@@ -47,7 +47,7 @@ void bnxt_rep_tx_queue_release_op(struct rte_eth_dev *dev, uint16_t queue_idx);<br>
 int  bnxt_rep_dev_stop_op(struct rte_eth_dev *eth_dev);<br>
 int bnxt_rep_dev_close_op(struct rte_eth_dev *eth_dev);<br>
 int bnxt_rep_stats_get_op(struct rte_eth_dev *eth_dev,<br>
-                            struct rte_eth_stats *stats);<br>
+                            struct rte_eth_stats *stats, struct eth_queue_stats *qstats);<br>
 int bnxt_rep_stats_reset_op(struct rte_eth_dev *eth_dev);<br>
 int bnxt_rep_stop_all(struct bnxt *bp);<br>
 #endif /* _BNXT_REPS_H_ */<br>
diff --git a/drivers/net/bnxt/bnxt_stats.c b/drivers/net/bnxt/bnxt_stats.c<br>
index 9d7cdf925d..53f5613eb3 100644<br>
--- a/drivers/net/bnxt/bnxt_stats.c<br>
+++ b/drivers/net/bnxt/bnxt_stats.c<br>
@@ -561,84 +561,95 @@ void bnxt_free_stats(struct bnxt *bp)<br>
 <br>
 static void bnxt_fill_rte_eth_stats_ext(struct rte_eth_stats *stats,<br>
                                         struct bnxt_ring_stats_ext *ring_stats,<br>
+                                       struct eth_queue_stats *qstats,<br>
                                         unsigned int i, bool rx)<br>
 {<br>
         if (rx) {<br>
-               stats->q_ipackets[i] = ring_stats->rx_ucast_pkts;<br>
-               stats->q_ipackets[i] += ring_stats->rx_mcast_pkts;<br>
-               stats->q_ipackets[i] += ring_stats->rx_bcast_pkts;<br>
-<br>
-               stats->ipackets += stats->q_ipackets[i];<br>
-<br>
-               stats->q_ibytes[i] = ring_stats->rx_ucast_bytes;<br>
-               stats->q_ibytes[i] += ring_stats->rx_mcast_bytes;<br>
-               stats->q_ibytes[i] += ring_stats->rx_bcast_bytes;<br>
-<br>
-               stats->ibytes += stats->q_ibytes[i];<br>
-<br>
-               stats->q_errors[i] = ring_stats->rx_discard_pkts;<br>
-               stats->q_errors[i] += ring_stats->rx_error_pkts;<br>
-<br>
+               uint64_t ipackets = ring_stats->rx_ucast_pkts +<br>
+                               ring_stats->rx_mcast_pkts +<br>
+                               ring_stats->rx_bcast_pkts;<br>
+               uint64_t ibytes = ring_stats->rx_ucast_bytes +<br>
+                               ring_stats->rx_mcast_bytes +<br>
+                               ring_stats->rx_bcast_bytes;<br>
+               uint64_t ierrors = ring_stats->rx_discard_pkts +<br>
+                               ring_stats->rx_error_pkts;<br>
+<br>
+               stats->ipackets += ipackets;<br>
+               stats->ibytes += ibytes;<br>
                 stats->imissed += ring_stats->rx_discard_pkts;<br>
                 stats->ierrors += ring_stats->rx_error_pkts;<br>
-       } else {<br>
-               stats->q_opackets[i] = ring_stats->tx_ucast_pkts;<br>
-               stats->q_opackets[i] += ring_stats->tx_mcast_pkts;<br>
-               stats->q_opackets[i] += ring_stats->tx_bcast_pkts;<br>
-<br>
-               stats->opackets += stats->q_opackets[i];<br>
-<br>
-               stats->q_obytes[i] = ring_stats->tx_ucast_bytes;<br>
-               stats->q_obytes[i] += ring_stats->tx_mcast_bytes;<br>
-               stats->q_obytes[i] += ring_stats->tx_bcast_bytes;<br>
-<br>
-               stats->obytes += stats->q_obytes[i];<br>
 <br>
+               if (qstats) {<br>
+                       qstats->q_ipackets[i] = ipackets;<br>
+                       qstats->q_ibytes[i] = ibytes;<br>
+                       qstats->q_errors[i] = ierrors;<br>
+               }<br>
+       } else {<br>
+               uint64_t opackets = ring_stats->tx_ucast_pkts +<br>
+                               ring_stats->tx_mcast_pkts +<br>
+                               ring_stats->tx_bcast_pkts;<br>
+               uint64_t obytes = ring_stats->tx_ucast_bytes +<br>
+                               ring_stats->tx_mcast_bytes +<br>
+                               ring_stats->tx_bcast_bytes;<br>
+<br>
+               stats->opackets += opackets;<br>
+               stats->obytes += obytes;<br>
                 stats->oerrors += ring_stats->tx_discard_pkts;<br>
+<br>
+               if (qstats) {<br>
+                       qstats->q_opackets[i] = opackets;<br>
+                       qstats->q_obytes[i] = obytes;<br>
+               }<br>
         }<br>
 }<br>
 <br>
 static void bnxt_fill_rte_eth_stats(struct rte_eth_stats *stats,<br>
                                     struct bnxt_ring_stats *ring_stats,<br>
+                                   struct eth_queue_stats *qstats,<br>
                                     unsigned int i, bool rx)<br>
 {<br>
         if (rx) {<br>
-               stats->q_ipackets[i] = ring_stats->rx_ucast_pkts;<br>
-               stats->q_ipackets[i] += ring_stats->rx_mcast_pkts;<br>
-               stats->q_ipackets[i] += ring_stats->rx_bcast_pkts;<br>
-<br>
-               stats->ipackets += stats->q_ipackets[i];<br>
-<br>
-               stats->q_ibytes[i] = ring_stats->rx_ucast_bytes;<br>
-               stats->q_ibytes[i] += ring_stats->rx_mcast_bytes;<br>
-               stats->q_ibytes[i] += ring_stats->rx_bcast_bytes;<br>
-<br>
-               stats->ibytes += stats->q_ibytes[i];<br>
-<br>
-               stats->q_errors[i] = ring_stats->rx_discard_pkts;<br>
-               stats->q_errors[i] += ring_stats->rx_error_pkts;<br>
-<br>
+               uint64_t ipackets = ring_stats->rx_ucast_pkts +<br>
+                               ring_stats->rx_mcast_pkts +<br>
+                               ring_stats->rx_bcast_pkts;<br>
+               uint64_t ibytes = ring_stats->rx_ucast_bytes +<br>
+                               ring_stats->rx_mcast_bytes +<br>
+                               ring_stats->rx_bcast_bytes;<br>
+               uint64_t ierrors = ring_stats->rx_discard_pkts +<br>
+                               ring_stats->rx_error_pkts;<br>
+<br>
+               stats->ipackets += ipackets;<br>
+               stats->ibytes += ibytes;<br>
                 stats->imissed += ring_stats->rx_discard_pkts;<br>
                 stats->ierrors += ring_stats->rx_error_pkts;<br>
-       } else {<br>
-               stats->q_opackets[i] = ring_stats->tx_ucast_pkts;<br>
-               stats->q_opackets[i] += ring_stats->tx_mcast_pkts;<br>
-               stats->q_opackets[i] += ring_stats->tx_bcast_pkts;<br>
-<br>
-               stats->opackets += stats->q_opackets[i];<br>
-<br>
-               stats->q_obytes[i] = ring_stats->tx_ucast_bytes;<br>
-               stats->q_obytes[i] += ring_stats->tx_mcast_bytes;<br>
-               stats->q_obytes[i] += ring_stats->tx_bcast_bytes;<br>
-<br>
-               stats->obytes += stats->q_obytes[i];<br>
 <br>
+               if (qstats) {<br>
+                       qstats->q_ipackets[i] = ipackets;<br>
+                       qstats->q_ibytes[i] = ibytes;<br>
+                       qstats->q_errors[i] = ierrors;<br>
+               }<br>
+       } else {<br>
+               uint64_t opackets = ring_stats->tx_ucast_pkts +<br>
+                               ring_stats->tx_mcast_pkts +<br>
+                               ring_stats->tx_bcast_pkts;<br>
+               uint64_t obytes = ring_stats->tx_ucast_bytes +<br>
+                               ring_stats->tx_mcast_bytes +<br>
+                               ring_stats->tx_bcast_bytes;<br>
+<br>
+               stats->opackets += opackets;<br>
+               stats->obytes += obytes;<br>
                 stats->oerrors += ring_stats->tx_discard_pkts;<br>
+<br>
+               if (qstats) {<br>
+                       qstats->q_opackets[i] = opackets;<br>
+                       qstats->q_obytes[i] = obytes;<br>
+               }<br>
         }<br>
 }<br>
 <br>
 static int bnxt_stats_get_ext(struct rte_eth_dev *eth_dev,<br>
-                                struct rte_eth_stats *bnxt_stats)<br>
+                                struct rte_eth_stats *bnxt_stats,<br>
+                                struct eth_queue_stats *qstats)<br>
 {<br>
         int rc = 0;<br>
         unsigned int i;<br>
@@ -661,7 +672,7 @@ static int bnxt_stats_get_ext(struct rte_eth_dev *eth_dev,<br>
                 if (unlikely(rc))<br>
                         return rc;<br>
 <br>
-               bnxt_fill_rte_eth_stats_ext(bnxt_stats, &ring_stats, i, true);<br>
+               bnxt_fill_rte_eth_stats_ext(bnxt_stats, &ring_stats, qstats, i, true);<br>
                 bnxt_stats->rx_nombuf +=<br>
                                 rte_atomic_load_explicit(&rxq->rx_mbuf_alloc_fail,<br>
                                                          rte_memory_order_relaxed);<br>
@@ -683,14 +694,14 @@ static int bnxt_stats_get_ext(struct rte_eth_dev *eth_dev,<br>
                 if (unlikely(rc))<br>
                         return rc;<br>
 <br>
-               bnxt_fill_rte_eth_stats_ext(bnxt_stats, &ring_stats, i, false);<br>
+               bnxt_fill_rte_eth_stats_ext(bnxt_stats, &ring_stats, qstats, i, false);<br>
         }<br>
 <br>
         return rc;<br>
 }<br>
 <br>
 int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,<br>
-                     struct rte_eth_stats *bnxt_stats)<br>
+                     struct rte_eth_stats *bnxt_stats, struct eth_queue_stats *qstats)<br>
 {<br>
         int rc = 0;<br>
         unsigned int i;<br>
@@ -705,7 +716,7 @@ int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,<br>
                 return -EIO;<br>
 <br>
         if (BNXT_TPA_V2_P7(bp))<br>
-               return bnxt_stats_get_ext(eth_dev, bnxt_stats);<br>
+               return bnxt_stats_get_ext(eth_dev, bnxt_stats, qstats);<br>
 <br>
         num_q_stats = RTE_MIN(bp->rx_cp_nr_rings,<br>
                               (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
@@ -723,7 +734,7 @@ int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,<br>
                 if (unlikely(rc))<br>
                         return rc;<br>
 <br>
-               bnxt_fill_rte_eth_stats(bnxt_stats, &ring_stats, i, true);<br>
+               bnxt_fill_rte_eth_stats(bnxt_stats, &ring_stats, qstats, i, true);<br>
                 bnxt_stats->rx_nombuf +=<br>
                                 rte_atomic_load_explicit(&rxq->rx_mbuf_alloc_fail,<br>
                                                          rte_memory_order_relaxed);<br>
@@ -745,7 +756,7 @@ int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,<br>
                 if (unlikely(rc))<br>
                         return rc;<br>
 <br>
-               bnxt_fill_rte_eth_stats(bnxt_stats, &ring_stats, i, false);<br>
+               bnxt_fill_rte_eth_stats(bnxt_stats, &ring_stats, qstats, i, false);<br>
                 bnxt_stats->oerrors +=<br>
                                 rte_atomic_load_explicit(&txq->tx_mbuf_drop,<br>
                                                          rte_memory_order_relaxed);<br>
diff --git a/drivers/net/bnxt/bnxt_stats.h b/drivers/net/bnxt/bnxt_stats.h<br>
index e46c05eed3..c0508e773a 100644<br>
--- a/drivers/net/bnxt/bnxt_stats.h<br>
+++ b/drivers/net/bnxt/bnxt_stats.h<br>
@@ -10,7 +10,7 @@<br>
 <br>
 void bnxt_free_stats(struct bnxt *bp);<br>
 int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,<br>
-                          struct rte_eth_stats *bnxt_stats);<br>
+                          struct rte_eth_stats *bnxt_stats, struct eth_queue_stats *qstats);<br>
 int bnxt_stats_reset_op(struct rte_eth_dev *eth_dev);<br>
 int bnxt_dev_xstats_get_names_op(struct rte_eth_dev *eth_dev,<br>
         struct rte_eth_xstat_name *xstats_names,<br>
diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c<br>
index 4906701a95..b7bab6bc99 100644<br>
--- a/drivers/net/bonding/rte_eth_bond_pmd.c<br>
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c<br>
@@ -2636,11 +2636,12 @@ bond_ethdev_link_update(struct rte_eth_dev *ethdev, int wait_to_complete)<br>
 <br>
 <br>
 static int<br>
-bond_ethdev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+bond_ethdev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+                     struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct bond_dev_private *internals = dev->data->dev_private;<br>
         struct rte_eth_stats member_stats;<br>
-       int i, j;<br>
+       int i;<br>
 <br>
         for (i = 0; i < internals->member_count; i++) {<br>
                 rte_eth_stats_get(internals->members[i].port_id, &member_stats);<br>
@@ -2653,15 +2654,6 @@ bond_ethdev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
                 stats->ierrors += member_stats.ierrors;<br>
                 stats->oerrors += member_stats.oerrors;<br>
                 stats->rx_nombuf += member_stats.rx_nombuf;<br>
-<br>
-               for (j = 0; j < RTE_ETHDEV_QUEUE_STAT_CNTRS; j++) {<br>
-                       stats->q_ipackets[j] += member_stats.q_ipackets[j];<br>
-                       stats->q_opackets[j] += member_stats.q_opackets[j];<br>
-                       stats->q_ibytes[j] += member_stats.q_ibytes[j];<br>
-                       stats->q_obytes[j] += member_stats.q_obytes[j];<br>
-                       stats->q_errors[j] += member_stats.q_errors[j];<br>
-               }<br>
-<br>
         }<br>
 <br>
         return 0;<br>
diff --git a/drivers/net/cnxk/cnxk_ethdev.h b/drivers/net/cnxk/cnxk_ethdev.h<br>
index 7868185768..67867c889b 100644<br>
--- a/drivers/net/cnxk/cnxk_ethdev.h<br>
+++ b/drivers/net/cnxk/cnxk_ethdev.h<br>
@@ -682,7 +682,8 @@ int cnxk_nix_link_update(struct rte_eth_dev *eth_dev, int wait_to_complete);<br>
 int cnxk_nix_queue_stats_mapping(struct rte_eth_dev *dev, uint16_t queue_id,<br>
                                  uint8_t stat_idx, uint8_t is_rx);<br>
 int cnxk_nix_stats_reset(struct rte_eth_dev *dev);<br>
-int cnxk_nix_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);<br>
+int cnxk_nix_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+                      struct eth_queue_stats *qstats);<br>
 int cnxk_nix_xstats_get(struct rte_eth_dev *eth_dev,<br>
                         struct rte_eth_xstat *xstats, unsigned int n);<br>
 int cnxk_nix_xstats_get_names(struct rte_eth_dev *eth_dev,<br>
diff --git a/drivers/net/cnxk/cnxk_rep.h b/drivers/net/cnxk/cnxk_rep.h<br>
index b9601854ce..9ede1e6dad 100644<br>
--- a/drivers/net/cnxk/cnxk_rep.h<br>
+++ b/drivers/net/cnxk/cnxk_rep.h<br>
@@ -130,7 +130,8 @@ void cnxk_rep_rx_queue_release(struct rte_eth_dev *dev, uint16_t queue_idx);<br>
 void cnxk_rep_tx_queue_release(struct rte_eth_dev *dev, uint16_t queue_idx);<br>
 int cnxk_rep_dev_stop(struct rte_eth_dev *eth_dev);<br>
 int cnxk_rep_dev_close(struct rte_eth_dev *eth_dev);<br>
-int cnxk_rep_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats);<br>
+int cnxk_rep_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats,<br>
+                      struct eth_queue_stats *qstats);<br>
 int cnxk_rep_stats_reset(struct rte_eth_dev *eth_dev);<br>
 int cnxk_rep_flow_ops_get(struct rte_eth_dev *ethdev, const struct rte_flow_ops **ops);<br>
 int cnxk_rep_state_update(struct cnxk_eswitch_dev *eswitch_dev, uint32_t state, uint16_t *rep_id);<br>
diff --git a/drivers/net/cnxk/cnxk_rep_ops.c b/drivers/net/cnxk/cnxk_rep_ops.c<br>
index c88d28ff72..c481015592 100644<br>
--- a/drivers/net/cnxk/cnxk_rep_ops.c<br>
+++ b/drivers/net/cnxk/cnxk_rep_ops.c<br>
@@ -574,7 +574,8 @@ native_repte_eth_stats(struct cnxk_rep_dev *rep_dev, struct rte_eth_stats *stats<br>
 }<br>
 <br>
 int<br>
-cnxk_rep_stats_get(struct rte_eth_dev *ethdev, struct rte_eth_stats *stats)<br>
+cnxk_rep_stats_get(struct rte_eth_dev *ethdev, struct rte_eth_stats *stats,<br>
+                  struct eth_queue_stats *qstats)<br>
 {<br>
         struct cnxk_rep_dev *rep_dev = cnxk_rep_pmd_priv(ethdev);<br>
         struct rte_eth_stats vf_stats;<br>
@@ -612,13 +613,15 @@ cnxk_rep_stats_get(struct rte_eth_dev *ethdev, struct rte_eth_stats *stats)<br>
                 rte_memcpy(&vf_stats, adata.u.data, adata.size);<br>
         }<br>
 <br>
-       stats->q_ipackets[0] = vf_stats.ipackets;<br>
-       stats->q_ibytes[0] = vf_stats.ibytes;<br>
+       if (qstats != NULL) {<br>
+               qstats->q_ipackets[0] = vf_stats.ipackets;<br>
+               qstats->q_ibytes[0] = vf_stats.ibytes;<br>
+               qstats->q_opackets[0] = vf_stats.opackets;<br>
+               qstats->q_obytes[0] = vf_stats.obytes;<br>
+       }<br>
+<br>
         stats->ipackets = vf_stats.ipackets;<br>
         stats->ibytes = vf_stats.ibytes;<br>
-<br>
-       stats->q_opackets[0] = vf_stats.opackets;<br>
-       stats->q_obytes[0] = vf_stats.obytes;<br>
         stats->opackets = vf_stats.opackets;<br>
         stats->obytes = vf_stats.obytes;<br>
 <br>
diff --git a/drivers/net/cnxk/cnxk_stats.c b/drivers/net/cnxk/cnxk_stats.c<br>
index 469faff405..d57659ef51 100644<br>
--- a/drivers/net/cnxk/cnxk_stats.c<br>
+++ b/drivers/net/cnxk/cnxk_stats.c<br>
@@ -8,7 +8,8 @@<br>
 #define CNXK_NB_TXQ_STATS 4<br>
 <br>
 int<br>
-cnxk_nix_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats)<br>
+cnxk_nix_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats,<br>
+                  struct eth_queue_stats *qstats)<br>
 {<br>
         struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);<br>
         struct roc_nix *nix = &dev->nix;<br>
@@ -32,28 +33,30 @@ cnxk_nix_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats)<br>
         stats->ibytes = nix_stats.rx_octs;<br>
         stats->ierrors = nix_stats.rx_err;<br>
 <br>
-       for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {<br>
-               struct roc_nix_stats_queue qstats;<br>
-               uint16_t qidx;<br>
-<br>
-               if (dev->txq_stat_map[i] & (1U << 31)) {<br>
-                       qidx = dev->txq_stat_map[i] & 0xFFFF;<br>
-                       rc = roc_nix_stats_queue_get(nix, qidx, 0, &qstats);<br>
-                       if (rc)<br>
-                               goto exit;<br>
-                       stats->q_opackets[i] = qstats.tx_pkts;<br>
-                       stats->q_obytes[i] = qstats.tx_octs;<br>
-                       stats->q_errors[i] = qstats.tx_drop_pkts;<br>
-               }<br>
-<br>
-               if (dev->rxq_stat_map[i] & (1U << 31)) {<br>
-                       qidx = dev->rxq_stat_map[i] & 0xFFFF;<br>
-                       rc = roc_nix_stats_queue_get(nix, qidx, 1, &qstats);<br>
-                       if (rc)<br>
-                               goto exit;<br>
-                       stats->q_ipackets[i] = qstats.rx_pkts;<br>
-                       stats->q_ibytes[i] = qstats.rx_octs;<br>
-                       stats->q_errors[i] += qstats.rx_drop_pkts;<br>
+       if (qstats != NULL) {<br>
+               for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {<br>
+                       struct roc_nix_stats_queue qstats_data;<br>
+                       uint16_t qidx;<br>
+<br>
+                       if (dev->txq_stat_map[i] & (1U << 31)) {<br>
+                               qidx = dev->txq_stat_map[i] & 0xFFFF;<br>
+                               rc = roc_nix_stats_queue_get(nix, qidx, 0, &qstats_data);<br>
+                               if (rc)<br>
+                                       goto exit;<br>
+                               qstats->q_opackets[i] = qstats_data.tx_pkts;<br>
+                               qstats->q_obytes[i] = qstats_data.tx_octs;<br>
+                               qstats->q_errors[i] = qstats_data.tx_drop_pkts;<br>
+                       }<br>
+<br>
+                       if (dev->rxq_stat_map[i] & (1U << 31)) {<br>
+                               qidx = dev->rxq_stat_map[i] & 0xFFFF;<br>
+                               rc = roc_nix_stats_queue_get(nix, qidx, 1, &qstats_data);<br>
+                               if (rc)<br>
+                                       goto exit;<br>
+                               qstats->q_ipackets[i] = qstats_data.rx_pkts;<br>
+                               qstats->q_ibytes[i] = qstats_data.rx_octs;<br>
+                               qstats->q_errors[i] += qstats_data.rx_drop_pkts;<br>
+                       }<br>
                 }<br>
         }<br>
 exit:<br>
diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c<br>
index 9b6a3651f9..0c337a6cc8 100644<br>
--- a/drivers/net/cxgbe/cxgbe_ethdev.c<br>
+++ b/drivers/net/cxgbe/cxgbe_ethdev.c<br>
@@ -701,7 +701,8 @@ void cxgbe_dev_rx_queue_release(struct rte_eth_dev *eth_dev, uint16_t qid)<br>
  * Get port statistics.<br>
  */<br>
 static int cxgbe_dev_stats_get(struct rte_eth_dev *eth_dev,<br>
-                               struct rte_eth_stats *eth_stats)<br>
+                               struct rte_eth_stats *eth_stats,<br>
+                               struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct port_info *pi = eth_dev->data->dev_private;<br>
         struct adapter *adapter = pi->adapter;<br>
diff --git a/drivers/net/cxgbe/cxgbevf_ethdev.c b/drivers/net/cxgbe/cxgbevf_ethdev.c<br>
index a62c56c2b9..d8eba8afef 100644<br>
--- a/drivers/net/cxgbe/cxgbevf_ethdev.c<br>
+++ b/drivers/net/cxgbe/cxgbevf_ethdev.c<br>
@@ -34,7 +34,8 @@<br>
  * Get port statistics.<br>
  */<br>
 static int cxgbevf_dev_stats_get(struct rte_eth_dev *eth_dev,<br>
-                                struct rte_eth_stats *eth_stats)<br>
+                                struct rte_eth_stats *eth_stats,<br>
+                                struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct port_info *pi = eth_dev->data->dev_private;<br>
         struct adapter *adapter = pi->adapter;<br>
diff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c<br>
index 34b691fde7..789a55c2a0 100644<br>
--- a/drivers/net/dpaa/dpaa_ethdev.c<br>
+++ b/drivers/net/dpaa/dpaa_ethdev.c<br>
@@ -855,7 +855,8 @@ static int dpaa_eth_link_update(struct rte_eth_dev *dev,<br>
 }<br>
 <br>
 static int dpaa_eth_stats_get(struct rte_eth_dev *dev,<br>
-                              struct rte_eth_stats *stats)<br>
+                              struct rte_eth_stats *stats,<br>
+                              struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         PMD_INIT_FUNC_TRACE();<br>
 <br>
diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c<br>
index 41678ce09b..ada4a79b36 100644<br>
--- a/drivers/net/dpaa2/dpaa2_ethdev.c<br>
+++ b/drivers/net/dpaa2/dpaa2_ethdev.c<br>
@@ -1602,7 +1602,7 @@ dpaa2_dev_set_mac_addr(struct rte_eth_dev *dev,<br>
 <br>
 static int<br>
 dpaa2_dev_stats_get(struct rte_eth_dev *dev,<br>
-       struct rte_eth_stats *stats)<br>
+       struct rte_eth_stats *stats, struct eth_queue_stats *qstats)<br>
 {<br>
         struct dpaa2_dev_priv *priv = dev->data->dev_private;<br>
         struct fsl_mc_io *dpni = dev->process_private;<br>
@@ -1659,18 +1659,20 @@ dpaa2_dev_stats_get(struct rte_eth_dev *dev,<br>
         stats->imissed = value.page_2.ingress_nobuffer_discards;<br>
 <br>
         /* Fill in per queue stats */<br>
-       for (i = 0; (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) &&<br>
-               (i < priv->nb_rx_queues || i < priv->nb_tx_queues); ++i) {<br>
-               dpaa2_rxq = priv->rx_vq[i];<br>
-               dpaa2_txq = priv->tx_vq[i];<br>
-               if (dpaa2_rxq)<br>
-                       stats->q_ipackets[i] = dpaa2_rxq->rx_pkts;<br>
-               if (dpaa2_txq)<br>
-                       stats->q_opackets[i] = dpaa2_txq->tx_pkts;<br>
-<br>
-               /* Byte counting is not implemented */<br>
-               stats->q_ibytes[i]   = 0;<br>
-               stats->q_obytes[i]   = 0;<br>
+       if (qstats != NULL) {<br>
+               for (i = 0; (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) &&<br>
+                       (i < priv->nb_rx_queues || i < priv->nb_tx_queues); ++i) {<br>
+                       dpaa2_rxq = priv->rx_vq[i];<br>
+                       dpaa2_txq = priv->tx_vq[i];<br>
+                       if (dpaa2_rxq)<br>
+                               qstats->q_ipackets[i] = dpaa2_rxq->rx_pkts;<br>
+                       if (dpaa2_txq)<br>
+                               qstats->q_opackets[i] = dpaa2_txq->tx_pkts;<br>
+<br>
+                       /* Byte counting is not implemented */<br>
+                       qstats->q_ibytes[i]   = 0;<br>
+                       qstats->q_obytes[i]   = 0;<br>
+               }<br>
         }<br>
 <br>
         return 0;<br>
diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c<br>
index f5cf5c3811..448de25fdc 100644<br>
--- a/drivers/net/ena/ena_ethdev.c<br>
+++ b/drivers/net/ena/ena_ethdev.c<br>
@@ -9,6 +9,7 @@<br>
 #include <rte_version.h><br>
 #include <rte_net.h><br>
 #include <rte_kvargs.h><br>
+#include <ethdev_driver.h><br>
 <br>
 #include "ena_ethdev.h"<br>
 #include "ena_logs.h"<br>
@@ -270,7 +271,8 @@ static int ena_start(struct rte_eth_dev *dev);<br>
 static int ena_stop(struct rte_eth_dev *dev);<br>
 static int ena_close(struct rte_eth_dev *dev);<br>
 static int ena_dev_reset(struct rte_eth_dev *dev);<br>
-static int ena_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);<br>
+static int ena_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+                         struct eth_queue_stats *qstats);<br>
 static void ena_rx_queue_release_all(struct rte_eth_dev *dev);<br>
 static void ena_tx_queue_release_all(struct rte_eth_dev *dev);<br>
 static void ena_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid);<br>
@@ -1240,7 +1242,8 @@ static void ena_stats_restart(struct rte_eth_dev *dev)<br>
 }<br>
 <br>
 static int ena_stats_get(struct rte_eth_dev *dev,<br>
-                         struct rte_eth_stats *stats)<br>
+                         struct rte_eth_stats *stats,<br>
+                         struct eth_queue_stats *qstats)<br>
 {<br>
         struct ena_admin_basic_stats ena_stats;<br>
         struct ena_adapter *adapter = dev->data->dev_private;<br>
@@ -1276,26 +1279,29 @@ static int ena_stats_get(struct rte_eth_dev *dev,<br>
         stats->oerrors = rte_atomic64_read(&adapter->drv_stats->oerrors);<br>
         stats->rx_nombuf = rte_atomic64_read(&adapter->drv_stats->rx_nombuf);<br>
 <br>
-       max_rings_stats = RTE_MIN(dev->data->nb_rx_queues,<br>
-               RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
-       for (i = 0; i < max_rings_stats; ++i) {<br>
-               struct ena_stats_rx *rx_stats = &adapter->rx_ring[i].rx_stats;<br>
-<br>
-               stats->q_ibytes[i] = rx_stats->bytes;<br>
-               stats->q_ipackets[i] = rx_stats->cnt;<br>
-               stats->q_errors[i] = rx_stats->bad_desc_num +<br>
-                       rx_stats->bad_req_id +<br>
-                       rx_stats->bad_desc +<br>
-                       rx_stats->unknown_error;<br>
-       }<br>
+       /* Queue statistics */<br>
+       if (qstats) {<br>
+               max_rings_stats = RTE_MIN(dev->data->nb_rx_queues,<br>
+                       RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
+               for (i = 0; i < max_rings_stats; ++i) {<br>
+                       struct ena_stats_rx *rx_stats = &adapter->rx_ring[i].rx_stats;<br>
+<br>
+                       qstats->q_ibytes[i] = rx_stats->bytes;<br>
+                       qstats->q_ipackets[i] = rx_stats->cnt;<br>
+                       qstats->q_errors[i] = rx_stats->bad_desc_num +<br>
+                               rx_stats->bad_req_id +<br>
+                               rx_stats->bad_desc +<br>
+                               rx_stats->unknown_error;<br>
+               }<br>
 <br>
-       max_rings_stats = RTE_MIN(dev->data->nb_tx_queues,<br>
-               RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
-       for (i = 0; i < max_rings_stats; ++i) {<br>
-               struct ena_stats_tx *tx_stats = &adapter->tx_ring[i].tx_stats;<br>
+               max_rings_stats = RTE_MIN(dev->data->nb_tx_queues,<br>
+                       RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
+               for (i = 0; i < max_rings_stats; ++i) {<br>
+                       struct ena_stats_tx *tx_stats = &adapter->tx_ring[i].tx_stats;<br>
 <br>
-               stats->q_obytes[i] = tx_stats->bytes;<br>
-               stats->q_opackets[i] = tx_stats->cnt;<br>
+                       qstats->q_obytes[i] = tx_stats->bytes;<br>
+                       qstats->q_opackets[i] = tx_stats->cnt;<br>
+               }<br>
         }<br>
 <br>
         return 0;<br>
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c<br>
index ffbecc407c..37a61f8ff6 100644<br>
--- a/drivers/net/enetc/enetc_ethdev.c<br>
+++ b/drivers/net/enetc/enetc_ethdev.c<br>
@@ -4,6 +4,7 @@<br>
 <br>
 #include <stdbool.h><br>
 #include <ethdev_pci.h><br>
+#include <ethdev_driver.h><br>
 #include <rte_random.h><br>
 #include <dpaax_iova_table.h><br>
 <br>
@@ -543,7 +544,8 @@ enetc_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid)<br>
 <br>
 static<br>
 int enetc_stats_get(struct rte_eth_dev *dev,<br>
-                   struct rte_eth_stats *stats)<br>
+                   struct rte_eth_stats *stats,<br>
+                   struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct enetc_eth_hw *hw =<br>
                 ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);<br>
diff --git a/drivers/net/enetfec/enet_ethdev.c b/drivers/net/enetfec/enet_ethdev.c<br>
index 7c2926409e..c336db75e8 100644<br>
--- a/drivers/net/enetfec/enet_ethdev.c<br>
+++ b/drivers/net/enetfec/enet_ethdev.c<br>
@@ -314,7 +314,8 @@ enetfec_set_mac_address(struct rte_eth_dev *dev,<br>
 <br>
 static int<br>
 enetfec_stats_get(struct rte_eth_dev *dev,<br>
-             struct rte_eth_stats *stats)<br>
+             struct rte_eth_stats *stats,<br>
+             struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct enetfec_private *fep = dev->data->dev_private;<br>
         struct rte_eth_stats *eth_stats = &fep->stats;<br>
diff --git a/drivers/net/enic/enic.h b/drivers/net/enic/enic.h<br>
index dc1d16f7d5..87f6b35fcd 100644<br>
--- a/drivers/net/enic/enic.h<br>
+++ b/drivers/net/enic/enic.h<br>
@@ -419,7 +419,8 @@ int enic_disable(struct enic *enic);<br>
 void enic_remove(struct enic *enic);<br>
 int enic_get_link_status(struct enic *enic);<br>
 int enic_dev_stats_get(struct enic *enic,<br>
-                      struct rte_eth_stats *r_stats);<br>
+                      struct rte_eth_stats *r_stats,<br>
+                      struct eth_queue_stats *qstats __rte_unused);<br>
 int enic_dev_stats_clear(struct enic *enic);<br>
 int enic_add_packet_filter(struct enic *enic);<br>
 int enic_set_mac_address(struct enic *enic, uint8_t *mac_addr);<br>
diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c<br>
index 749cc9ca5c..a853a5047a 100644<br>
--- a/drivers/net/enic/enic_ethdev.c<br>
+++ b/drivers/net/enic/enic_ethdev.c<br>
@@ -432,12 +432,12 @@ static int enicpmd_dev_link_update(struct rte_eth_dev *eth_dev,<br>
 }<br>
 <br>
 static int enicpmd_dev_stats_get(struct rte_eth_dev *eth_dev,<br>
-       struct rte_eth_stats *stats)<br>
+       struct rte_eth_stats *stats, struct eth_queue_stats *qstats)<br>
 {<br>
         struct enic *enic = pmd_priv(eth_dev);<br>
 <br>
         ENICPMD_FUNC_TRACE();<br>
-       return enic_dev_stats_get(enic, stats);<br>
+       return enic_dev_stats_get(enic, stats, qstats);<br>
 }<br>
 <br>
 static int enicpmd_dev_stats_reset(struct rte_eth_dev *eth_dev)<br>
diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c<br>
index 4124c48b85..2696fa77d4 100644<br>
--- a/drivers/net/enic/enic_main.c<br>
+++ b/drivers/net/enic/enic_main.c<br>
@@ -111,7 +111,8 @@ int enic_dev_stats_clear(struct enic *enic)<br>
         return 0;<br>
 }<br>
 <br>
-int enic_dev_stats_get(struct enic *enic, struct rte_eth_stats *r_stats)<br>
+int enic_dev_stats_get(struct enic *enic, struct rte_eth_stats *r_stats,<br>
+                       struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct vnic_stats *stats;<br>
         struct enic_soft_stats *soft_stats = &enic->soft_stats;<br>
diff --git a/drivers/net/enic/enic_vf_representor.c b/drivers/net/enic/enic_vf_representor.c<br>
index 8469e06de9..05b2efedcb 100644<br>
--- a/drivers/net/enic/enic_vf_representor.c<br>
+++ b/drivers/net/enic/enic_vf_representor.c<br>
@@ -419,13 +419,14 @@ static int enic_vf_link_update(struct rte_eth_dev *eth_dev,<br>
 }<br>
 <br>
 static int enic_vf_stats_get(struct rte_eth_dev *eth_dev,<br>
-       struct rte_eth_stats *stats)<br>
+       struct rte_eth_stats *stats, struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct enic_vf_representor *vf;<br>
         struct vnic_stats *vs;<br>
         int err;<br>
 <br>
         ENICPMD_FUNC_TRACE();<br>
+<br>
         vf = eth_dev->data->dev_private;<br>
         /* Get VF stats via PF */<br>
         err = vnic_dev_stats_dump(vf->enic.vdev, &vs);<br>
diff --git a/drivers/net/failsafe/failsafe_ether.c b/drivers/net/failsafe/failsafe_ether.c<br>
index dc4aba6e30..f0fd662c7b 100644<br>
--- a/drivers/net/failsafe/failsafe_ether.c<br>
+++ b/drivers/net/failsafe/failsafe_ether.c<br>
@@ -565,8 +565,6 @@ failsafe_eth_dev_state_sync(struct rte_eth_dev *dev)<br>
 void<br>
 failsafe_stats_increment(struct rte_eth_stats *to, struct rte_eth_stats *from)<br>
 {<br>
-       uint32_t i;<br>
-<br>
         RTE_ASSERT(to != NULL && from != NULL);<br>
         to->ipackets += from->ipackets;<br>
         to->opackets += from->opackets;<br>
@@ -576,13 +574,6 @@ failsafe_stats_increment(struct rte_eth_stats *to, struct rte_eth_stats *from)<br>
         to->ierrors += from->ierrors;<br>
         to->oerrors += from->oerrors;<br>
         to->rx_nombuf += from->rx_nombuf;<br>
-       for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {<br>
-               to->q_ipackets[i] += from->q_ipackets[i];<br>
-               to->q_opackets[i] += from->q_opackets[i];<br>
-               to->q_ibytes[i] += from->q_ibytes[i];<br>
-               to->q_obytes[i] += from->q_obytes[i];<br>
-               to->q_errors[i] += from->q_errors[i];<br>
-       }<br>
 }<br>
 <br>
 int<br>
diff --git a/drivers/net/failsafe/failsafe_ops.c b/drivers/net/failsafe/failsafe_ops.c<br>
index 5321c3385c..ddc8808ebe 100644<br>
--- a/drivers/net/failsafe/failsafe_ops.c<br>
+++ b/drivers/net/failsafe/failsafe_ops.c<br>
@@ -898,7 +898,8 @@ fs_link_update(struct rte_eth_dev *dev,<br>
 <br>
 static int<br>
 fs_stats_get(struct rte_eth_dev *dev,<br>
-            struct rte_eth_stats *stats)<br>
+            struct rte_eth_stats *stats,<br>
+            struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct rte_eth_stats backup;<br>
         struct sub_device *sdev;<br>
diff --git a/drivers/net/gve/gve_ethdev.c b/drivers/net/gve/gve_ethdev.c<br>
index 56e1a470b8..6341d89f39 100644<br>
--- a/drivers/net/gve/gve_ethdev.c<br>
+++ b/drivers/net/gve/gve_ethdev.c<br>
@@ -10,6 +10,7 @@<br>
 #include "gve_version.h"<br>
 #include "rte_ether.h"<br>
 #include "gve_rss.h"<br>
+#include <ethdev_driver.h><br>
 <br>
 static void<br>
 gve_write_version(uint8_t *driver_version_register)<br>
@@ -671,7 +672,8 @@ gve_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)<br>
 }<br>
 <br>
 static int<br>
-gve_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+gve_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+                 struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         uint16_t i;<br>
         if (gve_is_gqi(dev->data->dev_private))<br>
diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c<br>
index cb5c013b21..75534c1ce2 100644<br>
--- a/drivers/net/hinic/hinic_pmd_ethdev.c<br>
+++ b/drivers/net/hinic/hinic_pmd_ethdev.c<br>
@@ -5,6 +5,7 @@<br>
 #include <rte_pci.h><br>
 #include <bus_pci_driver.h><br>
 #include <ethdev_pci.h><br>
+#include <ethdev_driver.h><br>
 #include <rte_mbuf.h><br>
 #include <rte_malloc.h><br>
 #include <rte_memcpy.h><br>
@@ -1305,7 +1306,8 @@ static int hinic_set_dev_promiscuous(struct hinic_nic_dev *nic_dev, bool enable)<br>
  *   negative error value otherwise.<br>
  */<br>
 static int<br>
-hinic_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+hinic_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+                   struct eth_queue_stats *qstats)<br>
 {<br>
         int i, err, q_num;<br>
         u64 rx_discards_pmd = 0;<br>
@@ -1326,29 +1328,45 @@ hinic_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
         dev->data->rx_mbuf_alloc_failed = 0;<br>
 <br>
         /* rx queue stats */<br>
-       q_num = (nic_dev->num_rq < RTE_ETHDEV_QUEUE_STAT_CNTRS) ?<br>
-                       nic_dev->num_rq : RTE_ETHDEV_QUEUE_STAT_CNTRS;<br>
-       for (i = 0; i < q_num; i++) {<br>
-               rxq = nic_dev->rxqs[i];<br>
-               hinic_rxq_get_stats(rxq, &rxq_stats);<br>
-               stats->q_ipackets[i] = rxq_stats.packets;<br>
-               stats->q_ibytes[i] = rxq_stats.bytes;<br>
-               stats->q_errors[i] = rxq_stats.rx_discards;<br>
-<br>
-               stats->ierrors += rxq_stats.errors;<br>
-               rx_discards_pmd += rxq_stats.rx_discards;<br>
-               dev->data->rx_mbuf_alloc_failed += rxq_stats.rx_nombuf;<br>
-       }<br>
+       if (qstats) {<br>
+               q_num = (nic_dev->num_rq < RTE_ETHDEV_QUEUE_STAT_CNTRS) ?<br>
+                               nic_dev->num_rq : RTE_ETHDEV_QUEUE_STAT_CNTRS;<br>
+               for (i = 0; i < q_num; i++) {<br>
+                       rxq = nic_dev->rxqs[i];<br>
+                       hinic_rxq_get_stats(rxq, &rxq_stats);<br>
+                       qstats->q_ipackets[i] = rxq_stats.packets;<br>
+                       qstats->q_ibytes[i] = rxq_stats.bytes;<br>
+                       qstats->q_errors[i] = rxq_stats.rx_discards;<br>
+<br>
+                       stats->ierrors += rxq_stats.errors;<br>
+                       rx_discards_pmd += rxq_stats.rx_discards;<br>
+                       dev->data->rx_mbuf_alloc_failed += rxq_stats.rx_nombuf;<br>
+               }<br>
 <br>
-       /* tx queue stats */<br>
-       q_num = (nic_dev->num_sq < RTE_ETHDEV_QUEUE_STAT_CNTRS) ?<br>
-               nic_dev->num_sq : RTE_ETHDEV_QUEUE_STAT_CNTRS;<br>
-       for (i = 0; i < q_num; i++) {<br>
-               txq = nic_dev->txqs[i];<br>
-               hinic_txq_get_stats(txq, &txq_stats);<br>
-               stats->q_opackets[i] = txq_stats.packets;<br>
-               stats->q_obytes[i] = txq_stats.bytes;<br>
-               stats->oerrors += (txq_stats.tx_busy + txq_stats.off_errs);<br>
+               /* tx queue stats */<br>
+               q_num = (nic_dev->num_sq < RTE_ETHDEV_QUEUE_STAT_CNTRS) ?<br>
+                       nic_dev->num_sq : RTE_ETHDEV_QUEUE_STAT_CNTRS;<br>
+               for (i = 0; i < q_num; i++) {<br>
+                       txq = nic_dev->txqs[i];<br>
+                       hinic_txq_get_stats(txq, &txq_stats);<br>
+                       qstats->q_opackets[i] = txq_stats.packets;<br>
+                       qstats->q_obytes[i] = txq_stats.bytes;<br>
+                       stats->oerrors += (txq_stats.tx_busy + txq_stats.off_errs);<br>
+               }<br>
+       } else {<br>
+               /* Still aggregate error stats even without qstats */<br>
+               for (i = 0; i < nic_dev->num_rq; i++) {<br>
+                       rxq = nic_dev->rxqs[i];<br>
+                       hinic_rxq_get_stats(rxq, &rxq_stats);<br>
+                       stats->ierrors += rxq_stats.errors;<br>
+                       rx_discards_pmd += rxq_stats.rx_discards;<br>
+                       dev->data->rx_mbuf_alloc_failed += rxq_stats.rx_nombuf;<br>
+               }<br>
+               for (i = 0; i < nic_dev->num_sq; i++) {<br>
+                       txq = nic_dev->txqs[i];<br>
+                       hinic_txq_get_stats(txq, &txq_stats);<br>
+                       stats->oerrors += (txq_stats.tx_busy + txq_stats.off_errs);<br>
+               }<br>
         }<br>
 <br>
         /* vport stats */<br>
diff --git a/drivers/net/hns3/hns3_stats.c b/drivers/net/hns3/hns3_stats.c<br>
index 9a1e8935e5..c8d5070a5b 100644<br>
--- a/drivers/net/hns3/hns3_stats.c<br>
+++ b/drivers/net/hns3/hns3_stats.c<br>
@@ -3,6 +3,7 @@<br>
  */<br>
 <br>
 #include <rte_ethdev.h><br>
+#include <ethdev_driver.h><br>
 #include <rte_io.h><br>
 #include <rte_malloc.h><br>
 <br>
@@ -609,7 +610,8 @@ hns3_rcb_tx_ring_stats_get(struct hns3_tx_queue *txq,<br>
  *   0 on success.<br>
  */<br>
 int<br>
-hns3_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *rte_stats)<br>
+hns3_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *rte_stats,<br>
+              struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct hns3_adapter *hns = eth_dev->data->dev_private;<br>
         struct hns3_hw *hw = &hns->hw;<br>
diff --git a/drivers/net/hns3/hns3_stats.h b/drivers/net/hns3/hns3_stats.h<br>
index 74bc4173cc..511af430a3 100644<br>
--- a/drivers/net/hns3/hns3_stats.h<br>
+++ b/drivers/net/hns3/hns3_stats.h<br>
@@ -151,7 +151,8 @@ struct hns3_reset_stats;<br>
 struct hns3_hw;<br>
 <br>
 int hns3_stats_get(struct rte_eth_dev *eth_dev,<br>
-                  struct rte_eth_stats *rte_stats);<br>
+                  struct rte_eth_stats *rte_stats,<br>
+                  struct eth_queue_stats *qstats);<br>
 int hns3_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,<br>
                         unsigned int n);<br>
 int hns3_dev_xstats_reset(struct rte_eth_dev *dev);<br>
diff --git a/drivers/net/intel/cpfl/cpfl_ethdev.c b/drivers/net/intel/cpfl/cpfl_ethdev.c<br>
index 6d7b23ad7a..ed6852f23d 100644<br>
--- a/drivers/net/intel/cpfl/cpfl_ethdev.c<br>
+++ b/drivers/net/intel/cpfl/cpfl_ethdev.c<br>
@@ -311,7 +311,8 @@ cpfl_get_mbuf_alloc_failed_stats(struct rte_eth_dev *dev)<br>
 }<br>
 <br>
 static int<br>
-cpfl_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+cpfl_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct cpfl_vport *cpfl_vport = dev->data->dev_private;<br>
         struct idpf_vport *vport = &cpfl_vport->base;<br>
diff --git a/drivers/net/intel/e1000/em_ethdev.c b/drivers/net/intel/e1000/em_ethdev.c<br>
index 39dddf3384..ec3924bf6b 100644<br>
--- a/drivers/net/intel/e1000/em_ethdev.c<br>
+++ b/drivers/net/intel/e1000/em_ethdev.c<br>
@@ -42,7 +42,7 @@ static int eth_em_allmulticast_disable(struct rte_eth_dev *dev);<br>
 static int eth_em_link_update(struct rte_eth_dev *dev,<br>
                                 int wait_to_complete);<br>
 static int eth_em_stats_get(struct rte_eth_dev *dev,<br>
-                               struct rte_eth_stats *rte_stats);<br>
+                               struct rte_eth_stats *rte_stats, struct eth_queue_stats *qstats);<br>
 static int eth_em_stats_reset(struct rte_eth_dev *dev);<br>
 static int eth_em_infos_get(struct rte_eth_dev *dev,<br>
                                 struct rte_eth_dev_info *dev_info);<br>
@@ -926,7 +926,8 @@ em_hardware_init(struct e1000_hw *hw)<br>
 <br>
 /* This function is based on em_update_stats_counters() in e1000/if_em.c */<br>
 static int<br>
-eth_em_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats)<br>
+eth_em_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats,<br>
+               struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);<br>
         struct e1000_hw_stats *stats =<br>
@@ -1049,7 +1050,7 @@ eth_em_stats_reset(struct rte_eth_dev *dev)<br>
                         E1000_DEV_PRIVATE_TO_STATS(dev->data->dev_private);<br>
 <br>
         /* HW registers are cleared on read */<br>
-       eth_em_stats_get(dev, NULL);<br>
+       eth_em_stats_get(dev, NULL, NULL);<br>
 <br>
         /* Reset software totals */<br>
         memset(hw_stats, 0, sizeof(*hw_stats));<br>
diff --git a/drivers/net/intel/e1000/igb_ethdev.c b/drivers/net/intel/e1000/igb_ethdev.c<br>
index 124cf75762..f4e2a6442e 100644<br>
--- a/drivers/net/intel/e1000/igb_ethdev.c<br>
+++ b/drivers/net/intel/e1000/igb_ethdev.c<br>
@@ -86,7 +86,7 @@ static int  eth_igb_allmulticast_disable(struct rte_eth_dev *dev);<br>
 static int  eth_igb_link_update(struct rte_eth_dev *dev,<br>
                                 int wait_to_complete);<br>
 static int eth_igb_stats_get(struct rte_eth_dev *dev,<br>
-                               struct rte_eth_stats *rte_stats);<br>
+                               struct rte_eth_stats *rte_stats, struct eth_queue_stats *qstats);<br>
 static int eth_igb_xstats_get(struct rte_eth_dev *dev,<br>
                               struct rte_eth_xstat *xstats, unsigned n);<br>
 static int eth_igb_xstats_get_by_id(struct rte_eth_dev *dev,<br>
@@ -163,7 +163,7 @@ static int igbvf_allmulticast_enable(struct rte_eth_dev *dev);<br>
 static int igbvf_allmulticast_disable(struct rte_eth_dev *dev);<br>
 static int eth_igbvf_link_update(struct e1000_hw *hw);<br>
 static int eth_igbvf_stats_get(struct rte_eth_dev *dev,<br>
-                               struct rte_eth_stats *rte_stats);<br>
+                               struct rte_eth_stats *rte_stats, struct eth_queue_stats *qstats);<br>
 static int eth_igbvf_xstats_get(struct rte_eth_dev *dev,<br>
                                 struct rte_eth_xstat *xstats, unsigned n);<br>
 static int eth_igbvf_xstats_get_names(struct rte_eth_dev *dev,<br>
@@ -1943,7 +1943,8 @@ igb_read_stats_registers(struct e1000_hw *hw, struct e1000_hw_stats *stats)<br>
 }<br>
 <br>
 static int<br>
-eth_igb_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats)<br>
+eth_igb_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats,<br>
+               struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);<br>
         struct e1000_hw_stats *stats =<br>
@@ -1976,7 +1977,7 @@ eth_igb_stats_reset(struct rte_eth_dev *dev)<br>
                         E1000_DEV_PRIVATE_TO_STATS(dev->data->dev_private);<br>
 <br>
         /* HW registers are cleared on read */<br>
-       eth_igb_stats_get(dev, NULL);<br>
+       eth_igb_stats_get(dev, NULL, NULL);<br>
 <br>
         /* Reset software totals */<br>
         memset(hw_stats, 0, sizeof(*hw_stats));<br>
@@ -2212,7 +2213,8 @@ eth_igbvf_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,<br>
 }<br>
 <br>
 static int<br>
-eth_igbvf_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats)<br>
+eth_igbvf_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats,<br>
+               struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);<br>
         struct e1000_vf_stats *hw_stats = (struct e1000_vf_stats *)<br>
@@ -2237,7 +2239,7 @@ eth_igbvf_stats_reset(struct rte_eth_dev *dev)<br>
                         E1000_DEV_PRIVATE_TO_STATS(dev->data->dev_private);<br>
 <br>
         /* Sync HW register to the last stats */<br>
-       eth_igbvf_stats_get(dev, NULL);<br>
+       eth_igbvf_stats_get(dev, NULL, NULL);<br>
 <br>
         /* reset HW current stats*/<br>
         memset(&hw_stats->gprc, 0, sizeof(*hw_stats) -<br>
diff --git a/drivers/net/intel/e1000/igc_ethdev.c b/drivers/net/intel/e1000/igc_ethdev.c<br>
index 68444e4fba..b9c91d2446 100644<br>
--- a/drivers/net/intel/e1000/igc_ethdev.c<br>
+++ b/drivers/net/intel/e1000/igc_ethdev.c<br>
@@ -226,7 +226,7 @@ static int eth_igc_allmulticast_enable(struct rte_eth_dev *dev);<br>
 static int eth_igc_allmulticast_disable(struct rte_eth_dev *dev);<br>
 static int eth_igc_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);<br>
 static int eth_igc_stats_get(struct rte_eth_dev *dev,<br>
-                       struct rte_eth_stats *rte_stats);<br>
+                       struct rte_eth_stats *rte_stats, struct eth_queue_stats *qstats);<br>
 static int eth_igc_xstats_get(struct rte_eth_dev *dev,<br>
                         struct rte_eth_xstat *xstats, unsigned int n);<br>
 static int eth_igc_xstats_get_by_id(struct rte_eth_dev *dev,<br>
@@ -2029,7 +2029,8 @@ igc_read_queue_stats_register(struct rte_eth_dev *dev)<br>
 }<br>
 <br>
 static int<br>
-eth_igc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats)<br>
+eth_igc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats,<br>
+               struct eth_queue_stats *qstats)<br>
 {<br>
         struct igc_adapter *igc = IGC_DEV_PRIVATE(dev);<br>
         struct e1000_hw *hw = IGC_DEV_PRIVATE_HW(dev);<br>
@@ -2068,19 +2069,21 @@ eth_igc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats)<br>
         rte_stats->obytes   = stats->gotc;<br>
 <br>
         /* Get per-queue statuses */<br>
-       for (i = 0; i < IGC_QUEUE_PAIRS_NUM; i++) {<br>
-               /* GET TX queue statuses */<br>
-               int map_id = igc->txq_stats_map[i];<br>
-               if (map_id >= 0) {<br>
-                       rte_stats->q_opackets[map_id] += queue_stats->pqgptc[i];<br>
-                       rte_stats->q_obytes[map_id] += queue_stats->pqgotc[i];<br>
-               }<br>
-               /* Get RX queue statuses */<br>
-               map_id = igc->rxq_stats_map[i];<br>
-               if (map_id >= 0) {<br>
-                       rte_stats->q_ipackets[map_id] += queue_stats->pqgprc[i];<br>
-                       rte_stats->q_ibytes[map_id] += queue_stats->pqgorc[i];<br>
-                       rte_stats->q_errors[map_id] += queue_stats->rqdpc[i];<br>
+       if (qstats) {<br>
+               for (i = 0; i < IGC_QUEUE_PAIRS_NUM; i++) {<br>
+                       /* GET TX queue statuses */<br>
+                       int map_id = igc->txq_stats_map[i];<br>
+                       if (map_id >= 0) {<br>
+                               qstats->q_opackets[map_id] += queue_stats->pqgptc[i];<br>
+                               qstats->q_obytes[map_id] += queue_stats->pqgotc[i];<br>
+                       }<br>
+                       /* Get RX queue statuses */<br>
+                       map_id = igc->rxq_stats_map[i];<br>
+                       if (map_id >= 0) {<br>
+                               qstats->q_ipackets[map_id] += queue_stats->pqgprc[i];<br>
+                               qstats->q_ibytes[map_id] += queue_stats->pqgorc[i];<br>
+                               qstats->q_errors[map_id] += queue_stats->rqdpc[i];<br>
+                       }<br>
                 }<br>
         }<br>
 <br>
diff --git a/drivers/net/intel/fm10k/fm10k_ethdev.c b/drivers/net/intel/fm10k/fm10k_ethdev.c<br>
index 75ce2e19cf..bb05aecd97 100644<br>
--- a/drivers/net/intel/fm10k/fm10k_ethdev.c<br>
+++ b/drivers/net/intel/fm10k/fm10k_ethdev.c<br>
@@ -1314,7 +1314,8 @@ fm10k_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,<br>
 }<br>
 <br>
 static int<br>
-fm10k_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+fm10k_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats)<br>
 {<br>
         uint64_t ipackets, opackets, ibytes, obytes, imissed;<br>
         struct fm10k_hw *hw =<br>
@@ -1329,17 +1330,19 @@ fm10k_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
 <br>
         ipackets = opackets = ibytes = obytes = imissed = 0;<br>
         for (i = 0; (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) &&<br>
-               (i < hw->mac.max_queues); ++i) {<br>
-               stats->q_ipackets[i] = hw_stats->q[i].rx_packets.count;<br>
-               stats->q_opackets[i] = hw_stats->q[i].tx_packets.count;<br>
-               stats->q_ibytes[i]   = hw_stats->q[i].rx_bytes.count;<br>
-               stats->q_obytes[i]   = hw_stats->q[i].tx_bytes.count;<br>
-               stats->q_errors[i]   = hw_stats->q[i].rx_drops.count;<br>
-               ipackets += stats->q_ipackets[i];<br>
-               opackets += stats->q_opackets[i];<br>
-               ibytes   += stats->q_ibytes[i];<br>
-               obytes   += stats->q_obytes[i];<br>
-               imissed  += stats->q_errors[i];<br>
+                       (i < hw->mac.max_queues); ++i) {<br>
+               if (qstats != NULL) {<br>
+                       qstats->q_ipackets[i] = hw_stats->q[i].rx_packets.count;<br>
+                       qstats->q_opackets[i] = hw_stats->q[i].tx_packets.count;<br>
+                       qstats->q_ibytes[i]   = hw_stats->q[i].rx_bytes.count;<br>
+                       qstats->q_obytes[i]   = hw_stats->q[i].tx_bytes.count;<br>
+                       qstats->q_errors[i]   = hw_stats->q[i].rx_drops.count;<br>
+               }<br>
+               ipackets += hw_stats->q[i].rx_packets.count;<br>
+               opackets += hw_stats->q[i].tx_packets.count;<br>
+               ibytes   += hw_stats->q[i].rx_bytes.count;<br>
+               obytes   += hw_stats->q[i].tx_bytes.count;<br>
+               imissed  += hw_stats->q[i].rx_drops.count;<br>
         }<br>
         stats->ipackets = ipackets;<br>
         stats->opackets = opackets;<br>
diff --git a/drivers/net/intel/i40e/i40e_ethdev.c b/drivers/net/intel/i40e/i40e_ethdev.c<br>
index 7a562a6e0b..b8ce79061b 100644<br>
--- a/drivers/net/intel/i40e/i40e_ethdev.c<br>
+++ b/drivers/net/intel/i40e/i40e_ethdev.c<br>
@@ -256,7 +256,7 @@ static int i40e_dev_allmulticast_disable(struct rte_eth_dev *dev);<br>
 static int i40e_dev_set_link_up(struct rte_eth_dev *dev);<br>
 static int i40e_dev_set_link_down(struct rte_eth_dev *dev);<br>
 static int i40e_dev_stats_get(struct rte_eth_dev *dev,<br>
-                              struct rte_eth_stats *stats);<br>
+                              struct rte_eth_stats *stats,      struct eth_queue_stats *qstats);<br>
 static int i40e_dev_xstats_get(struct rte_eth_dev *dev,<br>
                                struct rte_eth_xstat *xstats, unsigned n);<br>
 static int i40e_dev_xstats_get_names(struct rte_eth_dev *dev,<br>
@@ -3474,7 +3474,8 @@ i40e_read_stats_registers(struct i40e_pf *pf, struct i40e_hw *hw)<br>
 <br>
 /* Get all statistics of a port */<br>
 static int<br>
-i40e_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+i40e_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);<br>
         struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);<br>
diff --git a/drivers/net/intel/i40e/i40e_vf_representor.c b/drivers/net/intel/i40e/i40e_vf_representor.c<br>
index c00ae832aa..e8f0bb62a0 100644<br>
--- a/drivers/net/intel/i40e/i40e_vf_representor.c<br>
+++ b/drivers/net/intel/i40e/i40e_vf_representor.c<br>
@@ -209,7 +209,7 @@ rte_pmd_i40e_get_vf_native_stats(uint16_t port,<br>
 <br>
 static int<br>
 i40e_vf_representor_stats_get(struct rte_eth_dev *ethdev,<br>
-               struct rte_eth_stats *stats)<br>
+               struct rte_eth_stats *stats, struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct i40e_vf_representor *representor = ethdev->data->dev_private;<br>
         struct i40e_eth_stats native_stats;<br>
diff --git a/drivers/net/intel/iavf/iavf_ethdev.c b/drivers/net/intel/iavf/iavf_ethdev.c<br>
index 08c814725d..56bc6480e5 100644<br>
--- a/drivers/net/intel/iavf/iavf_ethdev.c<br>
+++ b/drivers/net/intel/iavf/iavf_ethdev.c<br>
@@ -105,7 +105,7 @@ static int iavf_dev_info_get(struct rte_eth_dev *dev,<br>
 static const uint32_t *iavf_dev_supported_ptypes_get(struct rte_eth_dev *dev,<br>
                                                      size_t *no_of_elements);<br>
 static int iavf_dev_stats_get(struct rte_eth_dev *dev,<br>
-                            struct rte_eth_stats *stats);<br>
+                            struct rte_eth_stats *stats, struct eth_queue_stats *qstats);<br>
 static int iavf_dev_stats_reset(struct rte_eth_dev *dev);<br>
 static int iavf_dev_xstats_reset(struct rte_eth_dev *dev);<br>
 static int iavf_dev_xstats_get(struct rte_eth_dev *dev,<br>
@@ -1798,7 +1798,8 @@ iavf_update_stats(struct iavf_vsi *vsi, struct virtchnl_eth_stats *nes)<br>
 }<br>
 <br>
 static int<br>
-iavf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+iavf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct iavf_adapter *adapter =<br>
                 IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);<br>
diff --git a/drivers/net/intel/ice/ice_dcf_ethdev.c b/drivers/net/intel/ice/ice_dcf_ethdev.c<br>
index 499062be40..81da5a4656 100644<br>
--- a/drivers/net/intel/ice/ice_dcf_ethdev.c<br>
+++ b/drivers/net/intel/ice/ice_dcf_ethdev.c<br>
@@ -1514,7 +1514,8 @@ ice_dcf_update_stats(struct virtchnl_eth_stats *oes,<br>
 <br>
 <br>
 static int<br>
-ice_dcf_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+ice_dcf_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct ice_dcf_adapter *ad = dev->data->dev_private;<br>
         struct ice_dcf_hw *hw = &ad->real_hw;<br>
diff --git a/drivers/net/intel/ice/ice_ethdev.c b/drivers/net/intel/ice/ice_ethdev.c<br>
index 31f1419897..cdc4943667 100644<br>
--- a/drivers/net/intel/ice/ice_ethdev.c<br>
+++ b/drivers/net/intel/ice/ice_ethdev.c<br>
@@ -161,7 +161,7 @@ static int ice_get_module_info(struct rte_eth_dev *dev,<br>
 static int ice_get_module_eeprom(struct rte_eth_dev *dev,<br>
                                  struct rte_dev_eeprom_info *info);<br>
 static int ice_stats_get(struct rte_eth_dev *dev,<br>
-                        struct rte_eth_stats *stats);<br>
+                        struct rte_eth_stats *stats, struct eth_queue_stats *qstats);<br>
 static int ice_stats_reset(struct rte_eth_dev *dev);<br>
 static int ice_xstats_get(struct rte_eth_dev *dev,<br>
                           struct rte_eth_xstat *xstats, unsigned int n);<br>
@@ -6340,7 +6340,8 @@ ice_read_stats_registers(struct ice_pf *pf, struct ice_hw *hw)<br>
 <br>
 /* Get all statistics of a port */<br>
 static int<br>
-ice_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+ice_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);<br>
         struct ice_hw *hw = ICE_DEV_PRIVATE_TO_HW(dev->data->dev_private);<br>
diff --git a/drivers/net/intel/idpf/idpf_ethdev.c b/drivers/net/intel/idpf/idpf_ethdev.c<br>
index 90720909bf..3c505e882a 100644<br>
--- a/drivers/net/intel/idpf/idpf_ethdev.c<br>
+++ b/drivers/net/intel/idpf/idpf_ethdev.c<br>
@@ -268,7 +268,8 @@ idpf_get_mbuf_alloc_failed_stats(struct rte_eth_dev *dev)<br>
 }<br>
 <br>
 static int<br>
-idpf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+idpf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct idpf_vport *vport =<br>
                 (struct idpf_vport *)dev->data->dev_private;<br>
diff --git a/drivers/net/intel/ipn3ke/ipn3ke_representor.c b/drivers/net/intel/ipn3ke/ipn3ke_representor.c<br>
index c5aca0ea8f..cd34d08055 100644<br>
--- a/drivers/net/intel/ipn3ke/ipn3ke_representor.c<br>
+++ b/drivers/net/intel/ipn3ke/ipn3ke_representor.c<br>
@@ -2119,7 +2119,8 @@ ipn3ke_rpst_stats_reset(struct rte_eth_dev *ethdev)<br>
 <br>
 static int<br>
 ipn3ke_rpst_stats_get<br>
-(struct rte_eth_dev *ethdev, struct rte_eth_stats *stats)<br>
+(struct rte_eth_dev *ethdev, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         uint16_t port_id = 0;<br>
         char *ch;<br>
diff --git a/drivers/net/intel/ixgbe/ixgbe_ethdev.c b/drivers/net/intel/ixgbe/ixgbe_ethdev.c<br>
index 4f0343245e..7e1278c026 100644<br>
--- a/drivers/net/intel/ixgbe/ixgbe_ethdev.c<br>
+++ b/drivers/net/intel/ixgbe/ixgbe_ethdev.c<br>
@@ -164,7 +164,7 @@ static int ixgbe_dev_allmulticast_disable(struct rte_eth_dev *dev);<br>
 static int ixgbe_dev_link_update(struct rte_eth_dev *dev,<br>
                                 int wait_to_complete);<br>
 static int ixgbe_dev_stats_get(struct rte_eth_dev *dev,<br>
-                               struct rte_eth_stats *stats);<br>
+                               struct rte_eth_stats *stats, struct eth_queue_stats *qstats);<br>
 static int ixgbe_dev_xstats_get(struct rte_eth_dev *dev,<br>
                                 struct rte_eth_xstat *xstats, unsigned n);<br>
 static int ixgbevf_dev_xstats_get(struct rte_eth_dev *dev,<br>
@@ -265,7 +265,7 @@ static int  ixgbevf_dev_reset(struct rte_eth_dev *dev);<br>
 static void ixgbevf_intr_disable(struct rte_eth_dev *dev);<br>
 static void ixgbevf_intr_enable(struct rte_eth_dev *dev);<br>
 static int ixgbevf_dev_stats_get(struct rte_eth_dev *dev,<br>
-               struct rte_eth_stats *stats);<br>
+               struct rte_eth_stats *stats, struct eth_queue_stats *qstats);<br>
 static int ixgbevf_dev_stats_reset(struct rte_eth_dev *dev);<br>
 static int ixgbevf_vlan_filter_set(struct rte_eth_dev *dev,<br>
                 uint16_t vlan_id, int on);<br>
@@ -3398,7 +3398,7 @@ ixgbe_read_stats_registers(struct ixgbe_hw *hw,<br>
  * This function is based on ixgbe_update_stats_counters() in ixgbe/ixgbe.c<br>
  */<br>
 static int<br>
-ixgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+ixgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats, struct eth_queue_stats *qstats)<br>
 {<br>
         struct ixgbe_hw *hw =<br>
                         IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);<br>
@@ -3427,13 +3427,15 @@ ixgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
         stats->opackets = hw_stats->gptc;<br>
         stats->obytes = hw_stats->gotc;<br>
 <br>
-       for (i = 0; i < RTE_MIN_T(IXGBE_QUEUE_STAT_COUNTERS,<br>
-                       RTE_ETHDEV_QUEUE_STAT_CNTRS, typeof(i)); i++) {<br>
-               stats->q_ipackets[i] = hw_stats->qprc[i];<br>
-               stats->q_opackets[i] = hw_stats->qptc[i];<br>
-               stats->q_ibytes[i] = hw_stats->qbrc[i];<br>
-               stats->q_obytes[i] = hw_stats->qbtc[i];<br>
-               stats->q_errors[i] = hw_stats->qprdc[i];<br>
+       if (qstats != NULL) {<br>
+               for (i = 0; i < RTE_MIN_T(IXGBE_QUEUE_STAT_COUNTERS,<br>
+                               RTE_ETHDEV_QUEUE_STAT_CNTRS, typeof(i)); i++) {<br>
+                       qstats->q_ipackets[i] = hw_stats->qprc[i];<br>
+                       qstats->q_opackets[i] = hw_stats->qptc[i];<br>
+                       qstats->q_ibytes[i] = hw_stats->qbrc[i];<br>
+                       qstats->q_obytes[i] = hw_stats->qbtc[i];<br>
+                       qstats->q_errors[i] = hw_stats->qprdc[i];<br>
+               }<br>
         }<br>
 <br>
         /* Rx Errors */<br>
@@ -3468,7 +3470,7 @@ ixgbe_dev_stats_reset(struct rte_eth_dev *dev)<br>
                         IXGBE_DEV_PRIVATE_TO_STATS(dev->data->dev_private);<br>
 <br>
         /* HW registers are cleared on read */<br>
-       ixgbe_dev_stats_get(dev, NULL);<br>
+       ixgbe_dev_stats_get(dev, NULL, NULL);<br>
 <br>
         /* Reset software totals */<br>
         memset(stats, 0, sizeof(*stats));<br>
@@ -3887,7 +3889,8 @@ ixgbevf_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,<br>
 }<br>
 <br>
 static int<br>
-ixgbevf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+ixgbevf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct ixgbevf_hw_stats *hw_stats = (struct ixgbevf_hw_stats *)<br>
                           IXGBE_DEV_PRIVATE_TO_STATS(dev->data->dev_private);<br>
@@ -3911,7 +3914,7 @@ ixgbevf_dev_stats_reset(struct rte_eth_dev *dev)<br>
                         IXGBE_DEV_PRIVATE_TO_STATS(dev->data->dev_private);<br>
 <br>
         /* Sync HW register to the last stats */<br>
-       ixgbevf_dev_stats_get(dev, NULL);<br>
+       ixgbevf_dev_stats_get(dev, NULL, NULL);<br>
 <br>
         /* reset HW current stats*/<br>
         hw_stats->vfgprc = 0;<br>
diff --git a/drivers/net/ionic/ionic_ethdev.c b/drivers/net/ionic/ionic_ethdev.c<br>
index aa22b6a70d..6e9cd5f7eb 100644<br>
--- a/drivers/net/ionic/ionic_ethdev.c<br>
+++ b/drivers/net/ionic/ionic_ethdev.c<br>
@@ -39,7 +39,7 @@ static int  ionic_dev_rss_hash_conf_get(struct rte_eth_dev *eth_dev,<br>
 static int  ionic_dev_rss_hash_update(struct rte_eth_dev *eth_dev,<br>
         struct rte_eth_rss_conf *rss_conf);<br>
 static int  ionic_dev_stats_get(struct rte_eth_dev *eth_dev,<br>
-       struct rte_eth_stats *stats);<br>
+       struct rte_eth_stats *stats, struct eth_queue_stats *queue_stats);<br>
 static int  ionic_dev_stats_reset(struct rte_eth_dev *eth_dev);<br>
 static int  ionic_dev_xstats_get(struct rte_eth_dev *dev,<br>
         struct rte_eth_xstat *xstats, unsigned int n);<br>
@@ -722,11 +722,11 @@ ionic_dev_rss_hash_update(struct rte_eth_dev *eth_dev,<br>
 <br>
 static int<br>
 ionic_dev_stats_get(struct rte_eth_dev *eth_dev,<br>
-               struct rte_eth_stats *stats)<br>
+               struct rte_eth_stats *stats, struct eth_queue_stats *qstats)<br>
 {<br>
         struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev);<br>
 <br>
-       ionic_lif_get_stats(lif, stats);<br>
+       ionic_lif_get_stats(lif, stats, qstats);<br>
 <br>
         return 0;<br>
 }<br>
diff --git a/drivers/net/ionic/ionic_lif.c b/drivers/net/ionic/ionic_lif.c<br>
index b4dc118fef..b52c8cad88 100644<br>
--- a/drivers/net/ionic/ionic_lif.c<br>
+++ b/drivers/net/ionic/ionic_lif.c<br>
@@ -100,7 +100,8 @@ ionic_lif_reset(struct ionic_lif *lif)<br>
 }<br>
 <br>
 static void<br>
-ionic_lif_get_abs_stats(const struct ionic_lif *lif, struct rte_eth_stats *stats)<br>
+ionic_lif_get_abs_stats(const struct ionic_lif *lif, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats)<br>
 {<br>
         struct ionic_lif_stats *ls = &lif->info->stats;<br>
         uint32_t i;<br>
@@ -144,13 +145,15 @@ ionic_lif_get_abs_stats(const struct ionic_lif *lif, struct rte_eth_stats *stats<br>
                 ls->rx_desc_fetch_error +<br>
                 ls->rx_desc_data_error;<br>
 <br>
-       for (i = 0; i < num_rx_q_counters; i++) {<br>
-               struct ionic_rx_stats *rx_stats = &lif->rxqcqs[i]->stats;<br>
-               stats->q_ipackets[i] = rx_stats->packets;<br>
-               stats->q_ibytes[i] = rx_stats->bytes;<br>
-               stats->q_errors[i] =<br>
-                       rx_stats->bad_cq_status +<br>
-                       rx_stats->bad_len;<br>
+       if (qstats != NULL) {<br>
+               for (i = 0; i < num_rx_q_counters; i++) {<br>
+                       struct ionic_rx_stats *rx_stats = &lif->rxqcqs[i]->stats;<br>
+                       qstats->q_ipackets[i] = rx_stats->packets;<br>
+                       qstats->q_ibytes[i] = rx_stats->bytes;<br>
+                       qstats->q_errors[i] =<br>
+                               rx_stats->bad_cq_status +<br>
+                               rx_stats->bad_len;<br>
+               }<br>
         }<br>
 <br>
         /* TX */<br>
@@ -179,18 +182,20 @@ ionic_lif_get_abs_stats(const struct ionic_lif *lif, struct rte_eth_stats *stats<br>
                 ls->tx_desc_fetch_error +<br>
                 ls->tx_desc_data_error;<br>
 <br>
-       for (i = 0; i < num_tx_q_counters; i++) {<br>
-               struct ionic_tx_stats *tx_stats = &lif->txqcqs[i]->stats;<br>
-               stats->q_opackets[i] = tx_stats->packets;<br>
-               stats->q_obytes[i] = tx_stats->bytes;<br>
+       if (qstats != NULL) {<br>
+               for (i = 0; i < num_tx_q_counters; i++) {<br>
+                       struct ionic_tx_stats *tx_stats = &lif->txqcqs[i]->stats;<br>
+                       qstats->q_opackets[i] = tx_stats->packets;<br>
+                       qstats->q_obytes[i] = tx_stats->bytes;<br>
+               }<br>
         }<br>
 }<br>
 <br>
 void<br>
 ionic_lif_get_stats(const struct ionic_lif *lif,<br>
-               struct rte_eth_stats *stats)<br>
+               struct rte_eth_stats *stats, struct eth_queue_stats *qstats)<br>
 {<br>
-       ionic_lif_get_abs_stats(lif, stats);<br>
+       ionic_lif_get_abs_stats(lif, stats, qstats);<br>
 <br>
         stats->ipackets  -= lif->stats_base.ipackets;<br>
         stats->opackets  -= lif->stats_base.opackets;<br>
@@ -214,7 +219,7 @@ ionic_lif_reset_stats(struct ionic_lif *lif)<br>
                         sizeof(struct ionic_tx_stats));<br>
         }<br>
 <br>
-       ionic_lif_get_abs_stats(lif, &lif->stats_base);<br>
+       ionic_lif_get_abs_stats(lif, &lif->stats_base, NULL);<br>
 }<br>
 <br>
 void<br>
diff --git a/drivers/net/ionic/ionic_lif.h b/drivers/net/ionic/ionic_lif.h<br>
index f4a1b9937e..2d85ebbcae 100644<br>
--- a/drivers/net/ionic/ionic_lif.h<br>
+++ b/drivers/net/ionic/ionic_lif.h<br>
@@ -9,6 +9,7 @@<br>
 <br>
 #include <rte_ethdev.h><br>
 #include <rte_ether.h><br>
+#include <ethdev_driver.h><br>
 <br>
 #include "ionic.h"<br>
 #include "ionic_dev.h"<br>
@@ -244,7 +245,7 @@ int ionic_lif_rss_config(struct ionic_lif *lif, const uint16_t types,<br>
 int ionic_lif_set_features(struct ionic_lif *lif);<br>
 <br>
 void ionic_lif_get_stats(const struct ionic_lif *lif,<br>
-       struct rte_eth_stats *stats);<br>
+       struct rte_eth_stats *stats, struct eth_queue_stats *qstats);<br>
 void ionic_lif_reset_stats(struct ionic_lif *lif);<br>
 <br>
 void ionic_lif_get_hw_stats(struct ionic_lif *lif,<br>
diff --git a/drivers/net/mana/mana.c b/drivers/net/mana/mana.c<br>
index 48e44bfafc..b7ae01b152 100644<br>
--- a/drivers/net/mana/mana.c<br>
+++ b/drivers/net/mana/mana.c<br>
@@ -645,7 +645,8 @@ mana_dev_link_update(struct rte_eth_dev *dev,<br>
 }<br>
 <br>
 static int<br>
-mana_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+mana_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+                  struct eth_queue_stats *qstats)<br>
 {<br>
         unsigned int i;<br>
 <br>
@@ -659,9 +660,9 @@ mana_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
                 stats->obytes += txq->stats.bytes;<br>
                 stats->oerrors += txq->stats.errors;<br>
 <br>
-               if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
-                       stats->q_opackets[i] = txq->stats.packets;<br>
-                       stats->q_obytes[i] = txq->stats.bytes;<br>
+               if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                       qstats->q_opackets[i] = txq->stats.packets;<br>
+                       qstats->q_obytes[i] = txq->stats.bytes;<br>
                 }<br>
         }<br>
 <br>
@@ -678,9 +679,9 @@ mana_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
 <br>
                 /* There is no good way to get stats->imissed, not setting it */<br>
 <br>
-               if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
-                       stats->q_ipackets[i] = rxq->stats.packets;<br>
-                       stats->q_ibytes[i] = rxq->stats.bytes;<br>
+               if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                       qstats->q_ipackets[i] = rxq->stats.packets;<br>
+                       qstats->q_ibytes[i] = rxq->stats.bytes;<br>
                 }<br>
 <br>
                 stats->rx_nombuf += rxq->stats.nombuf;<br>
diff --git a/drivers/net/memif/rte_eth_memif.c b/drivers/net/memif/rte_eth_memif.c<br>
index f7b04c4f9e..9de6f97cd9 100644<br>
--- a/drivers/net/memif/rte_eth_memif.c<br>
+++ b/drivers/net/memif/rte_eth_memif.c<br>
@@ -1578,7 +1578,8 @@ memif_link_update(struct rte_eth_dev *dev,<br>
 }<br>
 <br>
 static int<br>
-memif_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+memif_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats)<br>
 {<br>
         struct pmd_internals *pmd = dev->data->dev_private;<br>
         struct memif_queue *mq;<br>
@@ -1598,8 +1599,10 @@ memif_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
         /* RX stats */<br>
         for (i = 0; i < nq; i++) {<br>
                 mq = dev->data->rx_queues[i];<br>
-               stats->q_ipackets[i] = mq->n_pkts;<br>
-               stats->q_ibytes[i] = mq->n_bytes;<br>
+               if (qstats != NULL) {<br>
+                       qstats->q_ipackets[i] = mq->n_pkts;<br>
+                       qstats->q_ibytes[i] = mq->n_bytes;<br>
+               }<br>
                 stats->ipackets += mq->n_pkts;<br>
                 stats->ibytes += mq->n_bytes;<br>
         }<br>
@@ -1612,8 +1615,10 @@ memif_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
         /* TX stats */<br>
         for (i = 0; i < nq; i++) {<br>
                 mq = dev->data->tx_queues[i];<br>
-               stats->q_opackets[i] = mq->n_pkts;<br>
-               stats->q_obytes[i] = mq->n_bytes;<br>
+               if (qstats != NULL) {<br>
+                       qstats->q_opackets[i] = mq->n_pkts;<br>
+                       qstats->q_obytes[i] = mq->n_bytes;<br>
+               }<br>
                 stats->opackets += mq->n_pkts;<br>
                 stats->obytes += mq->n_bytes;<br>
         }<br>
diff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h<br>
index c992a1c5ea..f68eeb991a 100644<br>
--- a/drivers/net/mlx4/mlx4.h<br>
+++ b/drivers/net/mlx4/mlx4.h<br>
@@ -219,7 +219,8 @@ int mlx4_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr);<br>
 int mlx4_set_mc_addr_list(struct rte_eth_dev *dev, struct rte_ether_addr *list,<br>
                           uint32_t num);<br>
 int mlx4_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on);<br>
-int mlx4_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);<br>
+int mlx4_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+                  struct eth_queue_stats *qstats);<br>
 int mlx4_stats_reset(struct rte_eth_dev *dev);<br>
 int mlx4_fw_version_get(struct rte_eth_dev *dev, char *fw_ver, size_t fw_size);<br>
 int mlx4_dev_infos_get(struct rte_eth_dev *dev,<br>
diff --git a/drivers/net/mlx4/mlx4_ethdev.c b/drivers/net/mlx4/mlx4_ethdev.c<br>
index f11c6b4373..efc6ee4577 100644<br>
--- a/drivers/net/mlx4/mlx4_ethdev.c<br>
+++ b/drivers/net/mlx4/mlx4_ethdev.c<br>
@@ -702,7 +702,8 @@ int mlx4_fw_version_get(struct rte_eth_dev *dev, char *fw_ver, size_t fw_size)<br>
  *   Stats structure output buffer.<br>
  */<br>
 int<br>
-mlx4_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+mlx4_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+              struct eth_queue_stats *qstats)<br>
 {<br>
         struct rte_eth_stats tmp;<br>
         unsigned int i;<br>
@@ -716,10 +717,10 @@ mlx4_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
                 if (rxq == NULL)<br>
                         continue;<br>
                 idx = rxq->stats.idx;<br>
-               if (idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
-                       tmp.q_ipackets[idx] += rxq->stats.ipackets;<br>
-                       tmp.q_ibytes[idx] += rxq->stats.ibytes;<br>
-                       tmp.q_errors[idx] += (rxq->stats.idropped +<br>
+               if (qstats != NULL && idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                       qstats->q_ipackets[idx] += rxq->stats.ipackets;<br>
+                       qstats->q_ibytes[idx] += rxq->stats.ibytes;<br>
+                       qstats->q_errors[idx] += (rxq->stats.idropped +<br>
                                               rxq->stats.rx_nombuf);<br>
                 }<br>
                 tmp.ipackets += rxq->stats.ipackets;<br>
@@ -733,9 +734,9 @@ mlx4_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
                 if (txq == NULL)<br>
                         continue;<br>
                 idx = txq->stats.idx;<br>
-               if (idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
-                       tmp.q_opackets[idx] += txq->stats.opackets;<br>
-                       tmp.q_obytes[idx] += txq->stats.obytes;<br>
+               if (qstats != NULL && idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                       qstats->q_opackets[idx] += txq->stats.opackets;<br>
+                       qstats->q_obytes[idx] += txq->stats.obytes;<br>
                 }<br>
                 tmp.opackets += txq->stats.opackets;<br>
                 tmp.obytes += txq->stats.obytes;<br>
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h<br>
index 93e298d648..e7fd4066ba 100644<br>
--- a/drivers/net/mlx5/mlx5.h<br>
+++ b/drivers/net/mlx5/mlx5.h<br>
@@ -2418,7 +2418,8 @@ int mlx5_allmulticast_disable(struct rte_eth_dev *dev);<br>
 <br>
 /* mlx5_stats.c */<br>
 <br>
-int mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);<br>
+int mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+                  struct eth_queue_stats *qstats);<br>
 int mlx5_stats_reset(struct rte_eth_dev *dev);<br>
 int mlx5_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *stats,<br>
                     unsigned int n);<br>
diff --git a/drivers/net/mlx5/mlx5_stats.c b/drivers/net/mlx5/mlx5_stats.c<br>
index ebc6f9fb53..5cd3e303cc 100644<br>
--- a/drivers/net/mlx5/mlx5_stats.c<br>
+++ b/drivers/net/mlx5/mlx5_stats.c<br>
@@ -208,7 +208,8 @@ mlx5_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *stats,<br>
  *   rte_errno is set.<br>
  */<br>
 int<br>
-mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+              struct eth_queue_stats *qstats)<br>
 {<br>
         struct mlx5_priv *priv = dev->data->dev_private;<br>
         struct mlx5_stats_ctrl *stats_ctrl = &priv->stats_ctrl;<br>
@@ -226,14 +227,14 @@ mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
                 if (rxq == NULL)<br>
                         continue;<br>
                 idx = rxq->idx;<br>
-               if (idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+               if (qstats != NULL && idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
 #ifdef MLX5_PMD_SOFT_COUNTERS<br>
-                       tmp.q_ipackets[idx] += rxq->stats.ipackets -<br>
+                       qstats->q_ipackets[idx] += rxq->stats.ipackets -<br>
                                 rxq->stats_reset.ipackets;<br>
-                       tmp.q_ibytes[idx] += rxq->stats.ibytes -<br>
+                       qstats->q_ibytes[idx] += rxq->stats.ibytes -<br>
                                 rxq->stats_reset.ibytes;<br>
 #endif<br>
-                       tmp.q_errors[idx] += (rxq->stats.idropped +<br>
+                       qstats->q_errors[idx] += (rxq->stats.idropped +<br>
                                               rxq->stats.rx_nombuf) -<br>
                                               (rxq->stats_reset.idropped +<br>
                                               rxq->stats_reset.rx_nombuf);<br>
@@ -252,11 +253,11 @@ mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
                 if (txq == NULL)<br>
                         continue;<br>
                 idx = txq->idx;<br>
-               if (idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+               if (qstats != NULL && idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
 #ifdef MLX5_PMD_SOFT_COUNTERS<br>
-                       tmp.q_opackets[idx] += txq->stats.opackets -<br>
+                       qstats->q_opackets[idx] += txq->stats.opackets -<br>
                                                 txq->stats_reset.opackets;<br>
-                       tmp.q_obytes[idx] += txq->stats.obytes -<br>
+                       qstats->q_obytes[idx] += txq->stats.obytes -<br>
                                                 txq->stats_reset.obytes;<br>
 #endif<br>
                 }<br>
diff --git a/drivers/net/mvneta/mvneta_ethdev.c b/drivers/net/mvneta/mvneta_ethdev.c<br>
index f99f9e6289..eef9758224 100644<br>
--- a/drivers/net/mvneta/mvneta_ethdev.c<br>
+++ b/drivers/net/mvneta/mvneta_ethdev.c<br>
@@ -712,7 +712,8 @@ mvneta_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr)<br>
  *   0 on success, negative error value otherwise.<br>
  */<br>
 static int<br>
-mvneta_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+mvneta_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+                struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct mvneta_priv *priv = dev->data->dev_private;<br>
         struct neta_ppio_statistics ppio_stats;<br>
@@ -765,7 +766,7 @@ mvneta_stats_reset(struct rte_eth_dev *dev)<br>
         if (!priv->ppio)<br>
                 return 0;<br>
 <br>
-       ret = mvneta_stats_get(dev, &priv->prev_stats);<br>
+       ret = mvneta_stats_get(dev, &priv->prev_stats, NULL);<br>
         if (unlikely(ret))<br>
                 MVNETA_LOG(ERR, "Failed to reset port statistics");<br>
 <br>
diff --git a/drivers/net/mvpp2/mrvl_ethdev.c b/drivers/net/mvpp2/mrvl_ethdev.c<br>
index 4200c11d46..845819e4d8 100644<br>
--- a/drivers/net/mvpp2/mrvl_ethdev.c<br>
+++ b/drivers/net/mvpp2/mrvl_ethdev.c<br>
@@ -1486,7 +1486,8 @@ mrvl_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr)<br>
  *   0 on success, negative error value otherwise.<br>
  */<br>
 static int<br>
-mrvl_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+mrvl_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+              struct eth_queue_stats *qstats)<br>
 {<br>
         struct mrvl_priv *priv = dev->data->dev_private;<br>
         struct pp2_ppio_statistics ppio_stats;<br>
@@ -1521,12 +1522,14 @@ mrvl_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
                         break;<br>
                 }<br>
 <br>
-               stats->q_ibytes[idx] = rxq->bytes_recv;<br>
-               stats->q_ipackets[idx] = rx_stats.enq_desc - rxq->drop_mac;<br>
-               stats->q_errors[idx] = rx_stats.drop_early +<br>
-                                      rx_stats.drop_fullq +<br>
-                                      rx_stats.drop_bm +<br>
-                                      rxq->drop_mac;<br>
+               if (qstats != NULL) {<br>
+                       qstats->q_ibytes[idx] = rxq->bytes_recv;<br>
+                       qstats->q_ipackets[idx] = rx_stats.enq_desc - rxq->drop_mac;<br>
+                       qstats->q_errors[idx] = rx_stats.drop_early +<br>
+                                              rx_stats.drop_fullq +<br>
+                                              rx_stats.drop_bm +<br>
+                                              rxq->drop_mac;<br>
+               }<br>
                 stats->ibytes += rxq->bytes_recv;<br>
                 drop_mac += rxq->drop_mac;<br>
         }<br>
@@ -1553,8 +1556,10 @@ mrvl_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
                         break;<br>
                 }<br>
 <br>
-               stats->q_opackets[idx] = tx_stats.deq_desc;<br>
-               stats->q_obytes[idx] = txq->bytes_sent;<br>
+               if (qstats != NULL) {<br>
+                       qstats->q_opackets[idx] = tx_stats.deq_desc;<br>
+                       qstats->q_obytes[idx] = txq->bytes_sent;<br>
+               }<br>
                 stats->obytes += txq->bytes_sent;<br>
         }<br>
 <br>
diff --git a/drivers/net/netvsc/hn_ethdev.c b/drivers/net/netvsc/hn_ethdev.c<br>
index 1d788f3fb7..a31aac1a8a 100644<br>
--- a/drivers/net/netvsc/hn_ethdev.c<br>
+++ b/drivers/net/netvsc/hn_ethdev.c<br>
@@ -817,11 +817,12 @@ static int hn_dev_configure(struct rte_eth_dev *dev)<br>
 }<br>
 <br>
 static int hn_dev_stats_get(struct rte_eth_dev *dev,<br>
-                           struct rte_eth_stats *stats)<br>
+                           struct rte_eth_stats *stats,<br>
+                           struct eth_queue_stats *qstats)<br>
 {<br>
         unsigned int i;<br>
 <br>
-       hn_vf_stats_get(dev, stats);<br>
+       hn_vf_stats_get(dev, stats, qstats);<br>
 <br>
         for (i = 0; i < dev->data->nb_tx_queues; i++) {<br>
                 const struct hn_tx_queue *txq = dev->data->tx_queues[i];<br>
@@ -833,9 +834,9 @@ static int hn_dev_stats_get(struct rte_eth_dev *dev,<br>
                 stats->obytes += txq->stats.bytes;<br>
                 stats->oerrors += txq->stats.errors;<br>
 <br>
-               if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
-                       stats->q_opackets[i] += txq->stats.packets;<br>
-                       stats->q_obytes[i] += txq->stats.bytes;<br>
+               if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                       qstats->q_opackets[i] += txq->stats.packets;<br>
+                       qstats->q_obytes[i] += txq->stats.bytes;<br>
                 }<br>
         }<br>
 <br>
@@ -850,9 +851,9 @@ static int hn_dev_stats_get(struct rte_eth_dev *dev,<br>
                 stats->ierrors += rxq->stats.errors;<br>
                 stats->imissed += rxq->stats.ring_full;<br>
 <br>
-               if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
-                       stats->q_ipackets[i] += rxq->stats.packets;<br>
-                       stats->q_ibytes[i] += rxq->stats.bytes;<br>
+               if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                       qstats->q_ipackets[i] += rxq->stats.packets;<br>
+                       qstats->q_ibytes[i] += rxq->stats.bytes;<br>
                 }<br>
         }<br>
 <br>
diff --git a/drivers/net/netvsc/hn_var.h b/drivers/net/netvsc/hn_var.h<br>
index ccbd6b6a33..17c1d5d07b 100644<br>
--- a/drivers/net/netvsc/hn_var.h<br>
+++ b/drivers/net/netvsc/hn_var.h<br>
@@ -269,7 +269,8 @@ int hn_vf_rx_queue_setup(struct rte_eth_dev *dev,<br>
                              struct rte_mempool *mp);<br>
 void    hn_vf_rx_queue_release(struct hn_data *hv, uint16_t queue_id);<br>
 <br>
-int    hn_vf_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);<br>
+int    hn_vf_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+                       struct eth_queue_stats *qstats);<br>
 int     hn_vf_stats_reset(struct rte_eth_dev *dev);<br>
 int     hn_vf_xstats_get_names(struct rte_eth_dev *dev,<br>
                                struct rte_eth_xstat_name *xstats_names,<br>
diff --git a/drivers/net/netvsc/hn_vf.c b/drivers/net/netvsc/hn_vf.c<br>
index d922e685f4..0ecfaf54ea 100644<br>
--- a/drivers/net/netvsc/hn_vf.c<br>
+++ b/drivers/net/netvsc/hn_vf.c<br>
@@ -677,7 +677,8 @@ void hn_vf_rx_queue_release(struct hn_data *hv, uint16_t queue_id)<br>
 }<br>
 <br>
 int hn_vf_stats_get(struct rte_eth_dev *dev,<br>
-                   struct rte_eth_stats *stats)<br>
+                   struct rte_eth_stats *stats,<br>
+                   struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct hn_data *hv = dev->data->dev_private;<br>
         struct rte_eth_dev *vf_dev;<br>
diff --git a/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c<br>
index 804ad494d5..4eeb9aee3b 100644<br>
--- a/drivers/net/nfp/flower/nfp_flower.c<br>
+++ b/drivers/net/nfp/flower/nfp_flower.c<br>
@@ -238,8 +238,8 @@ nfp_flower_multiple_pf_recv_pkts(void *rx_queue,<br>
                 for (i = 0; i < recv; i++)<br>
                         data_len += rx_pkts[i]->data_len;<br>
 <br>
-               repr->repr_stats.q_ipackets[rxq->qidx] += recv;<br>
-               repr->repr_stats.q_ibytes[rxq->qidx] += data_len;<br>
+               repr->repr_qstats.q_ipackets[rxq->qidx] += recv;<br>
+               repr->repr_qstats.q_ibytes[rxq->qidx] += data_len;<br>
         }<br>
 <br>
         return recv;<br>
@@ -276,8 +276,8 @@ nfp_flower_multiple_pf_xmit_pkts(void *tx_queue,<br>
                 for (i = 0; i < sent; i++)<br>
                         data_len += tx_pkts[i]->data_len;<br>
 <br>
-               repr->repr_stats.q_opackets[txq->qidx] += sent;<br>
-               repr->repr_stats.q_obytes[txq->qidx] += data_len;<br>
+               repr->repr_qstats.q_opackets[txq->qidx] += sent;<br>
+               repr->repr_qstats.q_obytes[txq->qidx] += data_len;<br>
         }<br>
 <br>
         return sent;<br>
diff --git a/drivers/net/nfp/flower/nfp_flower_representor.c b/drivers/net/nfp/flower/nfp_flower_representor.c<br>
index 6c3a30c694..9b984dbc8d 100644<br>
--- a/drivers/net/nfp/flower/nfp_flower_representor.c<br>
+++ b/drivers/net/nfp/flower/nfp_flower_representor.c<br>
@@ -314,7 +314,7 @@ nfp_flower_repr_tx_queue_setup(struct rte_eth_dev *dev,<br>
 <br>
 static int<br>
 nfp_flower_repr_stats_get(struct rte_eth_dev *ethdev,<br>
-               struct rte_eth_stats *stats)<br>
+               struct rte_eth_stats *stats, struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         uint16_t i;<br>
         struct nfp_flower_representor *repr;<br>
@@ -324,15 +324,15 @@ nfp_flower_repr_stats_get(struct rte_eth_dev *ethdev,<br>
         repr->repr_stats.ipackets = 0;<br>
         repr->repr_stats.ibytes = 0;<br>
         for (i = 0; i < ethdev->data->nb_rx_queues; i++) {<br>
-               repr->repr_stats.ipackets += repr->repr_stats.q_ipackets[i];<br>
-               repr->repr_stats.ibytes += repr->repr_stats.q_ibytes[i];<br>
+               repr->repr_stats.ipackets += repr->repr_qstats.q_ipackets[i];<br>
+               repr->repr_stats.ibytes += repr->repr_qstats.q_ibytes[i];<br>
         }<br>
 <br>
         repr->repr_stats.opackets = 0;<br>
         repr->repr_stats.obytes = 0;<br>
         for (i = 0; i < ethdev->data->nb_tx_queues; i++) {<br>
-               repr->repr_stats.opackets += repr->repr_stats.q_opackets[i];<br>
-               repr->repr_stats.obytes += repr->repr_stats.q_obytes[i];<br>
+               repr->repr_stats.opackets += repr->repr_qstats.q_opackets[i];<br>
+               repr->repr_stats.obytes += repr->repr_qstats.q_obytes[i];<br>
         }<br>
 <br>
         *stats = repr->repr_stats;<br>
@@ -347,6 +347,7 @@ nfp_flower_repr_stats_reset(struct rte_eth_dev *ethdev)<br>
 <br>
         repr = ethdev->data->dev_private;<br>
         memset(&repr->repr_stats, 0, sizeof(struct rte_eth_stats));<br>
+       memset(&repr->repr_qstats, 0, sizeof(struct eth_queue_stats));<br>
 <br>
         return 0;<br>
 }<br>
@@ -402,8 +403,8 @@ nfp_flower_repr_rx_burst(void *rx_queue,<br>
                 for (i = 0; i < total_dequeue; i++)<br>
                         data_len += rx_pkts[i]->data_len;<br>
 <br>
-               repr->repr_stats.q_ipackets[rxq->qidx] += total_dequeue;<br>
-               repr->repr_stats.q_ibytes[rxq->qidx] += data_len;<br>
+               repr->repr_qstats.q_ipackets[rxq->qidx] += total_dequeue;<br>
+               repr->repr_qstats.q_ibytes[rxq->qidx] += data_len;<br>
         }<br>
 <br>
         return total_dequeue;<br>
@@ -450,8 +451,8 @@ nfp_flower_repr_tx_burst(void *tx_queue,<br>
                 for (i = 0; i < sent; i++)<br>
                         data_len += tx_pkts[i]->data_len;<br>
 <br>
-               repr->repr_stats.q_opackets[txq->qidx] += sent;<br>
-               repr->repr_stats.q_obytes[txq->qidx] += data_len;<br>
+               repr->repr_qstats.q_opackets[txq->qidx] += sent;<br>
+               repr->repr_qstats.q_obytes[txq->qidx] += data_len;<br>
         }<br>
 <br>
         return sent;<br>
diff --git a/drivers/net/nfp/flower/nfp_flower_representor.h b/drivers/net/nfp/flower/nfp_flower_representor.h<br>
index a7416eccab..66714d9a51 100644<br>
--- a/drivers/net/nfp/flower/nfp_flower_representor.h<br>
+++ b/drivers/net/nfp/flower/nfp_flower_representor.h<br>
@@ -6,6 +6,8 @@<br>
 #ifndef __NFP_FLOWER_REPRESENTOR_H__<br>
 #define __NFP_FLOWER_REPRESENTOR_H__<br>
 <br>
+#include <ethdev_driver.h><br>
+<br>
 #include "nfp_flower.h"<br>
 <br>
 struct nfp_flower_representor {<br>
@@ -20,6 +22,7 @@ struct nfp_flower_representor {<br>
         struct rte_ring **ring;<br>
         struct rte_eth_link link;<br>
         struct rte_eth_stats repr_stats;<br>
+       struct eth_queue_stats repr_qstats;<br>
 <br>
         struct rte_eth_xstat *repr_xstats_base;<br>
         uint8_t *mac_stats;<br>
diff --git a/drivers/net/nfp/nfp_net_common.c b/drivers/net/nfp/nfp_net_common.c<br>
index 730372e279..d35eee970a 100644<br>
--- a/drivers/net/nfp/nfp_net_common.c<br>
+++ b/drivers/net/nfp/nfp_net_common.c<br>
@@ -904,7 +904,7 @@ nfp_net_link_update(struct rte_eth_dev *dev,<br>
 <br>
 int<br>
 nfp_net_stats_get(struct rte_eth_dev *dev,<br>
-               struct rte_eth_stats *stats)<br>
+               struct rte_eth_stats *stats, struct eth_queue_stats *qstats)<br>
 {<br>
         uint16_t i;<br>
         struct nfp_net_hw *hw;<br>
@@ -922,15 +922,16 @@ nfp_net_stats_get(struct rte_eth_dev *dev,<br>
                 if (i == RTE_ETHDEV_QUEUE_STAT_CNTRS)<br>
                         break;<br>
 <br>
-               nfp_dev_stats.q_ipackets[i] =<br>
-                               nn_cfg_readq(&hw->super, NFP_NET_CFG_RXR_STATS(i));<br>
-               nfp_dev_stats.q_ipackets[i] -=<br>
-                               hw->eth_stats_base.q_ipackets[i];<br>
+               uint64_t q_ipackets = nn_cfg_readq(&hw->super, NFP_NET_CFG_RXR_STATS(i));<br>
+               q_ipackets -= hw->eth_qstats_base.q_ipackets[i];<br>
 <br>
-               nfp_dev_stats.q_ibytes[i] =<br>
-                               nn_cfg_readq(&hw->super, NFP_NET_CFG_RXR_STATS(i) + 0x8);<br>
-               nfp_dev_stats.q_ibytes[i] -=<br>
-                               hw->eth_stats_base.q_ibytes[i];<br>
+               uint64_t q_ibytes = nn_cfg_readq(&hw->super, NFP_NET_CFG_RXR_STATS(i) + 0x8);<br>
+               q_ibytes -= hw->eth_qstats_base.q_ibytes[i];<br>
+<br>
+               if (qstats != NULL) {<br>
+                       qstats->q_ipackets[i] = q_ipackets;<br>
+                       qstats->q_ibytes[i] = q_ibytes;<br>
+               }<br>
         }<br>
 <br>
         /* Reading per TX ring stats */<br>
@@ -938,13 +939,16 @@ nfp_net_stats_get(struct rte_eth_dev *dev,<br>
                 if (i == RTE_ETHDEV_QUEUE_STAT_CNTRS)<br>
                         break;<br>
 <br>
-               nfp_dev_stats.q_opackets[i] =<br>
-                               nn_cfg_readq(&hw->super, NFP_NET_CFG_TXR_STATS(i));<br>
-               nfp_dev_stats.q_opackets[i] -= hw->eth_stats_base.q_opackets[i];<br>
+               uint64_t q_opackets = nn_cfg_readq(&hw->super, NFP_NET_CFG_TXR_STATS(i));<br>
+               q_opackets -= hw->eth_qstats_base.q_opackets[i];<br>
 <br>
-               nfp_dev_stats.q_obytes[i] =<br>
-                               nn_cfg_readq(&hw->super, NFP_NET_CFG_TXR_STATS(i) + 0x8);<br>
-               nfp_dev_stats.q_obytes[i] -= hw->eth_stats_base.q_obytes[i];<br>
+               uint64_t q_obytes = nn_cfg_readq(&hw->super, NFP_NET_CFG_TXR_STATS(i) + 0x8);<br>
+               q_obytes -= hw->eth_qstats_base.q_obytes[i];<br>
+<br>
+               if (qstats != NULL) {<br>
+                       qstats->q_opackets[i] = q_opackets;<br>
+                       qstats->q_obytes[i] = q_obytes;<br>
+               }<br>
         }<br>
 <br>
         nfp_dev_stats.ipackets = nn_cfg_readq(&hw->super, NFP_NET_CFG_STATS_RX_FRAMES);<br>
@@ -982,8 +986,8 @@ nfp_net_stats_get(struct rte_eth_dev *dev,<br>
 }<br>
 <br>
 /*<br>
- * hw->eth_stats_base records the per counter starting point.<br>
- * Lets update it now.<br>
+ * hw->eth_stats_base and hw->eth_qstats_base record the per counter starting point.<br>
+ * Let's update them now.<br>
  */<br>
 int<br>
 nfp_net_stats_reset(struct rte_eth_dev *dev)<br>
@@ -998,10 +1002,10 @@ nfp_net_stats_reset(struct rte_eth_dev *dev)<br>
                 if (i == RTE_ETHDEV_QUEUE_STAT_CNTRS)<br>
                         break;<br>
 <br>
-               hw->eth_stats_base.q_ipackets[i] =<br>
+               hw->eth_qstats_base.q_ipackets[i] =<br>
                                 nn_cfg_readq(&hw->super, NFP_NET_CFG_RXR_STATS(i));<br>
 <br>
-               hw->eth_stats_base.q_ibytes[i] =<br>
+               hw->eth_qstats_base.q_ibytes[i] =<br>
                                 nn_cfg_readq(&hw->super, NFP_NET_CFG_RXR_STATS(i) + 0x8);<br>
         }<br>
 <br>
@@ -1010,10 +1014,10 @@ nfp_net_stats_reset(struct rte_eth_dev *dev)<br>
                 if (i == RTE_ETHDEV_QUEUE_STAT_CNTRS)<br>
                         break;<br>
 <br>
-               hw->eth_stats_base.q_opackets[i] =<br>
+               hw->eth_qstats_base.q_opackets[i] =<br>
                                 nn_cfg_readq(&hw->super, NFP_NET_CFG_TXR_STATS(i));<br>
 <br>
-               hw->eth_stats_base.q_obytes[i] =<br>
+               hw->eth_qstats_base.q_obytes[i] =<br>
                                 nn_cfg_readq(&hw->super, NFP_NET_CFG_TXR_STATS(i) + 0x8);<br>
         }<br>
 <br>
diff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h<br>
index a6addf8610..2bd2d54028 100644<br>
--- a/drivers/net/nfp/nfp_net_common.h<br>
+++ b/drivers/net/nfp/nfp_net_common.h<br>
@@ -250,6 +250,7 @@ struct nfp_net_hw {<br>
 <br>
         /** Records starting point for counters */<br>
         struct rte_eth_stats eth_stats_base;<br>
+       struct eth_queue_stats eth_qstats_base;<br>
         struct rte_eth_xstat *eth_xstats_base;<br>
 <br>
         struct nfp_cpp_area *ctrl_area;<br>
@@ -301,7 +302,8 @@ int nfp_net_link_update_common(struct rte_eth_dev *dev,<br>
                 uint32_t link_status);<br>
 int nfp_net_link_update(struct rte_eth_dev *dev,<br>
                 __rte_unused int wait_to_complete);<br>
-int nfp_net_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);<br>
+int nfp_net_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats);<br>
 int nfp_net_stats_reset(struct rte_eth_dev *dev);<br>
 uint32_t nfp_net_xstats_size(const struct rte_eth_dev *dev);<br>
 int nfp_net_xstats_get_names(struct rte_eth_dev *dev,<br>
diff --git a/drivers/net/ngbe/ngbe_ethdev.c b/drivers/net/ngbe/ngbe_ethdev.c<br>
index d3ac40299f..adb7785498 100644<br>
--- a/drivers/net/ngbe/ngbe_ethdev.c<br>
+++ b/drivers/net/ngbe/ngbe_ethdev.c<br>
@@ -1498,7 +1498,8 @@ ngbe_read_stats_registers(struct ngbe_hw *hw,<br>
 }<br>
 <br>
 static int<br>
-ngbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+ngbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats)<br>
 {<br>
         struct ngbe_hw *hw = ngbe_dev_hw(dev);<br>
         struct ngbe_hw_stats *hw_stats = NGBE_DEV_STATS(dev);<br>
@@ -1518,29 +1519,31 @@ ngbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
         stats->opackets = hw_stats->tx_packets;<br>
         stats->obytes = hw_stats->tx_bytes;<br>
 <br>
-       memset(&stats->q_ipackets, 0, sizeof(stats->q_ipackets));<br>
-       memset(&stats->q_opackets, 0, sizeof(stats->q_opackets));<br>
-       memset(&stats->q_ibytes, 0, sizeof(stats->q_ibytes));<br>
-       memset(&stats->q_obytes, 0, sizeof(stats->q_obytes));<br>
-       memset(&stats->q_errors, 0, sizeof(stats->q_errors));<br>
-       for (i = 0; i < NGBE_MAX_QP; i++) {<br>
-               uint32_t n = i / NB_QMAP_FIELDS_PER_QSM_REG;<br>
-               uint32_t offset = (i % NB_QMAP_FIELDS_PER_QSM_REG) * 8;<br>
-               uint32_t q_map;<br>
-<br>
-               q_map = (stat_mappings->rqsm[n] >> offset)<br>
-                               & QMAP_FIELD_RESERVED_BITS_MASK;<br>
-               j = (q_map < RTE_ETHDEV_QUEUE_STAT_CNTRS<br>
-                    ? q_map : q_map % RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
-               stats->q_ipackets[j] += hw_stats->qp[i].rx_qp_packets;<br>
-               stats->q_ibytes[j] += hw_stats->qp[i].rx_qp_bytes;<br>
-<br>
-               q_map = (stat_mappings->tqsm[n] >> offset)<br>
-                               & QMAP_FIELD_RESERVED_BITS_MASK;<br>
-               j = (q_map < RTE_ETHDEV_QUEUE_STAT_CNTRS<br>
-                    ? q_map : q_map % RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
-               stats->q_opackets[j] += hw_stats->qp[i].tx_qp_packets;<br>
-               stats->q_obytes[j] += hw_stats->qp[i].tx_qp_bytes;<br>
+       if (qstats != NULL) {<br>
+               memset(&qstats->q_ipackets, 0, sizeof(qstats->q_ipackets));<br>
+               memset(&qstats->q_opackets, 0, sizeof(qstats->q_opackets));<br>
+               memset(&qstats->q_ibytes, 0, sizeof(qstats->q_ibytes));<br>
+               memset(&qstats->q_obytes, 0, sizeof(qstats->q_obytes));<br>
+               memset(&qstats->q_errors, 0, sizeof(qstats->q_errors));<br>
+               for (i = 0; i < NGBE_MAX_QP; i++) {<br>
+                       uint32_t n = i / NB_QMAP_FIELDS_PER_QSM_REG;<br>
+                       uint32_t offset = (i % NB_QMAP_FIELDS_PER_QSM_REG) * 8;<br>
+                       uint32_t q_map;<br>
+<br>
+                       q_map = (stat_mappings->rqsm[n] >> offset)<br>
+                                       & QMAP_FIELD_RESERVED_BITS_MASK;<br>
+                       j = (q_map < RTE_ETHDEV_QUEUE_STAT_CNTRS<br>
+                            ? q_map : q_map % RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
+                       qstats->q_ipackets[j] += hw_stats->qp[i].rx_qp_packets;<br>
+                       qstats->q_ibytes[j] += hw_stats->qp[i].rx_qp_bytes;<br>
+<br>
+                       q_map = (stat_mappings->tqsm[n] >> offset)<br>
+                                       & QMAP_FIELD_RESERVED_BITS_MASK;<br>
+                       j = (q_map < RTE_ETHDEV_QUEUE_STAT_CNTRS<br>
+                            ? q_map : q_map % RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
+                       qstats->q_opackets[j] += hw_stats->qp[i].tx_qp_packets;<br>
+                       qstats->q_obytes[j] += hw_stats->qp[i].tx_qp_bytes;<br>
+               }<br>
         }<br>
 <br>
         /* Rx Errors */<br>
@@ -1580,7 +1583,7 @@ ngbe_dev_stats_reset(struct rte_eth_dev *dev)<br>
 <br>
         /* HW registers are cleared on read */<br>
         hw->offset_loaded = 0;<br>
-       ngbe_dev_stats_get(dev, NULL);<br>
+       ngbe_dev_stats_get(dev, NULL, NULL);<br>
         hw->offset_loaded = 1;<br>
 <br>
         /* Reset software totals */<br>
diff --git a/drivers/net/ngbe/ngbe_ethdev_vf.c b/drivers/net/ngbe/ngbe_ethdev_vf.c<br>
index 846bc981f6..e575c47049 100644<br>
--- a/drivers/net/ngbe/ngbe_ethdev_vf.c<br>
+++ b/drivers/net/ngbe/ngbe_ethdev_vf.c<br>
@@ -425,7 +425,8 @@ ngbevf_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,<br>
 }<br>
 <br>
 static int<br>
-ngbevf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+ngbevf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct ngbevf_hw_stats *hw_stats = (struct ngbevf_hw_stats *)<br>
                           NGBE_DEV_STATS(dev);<br>
@@ -449,7 +450,7 @@ ngbevf_dev_stats_reset(struct rte_eth_dev *dev)<br>
                         NGBE_DEV_STATS(dev);<br>
 <br>
         /* Sync HW register to the last stats */<br>
-       ngbevf_dev_stats_get(dev, NULL);<br>
+       ngbevf_dev_stats_get(dev, NULL, NULL);<br>
 <br>
         /* reset HW current stats*/<br>
         hw_stats->vfgprc = 0;<br>
diff --git a/drivers/net/ntnic/ntnic_ethdev.c b/drivers/net/ntnic/ntnic_ethdev.c<br>
index 79ef9e7e7c..4c090aa521 100644<br>
--- a/drivers/net/ntnic/ntnic_ethdev.c<br>
+++ b/drivers/net/ntnic/ntnic_ethdev.c<br>
@@ -167,7 +167,8 @@ get_pdrv_from_pci(struct rte_pci_addr addr)<br>
         return p_drv;<br>
 }<br>
 <br>
-static int dpdk_stats_collect(struct pmd_internals *internals, struct rte_eth_stats *stats)<br>
+static int dpdk_stats_collect(struct pmd_internals *internals, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats)<br>
 {<br>
         const struct ntnic_filter_ops *ntnic_filter_ops = get_ntnic_filter_ops();<br>
 <br>
@@ -201,19 +202,19 @@ static int dpdk_stats_collect(struct pmd_internals *internals, struct rte_eth_st<br>
         ntnic_filter_ops->poll_statistics(internals);<br>
 <br>
         for (i = 0; i < internals->nb_rx_queues; i++) {<br>
-               if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
-                       stats->q_ipackets[i] = internals->rxq_scg[i].rx_pkts;<br>
-                       stats->q_ibytes[i] = internals->rxq_scg[i].rx_bytes;<br>
+               if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                       qstats->q_ipackets[i] = internals->rxq_scg[i].rx_pkts;<br>
+                       qstats->q_ibytes[i] = internals->rxq_scg[i].rx_bytes;<br>
                 }<br>
                 rx_total += internals->rxq_scg[i].rx_pkts;<br>
                 rx_total_b += internals->rxq_scg[i].rx_bytes;<br>
         }<br>
 <br>
         for (i = 0; i < internals->nb_tx_queues; i++) {<br>
-               if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
-                       stats->q_opackets[i] = internals->txq_scg[i].tx_pkts;<br>
-                       stats->q_obytes[i] = internals->txq_scg[i].tx_bytes;<br>
-                       stats->q_errors[i] = internals->txq_scg[i].err_pkts;<br>
+               if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                       qstats->q_opackets[i] = internals->txq_scg[i].tx_pkts;<br>
+                       qstats->q_obytes[i] = internals->txq_scg[i].tx_bytes;<br>
+                       qstats->q_errors[i] = internals->txq_scg[i].err_pkts;<br>
                 }<br>
                 tx_total += internals->txq_scg[i].tx_pkts;<br>
                 tx_total_b += internals->txq_scg[i].tx_bytes;<br>
@@ -303,10 +304,11 @@ eth_link_update(struct rte_eth_dev *eth_dev, int wait_to_complete __rte_unused)<br>
         return 0;<br>
 }<br>
 <br>
-static int eth_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats)<br>
+static int eth_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats)<br>
 {<br>
         struct pmd_internals *internals = eth_dev->data->dev_private;<br>
-       dpdk_stats_collect(internals, stats);<br>
+       dpdk_stats_collect(internals, stats, qstats);<br>
         return 0;<br>
 }<br>
 <br>
diff --git a/drivers/net/null/rte_eth_null.c b/drivers/net/null/rte_eth_null.c<br>
index 4f273319f2..14bc65c8ad 100644<br>
--- a/drivers/net/null/rte_eth_null.c<br>
+++ b/drivers/net/null/rte_eth_null.c<br>
@@ -426,7 +426,8 @@ eth_dev_info(struct rte_eth_dev *dev,<br>
 }<br>
 <br>
 static int<br>
-eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats)<br>
 {<br>
         const struct pmd_internals *internal = dev->data->dev_private;<br>
         unsigned int i;<br>
@@ -438,9 +439,9 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
                 stats->ipackets += pkts;<br>
                 stats->ibytes += bytes;<br>
 <br>
-               if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
-                       stats->q_ipackets[i] = pkts;<br>
-                       stats->q_ibytes[i] = bytes;<br>
+               if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                       qstats->q_ipackets[i] = pkts;<br>
+                       qstats->q_ibytes[i] = bytes;<br>
                 }<br>
         }<br>
 <br>
@@ -454,9 +455,9 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
                 stats->opackets = pkts;<br>
                 stats->obytes = bytes;<br>
 <br>
-               if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
-                       stats->q_opackets[i] = pkts;<br>
-                       stats->q_obytes[i] = bytes;<br>
+               if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                       qstats->q_opackets[i] = pkts;<br>
+                       qstats->q_obytes[i] = bytes;<br>
                 }<br>
         }<br>
 <br>
diff --git a/drivers/net/octeon_ep/otx_ep_ethdev.c b/drivers/net/octeon_ep/otx_ep_ethdev.c<br>
index 10f2f8a2e0..79dc02ee0b 100644<br>
--- a/drivers/net/octeon_ep/otx_ep_ethdev.c<br>
+++ b/drivers/net/octeon_ep/otx_ep_ethdev.c<br>
@@ -608,7 +608,8 @@ otx_ep_dev_stats_reset(struct rte_eth_dev *dev)<br>
 <br>
 static int<br>
 otx_ep_dev_stats_get(struct rte_eth_dev *eth_dev,<br>
-                               struct rte_eth_stats *stats)<br>
+                               struct rte_eth_stats *stats,<br>
+                               struct eth_queue_stats *qstats)<br>
 {<br>
         struct otx_ep_device *otx_epvf = OTX_EP_DEV(eth_dev);<br>
         struct otx_ep_iq_stats *ostats;<br>
@@ -619,17 +620,21 @@ otx_ep_dev_stats_get(struct rte_eth_dev *eth_dev,<br>
 <br>
         for (i = 0; i < otx_epvf->nb_tx_queues; i++) {<br>
                 ostats = &otx_epvf->instr_queue[i]->stats;<br>
-               stats->q_opackets[i] = ostats->tx_pkts;<br>
-               stats->q_obytes[i] = ostats->tx_bytes;<br>
+               if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                       qstats->q_opackets[i] = ostats->tx_pkts;<br>
+                       qstats->q_obytes[i] = ostats->tx_bytes;<br>
+               }<br>
                 stats->opackets += ostats->tx_pkts;<br>
                 stats->obytes += ostats->tx_bytes;<br>
                 stats->oerrors += ostats->instr_dropped;<br>
         }<br>
         for (i = 0; i < otx_epvf->nb_rx_queues; i++) {<br>
                 istats = &otx_epvf->droq[i]->stats;<br>
-               stats->q_ipackets[i] = istats->pkts_received;<br>
-               stats->q_ibytes[i] = istats->bytes_received;<br>
-               stats->q_errors[i] = istats->rx_err;<br>
+               if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                       qstats->q_ipackets[i] = istats->pkts_received;<br>
+                       qstats->q_ibytes[i] = istats->bytes_received;<br>
+                       qstats->q_errors[i] = istats->rx_err;<br>
+               }<br>
                 stats->ipackets += istats->pkts_received;<br>
                 stats->ibytes += istats->bytes_received;<br>
                 stats->imissed += istats->rx_alloc_failure;<br>
diff --git a/drivers/net/octeontx/octeontx_ethdev.c b/drivers/net/octeontx/octeontx_ethdev.c<br>
index 9451431144..21e3e56901 100644<br>
--- a/drivers/net/octeontx/octeontx_ethdev.c<br>
+++ b/drivers/net/octeontx/octeontx_ethdev.c<br>
@@ -1022,7 +1022,8 @@ octeontx_dev_xstats_get(struct rte_eth_dev *dev,<br>
 }<br>
 <br>
 static int<br>
-octeontx_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+octeontx_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+                      struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct octeontx_nic *nic = octeontx_pmd_priv(dev);<br>
 <br>
diff --git a/drivers/net/pcap/pcap_ethdev.c b/drivers/net/pcap/pcap_ethdev.c<br>
index 728ef85d53..f323c0b0df 100644<br>
--- a/drivers/net/pcap/pcap_ethdev.c<br>
+++ b/drivers/net/pcap/pcap_ethdev.c<br>
@@ -750,7 +750,8 @@ eth_dev_info(struct rte_eth_dev *dev,<br>
 }<br>
 <br>
 static int<br>
-eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+             struct eth_queue_stats *qstats)<br>
 {<br>
         unsigned int i;<br>
         unsigned long rx_packets_total = 0, rx_bytes_total = 0;<br>
@@ -762,21 +763,25 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
 <br>
         for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS &&<br>
                         i < dev->data->nb_rx_queues; i++) {<br>
-               stats->q_ipackets[i] = internal->rx_queue[i].rx_stat.pkts;<br>
-               stats->q_ibytes[i] = internal->rx_queue[i].rx_stat.bytes;<br>
+               if (qstats != NULL) {<br>
+                       qstats->q_ipackets[i] = internal->rx_queue[i].rx_stat.pkts;<br>
+                       qstats->q_ibytes[i] = internal->rx_queue[i].rx_stat.bytes;<br>
+               }<br>
                 rx_nombuf_total += internal->rx_queue[i].rx_stat.rx_nombuf;<br>
                 rx_err_total += internal->rx_queue[i].rx_stat.err_pkts;<br>
-               rx_packets_total += stats->q_ipackets[i];<br>
-               rx_bytes_total += stats->q_ibytes[i];<br>
+               rx_packets_total += internal->rx_queue[i].rx_stat.pkts;<br>
+               rx_bytes_total += internal->rx_queue[i].rx_stat.bytes;<br>
                 rx_missed_total += queue_missed_stat_get(dev, i);<br>
         }<br>
 <br>
         for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS &&<br>
                         i < dev->data->nb_tx_queues; i++) {<br>
-               stats->q_opackets[i] = internal->tx_queue[i].tx_stat.pkts;<br>
-               stats->q_obytes[i] = internal->tx_queue[i].tx_stat.bytes;<br>
-               tx_packets_total += stats->q_opackets[i];<br>
-               tx_bytes_total += stats->q_obytes[i];<br>
+               if (qstats != NULL) {<br>
+                       qstats->q_opackets[i] = internal->tx_queue[i].tx_stat.pkts;<br>
+                       qstats->q_obytes[i] = internal->tx_queue[i].tx_stat.bytes;<br>
+               }<br>
+               tx_packets_total += internal->tx_queue[i].tx_stat.pkts;<br>
+               tx_bytes_total += internal->tx_queue[i].tx_stat.bytes;<br>
                 tx_packets_err_total += internal->tx_queue[i].tx_stat.err_pkts;<br>
         }<br>
 <br>
diff --git a/drivers/net/pfe/pfe_ethdev.c b/drivers/net/pfe/pfe_ethdev.c<br>
index 725ffcb2bc..1efa17539e 100644<br>
--- a/drivers/net/pfe/pfe_ethdev.c<br>
+++ b/drivers/net/pfe/pfe_ethdev.c<br>
@@ -713,7 +713,8 @@ pfe_dev_set_mac_addr(struct rte_eth_dev *dev,<br>
 <br>
 static int<br>
 pfe_stats_get(struct rte_eth_dev *dev,<br>
-             struct rte_eth_stats *stats)<br>
+             struct rte_eth_stats *stats,<br>
+             struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct pfe_eth_priv_s *priv = dev->data->dev_private;<br>
         struct rte_eth_stats *eth_stats = &priv->stats;<br>
diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c<br>
index bee9fa4f60..e1c28a0ac2 100644<br>
--- a/drivers/net/qede/qede_ethdev.c<br>
+++ b/drivers/net/qede/qede_ethdev.c<br>
@@ -1592,7 +1592,8 @@ static int qede_dev_close(struct rte_eth_dev *eth_dev)<br>
 }<br>
 <br>
 static int<br>
-qede_get_stats(struct rte_eth_dev *eth_dev, struct rte_eth_stats *eth_stats)<br>
+qede_get_stats(struct rte_eth_dev *eth_dev, struct rte_eth_stats *eth_stats,<br>
+              struct eth_queue_stats *qstats)<br>
 {<br>
         struct qede_dev *qdev = eth_dev->data->dev_private;<br>
         struct ecore_dev *edev = &qdev->edev;<br>
@@ -1645,18 +1646,18 @@ qede_get_stats(struct rte_eth_dev *eth_dev, struct rte_eth_stats *eth_stats)<br>
                        " appropriately and retry.\n");<br>
 <br>
         for (qid = 0; qid < eth_dev->data->nb_rx_queues; qid++) {<br>
-               eth_stats->q_ipackets[i] = 0;<br>
-               eth_stats->q_errors[i] = 0;<br>
+               uint64_t q_ipackets = 0;<br>
+               uint64_t q_errors = 0;<br>
 <br>
                 for_each_hwfn(edev, hw_fn) {<br>
                         idx = qid * edev->num_hwfns + hw_fn;<br>
 <br>
-                       eth_stats->q_ipackets[i] +=<br>
+                       q_ipackets +=<br>
                                 *(uint64_t *)<br>
                                         (((char *)(qdev->fp_array[idx].rxq)) +<br>
                                          offsetof(struct qede_rx_queue,<br>
                                          rcv_pkts));<br>
-                       eth_stats->q_errors[i] +=<br>
+                       q_errors +=<br>
                                 *(uint64_t *)<br>
                                         (((char *)(qdev->fp_array[idx].rxq)) +<br>
                                          offsetof(struct qede_rx_queue,<br>
@@ -1667,25 +1668,33 @@ qede_get_stats(struct rte_eth_dev *eth_dev, struct rte_eth_stats *eth_stats)<br>
                                          rx_alloc_errors));<br>
                 }<br>
 <br>
+               if (qstats != NULL) {<br>
+                       qstats->q_ipackets[i] = q_ipackets;<br>
+                       qstats->q_errors[i] = q_errors;<br>
+               }<br>
+<br>
                 i++;<br>
                 if (i == rxq_stat_cntrs)<br>
                         break;<br>
         }<br>
 <br>
         for (qid = 0; qid < eth_dev->data->nb_tx_queues; qid++) {<br>
-               eth_stats->q_opackets[j] = 0;<br>
+               uint64_t q_opackets = 0;<br>
 <br>
                 for_each_hwfn(edev, hw_fn) {<br>
                         idx = qid * edev->num_hwfns + hw_fn;<br>
 <br>
                         txq = qdev->fp_array[idx].txq;<br>
-                       eth_stats->q_opackets[j] +=<br>
+                       q_opackets +=<br>
                                 *((uint64_t *)(uintptr_t)<br>
                                         (((uint64_t)(uintptr_t)(txq)) +<br>
                                          offsetof(struct qede_tx_queue,<br>
                                                   xmit_pkts)));<br>
                 }<br>
 <br>
+               if (qstats != NULL)<br>
+                       qstats->q_opackets[j] = q_opackets;<br>
+<br>
                 j++;<br>
                 if (j == txq_stat_cntrs)<br>
                         break;<br>
diff --git a/drivers/net/r8169/r8169_ethdev.c b/drivers/net/r8169/r8169_ethdev.c<br>
index 8071e14412..69512ced8b 100644<br>
--- a/drivers/net/r8169/r8169_ethdev.c<br>
+++ b/drivers/net/r8169/r8169_ethdev.c<br>
@@ -37,7 +37,8 @@ static int rtl_dev_set_link_down(struct rte_eth_dev *dev);<br>
 static int rtl_dev_infos_get(struct rte_eth_dev *dev,<br>
                              struct rte_eth_dev_info *dev_info);<br>
 static int rtl_dev_stats_get(struct rte_eth_dev *dev,<br>
-                            struct rte_eth_stats *rte_stats);<br>
+                            struct rte_eth_stats *rte_stats,<br>
+                            struct eth_queue_stats *qstats);<br>
 static int rtl_dev_stats_reset(struct rte_eth_dev *dev);<br>
 static int rtl_promiscuous_enable(struct rte_eth_dev *dev);<br>
 static int rtl_promiscuous_disable(struct rte_eth_dev *dev);<br>
@@ -533,7 +534,8 @@ rtl_sw_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats)<br>
 }<br>
 <br>
 static int<br>
-rtl_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats)<br>
+rtl_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats,<br>
+               struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct rtl_adapter *adapter = RTL_DEV_PRIVATE(dev);<br>
         struct rtl_hw *hw = &adapter->hw;<br>
diff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c<br>
index b1085bf390..b639544eab 100644<br>
--- a/drivers/net/ring/rte_eth_ring.c<br>
+++ b/drivers/net/ring/rte_eth_ring.c<br>
@@ -196,7 +196,8 @@ eth_dev_info(struct rte_eth_dev *dev,<br>
 }<br>
 <br>
 static int<br>
-eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+             struct eth_queue_stats *qstats)<br>
 {<br>
         unsigned int i;<br>
         unsigned long rx_total = 0, tx_total = 0;<br>
@@ -204,14 +205,16 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
 <br>
         for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS &&<br>
                         i < dev->data->nb_rx_queues; i++) {<br>
-               stats->q_ipackets[i] = internal->rx_ring_queues[i].rx_pkts;<br>
-               rx_total += stats->q_ipackets[i];<br>
+               if (qstats != NULL)<br>
+                       qstats->q_ipackets[i] = internal->rx_ring_queues[i].rx_pkts;<br>
+               rx_total += internal->rx_ring_queues[i].rx_pkts;<br>
         }<br>
 <br>
         for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS &&<br>
                         i < dev->data->nb_tx_queues; i++) {<br>
-               stats->q_opackets[i] = internal->tx_ring_queues[i].tx_pkts;<br>
-               tx_total += stats->q_opackets[i];<br>
+               if (qstats != NULL)<br>
+                       qstats->q_opackets[i] = internal->tx_ring_queues[i].tx_pkts;<br>
+               tx_total += internal->tx_ring_queues[i].tx_pkts;<br>
         }<br>
 <br>
         stats->ipackets = rx_total;<br>
diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c<br>
index de1c077f61..f5babb797d 100644<br>
--- a/drivers/net/rnp/rnp_ethdev.c<br>
+++ b/drivers/net/rnp/rnp_ethdev.c<br>
@@ -1233,7 +1233,8 @@ static void rnp_get_hw_stats(struct rte_eth_dev *dev)<br>
 <br>
 static int<br>
 rnp_dev_stats_get(struct rte_eth_dev *dev,<br>
-                 struct rte_eth_stats *stats)<br>
+                 struct rte_eth_stats *stats,<br>
+                 struct eth_queue_stats *qstats)<br>
 {<br>
         struct rnp_eth_port *port = RNP_DEV_TO_PORT(dev);<br>
         struct rnp_hw_eth_stats *eth_stats = &port->eth_stats;<br>
@@ -1251,9 +1252,9 @@ rnp_dev_stats_get(struct rte_eth_dev *dev,<br>
                         continue;<br>
                 stats->ipackets += rxq->stats.ipackets;<br>
                 stats->ibytes += rxq->stats.ibytes;<br>
-               if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
-                       stats->q_ipackets[i] = rxq->stats.ipackets;<br>
-                       stats->q_ibytes[i] = rxq->stats.ibytes;<br>
+               if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                       qstats->q_ipackets[i] = rxq->stats.ipackets;<br>
+                       qstats->q_ibytes[i] = rxq->stats.ibytes;<br>
                 }<br>
         }<br>
 <br>
@@ -1265,9 +1266,9 @@ rnp_dev_stats_get(struct rte_eth_dev *dev,<br>
                 stats->opackets += txq->stats.opackets;<br>
                 stats->obytes += txq->stats.obytes;<br>
                 stats->oerrors += txq->stats.errors;<br>
-               if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
-                       stats->q_opackets[i] = txq->stats.opackets;<br>
-                       stats->q_obytes[i] = txq->stats.obytes;<br>
+               if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                       qstats->q_opackets[i] = txq->stats.opackets;<br>
+                       qstats->q_obytes[i] = txq->stats.obytes;<br>
                 }<br>
         }<br>
         stats->imissed = eth_stats->rx_trans_drop + eth_stats->rx_trunc_drop;<br>
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c<br>
index 8b0bf4eeee..99141bdda5 100644<br>
--- a/drivers/net/sfc/sfc_ethdev.c<br>
+++ b/drivers/net/sfc/sfc_ethdev.c<br>
@@ -823,7 +823,8 @@ sfc_update_diff_stat(uint64_t *stat, uint64_t newval)<br>
 }<br>
 <br>
 static int<br>
-sfc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+sfc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+             struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         const struct sfc_adapter_priv *sap = sfc_adapter_priv_by_eth_dev(dev);<br>
         bool have_dp_rx_stats = sap->dp_rx->features & SFC_DP_RX_FEAT_STATS;<br>
diff --git a/drivers/net/sfc/sfc_repr.c b/drivers/net/sfc/sfc_repr.c<br>
index 18e76fa7da..93da97387c 100644<br>
--- a/drivers/net/sfc/sfc_repr.c<br>
+++ b/drivers/net/sfc/sfc_repr.c<br>
@@ -846,7 +846,8 @@ sfc_repr_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr)<br>
 }<br>
 <br>
 static int<br>
-sfc_repr_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+sfc_repr_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+                   struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         union sfc_pkts_bytes queue_stats;<br>
         uint16_t i;<br>
diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c<br>
index 650ddbd706..3c9ba829d6 100644<br>
--- a/drivers/net/tap/rte_eth_tap.c<br>
+++ b/drivers/net/tap/rte_eth_tap.c<br>
@@ -1030,7 +1030,8 @@ tap_dev_info(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)<br>
 }<br>
 <br>
 static int<br>
-tap_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *tap_stats)<br>
+tap_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *tap_stats,<br>
+             struct eth_queue_stats *qstats)<br>
 {<br>
         unsigned int i, imax;<br>
         unsigned long rx_total = 0, tx_total = 0, tx_err_total = 0;<br>
@@ -1042,10 +1043,12 @@ tap_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *tap_stats)<br>
         imax = (dev->data->nb_rx_queues < RTE_ETHDEV_QUEUE_STAT_CNTRS) ?<br>
                 dev->data->nb_rx_queues : RTE_ETHDEV_QUEUE_STAT_CNTRS;<br>
         for (i = 0; i < imax; i++) {<br>
-               tap_stats->q_ipackets[i] = pmd->rxq[i].stats.ipackets;<br>
-               tap_stats->q_ibytes[i] = pmd->rxq[i].stats.ibytes;<br>
-               rx_total += tap_stats->q_ipackets[i];<br>
-               rx_bytes_total += tap_stats->q_ibytes[i];<br>
+               if (qstats != NULL) {<br>
+                       qstats->q_ipackets[i] = pmd->rxq[i].stats.ipackets;<br>
+                       qstats->q_ibytes[i] = pmd->rxq[i].stats.ibytes;<br>
+               }<br>
+               rx_total += pmd->rxq[i].stats.ipackets;<br>
+               rx_bytes_total += pmd->rxq[i].stats.ibytes;<br>
                 rx_nombuf += pmd->rxq[i].stats.rx_nombuf;<br>
                 ierrors += pmd->rxq[i].stats.ierrors;<br>
         }<br>
@@ -1055,11 +1058,13 @@ tap_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *tap_stats)<br>
                 dev->data->nb_tx_queues : RTE_ETHDEV_QUEUE_STAT_CNTRS;<br>
 <br>
         for (i = 0; i < imax; i++) {<br>
-               tap_stats->q_opackets[i] = pmd->txq[i].stats.opackets;<br>
-               tap_stats->q_obytes[i] = pmd->txq[i].stats.obytes;<br>
-               tx_total += tap_stats->q_opackets[i];<br>
+               if (qstats != NULL) {<br>
+                       qstats->q_opackets[i] = pmd->txq[i].stats.opackets;<br>
+                       qstats->q_obytes[i] = pmd->txq[i].stats.obytes;<br>
+               }<br>
+               tx_total += pmd->txq[i].stats.opackets;<br>
+               tx_bytes_total += pmd->txq[i].stats.obytes;<br>
                 tx_err_total += pmd->txq[i].stats.errs;<br>
-               tx_bytes_total += tap_stats->q_obytes[i];<br>
         }<br>
 <br>
         tap_stats->ipackets = rx_total;<br>
diff --git a/drivers/net/thunderx/nicvf_ethdev.c b/drivers/net/thunderx/nicvf_ethdev.c<br>
index 4441a90bdf..76ed76a045 100644<br>
--- a/drivers/net/thunderx/nicvf_ethdev.c<br>
+++ b/drivers/net/thunderx/nicvf_ethdev.c<br>
@@ -289,7 +289,8 @@ nicvf_dev_get_regs(struct rte_eth_dev *dev, struct rte_dev_reg_info *regs)<br>
 }<br>
 <br>
 static int<br>
-nicvf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+nicvf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+                   struct eth_queue_stats *qstats)<br>
 {<br>
         uint16_t qidx;<br>
         struct nicvf_hw_rx_qstats rx_qstats;<br>
@@ -309,8 +310,10 @@ nicvf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
                         break;<br>
 <br>
                 nicvf_hw_get_rx_qstats(nic, &rx_qstats, qidx);<br>
-               stats->q_ibytes[qidx] = rx_qstats.q_rx_bytes;<br>
-               stats->q_ipackets[qidx] = rx_qstats.q_rx_packets;<br>
+               if (qstats != NULL) {<br>
+                       qstats->q_ibytes[qidx] = rx_qstats.q_rx_bytes;<br>
+                       qstats->q_ipackets[qidx] = rx_qstats.q_rx_packets;<br>
+               }<br>
         }<br>
 <br>
         /* TX queue indices for the first VF */<br>
@@ -322,8 +325,10 @@ nicvf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
                         break;<br>
 <br>
                 nicvf_hw_get_tx_qstats(nic, &tx_qstats, qidx);<br>
-               stats->q_obytes[qidx] = tx_qstats.q_tx_bytes;<br>
-               stats->q_opackets[qidx] = tx_qstats.q_tx_packets;<br>
+               if (qstats != NULL) {<br>
+                       qstats->q_obytes[qidx] = tx_qstats.q_tx_bytes;<br>
+                       qstats->q_opackets[qidx] = tx_qstats.q_tx_packets;<br>
+               }<br>
         }<br>
 <br>
         for (i = 0; i < nic->sqs_count; i++) {<br>
@@ -342,8 +347,10 @@ nicvf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
 <br>
                         nicvf_hw_get_rx_qstats(snic, &rx_qstats,<br>
                                                qidx % MAX_RCV_QUEUES_PER_QS);<br>
-                       stats->q_ibytes[qidx] = rx_qstats.q_rx_bytes;<br>
-                       stats->q_ipackets[qidx] = rx_qstats.q_rx_packets;<br>
+                       if (qstats != NULL) {<br>
+                               qstats->q_ibytes[qidx] = rx_qstats.q_rx_bytes;<br>
+                               qstats->q_ipackets[qidx] = rx_qstats.q_rx_packets;<br>
+                       }<br>
                 }<br>
 <br>
                 /* TX queue indices for a secondary VF */<br>
@@ -355,8 +362,10 @@ nicvf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
 <br>
                         nicvf_hw_get_tx_qstats(snic, &tx_qstats,<br>
                                                qidx % MAX_SND_QUEUES_PER_QS);<br>
-                       stats->q_obytes[qidx] = tx_qstats.q_tx_bytes;<br>
-                       stats->q_opackets[qidx] = tx_qstats.q_tx_packets;<br>
+                       if (qstats != NULL) {<br>
+                               qstats->q_obytes[qidx] = tx_qstats.q_tx_bytes;<br>
+                               qstats->q_opackets[qidx] = tx_qstats.q_tx_packets;<br>
+                       }<br>
                 }<br>
         }<br>
 <br>
diff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c<br>
index 580579094b..33d1d59ead 100644<br>
--- a/drivers/net/txgbe/txgbe_ethdev.c<br>
+++ b/drivers/net/txgbe/txgbe_ethdev.c<br>
@@ -2342,7 +2342,8 @@ txgbe_read_stats_registers(struct txgbe_hw *hw,<br>
 }<br>
 <br>
 static int<br>
-txgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+txgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+                   struct eth_queue_stats *qstats)<br>
 {<br>
         struct txgbe_hw *hw = TXGBE_DEV_HW(dev);<br>
         struct txgbe_hw_stats *hw_stats = TXGBE_DEV_STATS(dev);<br>
@@ -2362,29 +2363,31 @@ txgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
         stats->opackets = hw_stats->tx_packets;<br>
         stats->obytes = hw_stats->tx_bytes;<br>
 <br>
-       memset(&stats->q_ipackets, 0, sizeof(stats->q_ipackets));<br>
-       memset(&stats->q_opackets, 0, sizeof(stats->q_opackets));<br>
-       memset(&stats->q_ibytes, 0, sizeof(stats->q_ibytes));<br>
-       memset(&stats->q_obytes, 0, sizeof(stats->q_obytes));<br>
-       memset(&stats->q_errors, 0, sizeof(stats->q_errors));<br>
-       for (i = 0; i < TXGBE_MAX_QP; i++) {<br>
-               uint32_t n = i / NB_QMAP_FIELDS_PER_QSM_REG;<br>
-               uint32_t offset = (i % NB_QMAP_FIELDS_PER_QSM_REG) * 8;<br>
-               uint32_t q_map;<br>
-<br>
-               q_map = (stat_mappings->rqsm[n] >> offset)<br>
-                               & QMAP_FIELD_RESERVED_BITS_MASK;<br>
-               j = (q_map < RTE_ETHDEV_QUEUE_STAT_CNTRS<br>
-                    ? q_map : q_map % RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
-               stats->q_ipackets[j] += hw_stats->qp[i].rx_qp_packets;<br>
-               stats->q_ibytes[j] += hw_stats->qp[i].rx_qp_bytes;<br>
-<br>
-               q_map = (stat_mappings->tqsm[n] >> offset)<br>
-                               & QMAP_FIELD_RESERVED_BITS_MASK;<br>
-               j = (q_map < RTE_ETHDEV_QUEUE_STAT_CNTRS<br>
-                    ? q_map : q_map % RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
-               stats->q_opackets[j] += hw_stats->qp[i].tx_qp_packets;<br>
-               stats->q_obytes[j] += hw_stats->qp[i].tx_qp_bytes;<br>
+       if (qstats != NULL) {<br>
+               memset(&qstats->q_ipackets, 0, sizeof(qstats->q_ipackets));<br>
+               memset(&qstats->q_opackets, 0, sizeof(qstats->q_opackets));<br>
+               memset(&qstats->q_ibytes, 0, sizeof(qstats->q_ibytes));<br>
+               memset(&qstats->q_obytes, 0, sizeof(qstats->q_obytes));<br>
+               memset(&qstats->q_errors, 0, sizeof(qstats->q_errors));<br>
+               for (i = 0; i < TXGBE_MAX_QP; i++) {<br>
+                       uint32_t n = i / NB_QMAP_FIELDS_PER_QSM_REG;<br>
+                       uint32_t offset = (i % NB_QMAP_FIELDS_PER_QSM_REG) * 8;<br>
+                       uint32_t q_map;<br>
+<br>
+                       q_map = (stat_mappings->rqsm[n] >> offset)<br>
+                                       & QMAP_FIELD_RESERVED_BITS_MASK;<br>
+                       j = (q_map < RTE_ETHDEV_QUEUE_STAT_CNTRS<br>
+                            ? q_map : q_map % RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
+                       qstats->q_ipackets[j] += hw_stats->qp[i].rx_qp_packets;<br>
+                       qstats->q_ibytes[j] += hw_stats->qp[i].rx_qp_bytes;<br>
+<br>
+                       q_map = (stat_mappings->tqsm[n] >> offset)<br>
+                                       & QMAP_FIELD_RESERVED_BITS_MASK;<br>
+                       j = (q_map < RTE_ETHDEV_QUEUE_STAT_CNTRS<br>
+                            ? q_map : q_map % RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
+                       qstats->q_opackets[j] += hw_stats->qp[i].tx_qp_packets;<br>
+                       qstats->q_obytes[j] += hw_stats->qp[i].tx_qp_bytes;<br>
+               }<br>
         }<br>
 <br>
         /* Rx Errors */<br>
@@ -2426,7 +2429,7 @@ txgbe_dev_stats_reset(struct rte_eth_dev *dev)<br>
 <br>
         /* HW registers are cleared on read */<br>
         hw->offset_loaded = 0;<br>
-       txgbe_dev_stats_get(dev, NULL);<br>
+       txgbe_dev_stats_get(dev, NULL, NULL);<br>
         hw->offset_loaded = 1;<br>
 <br>
         /* Reset software totals */<br>
diff --git a/drivers/net/txgbe/txgbe_ethdev_vf.c b/drivers/net/txgbe/txgbe_ethdev_vf.c<br>
index 847febf8c3..b369070da8 100644<br>
--- a/drivers/net/txgbe/txgbe_ethdev_vf.c<br>
+++ b/drivers/net/txgbe/txgbe_ethdev_vf.c<br>
@@ -494,7 +494,8 @@ txgbevf_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,<br>
 }<br>
 <br>
 static int<br>
-txgbevf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+txgbevf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+                     struct eth_queue_stats *qstats __rte_unused)<br>
 {<br>
         struct txgbevf_hw_stats *hw_stats = (struct txgbevf_hw_stats *)<br>
                           TXGBE_DEV_STATS(dev);<br>
@@ -528,7 +529,7 @@ txgbevf_dev_stats_reset(struct rte_eth_dev *dev)<br>
         uint32_t i;<br>
 <br>
         /* Sync HW register to the last stats */<br>
-       txgbevf_dev_stats_get(dev, NULL);<br>
+       txgbevf_dev_stats_get(dev, NULL, NULL);<br>
 <br>
         /* reset HW current stats*/<br>
         for (i = 0; i < 8; i++) {<br>
diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c<br>
index 87c91e2f96..05940f2461 100644<br>
--- a/drivers/net/vhost/rte_eth_vhost.c<br>
+++ b/drivers/net/vhost/rte_eth_vhost.c<br>
@@ -1310,7 +1310,8 @@ eth_dev_info(struct rte_eth_dev *dev,<br>
 }<br>
 <br>
 static int<br>
-eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+             struct eth_queue_stats *qstats)<br>
 {<br>
         unsigned i;<br>
         unsigned long rx_total = 0, tx_total = 0;<br>
@@ -1323,11 +1324,12 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
                 if (dev->data->rx_queues[i] == NULL)<br>
                         continue;<br>
                 vq = dev->data->rx_queues[i];<br>
-               stats->q_ipackets[i] = vq->stats.pkts;<br>
-               rx_total += stats->q_ipackets[i];<br>
-<br>
-               stats->q_ibytes[i] = vq->stats.bytes;<br>
-               rx_total_bytes += stats->q_ibytes[i];<br>
+               if (qstats != NULL) {<br>
+                       qstats->q_ipackets[i] = vq->stats.pkts;<br>
+                       qstats->q_ibytes[i] = vq->stats.bytes;<br>
+               }<br>
+               rx_total += vq->stats.pkts;<br>
+               rx_total_bytes += vq->stats.bytes;<br>
         }<br>
 <br>
         for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS &&<br>
@@ -1335,12 +1337,12 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
                 if (dev->data->tx_queues[i] == NULL)<br>
                         continue;<br>
                 vq = dev->data->tx_queues[i];<br>
-               stats->q_opackets[i] = vq->stats.pkts;<br>
-               tx_total += stats->q_opackets[i];<br>
-<br>
-               stats->q_obytes[i] = vq->stats.bytes;<br>
-               tx_total_bytes += stats->q_obytes[i];<br>
-<br>
+               if (qstats != NULL) {<br>
+                       qstats->q_opackets[i] = vq->stats.pkts;<br>
+                       qstats->q_obytes[i] = vq->stats.bytes;<br>
+               }<br>
+               tx_total += vq->stats.pkts;<br>
+               tx_total_bytes += vq->stats.bytes;<br>
                 tx_total_errors += vq->stats.missed_pkts;<br>
         }<br>
 <br>
diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c<br>
index eebc3ea817..e45dbd8ee9 100644<br>
--- a/drivers/net/virtio/virtio_ethdev.c<br>
+++ b/drivers/net/virtio/virtio_ethdev.c<br>
@@ -68,7 +68,8 @@ static void virtio_set_hwaddr(struct virtio_hw *hw);<br>
 static void virtio_get_hwaddr(struct virtio_hw *hw);<br>
 <br>
 static int virtio_dev_stats_get(struct rte_eth_dev *dev,<br>
-                                struct rte_eth_stats *stats);<br>
+                                struct rte_eth_stats *stats,<br>
+                                struct eth_queue_stats *qstats);<br>
 static int virtio_dev_xstats_get(struct rte_eth_dev *dev,<br>
                                  struct rte_eth_xstat *xstats, unsigned n);<br>
 static int virtio_dev_xstats_get_names(struct rte_eth_dev *dev,<br>
@@ -673,7 +674,8 @@ const struct eth_dev_ops virtio_user_secondary_eth_dev_ops = {<br>
 };<br>
 <br>
 static void<br>
-virtio_update_stats(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+virtio_update_stats(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+                   struct eth_queue_stats *qstats)<br>
 {<br>
         unsigned i;<br>
 <br>
@@ -685,9 +687,9 @@ virtio_update_stats(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
                 stats->opackets += txvq->stats.packets;<br>
                 stats->obytes += txvq->stats.bytes;<br>
 <br>
-               if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
-                       stats->q_opackets[i] = txvq->stats.packets;<br>
-                       stats->q_obytes[i] = txvq->stats.bytes;<br>
+               if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                       qstats->q_opackets[i] = txvq->stats.packets;<br>
+                       qstats->q_obytes[i] = txvq->stats.bytes;<br>
                 }<br>
         }<br>
 <br>
@@ -700,9 +702,9 @@ virtio_update_stats(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
                 stats->ibytes += rxvq->stats.bytes;<br>
                 stats->ierrors += rxvq->stats.errors;<br>
 <br>
-               if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
-                       stats->q_ipackets[i] = rxvq->stats.packets;<br>
-                       stats->q_ibytes[i] = rxvq->stats.bytes;<br>
+               if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                       qstats->q_ipackets[i] = rxvq->stats.packets;<br>
+                       qstats->q_ibytes[i] = rxvq->stats.bytes;<br>
                 }<br>
         }<br>
 <br>
@@ -802,9 +804,10 @@ virtio_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,<br>
 }<br>
 <br>
 static int<br>
-virtio_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+virtio_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+                    struct eth_queue_stats *qstats)<br>
 {<br>
-       virtio_update_stats(dev, stats);<br>
+       virtio_update_stats(dev, stats, qstats);<br>
 <br>
         return 0;<br>
 }<br>
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c<br>
index e19aa43888..b0c19c5c7c 100644<br>
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c<br>
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c<br>
@@ -77,7 +77,8 @@ static int vmxnet3_dev_link_update(struct rte_eth_dev *dev,<br>
                                    int wait_to_complete);<br>
 static void vmxnet3_hw_stats_save(struct vmxnet3_hw *hw);<br>
 static int vmxnet3_dev_stats_get(struct rte_eth_dev *dev,<br>
-                                 struct rte_eth_stats *stats);<br>
+                                 struct rte_eth_stats *stats,<br>
+                                 struct eth_queue_stats *qstats);<br>
 static int vmxnet3_dev_stats_reset(struct rte_eth_dev *dev);<br>
 static int vmxnet3_dev_xstats_get_names(struct rte_eth_dev *dev,<br>
                                         struct rte_eth_xstat_name *xstats,<br>
@@ -1470,7 +1471,8 @@ vmxnet3_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,<br>
 }<br>
 <br>
 static int<br>
-vmxnet3_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+vmxnet3_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats)<br>
 {<br>
         unsigned int i;<br>
         struct vmxnet3_hw *hw = dev->data->dev_private;<br>
@@ -1495,9 +1497,9 @@ vmxnet3_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
                 stats->obytes += bytes;<br>
                 stats->oerrors += txStats.pktsTxError + txStats.pktsTxDiscard;<br>
 <br>
-               if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
-                       stats->q_opackets[i] = packets;<br>
-                       stats->q_obytes[i] = bytes;<br>
+               if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                       qstats->q_opackets[i] = packets;<br>
+                       qstats->q_obytes[i] = bytes;<br>
                 }<br>
         }<br>
 <br>
@@ -1517,10 +1519,10 @@ vmxnet3_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
                 stats->ierrors += rxStats.pktsRxError;<br>
                 stats->imissed += rxStats.pktsRxOutOfBuf;<br>
 <br>
-               if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
-                       stats->q_ipackets[i] = packets;<br>
-                       stats->q_ibytes[i] = bytes;<br>
-                       stats->q_errors[i] = rxStats.pktsRxError;<br>
+               if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                       qstats->q_ipackets[i] = packets;<br>
+                       qstats->q_ibytes[i] = bytes;<br>
+                       qstats->q_errors[i] = rxStats.pktsRxError;<br>
                 }<br>
         }<br>
 <br>
diff --git a/drivers/net/xsc/xsc_ethdev.c b/drivers/net/xsc/xsc_ethdev.c<br>
index 988d734b5b..07fc52ac7b 100644<br>
--- a/drivers/net/xsc/xsc_ethdev.c<br>
+++ b/drivers/net/xsc/xsc_ethdev.c<br>
@@ -577,7 +577,8 @@ xsc_ethdev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)<br>
 }<br>
 <br>
 static int<br>
-xsc_ethdev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+xsc_ethdev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats)<br>
 {<br>
         struct xsc_ethdev_priv *priv = TO_XSC_ETHDEV_PRIV(dev);<br>
         uint32_t rxqs_n = priv->num_rq;<br>
@@ -592,10 +593,10 @@ xsc_ethdev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
                         continue;<br>
 <br>
                 idx = rxq->idx;<br>
-               if (idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
-                       stats->q_ipackets[idx] += rxq->stats.rx_pkts;<br>
-                       stats->q_ibytes[idx] += rxq->stats.rx_bytes;<br>
-                       stats->q_errors[idx] += rxq->stats.rx_errors +<br>
+               if (qstats != NULL && idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                       qstats->q_ipackets[idx] += rxq->stats.rx_pkts;<br>
+                       qstats->q_ibytes[idx] += rxq->stats.rx_bytes;<br>
+                       qstats->q_errors[idx] += rxq->stats.rx_errors +<br>
                                                 rxq->stats.rx_nombuf;<br>
                 }<br>
                 stats->ipackets += rxq->stats.rx_pkts;<br>
@@ -610,10 +611,10 @@ xsc_ethdev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
                         continue;<br>
 <br>
                 idx = txq->idx;<br>
-               if (idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
-                       stats->q_opackets[idx] += txq->stats.tx_pkts;<br>
-                       stats->q_obytes[idx] += txq->stats.tx_bytes;<br>
-                       stats->q_errors[idx] += txq->stats.tx_errors;<br>
+               if (qstats != NULL && idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+                       qstats->q_opackets[idx] += txq->stats.tx_pkts;<br>
+                       qstats->q_obytes[idx] += txq->stats.tx_bytes;<br>
+                       qstats->q_errors[idx] += txq->stats.tx_errors;<br>
                 }<br>
                 stats->opackets += txq->stats.tx_pkts;<br>
                 stats->obytes += txq->stats.tx_bytes;<br>
diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c<br>
index da32512b03..6d9f0af748 100644<br>
--- a/drivers/net/zxdh/zxdh_ethdev_ops.c<br>
+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c<br>
@@ -1698,7 +1698,8 @@ zxdh_hw_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)<br>
 }<br>
 <br>
 int<br>
-zxdh_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+zxdh_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats)<br>
 {<br>
         struct zxdh_hw *hw = dev->data->dev_private;<br>
         struct zxdh_hw_vqm_stats vqm_stats = {0};<br>
@@ -1730,14 +1731,16 @@ zxdh_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
 <br>
                 if (rxvq == NULL)<br>
                         continue;<br>
-               stats->q_ipackets[i] = *(uint64_t *)(((char *)rxvq) +<br>
-                               zxdh_rxq_stat_strings[0].offset);<br>
-               stats->q_ibytes[i] = *(uint64_t *)(((char *)rxvq) +<br>
-                               zxdh_rxq_stat_strings[1].offset);<br>
-               stats->q_errors[i] = *(uint64_t *)(((char *)rxvq) +<br>
-                               zxdh_rxq_stat_strings[2].offset);<br>
-               stats->q_errors[i] += *(uint64_t *)(((char *)rxvq) +<br>
-                               zxdh_rxq_stat_strings[5].offset);<br>
+               if (qstats != NULL) {<br>
+                       qstats->q_ipackets[i] = *(uint64_t *)(((char *)rxvq) +<br>
+                                       zxdh_rxq_stat_strings[0].offset);<br>
+                       qstats->q_ibytes[i] = *(uint64_t *)(((char *)rxvq) +<br>
+                                       zxdh_rxq_stat_strings[1].offset);<br>
+                       qstats->q_errors[i] = *(uint64_t *)(((char *)rxvq) +<br>
+                                       zxdh_rxq_stat_strings[2].offset);<br>
+                       qstats->q_errors[i] += *(uint64_t *)(((char *)rxvq) +<br>
+                                       zxdh_rxq_stat_strings[5].offset);<br>
+               }<br>
         }<br>
 <br>
         for (i = 0; (i < dev->data->nb_tx_queues) && (i < RTE_ETHDEV_QUEUE_STAT_CNTRS); i++) {<br>
@@ -1745,14 +1748,16 @@ zxdh_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
 <br>
                 if (txvq == NULL)<br>
                         continue;<br>
-               stats->q_opackets[i] = *(uint64_t *)(((char *)txvq) +<br>
-                               zxdh_txq_stat_strings[0].offset);<br>
-               stats->q_obytes[i] = *(uint64_t *)(((char *)txvq) +<br>
-                               zxdh_txq_stat_strings[1].offset);<br>
-               stats->q_errors[i] += *(uint64_t *)(((char *)txvq) +<br>
-                               zxdh_txq_stat_strings[2].offset);<br>
-               stats->q_errors[i] += *(uint64_t *)(((char *)txvq) +<br>
-                               zxdh_txq_stat_strings[5].offset);<br>
+               if (qstats != NULL) {<br>
+                       qstats->q_opackets[i] = *(uint64_t *)(((char *)txvq) +<br>
+                                       zxdh_txq_stat_strings[0].offset);<br>
+                       qstats->q_obytes[i] = *(uint64_t *)(((char *)txvq) +<br>
+                                       zxdh_txq_stat_strings[1].offset);<br>
+                       qstats->q_errors[i] += *(uint64_t *)(((char *)txvq) +<br>
+                                       zxdh_txq_stat_strings[2].offset);<br>
+                       qstats->q_errors[i] += *(uint64_t *)(((char *)txvq) +<br>
+                                       zxdh_txq_stat_strings[5].offset);<br>
+               }<br>
         }<br>
         return 0;<br>
 }<br>
diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.h b/drivers/net/zxdh/zxdh_ethdev_ops.h<br>
index 86db6efe40..85e926887b 100644<br>
--- a/drivers/net/zxdh/zxdh_ethdev_ops.h<br>
+++ b/drivers/net/zxdh/zxdh_ethdev_ops.h<br>
@@ -130,7 +130,8 @@ int zxdh_dev_rss_reta_query(struct rte_eth_dev *dev,<br>
 int zxdh_rss_hash_update(struct rte_eth_dev *dev, struct rte_eth_rss_conf *rss_conf);<br>
 int zxdh_rss_hash_conf_get(struct rte_eth_dev *dev, struct rte_eth_rss_conf *rss_conf);<br>
 int zxdh_rss_configure(struct rte_eth_dev *dev);<br>
-int zxdh_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);<br>
+int zxdh_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+               struct eth_queue_stats *qstats);<br>
 int zxdh_dev_stats_reset(struct rte_eth_dev *dev);<br>
 int zxdh_dev_mtu_set(struct rte_eth_dev *dev, uint16_t new_mtu);<br>
 int zxdh_hw_np_stats_pf_reset(struct rte_eth_dev *dev, uint32_t stats_id);<br>
--<br>
2.48.1<br>
<br>
</div>
<div style="font-family: "Segoe UI", "Segoe UI Web (West European)", -apple-system, BlinkMacSystemFont, Roboto, "Helvetica Neue", sans-serif; font-size: 14.6667px; color: rgb(0, 0, 0);" class="elementToProof">
<span style="background-color: rgb(255, 255, 255);">Reviewed-by: Rosen Xu <rosen.xu@altera.com></span></div>
</body>
</html>