get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/100208/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 100208,
    "url": "https://patches.dpdk.org/api/patches/100208/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20211001090723.1414911-5-andrew.rybchenko@oktetlabs.ru/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20211001090723.1414911-5-andrew.rybchenko@oktetlabs.ru>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20211001090723.1414911-5-andrew.rybchenko@oktetlabs.ru",
    "date": "2021-10-01T09:07:23",
    "name": "[v9,5/5] ethdev: merge driver ops to get all xstats names and by ID",
    "commit_ref": null,
    "pull_url": null,
    "state": "rejected",
    "archived": true,
    "hash": "fe77073dd36314b7005120cc9716d67570f288de",
    "submitter": {
        "id": 2013,
        "url": "https://patches.dpdk.org/api/people/2013/?format=api",
        "name": "Andrew Rybchenko",
        "email": "Andrew.Rybchenko@oktetlabs.ru"
    },
    "delegate": {
        "id": 319,
        "url": "https://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20211001090723.1414911-5-andrew.rybchenko@oktetlabs.ru/mbox/",
    "series": [
        {
            "id": 19319,
            "url": "https://patches.dpdk.org/api/series/19319/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=19319",
            "date": "2021-10-01T09:07:19",
            "name": "[v9,1/5] ethdev: fix docs of functions getting xstats by IDs",
            "version": 9,
            "mbox": "https://patches.dpdk.org/series/19319/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/100208/comments/",
    "check": "fail",
    "checks": "https://patches.dpdk.org/api/patches/100208/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id AC2D8A0032;\n\tFri,  1 Oct 2021 11:08:01 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 9B67A41140;\n\tFri,  1 Oct 2021 11:08:01 +0200 (CEST)",
            "from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113])\n by mails.dpdk.org (Postfix) with ESMTP id 4AAA841135\n for <dev@dpdk.org>; Fri,  1 Oct 2021 11:07:59 +0200 (CEST)",
            "by shelob.oktetlabs.ru (Postfix, from userid 122)\n id 0AD3F7F6DA; Fri,  1 Oct 2021 12:07:59 +0300 (MSK)",
            "from aros.oktetlabs.ru (aros.oktetlabs.ru [192.168.38.17])\n by shelob.oktetlabs.ru (Postfix) with ESMTP id CFBC87F6D3;\n Fri,  1 Oct 2021 12:07:28 +0300 (MSK)"
        ],
        "X-Spam-Checker-Version": "SpamAssassin 3.4.2 (2018-09-13) on shelob.oktetlabs.ru",
        "X-Spam-Level": "",
        "X-Spam-Status": "No, score=0.8 required=5.0 tests=ALL_TRUSTED,\n DKIM_ADSP_DISCARD,\n URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.2",
        "DKIM-Filter": "OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru CFBC87F6D3",
        "Authentication-Results": "shelob.oktetlabs.ru/CFBC87F6D3; dkim=none;\n dkim-atps=neutral",
        "From": "Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>",
        "To": "Igor Russkikh <irusskikh@marvell.com>,\n Somalapuram Amaranath <asomalap@amd.com>, Rasesh Mody <rmody@marvell.com>,\n Shahed Shaikh <shshaikh@marvell.com>,\n Ajit Khaparde <ajit.khaparde@broadcom.com>,\n Somnath Kotur <somnath.kotur@broadcom.com>,\n Nithin Dabilpuram <ndabilpuram@marvell.com>,\n Kiran Kumar K <kirankumark@marvell.com>,\n Sunil Kumar Kori <skori@marvell.com>, Satha Rao <skoteshwar@marvell.com>,\n Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>,\n Hemant Agrawal <hemant.agrawal@nxp.com>,\n Sachin Saxena <sachin.saxena@oss.nxp.com>,\n Haiyue Wang <haiyue.wang@intel.com>, Marcin Wojtas <mw@semihalf.com>,\n Michal Krawczyk <mk@semihalf.com>, Shai Brandes <shaibran@amazon.com>,\n Evgeny Schemeilin <evgenys@amazon.com>, Igor Chauskin <igorch@amazon.com>,\n Gaetan Rivet <grive@u256.net>, Qi Zhang <qi.z.zhang@intel.com>,\n Xiao Wang <xiao.w.wang@intel.com>, Ziyang Xuan <xuanziyang2@huawei.com>,\n Xiaoyun Wang <cloud.wangxiaoyun@huawei.com>,\n Guoyang Zhou <zhouguoyang@huawei.com>,\n \"Min Hu (Connor)\" <humin29@huawei.com>,\n Yisen Zhuang <yisen.zhuang@huawei.com>, Lijun Ou <oulijun@huawei.com>,\n Beilei Xing <beilei.xing@intel.com>, Jingjing Wu <jingjing.wu@intel.com>,\n Qiming Yang <qiming.yang@intel.com>, Andrew Boyer <aboyer@pensando.io>,\n Rosen Xu <rosen.xu@intel.com>, Shijith Thotton <sthotton@marvell.com>,\n Srisivasubramanian Srinivasan <srinivasan@marvell.com>,\n Matan Azrad <matan@nvidia.com>,\n Viacheslav Ovsiienko <viacheslavo@nvidia.com>,\n Liron Himi <lironh@marvell.com>,\n Stephen Hemminger <sthemmin@microsoft.com>, Long Li <longli@microsoft.com>,\n Jerin Jacob <jerinj@marvell.com>,\n Devendra Singh Rawat <dsinghrawat@marvell.com>,\n Jiawen Wu <jiawenwu@trustnetic.com>, Jian Wang <jianwang@trustnetic.com>,\n Maxime Coquelin <maxime.coquelin@redhat.com>,\n Chenbo Xia <chenbo.xia@intel.com>, Yong Wang <yongwang@vmware.com>,\n Thomas Monjalon <thomas@monjalon.net>,\n Ferruh Yigit <ferruh.yigit@intel.com>",
        "Cc": "dev@dpdk.org",
        "Date": "Fri,  1 Oct 2021 12:07:23 +0300",
        "Message-Id": "<20211001090723.1414911-5-andrew.rybchenko@oktetlabs.ru>",
        "X-Mailer": "git-send-email 2.30.2",
        "In-Reply-To": "<20211001090723.1414911-1-andrew.rybchenko@oktetlabs.ru>",
        "References": "<20210604144225.287678-1-andrew.rybchenko@oktetlabs.ru>\n <20211001090723.1414911-1-andrew.rybchenko@oktetlabs.ru>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v9 5/5] ethdev: merge driver ops to get all\n xstats names and by ID",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "All xstats names may be retrieved passing NULL ids.\n\nIf a driver does not support getting names by IDs, the callback should\nreturn -ENOTSUP on attempt to use it. If so, the request is handled\non ethdev layer by getting all names and filtering out requested only.\n\nSigned-off-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>\n---\nv9:\n    - document -ENOTSUP in callback\n    - simplify documentation about supported cases\n\nv8:\n    - handle -ENOTSUP on ethdev to fallback to by-IDs handling in ethdev\n\n doc/guides/nics/features.rst            |  2 +-\n drivers/net/atlantic/atl_ethdev.c       |  5 ++\n drivers/net/axgbe/axgbe_ethdev.c        | 30 ++++-----\n drivers/net/bnx2x/bnx2x_ethdev.c        |  4 ++\n drivers/net/bnxt/bnxt_stats.c           |  4 ++\n drivers/net/bnxt/bnxt_stats.h           |  1 +\n drivers/net/cnxk/cnxk_ethdev.c          |  1 -\n drivers/net/cnxk/cnxk_ethdev.h          |  5 +-\n drivers/net/cnxk/cnxk_stats.c           | 18 +++---\n drivers/net/cxgbe/cxgbe_ethdev.c        | 17 ++---\n drivers/net/dpaa/dpaa_ethdev.c          | 13 ++--\n drivers/net/dpaa2/dpaa2_ethdev.c        | 13 ++--\n drivers/net/e1000/igb_ethdev.c          | 36 +++--------\n drivers/net/ena/ena_ethdev.c            |  6 +-\n drivers/net/failsafe/failsafe_ops.c     |  5 +-\n drivers/net/fm10k/fm10k_ethdev.c        |  4 ++\n drivers/net/hinic/hinic_pmd_ethdev.c    |  4 ++\n drivers/net/hns3/hns3_ethdev.c          |  1 -\n drivers/net/hns3/hns3_ethdev_vf.c       |  1 -\n drivers/net/hns3/hns3_stats.c           | 22 +++----\n drivers/net/hns3/hns3_stats.h           | 10 +--\n drivers/net/i40e/i40e_ethdev.c          |  5 ++\n drivers/net/iavf/iavf_ethdev.c          | 13 ++--\n drivers/net/ice/ice_ethdev.c            |  5 ++\n drivers/net/igc/igc_ethdev.c            | 10 +--\n drivers/net/ionic/ionic_ethdev.c        | 25 +-------\n drivers/net/ipn3ke/ipn3ke_representor.c |  5 +-\n drivers/net/ixgbe/ixgbe_ethdev.c        | 71 +++------------------\n drivers/net/liquidio/lio_ethdev.c       |  4 ++\n drivers/net/mlx5/mlx5.h                 |  1 +\n drivers/net/mlx5/mlx5_stats.c           |  7 ++-\n drivers/net/mvpp2/mrvl_ethdev.c         |  4 ++\n drivers/net/netvsc/hn_ethdev.c          |  5 +-\n drivers/net/octeontx2/otx2_ethdev.c     |  1 -\n drivers/net/octeontx2/otx2_ethdev.h     |  5 +-\n drivers/net/octeontx2/otx2_stats.c      | 14 ++---\n drivers/net/qede/qede_ethdev.c          |  4 ++\n drivers/net/sfc/sfc_ethdev.c            | 84 ++++++++++++-------------\n drivers/net/txgbe/txgbe_ethdev.c        |  7 +--\n drivers/net/txgbe/txgbe_ethdev_vf.c     |  4 ++\n drivers/net/vhost/rte_eth_vhost.c       |  4 ++\n drivers/net/virtio/virtio_ethdev.c      |  5 ++\n drivers/net/vmxnet3/vmxnet3_ethdev.c    |  5 ++\n lib/ethdev/ethdev_driver.h              | 21 ++++---\n lib/ethdev/rte_ethdev.c                 | 17 +++--\n 45 files changed, 245 insertions(+), 283 deletions(-)",
    "diff": "diff --git a/doc/guides/nics/features.rst b/doc/guides/nics/features.rst\nindex 4fce8cd1c9..8fef2939fb 100644\n--- a/doc/guides/nics/features.rst\n+++ b/doc/guides/nics/features.rst\n@@ -708,7 +708,7 @@ Extended stats\n Supports Extended Statistics, changes from driver to driver.\n \n * **[implements] eth_dev_ops**: ``xstats_get``, ``xstats_reset``, ``xstats_get_names``.\n-* **[implements] eth_dev_ops**: ``xstats_get_by_id``, ``xstats_get_names_by_id``.\n+* **[implements] eth_dev_ops**: ``xstats_get_by_id``.\n * **[related]    API**: ``rte_eth_xstats_get()``, ``rte_eth_xstats_reset()``,\n   ``rte_eth_xstats_get_names``, ``rte_eth_xstats_get_by_id()``,\n   ``rte_eth_xstats_get_names_by_id()``, ``rte_eth_xstats_get_id_by_name()``.\ndiff --git a/drivers/net/atlantic/atl_ethdev.c b/drivers/net/atlantic/atl_ethdev.c\nindex 0ce35eb519..f55d18ae9a 100644\n--- a/drivers/net/atlantic/atl_ethdev.c\n+++ b/drivers/net/atlantic/atl_ethdev.c\n@@ -29,6 +29,7 @@ static int atl_dev_allmulticast_disable(struct rte_eth_dev *dev);\n static int  atl_dev_link_update(struct rte_eth_dev *dev, int wait);\n \n static int atl_dev_xstats_get_names(struct rte_eth_dev *dev __rte_unused,\n+\t\t\t\t    const uint64_t *ids,\n \t\t\t\t    struct rte_eth_xstat_name *xstats_names,\n \t\t\t\t    unsigned int size);\n \n@@ -1003,12 +1004,16 @@ atl_dev_xstats_get_count(struct rte_eth_dev *dev)\n \n static int\n atl_dev_xstats_get_names(struct rte_eth_dev *dev __rte_unused,\n+\t\t\t const uint64_t *ids,\n \t\t\t struct rte_eth_xstat_name *xstats_names,\n \t\t\t unsigned int size)\n {\n \tunsigned int i;\n \tunsigned int count = atl_dev_xstats_get_count(dev);\n \n+\tif (ids != NULL)\n+\t\treturn -ENOTSUP;\n+\n \tif (xstats_names) {\n \t\tfor (i = 0; i < size && i < count; i++) {\n \t\t\tsnprintf(xstats_names[i].name,\ndiff --git a/drivers/net/axgbe/axgbe_ethdev.c b/drivers/net/axgbe/axgbe_ethdev.c\nindex ebd5411fdd..6a55a211df 100644\n--- a/drivers/net/axgbe/axgbe_ethdev.c\n+++ b/drivers/net/axgbe/axgbe_ethdev.c\n@@ -47,19 +47,14 @@ static int axgbe_dev_xstats_get(struct rte_eth_dev *dev,\n \t\t\t\tstruct rte_eth_xstat *stats,\n \t\t\t\tunsigned int n);\n static int\n-axgbe_dev_xstats_get_names(struct rte_eth_dev *dev,\n-\t\t\t   struct rte_eth_xstat_name *xstats_names,\n-\t\t\t   unsigned int size);\n-static int\n axgbe_dev_xstats_get_by_id(struct rte_eth_dev *dev,\n \t\t\t   const uint64_t *ids,\n \t\t\t   uint64_t *values,\n \t\t\t   unsigned int n);\n static int\n-axgbe_dev_xstats_get_names_by_id(struct rte_eth_dev *dev,\n-\t\t\t\t const uint64_t *ids,\n-\t\t\t\t struct rte_eth_xstat_name *xstats_names,\n-\t\t\t\t unsigned int size);\n+axgbe_dev_xstats_get_names(struct rte_eth_dev *dev, const uint64_t *ids,\n+\t\t\t   struct rte_eth_xstat_name *xstats_names,\n+\t\t\t   unsigned int size);\n static int axgbe_dev_xstats_reset(struct rte_eth_dev *dev);\n static int axgbe_dev_rss_reta_update(struct rte_eth_dev *dev,\n \t\t\t  struct rte_eth_rss_reta_entry64 *reta_conf,\n@@ -239,7 +234,6 @@ static const struct eth_dev_ops axgbe_eth_dev_ops = {\n \t.xstats_get\t      = axgbe_dev_xstats_get,\n \t.xstats_reset\t      = axgbe_dev_xstats_reset,\n \t.xstats_get_names     = axgbe_dev_xstats_get_names,\n-\t.xstats_get_names_by_id = axgbe_dev_xstats_get_names_by_id,\n \t.xstats_get_by_id     = axgbe_dev_xstats_get_by_id,\n \t.reta_update          = axgbe_dev_rss_reta_update,\n \t.reta_query           = axgbe_dev_rss_reta_query,\n@@ -1022,9 +1016,9 @@ axgbe_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *stats,\n }\n \n static int\n-axgbe_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,\n-\t\t\t   struct rte_eth_xstat_name *xstats_names,\n-\t\t\t   unsigned int n)\n+axgbe_dev_xstats_get_all_names(__rte_unused struct rte_eth_dev *dev,\n+\t\t\t       struct rte_eth_xstat_name *xstats_names,\n+\t\t\t       unsigned int n)\n {\n \tunsigned int i;\n \n@@ -1075,18 +1069,18 @@ axgbe_dev_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,\n }\n \n static int\n-axgbe_dev_xstats_get_names_by_id(struct rte_eth_dev *dev,\n-\t\t\t\t const uint64_t *ids,\n-\t\t\t\t struct rte_eth_xstat_name *xstats_names,\n-\t\t\t\t unsigned int size)\n+axgbe_dev_xstats_get_names(struct rte_eth_dev *dev,\n+\t\t\t   const uint64_t *ids,\n+\t\t\t   struct rte_eth_xstat_name *xstats_names,\n+\t\t\t   unsigned int size)\n {\n \tstruct rte_eth_xstat_name xstats_names_copy[AXGBE_XSTATS_COUNT];\n \tunsigned int i;\n \n \tif (!ids)\n-\t\treturn axgbe_dev_xstats_get_names(dev, xstats_names, size);\n+\t\treturn axgbe_dev_xstats_get_all_names(dev, xstats_names, size);\n \n-\taxgbe_dev_xstats_get_names(dev, xstats_names_copy, size);\n+\taxgbe_dev_xstats_get_all_names(dev, xstats_names_copy, size);\n \n \tfor (i = 0; i < size; i++) {\n \t\tif (ids[i] >= AXGBE_XSTATS_COUNT) {\ndiff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c\nindex 463886f17a..b18d14d735 100644\n--- a/drivers/net/bnx2x/bnx2x_ethdev.c\n+++ b/drivers/net/bnx2x/bnx2x_ethdev.c\n@@ -484,11 +484,15 @@ bnx2x_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)\n \n static int\n bnx2x_get_xstats_names(__rte_unused struct rte_eth_dev *dev,\n+\t\t       const uint64_t *ids,\n \t\t       struct rte_eth_xstat_name *xstats_names,\n \t\t       __rte_unused unsigned limit)\n {\n \tunsigned int i, stat_cnt = RTE_DIM(bnx2x_xstats_strings);\n \n+\tif (ids != NULL)\n+\t\treturn -ENOTSUP;\n+\n \tif (xstats_names != NULL)\n \t\tfor (i = 0; i < stat_cnt; i++)\n \t\t\tstrlcpy(xstats_names[i].name,\ndiff --git a/drivers/net/bnxt/bnxt_stats.c b/drivers/net/bnxt/bnxt_stats.c\nindex 991eafc644..aca350402b 100644\n--- a/drivers/net/bnxt/bnxt_stats.c\n+++ b/drivers/net/bnxt/bnxt_stats.c\n@@ -845,6 +845,7 @@ int bnxt_flow_stats_cnt(struct bnxt *bp)\n }\n \n int bnxt_dev_xstats_get_names_op(struct rte_eth_dev *eth_dev,\n+\t\tconst uint64_t *ids,\n \t\tstruct rte_eth_xstat_name *xstats_names,\n \t\t__rte_unused unsigned int limit)\n {\n@@ -862,6 +863,9 @@ int bnxt_dev_xstats_get_names_op(struct rte_eth_dev *eth_dev,\n \tif (rc)\n \t\treturn rc;\n \n+\tif (ids != NULL)\n+\t\treturn -ENOTSUP;\n+\n \tif (xstats_names != NULL) {\n \t\tcount = 0;\n \ndiff --git a/drivers/net/bnxt/bnxt_stats.h b/drivers/net/bnxt/bnxt_stats.h\nindex 1ca9b9c594..497380ae2d 100644\n--- a/drivers/net/bnxt/bnxt_stats.h\n+++ b/drivers/net/bnxt/bnxt_stats.h\n@@ -13,6 +13,7 @@ int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,\n \t\t\t   struct rte_eth_stats *bnxt_stats);\n int bnxt_stats_reset_op(struct rte_eth_dev *eth_dev);\n int bnxt_dev_xstats_get_names_op(struct rte_eth_dev *eth_dev,\n+\tconst uint64_t *ids,\n \tstruct rte_eth_xstat_name *xstats_names,\n \t__rte_unused unsigned int limit);\n int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev,\ndiff --git a/drivers/net/cnxk/cnxk_ethdev.c b/drivers/net/cnxk/cnxk_ethdev.c\nindex 8629193d50..c208611e88 100644\n--- a/drivers/net/cnxk/cnxk_ethdev.c\n+++ b/drivers/net/cnxk/cnxk_ethdev.c\n@@ -1258,7 +1258,6 @@ struct eth_dev_ops cnxk_eth_dev_ops = {\n \t.xstats_get_names = cnxk_nix_xstats_get_names,\n \t.xstats_reset = cnxk_nix_xstats_reset,\n \t.xstats_get_by_id = cnxk_nix_xstats_get_by_id,\n-\t.xstats_get_names_by_id = cnxk_nix_xstats_get_names_by_id,\n \t.fw_version_get = cnxk_nix_fw_version_get,\n \t.rxq_info_get = cnxk_nix_rxq_info_get,\n \t.txq_info_get = cnxk_nix_txq_info_get,\ndiff --git a/drivers/net/cnxk/cnxk_ethdev.h b/drivers/net/cnxk/cnxk_ethdev.h\nindex 946629f72e..1165482baf 100644\n--- a/drivers/net/cnxk/cnxk_ethdev.h\n+++ b/drivers/net/cnxk/cnxk_ethdev.h\n@@ -362,12 +362,9 @@ int cnxk_nix_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);\n int cnxk_nix_xstats_get(struct rte_eth_dev *eth_dev,\n \t\t\tstruct rte_eth_xstat *xstats, unsigned int n);\n int cnxk_nix_xstats_get_names(struct rte_eth_dev *eth_dev,\n+\t\t\t      const uint64_t *ids,\n \t\t\t      struct rte_eth_xstat_name *xstats_names,\n \t\t\t      unsigned int limit);\n-int cnxk_nix_xstats_get_names_by_id(struct rte_eth_dev *eth_dev,\n-\t\t\t\t    const uint64_t *ids,\n-\t\t\t\t    struct rte_eth_xstat_name *xstats_names,\n-\t\t\t\t    unsigned int limit);\n int cnxk_nix_xstats_get_by_id(struct rte_eth_dev *eth_dev, const uint64_t *ids,\n \t\t\t      uint64_t *values, unsigned int n);\n int cnxk_nix_xstats_reset(struct rte_eth_dev *eth_dev);\ndiff --git a/drivers/net/cnxk/cnxk_stats.c b/drivers/net/cnxk/cnxk_stats.c\nindex 4b0deac05e..ae3eef3628 100644\n--- a/drivers/net/cnxk/cnxk_stats.c\n+++ b/drivers/net/cnxk/cnxk_stats.c\n@@ -162,10 +162,10 @@ cnxk_nix_xstats_get(struct rte_eth_dev *eth_dev, struct rte_eth_xstat *xstats,\n \treturn size;\n }\n \n-int\n-cnxk_nix_xstats_get_names(struct rte_eth_dev *eth_dev,\n-\t\t\t  struct rte_eth_xstat_name *xstats_names,\n-\t\t\t  unsigned int limit)\n+static int\n+cnxk_nix_xstats_get_all_names(struct rte_eth_dev *eth_dev,\n+\t\t\t      struct rte_eth_xstat_name *xstats_names,\n+\t\t\t      unsigned int limit)\n {\n \tstruct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);\n \tstruct roc_nix_xstat_name roc_xstats_name[limit];\n@@ -226,10 +226,10 @@ cnxk_nix_xstats_get_names(struct rte_eth_dev *eth_dev,\n }\n \n int\n-cnxk_nix_xstats_get_names_by_id(struct rte_eth_dev *eth_dev,\n-\t\t\t\tconst uint64_t *ids,\n-\t\t\t\tstruct rte_eth_xstat_name *xstats_names,\n-\t\t\t\tunsigned int limit)\n+cnxk_nix_xstats_get_names(struct rte_eth_dev *eth_dev,\n+\t\t\t  const uint64_t *ids,\n+\t\t\t  struct rte_eth_xstat_name *xstats_names,\n+\t\t\t  unsigned int limit)\n {\n \tstruct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);\n \tuint32_t nix_cnt = roc_nix_num_xstats_get(&dev->nix);\n@@ -247,7 +247,7 @@ cnxk_nix_xstats_get_names_by_id(struct rte_eth_dev *eth_dev,\n \tif (xstats_names == NULL)\n \t\treturn -ENOMEM;\n \n-\tcnxk_nix_xstats_get_names(eth_dev, xnames, stat_cnt);\n+\tcnxk_nix_xstats_get_all_names(eth_dev, xnames, stat_cnt);\n \n \tfor (i = 0; i < limit; i++) {\n \t\tif (ids[i] >= stat_cnt)\ndiff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c\nindex 4929766d9a..371550069e 100644\n--- a/drivers/net/cxgbe/cxgbe_ethdev.c\n+++ b/drivers/net/cxgbe/cxgbe_ethdev.c\n@@ -1005,10 +1005,10 @@ static int cxgbe_dev_xstats_get_by_id(struct rte_eth_dev *dev,\n }\n \n /* Get names of port extended statistics by ID. */\n-static int cxgbe_dev_xstats_get_names_by_id(struct rte_eth_dev *dev,\n-\t\t\t\t\t    const uint64_t *ids,\n-\t\t\t\t\t    struct rte_eth_xstat_name *xnames,\n-\t\t\t\t\t    unsigned int n)\n+static int cxgbe_dev_xstats_get_names(struct rte_eth_dev *dev,\n+\t\t\t\t      const uint64_t *ids,\n+\t\t\t\t      struct rte_eth_xstat_name *xnames,\n+\t\t\t\t      unsigned int n)\n {\n \tstruct port_info *pi = dev->data->dev_private;\n \tstruct rte_eth_xstat_name *xnames_copy;\n@@ -1048,14 +1048,6 @@ static int cxgbe_dev_xstats_get(struct rte_eth_dev *dev,\n \treturn cxgbe_dev_xstats(dev, NULL, xstats, n);\n }\n \n-/* Get names of port extended statistics. */\n-static int cxgbe_dev_xstats_get_names(struct rte_eth_dev *dev,\n-\t\t\t\t      struct rte_eth_xstat_name *xstats_names,\n-\t\t\t\t      unsigned int n)\n-{\n-\treturn cxgbe_dev_xstats(dev, xstats_names, NULL, n);\n-}\n-\n /* Reset port extended statistics. */\n static int cxgbe_dev_xstats_reset(struct rte_eth_dev *dev)\n {\n@@ -1620,7 +1612,6 @@ static const struct eth_dev_ops cxgbe_eth_dev_ops = {\n \t.xstats_get             = cxgbe_dev_xstats_get,\n \t.xstats_get_by_id       = cxgbe_dev_xstats_get_by_id,\n \t.xstats_get_names       = cxgbe_dev_xstats_get_names,\n-\t.xstats_get_names_by_id = cxgbe_dev_xstats_get_names_by_id,\n \t.xstats_reset           = cxgbe_dev_xstats_reset,\n \t.flow_ctrl_get\t\t= cxgbe_flow_ctrl_get,\n \t.flow_ctrl_set\t\t= cxgbe_flow_ctrl_set,\ndiff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c\nindex 1f80e8d744..06e293b17f 100644\n--- a/drivers/net/dpaa/dpaa_ethdev.c\n+++ b/drivers/net/dpaa/dpaa_ethdev.c\n@@ -758,9 +758,9 @@ dpaa_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,\n }\n \n static int\n-dpaa_xstats_get_names(__rte_unused struct rte_eth_dev *dev,\n-\t\t      struct rte_eth_xstat_name *xstats_names,\n-\t\t      unsigned int limit)\n+dpaa_xstats_get_all_names(__rte_unused struct rte_eth_dev *dev,\n+\t\t\t  struct rte_eth_xstat_name *xstats_names,\n+\t\t\t  unsigned int limit)\n {\n \tunsigned int i, stat_cnt = RTE_DIM(dpaa_xstats_strings);\n \n@@ -813,7 +813,7 @@ dpaa_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,\n }\n \n static int\n-dpaa_xstats_get_names_by_id(\n+dpaa_xstats_get_names(\n \tstruct rte_eth_dev *dev,\n \tconst uint64_t *ids,\n \tstruct rte_eth_xstat_name *xstats_names,\n@@ -823,9 +823,9 @@ dpaa_xstats_get_names_by_id(\n \tstruct rte_eth_xstat_name xstats_names_copy[stat_cnt];\n \n \tif (!ids)\n-\t\treturn dpaa_xstats_get_names(dev, xstats_names, limit);\n+\t\treturn dpaa_xstats_get_all_names(dev, xstats_names, limit);\n \n-\tdpaa_xstats_get_names(dev, xstats_names_copy, limit);\n+\tdpaa_xstats_get_all_names(dev, xstats_names_copy, limit);\n \n \tfor (i = 0; i < limit; i++) {\n \t\tif (ids[i] >= stat_cnt) {\n@@ -1585,7 +1585,6 @@ static struct eth_dev_ops dpaa_devops = {\n \t.stats_get\t\t  = dpaa_eth_stats_get,\n \t.xstats_get\t\t  = dpaa_dev_xstats_get,\n \t.xstats_get_by_id\t  = dpaa_xstats_get_by_id,\n-\t.xstats_get_names_by_id\t  = dpaa_xstats_get_names_by_id,\n \t.xstats_get_names\t  = dpaa_xstats_get_names,\n \t.xstats_reset\t\t  = dpaa_eth_stats_reset,\n \t.stats_reset\t\t  = dpaa_eth_stats_reset,\ndiff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c\nindex ea191564fc..9aaeb0bc17 100644\n--- a/drivers/net/dpaa2/dpaa2_ethdev.c\n+++ b/drivers/net/dpaa2/dpaa2_ethdev.c\n@@ -1711,9 +1711,9 @@ dpaa2_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,\n }\n \n static int\n-dpaa2_xstats_get_names(__rte_unused struct rte_eth_dev *dev,\n-\t\t       struct rte_eth_xstat_name *xstats_names,\n-\t\t       unsigned int limit)\n+dpaa2_xstats_get_all_names(__rte_unused struct rte_eth_dev *dev,\n+\t\t\t   struct rte_eth_xstat_name *xstats_names,\n+\t\t\t   unsigned int limit)\n {\n \tunsigned int i, stat_cnt = RTE_DIM(dpaa2_xstats_strings);\n \n@@ -1793,7 +1793,7 @@ dpaa2_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,\n }\n \n static int\n-dpaa2_xstats_get_names_by_id(\n+dpaa2_xstats_get_names(\n \tstruct rte_eth_dev *dev,\n \tconst uint64_t *ids,\n \tstruct rte_eth_xstat_name *xstats_names,\n@@ -1803,9 +1803,9 @@ dpaa2_xstats_get_names_by_id(\n \tstruct rte_eth_xstat_name xstats_names_copy[stat_cnt];\n \n \tif (!ids)\n-\t\treturn dpaa2_xstats_get_names(dev, xstats_names, limit);\n+\t\treturn dpaa2_xstats_get_all_names(dev, xstats_names, limit);\n \n-\tdpaa2_xstats_get_names(dev, xstats_names_copy, limit);\n+\tdpaa2_xstats_get_all_names(dev, xstats_names_copy, limit);\n \n \tfor (i = 0; i < limit; i++) {\n \t\tif (ids[i] >= stat_cnt) {\n@@ -2413,7 +2413,6 @@ static struct eth_dev_ops dpaa2_ethdev_ops = {\n \t.stats_get\t       = dpaa2_dev_stats_get,\n \t.xstats_get\t       = dpaa2_dev_xstats_get,\n \t.xstats_get_by_id     = dpaa2_xstats_get_by_id,\n-\t.xstats_get_names_by_id = dpaa2_xstats_get_names_by_id,\n \t.xstats_get_names      = dpaa2_xstats_get_names,\n \t.stats_reset\t   = dpaa2_dev_stats_reset,\n \t.xstats_reset\t      = dpaa2_dev_stats_reset,\ndiff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c\nindex 6510cd7ceb..8bf254a802 100644\n--- a/drivers/net/e1000/igb_ethdev.c\n+++ b/drivers/net/e1000/igb_ethdev.c\n@@ -93,9 +93,6 @@ static int eth_igb_xstats_get_by_id(struct rte_eth_dev *dev,\n \t\tconst uint64_t *ids,\n \t\tuint64_t *values, unsigned int n);\n static int eth_igb_xstats_get_names(struct rte_eth_dev *dev,\n-\t\t\t\t    struct rte_eth_xstat_name *xstats_names,\n-\t\t\t\t    unsigned int size);\n-static int eth_igb_xstats_get_names_by_id(struct rte_eth_dev *dev,\n \t\tconst uint64_t *ids, struct rte_eth_xstat_name *xstats_names,\n \t\tunsigned int limit);\n static int eth_igb_stats_reset(struct rte_eth_dev *dev);\n@@ -166,6 +163,7 @@ static int eth_igbvf_stats_get(struct rte_eth_dev *dev,\n static int eth_igbvf_xstats_get(struct rte_eth_dev *dev,\n \t\t\t\tstruct rte_eth_xstat *xstats, unsigned n);\n static int eth_igbvf_xstats_get_names(struct rte_eth_dev *dev,\n+\t\t\t\t      const uint64_t *ids,\n \t\t\t\t      struct rte_eth_xstat_name *xstats_names,\n \t\t\t\t      unsigned limit);\n static int eth_igbvf_stats_reset(struct rte_eth_dev *dev);\n@@ -343,7 +341,6 @@ static const struct eth_dev_ops eth_igb_ops = {\n \t.stats_get            = eth_igb_stats_get,\n \t.xstats_get           = eth_igb_xstats_get,\n \t.xstats_get_by_id     = eth_igb_xstats_get_by_id,\n-\t.xstats_get_names_by_id = eth_igb_xstats_get_names_by_id,\n \t.xstats_get_names     = eth_igb_xstats_get_names,\n \t.stats_reset          = eth_igb_stats_reset,\n \t.xstats_reset         = eth_igb_xstats_reset,\n@@ -1863,26 +1860,7 @@ eth_igb_xstats_reset(struct rte_eth_dev *dev)\n \treturn 0;\n }\n \n-static int eth_igb_xstats_get_names(__rte_unused struct rte_eth_dev *dev,\n-\tstruct rte_eth_xstat_name *xstats_names,\n-\t__rte_unused unsigned int size)\n-{\n-\tunsigned i;\n-\n-\tif (xstats_names == NULL)\n-\t\treturn IGB_NB_XSTATS;\n-\n-\t/* Note: limit checked in rte_eth_xstats_names() */\n-\n-\tfor (i = 0; i < IGB_NB_XSTATS; i++) {\n-\t\tstrlcpy(xstats_names[i].name, rte_igb_stats_strings[i].name,\n-\t\t\tsizeof(xstats_names[i].name));\n-\t}\n-\n-\treturn IGB_NB_XSTATS;\n-}\n-\n-static int eth_igb_xstats_get_names_by_id(struct rte_eth_dev *dev,\n+static int eth_igb_xstats_get_names(struct rte_eth_dev *dev,\n \t\tconst uint64_t *ids, struct rte_eth_xstat_name *xstats_names,\n \t\tunsigned int limit)\n {\n@@ -1902,7 +1880,7 @@ static int eth_igb_xstats_get_names_by_id(struct rte_eth_dev *dev,\n \t} else {\n \t\tstruct rte_eth_xstat_name xstats_names_copy[IGB_NB_XSTATS];\n \n-\t\teth_igb_xstats_get_names_by_id(dev, NULL, xstats_names_copy,\n+\t\teth_igb_xstats_get_names(dev, NULL, xstats_names_copy,\n \t\t\t\tIGB_NB_XSTATS);\n \n \t\tfor (i = 0; i < limit; i++) {\n@@ -2035,11 +2013,15 @@ igbvf_read_stats_registers(struct e1000_hw *hw, struct e1000_vf_stats *hw_stats)\n }\n \n static int eth_igbvf_xstats_get_names(__rte_unused struct rte_eth_dev *dev,\n-\t\t\t\t     struct rte_eth_xstat_name *xstats_names,\n-\t\t\t\t     __rte_unused unsigned limit)\n+\t\t\t\t      const uint64_t *ids,\n+\t\t\t\t      struct rte_eth_xstat_name *xstats_names,\n+\t\t\t\t      __rte_unused unsigned limit)\n {\n \tunsigned i;\n \n+\tif (ids != NULL)\n+\t\treturn -ENOTSUP;\n+\n \tif (xstats_names != NULL)\n \t\tfor (i = 0; i < IGBVF_NB_XSTATS; i++) {\n \t\t\tstrlcpy(xstats_names[i].name,\ndiff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c\nindex 4cebf60a68..a807e50dba 100644\n--- a/drivers/net/ena/ena_ethdev.c\n+++ b/drivers/net/ena/ena_ethdev.c\n@@ -212,7 +212,7 @@ static void ena_interrupt_handler_rte(void *cb_arg);\n static void ena_timer_wd_callback(struct rte_timer *timer, void *arg);\n static void ena_destroy_device(struct rte_eth_dev *eth_dev);\n static int eth_ena_dev_init(struct rte_eth_dev *eth_dev);\n-static int ena_xstats_get_names(struct rte_eth_dev *dev,\n+static int ena_xstats_get_names(struct rte_eth_dev *dev, const uint64_t *ids,\n \t\t\t\tstruct rte_eth_xstat_name *xstats_names,\n \t\t\t\tunsigned int n);\n static int ena_xstats_get(struct rte_eth_dev *dev,\n@@ -2585,12 +2585,16 @@ int ena_copy_eni_stats(struct ena_adapter *adapter)\n  *   Number of xstats names.\n  */\n static int ena_xstats_get_names(struct rte_eth_dev *dev,\n+\t\t\t\tconst uint64_t *ids,\n \t\t\t\tstruct rte_eth_xstat_name *xstats_names,\n \t\t\t\tunsigned int n)\n {\n \tunsigned int xstats_count = ena_xstats_calc_num(dev->data);\n \tunsigned int stat, i, count = 0;\n \n+\tif (ids != NULL)\n+\t\treturn -ENOTSUP;\n+\n \tif (n < xstats_count || !xstats_names)\n \t\treturn xstats_count;\n \ndiff --git a/drivers/net/failsafe/failsafe_ops.c b/drivers/net/failsafe/failsafe_ops.c\nindex 5ff33e03e0..dae85b7677 100644\n--- a/drivers/net/failsafe/failsafe_ops.c\n+++ b/drivers/net/failsafe/failsafe_ops.c\n@@ -990,12 +990,15 @@ __fs_xstats_get_names(struct rte_eth_dev *dev,\n }\n \n static int\n-fs_xstats_get_names(struct rte_eth_dev *dev,\n+fs_xstats_get_names(struct rte_eth_dev *dev, const uint64_t *ids,\n \t\t    struct rte_eth_xstat_name *xstats_names,\n \t\t    unsigned int limit)\n {\n \tint ret;\n \n+\tif (ids != NULL)\n+\t\treturn -ENOTSUP;\n+\n \tfs_lock(dev, 0);\n \tret = __fs_xstats_get_names(dev, xstats_names, limit);\n \tfs_unlock(dev, 0);\ndiff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c\nindex 3236290e40..16af1751f9 100644\n--- a/drivers/net/fm10k/fm10k_ethdev.c\n+++ b/drivers/net/fm10k/fm10k_ethdev.c\n@@ -1232,11 +1232,15 @@ fm10k_link_update(struct rte_eth_dev *dev,\n }\n \n static int fm10k_xstats_get_names(__rte_unused struct rte_eth_dev *dev,\n+\tconst uint64_t *ids,\n \tstruct rte_eth_xstat_name *xstats_names, __rte_unused unsigned limit)\n {\n \tunsigned i, q;\n \tunsigned count = 0;\n \n+\tif (ids != NULL)\n+\t\treturn -ENOTSUP;\n+\n \tif (xstats_names != NULL) {\n \t\t/* Note: limit checked in rte_eth_xstats_names() */\n \ndiff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c\nindex c01e2ec1d4..bc6f07d070 100644\n--- a/drivers/net/hinic/hinic_pmd_ethdev.c\n+++ b/drivers/net/hinic/hinic_pmd_ethdev.c\n@@ -2280,6 +2280,7 @@ static void hinic_txq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,\n  *   Number of xstats names.\n  */\n static int hinic_dev_xstats_get_names(struct rte_eth_dev *dev,\n+\t\t\t       const uint64_t *ids,\n \t\t\t       struct rte_eth_xstat_name *xstats_names,\n \t\t\t       __rte_unused unsigned int limit)\n {\n@@ -2287,6 +2288,9 @@ static int hinic_dev_xstats_get_names(struct rte_eth_dev *dev,\n \tint count = 0;\n \tu16 i = 0, q_num;\n \n+\tif (ids != NULL)\n+\t\treturn -ENOTSUP;\n+\n \tif (xstats_names == NULL)\n \t\treturn hinic_xstats_calc_num(nic_dev);\n \ndiff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c\nindex 7d37004972..87ae92080f 100644\n--- a/drivers/net/hns3/hns3_ethdev.c\n+++ b/drivers/net/hns3/hns3_ethdev.c\n@@ -7413,7 +7413,6 @@ static const struct eth_dev_ops hns3_eth_dev_ops = {\n \t.xstats_get_names   = hns3_dev_xstats_get_names,\n \t.xstats_reset       = hns3_dev_xstats_reset,\n \t.xstats_get_by_id   = hns3_dev_xstats_get_by_id,\n-\t.xstats_get_names_by_id = hns3_dev_xstats_get_names_by_id,\n \t.dev_infos_get          = hns3_dev_infos_get,\n \t.fw_version_get         = hns3_fw_version_get,\n \t.rx_queue_setup         = hns3_rx_queue_setup,\ndiff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c\nindex 8d9b7979c8..d65236e003 100644\n--- a/drivers/net/hns3/hns3_ethdev_vf.c\n+++ b/drivers/net/hns3/hns3_ethdev_vf.c\n@@ -2905,7 +2905,6 @@ static const struct eth_dev_ops hns3vf_eth_dev_ops = {\n \t.xstats_get_names   = hns3_dev_xstats_get_names,\n \t.xstats_reset       = hns3_dev_xstats_reset,\n \t.xstats_get_by_id   = hns3_dev_xstats_get_by_id,\n-\t.xstats_get_names_by_id = hns3_dev_xstats_get_names_by_id,\n \t.dev_infos_get      = hns3vf_dev_infos_get,\n \t.fw_version_get     = hns3vf_fw_version_get,\n \t.rx_queue_setup     = hns3_rx_queue_setup,\ndiff --git a/drivers/net/hns3/hns3_stats.c b/drivers/net/hns3/hns3_stats.c\nindex 0fe853d626..abb2d42144 100644\n--- a/drivers/net/hns3/hns3_stats.c\n+++ b/drivers/net/hns3/hns3_stats.c\n@@ -1189,7 +1189,7 @@ hns3_imissed_stats_name_get(struct rte_eth_dev *dev,\n }\n \n /*\n- * Retrieve names of extended statistics of an Ethernet device.\n+ * Retrieve all names of extended statistics of an Ethernet device.\n  *\n  * There is an assumption that 'xstat_names' and 'xstats' arrays are matched\n  * by array index:\n@@ -1212,10 +1212,10 @@ hns3_imissed_stats_name_get(struct rte_eth_dev *dev,\n  *   - A positive value lower or equal to size: success. The return value\n  *     is the number of entries filled in the stats table.\n  */\n-int\n-hns3_dev_xstats_get_names(struct rte_eth_dev *dev,\n-\t\t\t  struct rte_eth_xstat_name *xstats_names,\n-\t\t\t  __rte_unused unsigned int size)\n+static int\n+hns3_dev_xstats_get_all_names(struct rte_eth_dev *dev,\n+\t\t\t      struct rte_eth_xstat_name *xstats_names,\n+\t\t\t      __rte_unused unsigned int size)\n {\n \tstruct hns3_adapter *hns = dev->data->dev_private;\n \tint cnt_stats = hns3_xstats_calc_num(dev);\n@@ -1382,10 +1382,9 @@ hns3_dev_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,\n  *     shall not be used by the caller.\n  */\n int\n-hns3_dev_xstats_get_names_by_id(struct rte_eth_dev *dev,\n-\t\t\t\tconst uint64_t *ids,\n-\t\t\t\tstruct rte_eth_xstat_name *xstats_names,\n-\t\t\t\tuint32_t size)\n+hns3_dev_xstats_get_names(struct rte_eth_dev *dev, const uint64_t *ids,\n+\t\t\t  struct rte_eth_xstat_name *xstats_names,\n+\t\t\t  uint32_t size)\n {\n \tconst uint32_t cnt_stats = hns3_xstats_calc_num(dev);\n \tstruct hns3_adapter *hns = dev->data->dev_private;\n@@ -1401,7 +1400,8 @@ hns3_dev_xstats_get_names_by_id(struct rte_eth_dev *dev,\n \t\tif (size < cnt_stats)\n \t\t\treturn cnt_stats;\n \n-\t\treturn hns3_dev_xstats_get_names(dev, xstats_names, cnt_stats);\n+\t\treturn hns3_dev_xstats_get_all_names(dev, xstats_names,\n+\t\t\t\t\t\t     cnt_stats);\n \t}\n \n \tlen = cnt_stats * sizeof(struct rte_eth_xstat_name);\n@@ -1412,7 +1412,7 @@ hns3_dev_xstats_get_names_by_id(struct rte_eth_dev *dev,\n \t\treturn -ENOMEM;\n \t}\n \n-\t(void)hns3_dev_xstats_get_names(dev, names_copy, cnt_stats);\n+\t(void)hns3_dev_xstats_get_all_names(dev, names_copy, cnt_stats);\n \n \tfor (i = 0; i < size; i++) {\n \t\tif (ids[i] >= cnt_stats) {\ndiff --git a/drivers/net/hns3/hns3_stats.h b/drivers/net/hns3/hns3_stats.h\nindex d1230f94cb..53fd1572f0 100644\n--- a/drivers/net/hns3/hns3_stats.h\n+++ b/drivers/net/hns3/hns3_stats.h\n@@ -153,17 +153,13 @@ int hns3_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats);\n int hns3_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,\n \t\t\tunsigned int n);\n int hns3_dev_xstats_reset(struct rte_eth_dev *dev);\n-int hns3_dev_xstats_get_names(struct rte_eth_dev *dev,\n-\t\t\t      struct rte_eth_xstat_name *xstats_names,\n-\t\t\t      __rte_unused unsigned int size);\n int hns3_dev_xstats_get_by_id(struct rte_eth_dev *dev,\n \t\t\t      const uint64_t *ids,\n \t\t\t      uint64_t *values,\n \t\t\t      uint32_t size);\n-int hns3_dev_xstats_get_names_by_id(struct rte_eth_dev *dev,\n-\t\t\t\t    const uint64_t *ids,\n-\t\t\t\t    struct rte_eth_xstat_name *xstats_names,\n-\t\t\t\t    uint32_t size);\n+int hns3_dev_xstats_get_names(struct rte_eth_dev *dev, const uint64_t *ids,\n+\t\t\t      struct rte_eth_xstat_name *xstats_names,\n+\t\t\t      unsigned int size);\n int hns3_stats_reset(struct rte_eth_dev *dev);\n int hns3_tqp_stats_init(struct hns3_hw *hw);\n void hns3_tqp_stats_uninit(struct hns3_hw *hw);\ndiff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c\nindex 7a2a8281d2..832c9bff01 100644\n--- a/drivers/net/i40e/i40e_ethdev.c\n+++ b/drivers/net/i40e/i40e_ethdev.c\n@@ -258,6 +258,7 @@ static int i40e_dev_stats_get(struct rte_eth_dev *dev,\n static int i40e_dev_xstats_get(struct rte_eth_dev *dev,\n \t\t\t       struct rte_eth_xstat *xstats, unsigned n);\n static int i40e_dev_xstats_get_names(struct rte_eth_dev *dev,\n+\t\t\t\t     const uint64_t *ids,\n \t\t\t\t     struct rte_eth_xstat_name *xstats_names,\n \t\t\t\t     unsigned limit);\n static int i40e_dev_stats_reset(struct rte_eth_dev *dev);\n@@ -3567,12 +3568,16 @@ i40e_xstats_calc_num(void)\n }\n \n static int i40e_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,\n+\t\t\t\t     const uint64_t *ids,\n \t\t\t\t     struct rte_eth_xstat_name *xstats_names,\n \t\t\t\t     __rte_unused unsigned limit)\n {\n \tunsigned count = 0;\n \tunsigned i, prio;\n \n+\tif (ids != NULL)\n+\t\treturn -ENOTSUP;\n+\n \tif (xstats_names == NULL)\n \t\treturn i40e_xstats_calc_num();\n \ndiff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c\nindex 5a5a7f59e1..a7be7abf1a 100644\n--- a/drivers/net/iavf/iavf_ethdev.c\n+++ b/drivers/net/iavf/iavf_ethdev.c\n@@ -87,8 +87,9 @@ static int iavf_dev_stats_reset(struct rte_eth_dev *dev);\n static int iavf_dev_xstats_get(struct rte_eth_dev *dev,\n \t\t\t\t struct rte_eth_xstat *xstats, unsigned int n);\n static int iavf_dev_xstats_get_names(struct rte_eth_dev *dev,\n-\t\t\t\t       struct rte_eth_xstat_name *xstats_names,\n-\t\t\t\t       unsigned int limit);\n+\t\t\t\t     const uint64_t *ids,\n+\t\t\t\t     struct rte_eth_xstat_name *xstats_names,\n+\t\t\t\t     unsigned int limit);\n static int iavf_dev_promiscuous_enable(struct rte_eth_dev *dev);\n static int iavf_dev_promiscuous_disable(struct rte_eth_dev *dev);\n static int iavf_dev_allmulticast_enable(struct rte_eth_dev *dev);\n@@ -1611,11 +1612,15 @@ iavf_dev_stats_reset(struct rte_eth_dev *dev)\n }\n \n static int iavf_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,\n-\t\t\t\t      struct rte_eth_xstat_name *xstats_names,\n-\t\t\t\t      __rte_unused unsigned int limit)\n+\t\t\t\t     const uint64_t *ids,\n+\t\t\t\t     struct rte_eth_xstat_name *xstats_names,\n+\t\t\t\t     __rte_unused unsigned int limit)\n {\n \tunsigned int i;\n \n+\tif (ids != NULL)\n+\t\treturn -ENOTSUP;\n+\n \tif (xstats_names != NULL)\n \t\tfor (i = 0; i < IAVF_NB_XSTATS; i++) {\n \t\t\tsnprintf(xstats_names[i].name,\ndiff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c\nindex ea3b5c02aa..adeb5a00f3 100644\n--- a/drivers/net/ice/ice_ethdev.c\n+++ b/drivers/net/ice/ice_ethdev.c\n@@ -145,6 +145,7 @@ static int ice_stats_reset(struct rte_eth_dev *dev);\n static int ice_xstats_get(struct rte_eth_dev *dev,\n \t\t\t  struct rte_eth_xstat *xstats, unsigned int n);\n static int ice_xstats_get_names(struct rte_eth_dev *dev,\n+\t\t\t\tconst uint64_t *ids,\n \t\t\t\tstruct rte_eth_xstat_name *xstats_names,\n \t\t\t\tunsigned int limit);\n static int ice_dev_flow_ops_get(struct rte_eth_dev *dev,\n@@ -5420,12 +5421,16 @@ ice_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,\n }\n \n static int ice_xstats_get_names(__rte_unused struct rte_eth_dev *dev,\n+\t\t\t\tconst uint64_t *ids,\n \t\t\t\tstruct rte_eth_xstat_name *xstats_names,\n \t\t\t\t__rte_unused unsigned int limit)\n {\n \tunsigned int count = 0;\n \tunsigned int i;\n \n+\tif (ids != NULL)\n+\t\treturn -ENOTSUP;\n+\n \tif (!xstats_names)\n \t\treturn ice_xstats_calc_num();\n \ndiff --git a/drivers/net/igc/igc_ethdev.c b/drivers/net/igc/igc_ethdev.c\nindex be2c066111..969e515a5f 100644\n--- a/drivers/net/igc/igc_ethdev.c\n+++ b/drivers/net/igc/igc_ethdev.c\n@@ -213,9 +213,6 @@ static int eth_igc_xstats_get_by_id(struct rte_eth_dev *dev,\n \t\t\t\tconst uint64_t *ids,\n \t\t\t\tuint64_t *values, unsigned int n);\n static int eth_igc_xstats_get_names(struct rte_eth_dev *dev,\n-\t\t\t\tstruct rte_eth_xstat_name *xstats_names,\n-\t\t\t\tunsigned int size);\n-static int eth_igc_xstats_get_names_by_id(struct rte_eth_dev *dev,\n \t\tconst uint64_t *ids, struct rte_eth_xstat_name *xstats_names,\n \t\tunsigned int limit);\n static int eth_igc_xstats_reset(struct rte_eth_dev *dev);\n@@ -280,7 +277,6 @@ static const struct eth_dev_ops eth_igc_ops = {\n \t.stats_get\t\t= eth_igc_stats_get,\n \t.xstats_get\t\t= eth_igc_xstats_get,\n \t.xstats_get_by_id\t= eth_igc_xstats_get_by_id,\n-\t.xstats_get_names_by_id\t= eth_igc_xstats_get_names_by_id,\n \t.xstats_get_names\t= eth_igc_xstats_get_names,\n \t.stats_reset\t\t= eth_igc_xstats_reset,\n \t.xstats_reset\t\t= eth_igc_xstats_reset,\n@@ -1991,7 +1987,7 @@ eth_igc_xstats_reset(struct rte_eth_dev *dev)\n }\n \n static int\n-eth_igc_xstats_get_names(__rte_unused struct rte_eth_dev *dev,\n+eth_igc_xstats_get_all_names(__rte_unused struct rte_eth_dev *dev,\n \tstruct rte_eth_xstat_name *xstats_names, unsigned int size)\n {\n \tunsigned int i;\n@@ -2012,14 +2008,14 @@ eth_igc_xstats_get_names(__rte_unused struct rte_eth_dev *dev,\n }\n \n static int\n-eth_igc_xstats_get_names_by_id(struct rte_eth_dev *dev,\n+eth_igc_xstats_get_names(struct rte_eth_dev *dev,\n \t\tconst uint64_t *ids, struct rte_eth_xstat_name *xstats_names,\n \t\tunsigned int limit)\n {\n \tunsigned int i;\n \n \tif (!ids)\n-\t\treturn eth_igc_xstats_get_names(dev, xstats_names, limit);\n+\t\treturn eth_igc_xstats_get_all_names(dev, xstats_names, limit);\n \n \tfor (i = 0; i < limit; i++) {\n \t\tif (ids[i] >= IGC_NB_XSTATS) {\ndiff --git a/drivers/net/ionic/ionic_ethdev.c b/drivers/net/ionic/ionic_ethdev.c\nindex 344c076f30..d813e9f909 100644\n--- a/drivers/net/ionic/ionic_ethdev.c\n+++ b/drivers/net/ionic/ionic_ethdev.c\n@@ -50,8 +50,6 @@ static int  ionic_dev_xstats_get_by_id(struct rte_eth_dev *dev,\n \tconst uint64_t *ids, uint64_t *values, unsigned int n);\n static int  ionic_dev_xstats_reset(struct rte_eth_dev *dev);\n static int  ionic_dev_xstats_get_names(struct rte_eth_dev *dev,\n-\tstruct rte_eth_xstat_name *xstats_names, unsigned int size);\n-static int  ionic_dev_xstats_get_names_by_id(struct rte_eth_dev *dev,\n \tconst uint64_t *ids, struct rte_eth_xstat_name *xstats_names,\n \tunsigned int limit);\n static int  ionic_dev_fw_version_get(struct rte_eth_dev *eth_dev,\n@@ -119,7 +117,6 @@ static const struct eth_dev_ops ionic_eth_dev_ops = {\n \t.xstats_get_by_id       = ionic_dev_xstats_get_by_id,\n \t.xstats_reset           = ionic_dev_xstats_reset,\n \t.xstats_get_names       = ionic_dev_xstats_get_names,\n-\t.xstats_get_names_by_id = ionic_dev_xstats_get_names_by_id,\n \t.fw_version_get         = ionic_dev_fw_version_get,\n };\n \n@@ -714,25 +711,7 @@ ionic_dev_stats_reset(struct rte_eth_dev *eth_dev)\n }\n \n static int\n-ionic_dev_xstats_get_names(__rte_unused struct rte_eth_dev *eth_dev,\n-\t\tstruct rte_eth_xstat_name *xstats_names,\n-\t\t__rte_unused unsigned int size)\n-{\n-\tunsigned int i;\n-\n-\tif (xstats_names != NULL) {\n-\t\tfor (i = 0; i < IONIC_NB_HW_STATS; i++) {\n-\t\t\tsnprintf(xstats_names[i].name,\n-\t\t\t\t\tsizeof(xstats_names[i].name),\n-\t\t\t\t\t\"%s\", rte_ionic_xstats_strings[i].name);\n-\t\t}\n-\t}\n-\n-\treturn IONIC_NB_HW_STATS;\n-}\n-\n-static int\n-ionic_dev_xstats_get_names_by_id(struct rte_eth_dev *eth_dev,\n+ionic_dev_xstats_get_names(struct rte_eth_dev *eth_dev,\n \t\tconst uint64_t *ids, struct rte_eth_xstat_name *xstats_names,\n \t\tunsigned int limit)\n {\n@@ -751,7 +730,7 @@ ionic_dev_xstats_get_names_by_id(struct rte_eth_dev *eth_dev,\n \t\treturn IONIC_NB_HW_STATS;\n \t}\n \n-\tionic_dev_xstats_get_names_by_id(eth_dev, NULL, xstats_names_copy,\n+\tionic_dev_xstats_get_names(eth_dev, NULL, xstats_names_copy,\n \t\tIONIC_NB_HW_STATS);\n \n \tfor (i = 0; i < limit; i++) {\ndiff --git a/drivers/net/ipn3ke/ipn3ke_representor.c b/drivers/net/ipn3ke/ipn3ke_representor.c\nindex 589d9fa587..5312b955d6 100644\n--- a/drivers/net/ipn3ke/ipn3ke_representor.c\n+++ b/drivers/net/ipn3ke/ipn3ke_representor.c\n@@ -2329,13 +2329,16 @@ ipn3ke_rpst_xstats_get\n \n static int\n ipn3ke_rpst_xstats_get_names\n-(__rte_unused struct rte_eth_dev *dev,\n+(__rte_unused struct rte_eth_dev *dev, const uint64_t *ids,\n struct rte_eth_xstat_name *xstats_names,\n __rte_unused unsigned int limit)\n {\n \tunsigned int count = 0;\n \tunsigned int i, prio;\n \n+\tif (ids != NULL)\n+\t\treturn -ENOTSUP;\n+\n \tif (!xstats_names)\n \t\treturn ipn3ke_rpst_xstats_calc_num();\n \ndiff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c\nindex aae8b55d83..51b86ea5ce 100644\n--- a/drivers/net/ixgbe/ixgbe_ethdev.c\n+++ b/drivers/net/ixgbe/ixgbe_ethdev.c\n@@ -167,15 +167,12 @@ ixgbe_dev_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,\n static int ixgbe_dev_stats_reset(struct rte_eth_dev *dev);\n static int ixgbe_dev_xstats_reset(struct rte_eth_dev *dev);\n static int ixgbe_dev_xstats_get_names(struct rte_eth_dev *dev,\n+\tconst uint64_t *ids,\n \tstruct rte_eth_xstat_name *xstats_names,\n \tunsigned int size);\n static int ixgbevf_dev_xstats_get_names(struct rte_eth_dev *dev,\n-\tstruct rte_eth_xstat_name *xstats_names, unsigned limit);\n-static int ixgbe_dev_xstats_get_names_by_id(\n-\tstruct rte_eth_dev *dev,\n \tconst uint64_t *ids,\n-\tstruct rte_eth_xstat_name *xstats_names,\n-\tunsigned int limit);\n+\tstruct rte_eth_xstat_name *xstats_names, unsigned limit);\n static int ixgbe_dev_queue_stats_mapping_set(struct rte_eth_dev *eth_dev,\n \t\t\t\t\t     uint16_t queue_id,\n \t\t\t\t\t     uint8_t stat_idx,\n@@ -499,7 +496,6 @@ static const struct eth_dev_ops ixgbe_eth_dev_ops = {\n \t.stats_reset          = ixgbe_dev_stats_reset,\n \t.xstats_reset         = ixgbe_dev_xstats_reset,\n \t.xstats_get_names     = ixgbe_dev_xstats_get_names,\n-\t.xstats_get_names_by_id = ixgbe_dev_xstats_get_names_by_id,\n \t.queue_stats_mapping_set = ixgbe_dev_queue_stats_mapping_set,\n \t.fw_version_get       = ixgbe_fw_version_get,\n \t.dev_infos_get        = ixgbe_dev_info_get,\n@@ -3381,61 +3377,7 @@ ixgbe_xstats_calc_num(void) {\n \t\t(IXGBE_NB_TXQ_PRIO_STATS * IXGBE_NB_TXQ_PRIO_VALUES);\n }\n \n-static int ixgbe_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,\n-\tstruct rte_eth_xstat_name *xstats_names, __rte_unused unsigned int size)\n-{\n-\tconst unsigned cnt_stats = ixgbe_xstats_calc_num();\n-\tunsigned stat, i, count;\n-\n-\tif (xstats_names != NULL) {\n-\t\tcount = 0;\n-\n-\t\t/* Note: limit >= cnt_stats checked upstream\n-\t\t * in rte_eth_xstats_names()\n-\t\t */\n-\n-\t\t/* Extended stats from ixgbe_hw_stats */\n-\t\tfor (i = 0; i < IXGBE_NB_HW_STATS; i++) {\n-\t\t\tstrlcpy(xstats_names[count].name,\n-\t\t\t\trte_ixgbe_stats_strings[i].name,\n-\t\t\t\tsizeof(xstats_names[count].name));\n-\t\t\tcount++;\n-\t\t}\n-\n-\t\t/* MACsec Stats */\n-\t\tfor (i = 0; i < IXGBE_NB_MACSEC_STATS; i++) {\n-\t\t\tstrlcpy(xstats_names[count].name,\n-\t\t\t\trte_ixgbe_macsec_strings[i].name,\n-\t\t\t\tsizeof(xstats_names[count].name));\n-\t\t\tcount++;\n-\t\t}\n-\n-\t\t/* RX Priority Stats */\n-\t\tfor (stat = 0; stat < IXGBE_NB_RXQ_PRIO_STATS; stat++) {\n-\t\t\tfor (i = 0; i < IXGBE_NB_RXQ_PRIO_VALUES; i++) {\n-\t\t\t\tsnprintf(xstats_names[count].name,\n-\t\t\t\t\tsizeof(xstats_names[count].name),\n-\t\t\t\t\t\"rx_priority%u_%s\", i,\n-\t\t\t\t\trte_ixgbe_rxq_strings[stat].name);\n-\t\t\t\tcount++;\n-\t\t\t}\n-\t\t}\n-\n-\t\t/* TX Priority Stats */\n-\t\tfor (stat = 0; stat < IXGBE_NB_TXQ_PRIO_STATS; stat++) {\n-\t\t\tfor (i = 0; i < IXGBE_NB_TXQ_PRIO_VALUES; i++) {\n-\t\t\t\tsnprintf(xstats_names[count].name,\n-\t\t\t\t\tsizeof(xstats_names[count].name),\n-\t\t\t\t\t\"tx_priority%u_%s\", i,\n-\t\t\t\t\trte_ixgbe_txq_strings[stat].name);\n-\t\t\t\tcount++;\n-\t\t\t}\n-\t\t}\n-\t}\n-\treturn cnt_stats;\n-}\n-\n-static int ixgbe_dev_xstats_get_names_by_id(\n+static int ixgbe_dev_xstats_get_names(\n \tstruct rte_eth_dev *dev,\n \tconst uint64_t *ids,\n \tstruct rte_eth_xstat_name *xstats_names,\n@@ -3497,8 +3439,7 @@ static int ixgbe_dev_xstats_get_names_by_id(\n \tuint16_t size = ixgbe_xstats_calc_num();\n \tstruct rte_eth_xstat_name xstats_names_copy[size];\n \n-\tixgbe_dev_xstats_get_names_by_id(dev, NULL, xstats_names_copy,\n-\t\t\tsize);\n+\tixgbe_dev_xstats_get_names(dev, NULL, xstats_names_copy, size);\n \n \tfor (i = 0; i < limit; i++) {\n \t\tif (ids[i] >= size) {\n@@ -3512,6 +3453,7 @@ static int ixgbe_dev_xstats_get_names_by_id(\n }\n \n static int ixgbevf_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,\n+\tconst uint64_t *ids,\n \tstruct rte_eth_xstat_name *xstats_names, unsigned limit)\n {\n \tunsigned i;\n@@ -3519,6 +3461,9 @@ static int ixgbevf_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,\n \tif (limit < IXGBEVF_NB_XSTATS && xstats_names != NULL)\n \t\treturn -ENOMEM;\n \n+\tif (ids != NULL)\n+\t\treturn -ENOTSUP;\n+\n \tif (xstats_names != NULL)\n \t\tfor (i = 0; i < IXGBEVF_NB_XSTATS; i++)\n \t\t\tstrlcpy(xstats_names[i].name,\ndiff --git a/drivers/net/liquidio/lio_ethdev.c b/drivers/net/liquidio/lio_ethdev.c\nindex b72060a449..68b674c2a6 100644\n--- a/drivers/net/liquidio/lio_ethdev.c\n+++ b/drivers/net/liquidio/lio_ethdev.c\n@@ -214,6 +214,7 @@ lio_dev_xstats_get(struct rte_eth_dev *eth_dev, struct rte_eth_xstat *xstats,\n \n static int\n lio_dev_xstats_get_names(struct rte_eth_dev *eth_dev,\n+\t\t\t const uint64_t *ids,\n \t\t\t struct rte_eth_xstat_name *xstats_names,\n \t\t\t unsigned limit __rte_unused)\n {\n@@ -226,6 +227,9 @@ lio_dev_xstats_get_names(struct rte_eth_dev *eth_dev,\n \t\treturn -EINVAL;\n \t}\n \n+\tif (ids != NULL)\n+\t\treturn -ENOTSUP;\n+\n \tif (xstats_names == NULL)\n \t\treturn LIO_NB_XSTATS;\n \ndiff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h\nindex 3581414b78..4eab2554bc 100644\n--- a/drivers/net/mlx5/mlx5.h\n+++ b/drivers/net/mlx5/mlx5.h\n@@ -1620,6 +1620,7 @@ int mlx5_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *stats,\n \t\t    unsigned int n);\n int mlx5_xstats_reset(struct rte_eth_dev *dev);\n int mlx5_xstats_get_names(struct rte_eth_dev *dev __rte_unused,\n+\t\t\t  const uint64_t *ids,\n \t\t\t  struct rte_eth_xstat_name *xstats_names,\n \t\t\t  unsigned int n);\n \ndiff --git a/drivers/net/mlx5/mlx5_stats.c b/drivers/net/mlx5/mlx5_stats.c\nindex ae2f5668a7..d67afd6bc1 100644\n--- a/drivers/net/mlx5/mlx5_stats.c\n+++ b/drivers/net/mlx5/mlx5_stats.c\n@@ -260,6 +260,8 @@ mlx5_xstats_reset(struct rte_eth_dev *dev)\n  *\n  * @param dev\n  *   Pointer to Ethernet device structure.\n+ * @param ids\n+ *   Array of xstats IDs to get names\n  * @param[out] xstats_names\n  *   Buffer to insert names into.\n  * @param n\n@@ -269,7 +271,7 @@ mlx5_xstats_reset(struct rte_eth_dev *dev)\n  *   Number of xstats names.\n  */\n int\n-mlx5_xstats_get_names(struct rte_eth_dev *dev,\n+mlx5_xstats_get_names(struct rte_eth_dev *dev, const uint64_t *ids,\n \t\t      struct rte_eth_xstat_name *xstats_names, unsigned int n)\n {\n \tunsigned int i;\n@@ -277,6 +279,9 @@ mlx5_xstats_get_names(struct rte_eth_dev *dev,\n \tstruct mlx5_xstats_ctrl *xstats_ctrl = &priv->xstats_ctrl;\n \tunsigned int mlx5_xstats_n = xstats_ctrl->mlx5_stats_n;\n \n+\tif (ids != NULL)\n+\t\treturn -ENOTSUP;\n+\n \tif (n >= mlx5_xstats_n && xstats_names) {\n \t\tfor (i = 0; i != mlx5_xstats_n; ++i) {\n \t\t\tstrncpy(xstats_names[i].name,\ndiff --git a/drivers/net/mvpp2/mrvl_ethdev.c b/drivers/net/mvpp2/mrvl_ethdev.c\nindex 078aefbb8d..554aba1be9 100644\n--- a/drivers/net/mvpp2/mrvl_ethdev.c\n+++ b/drivers/net/mvpp2/mrvl_ethdev.c\n@@ -1689,11 +1689,15 @@ mrvl_xstats_reset(struct rte_eth_dev *dev)\n  */\n static int\n mrvl_xstats_get_names(struct rte_eth_dev *dev __rte_unused,\n+\t\t      const uint64_t *ids,\n \t\t      struct rte_eth_xstat_name *xstats_names,\n \t\t      unsigned int size)\n {\n \tunsigned int i;\n \n+\tif (ids != NULL)\n+\t\treturn -ENOTSUP;\n+\n \tif (!xstats_names)\n \t\treturn RTE_DIM(mrvl_xstats_tbl);\n \ndiff --git a/drivers/net/netvsc/hn_ethdev.c b/drivers/net/netvsc/hn_ethdev.c\nindex 9e2a405973..4260f0b4ab 100644\n--- a/drivers/net/netvsc/hn_ethdev.c\n+++ b/drivers/net/netvsc/hn_ethdev.c\n@@ -851,13 +851,16 @@ hn_dev_xstats_count(struct rte_eth_dev *dev)\n }\n \n static int\n-hn_dev_xstats_get_names(struct rte_eth_dev *dev,\n+hn_dev_xstats_get_names(struct rte_eth_dev *dev, const uint64_t *ids,\n \t\t\tstruct rte_eth_xstat_name *xstats_names,\n \t\t\tunsigned int limit)\n {\n \tunsigned int i, t, count = 0;\n \tint ret;\n \n+\tif (ids != NULL)\n+\t\treturn -ENOTSUP;\n+\n \tif (!xstats_names)\n \t\treturn hn_dev_xstats_count(dev);\n \ndiff --git a/drivers/net/octeontx2/otx2_ethdev.c b/drivers/net/octeontx2/otx2_ethdev.c\nindex 75d4cabf2e..c1fd2ad7d5 100644\n--- a/drivers/net/octeontx2/otx2_ethdev.c\n+++ b/drivers/net/octeontx2/otx2_ethdev.c\n@@ -2338,7 +2338,6 @@ static const struct eth_dev_ops otx2_eth_dev_ops = {\n \t.xstats_get_names         = otx2_nix_xstats_get_names,\n \t.xstats_reset             = otx2_nix_xstats_reset,\n \t.xstats_get_by_id         = otx2_nix_xstats_get_by_id,\n-\t.xstats_get_names_by_id   = otx2_nix_xstats_get_names_by_id,\n \t.rxq_info_get             = otx2_nix_rxq_info_get,\n \t.txq_info_get             = otx2_nix_txq_info_get,\n \t.rx_burst_mode_get        = otx2_rx_burst_mode_get,\ndiff --git a/drivers/net/octeontx2/otx2_ethdev.h b/drivers/net/octeontx2/otx2_ethdev.h\nindex b1575f59a2..1eeb77c9dd 100644\n--- a/drivers/net/octeontx2/otx2_ethdev.h\n+++ b/drivers/net/octeontx2/otx2_ethdev.h\n@@ -506,6 +506,7 @@ int otx2_nix_queue_stats_mapping(struct rte_eth_dev *dev,\n int otx2_nix_xstats_get(struct rte_eth_dev *eth_dev,\n \t\t\tstruct rte_eth_xstat *xstats, unsigned int n);\n int otx2_nix_xstats_get_names(struct rte_eth_dev *eth_dev,\n+\t\t\t      const uint64_t *ids,\n \t\t\t      struct rte_eth_xstat_name *xstats_names,\n \t\t\t      unsigned int limit);\n int otx2_nix_xstats_reset(struct rte_eth_dev *eth_dev);\n@@ -513,10 +514,6 @@ int otx2_nix_xstats_reset(struct rte_eth_dev *eth_dev);\n int otx2_nix_xstats_get_by_id(struct rte_eth_dev *eth_dev,\n \t\t\t      const uint64_t *ids,\n \t\t\t      uint64_t *values, unsigned int n);\n-int otx2_nix_xstats_get_names_by_id(struct rte_eth_dev *eth_dev,\n-\t\t\t\t    const uint64_t *ids,\n-\t\t\t\t    struct rte_eth_xstat_name *xstats_names,\n-\t\t\t\t    unsigned int limit);\n \n /* RSS */\n void otx2_nix_rss_set_key(struct otx2_eth_dev *dev,\ndiff --git a/drivers/net/octeontx2/otx2_stats.c b/drivers/net/octeontx2/otx2_stats.c\nindex 3adf21608c..70bfaa3d77 100644\n--- a/drivers/net/octeontx2/otx2_stats.c\n+++ b/drivers/net/octeontx2/otx2_stats.c\n@@ -200,8 +200,8 @@ otx2_nix_xstats_get(struct rte_eth_dev *eth_dev,\n \treturn count;\n }\n \n-int\n-otx2_nix_xstats_get_names(struct rte_eth_dev *eth_dev,\n+static int\n+otx2_nix_xstats_get_all_names(struct rte_eth_dev *eth_dev,\n \t\t\t  struct rte_eth_xstat_name *xstats_names,\n \t\t\t  unsigned int limit)\n {\n@@ -239,10 +239,10 @@ otx2_nix_xstats_get_names(struct rte_eth_dev *eth_dev,\n }\n \n int\n-otx2_nix_xstats_get_names_by_id(struct rte_eth_dev *eth_dev,\n-\t\t\t\tconst uint64_t *ids,\n-\t\t\t\tstruct rte_eth_xstat_name *xstats_names,\n-\t\t\t\tunsigned int limit)\n+otx2_nix_xstats_get_names(struct rte_eth_dev *eth_dev,\n+\t\t\t  const uint64_t *ids,\n+\t\t\t  struct rte_eth_xstat_name *xstats_names,\n+\t\t\t  unsigned int limit)\n {\n \tstruct rte_eth_xstat_name xstats_names_copy[OTX2_NIX_NUM_XSTATS_REG];\n \tuint16_t i;\n@@ -256,7 +256,7 @@ otx2_nix_xstats_get_names_by_id(struct rte_eth_dev *eth_dev,\n \tif (xstats_names == NULL)\n \t\treturn -ENOMEM;\n \n-\totx2_nix_xstats_get_names(eth_dev, xstats_names_copy, limit);\n+\totx2_nix_xstats_get_all_names(eth_dev, xstats_names_copy, limit);\n \n \tfor (i = 0; i < OTX2_NIX_NUM_XSTATS_REG; i++) {\n \t\tif (ids[i] >= OTX2_NIX_NUM_XSTATS_REG) {\ndiff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c\nindex a4304e0eff..40443b30bf 100644\n--- a/drivers/net/qede/qede_ethdev.c\n+++ b/drivers/net/qede/qede_ethdev.c\n@@ -1718,6 +1718,7 @@ qede_get_xstats_count(struct qede_dev *qdev) {\n \n static int\n qede_get_xstats_names(struct rte_eth_dev *dev,\n+\t\t      const uint64_t *ids,\n \t\t      struct rte_eth_xstat_name *xstats_names,\n \t\t      __rte_unused unsigned int limit)\n {\n@@ -1726,6 +1727,9 @@ qede_get_xstats_names(struct rte_eth_dev *dev,\n \tconst unsigned int stat_cnt = qede_get_xstats_count(qdev);\n \tunsigned int i, qid, hw_fn, stat_idx = 0;\n \n+\tif (ids != NULL)\n+\t\treturn -ENOTSUP;\n+\n \tif (xstats_names == NULL)\n \t\treturn stat_cnt;\n \ndiff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c\nindex f212ca8ad6..d05a1fb5ca 100644\n--- a/drivers/net/sfc/sfc_ethdev.c\n+++ b/drivers/net/sfc/sfc_ethdev.c\n@@ -763,43 +763,6 @@ sfc_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,\n \treturn nb_supported;\n }\n \n-static int\n-sfc_xstats_get_names(struct rte_eth_dev *dev,\n-\t\t     struct rte_eth_xstat_name *xstats_names,\n-\t\t     unsigned int xstats_count)\n-{\n-\tstruct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);\n-\tstruct sfc_port *port = &sa->port;\n-\tunsigned int i;\n-\tunsigned int nstats = 0;\n-\tunsigned int nb_written = 0;\n-\tint ret;\n-\n-\tif (unlikely(xstats_names == NULL))\n-\t\treturn sfc_xstats_get_nb_supported(sa);\n-\n-\tfor (i = 0; i < EFX_MAC_NSTATS; ++i) {\n-\t\tif (EFX_MAC_STAT_SUPPORTED(port->mac_stats_mask, i)) {\n-\t\t\tif (nstats < xstats_count) {\n-\t\t\t\tstrlcpy(xstats_names[nstats].name,\n-\t\t\t\t\tefx_mac_stat_name(sa->nic, i),\n-\t\t\t\t\tsizeof(xstats_names[0].name));\n-\t\t\t\tnb_written++;\n-\t\t\t}\n-\t\t\tnstats++;\n-\t\t}\n-\t}\n-\n-\tret = sfc_sw_xstats_get_names(sa, xstats_names, xstats_count,\n-\t\t\t\t      &nb_written, &nstats);\n-\tif (ret != 0) {\n-\t\tSFC_ASSERT(ret < 0);\n-\t\treturn ret;\n-\t}\n-\n-\treturn nstats;\n-}\n-\n static int\n sfc_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,\n \t\t     uint64_t *values, unsigned int n)\n@@ -837,10 +800,42 @@ sfc_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,\n }\n \n static int\n-sfc_xstats_get_names_by_id(struct rte_eth_dev *dev,\n-\t\t\t   const uint64_t *ids,\n-\t\t\t   struct rte_eth_xstat_name *xstats_names,\n-\t\t\t   unsigned int size)\n+sfc_xstats_get_all_names(struct sfc_adapter *sa,\n+\t\t\t struct rte_eth_xstat_name *xstats_names,\n+\t\t\t unsigned int xstats_count)\n+{\n+\tstruct sfc_port *port = &sa->port;\n+\tunsigned int i;\n+\tunsigned int nstats = 0;\n+\tunsigned int nb_written = 0;\n+\tint ret;\n+\n+\tfor (i = 0; i < EFX_MAC_NSTATS; ++i) {\n+\t\tif (EFX_MAC_STAT_SUPPORTED(port->mac_stats_mask, i)) {\n+\t\t\tif (nstats < xstats_count) {\n+\t\t\t\tstrlcpy(xstats_names[nstats].name,\n+\t\t\t\t\tefx_mac_stat_name(sa->nic, i),\n+\t\t\t\t\tsizeof(xstats_names[0].name));\n+\t\t\t\tnb_written++;\n+\t\t\t}\n+\t\t\tnstats++;\n+\t\t}\n+\t}\n+\n+\tret = sfc_sw_xstats_get_names(sa, xstats_names, xstats_count,\n+\t\t\t\t      &nb_written, &nstats);\n+\tif (ret != 0) {\n+\t\tSFC_ASSERT(ret < 0);\n+\t\treturn ret;\n+\t}\n+\n+\treturn nstats;\n+}\n+\n+static int\n+sfc_xstats_get_names(struct rte_eth_dev *dev, const uint64_t *ids,\n+\t\t     struct rte_eth_xstat_name *xstats_names,\n+\t\t     unsigned int size)\n {\n \tstruct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);\n \tstruct sfc_port *port = &sa->port;\n@@ -848,13 +843,15 @@ sfc_xstats_get_names_by_id(struct rte_eth_dev *dev,\n \tunsigned int i;\n \tint ret;\n \n-\tif (unlikely(xstats_names == NULL && ids != NULL) ||\n-\t    unlikely(xstats_names != NULL && ids == NULL))\n+\tif (unlikely(xstats_names == NULL && ids != NULL))\n \t\treturn -EINVAL;\n \n \tif (unlikely(xstats_names == NULL && ids == NULL))\n \t\treturn sfc_xstats_get_nb_supported(sa);\n \n+\tif (ids == NULL)\n+\t\treturn sfc_xstats_get_all_names(sa, xstats_names, size);\n+\n \t/*\n \t * Names array could be filled in nonsequential order. Fill names with\n \t * string indicating invalid ID first.\n@@ -1905,7 +1902,6 @@ static const struct eth_dev_ops sfc_eth_dev_ops = {\n \t.txq_info_get\t\t\t= sfc_tx_queue_info_get,\n \t.fw_version_get\t\t\t= sfc_fw_version_get,\n \t.xstats_get_by_id\t\t= sfc_xstats_get_by_id,\n-\t.xstats_get_names_by_id\t\t= sfc_xstats_get_names_by_id,\n \t.pool_ops_supported\t\t= sfc_pool_ops_supported,\n };\n \ndiff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c\nindex b267da462b..be6e073141 100644\n--- a/drivers/net/txgbe/txgbe_ethdev.c\n+++ b/drivers/net/txgbe/txgbe_ethdev.c\n@@ -2424,7 +2424,7 @@ txgbe_get_offset_by_id(uint32_t id, uint32_t *offset)\n \treturn -1;\n }\n \n-static int txgbe_dev_xstats_get_names(struct rte_eth_dev *dev,\n+static int txgbe_dev_xstats_get_all_names(struct rte_eth_dev *dev,\n \tstruct rte_eth_xstat_name *xstats_names, unsigned int limit)\n {\n \tunsigned int i, count;\n@@ -2450,7 +2450,7 @@ static int txgbe_dev_xstats_get_names(struct rte_eth_dev *dev,\n \treturn i;\n }\n \n-static int txgbe_dev_xstats_get_names_by_id(struct rte_eth_dev *dev,\n+static int txgbe_dev_xstats_get_names(struct rte_eth_dev *dev,\n \tconst uint64_t *ids,\n \tstruct rte_eth_xstat_name *xstats_names,\n \tunsigned int limit)\n@@ -2458,7 +2458,7 @@ static int txgbe_dev_xstats_get_names_by_id(struct rte_eth_dev *dev,\n \tunsigned int i;\n \n \tif (ids == NULL)\n-\t\treturn txgbe_dev_xstats_get_names(dev, xstats_names, limit);\n+\t\treturn txgbe_dev_xstats_get_all_names(dev, xstats_names, limit);\n \n \tfor (i = 0; i < limit; i++) {\n \t\tif (txgbe_get_name_by_id(ids[i], xstats_names[i].name,\n@@ -5292,7 +5292,6 @@ static const struct eth_dev_ops txgbe_eth_dev_ops = {\n \t.stats_reset                = txgbe_dev_stats_reset,\n \t.xstats_reset               = txgbe_dev_xstats_reset,\n \t.xstats_get_names           = txgbe_dev_xstats_get_names,\n-\t.xstats_get_names_by_id     = txgbe_dev_xstats_get_names_by_id,\n \t.queue_stats_mapping_set    = txgbe_dev_queue_stats_mapping_set,\n \t.fw_version_get             = txgbe_fw_version_get,\n \t.dev_supported_ptypes_get   = txgbe_dev_supported_ptypes_get,\ndiff --git a/drivers/net/txgbe/txgbe_ethdev_vf.c b/drivers/net/txgbe/txgbe_ethdev_vf.c\nindex 896da8a887..cbe2f46f34 100644\n--- a/drivers/net/txgbe/txgbe_ethdev_vf.c\n+++ b/drivers/net/txgbe/txgbe_ethdev_vf.c\n@@ -348,10 +348,14 @@ static struct rte_pci_driver rte_txgbevf_pmd = {\n };\n \n static int txgbevf_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,\n+\tconst uint64_t *ids,\n \tstruct rte_eth_xstat_name *xstats_names, unsigned int limit)\n {\n \tunsigned int i;\n \n+\tif (ids != NULL)\n+\t\treturn -ENOTSUP;\n+\n \tif (limit < TXGBEVF_NB_XSTATS && xstats_names != NULL)\n \t\treturn -ENOMEM;\n \ndiff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c\nindex a202931e9a..e5d723bfd7 100644\n--- a/drivers/net/vhost/rte_eth_vhost.c\n+++ b/drivers/net/vhost/rte_eth_vhost.c\n@@ -251,6 +251,7 @@ vhost_dev_xstats_reset(struct rte_eth_dev *dev)\n \n static int\n vhost_dev_xstats_get_names(struct rte_eth_dev *dev __rte_unused,\n+\t\t\t   const uint64_t *ids,\n \t\t\t   struct rte_eth_xstat_name *xstats_names,\n \t\t\t   unsigned int limit __rte_unused)\n {\n@@ -258,6 +259,9 @@ vhost_dev_xstats_get_names(struct rte_eth_dev *dev __rte_unused,\n \tint count = 0;\n \tint nstats = VHOST_NB_XSTATS_RXPORT + VHOST_NB_XSTATS_TXPORT;\n \n+\tif (ids != NULL)\n+\t\treturn -ENOTSUP;\n+\n \tif (!xstats_names)\n \t\treturn nstats;\n \tfor (t = 0; t < VHOST_NB_XSTATS_RXPORT; t++) {\ndiff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c\nindex b60eeb24ab..da405e0896 100644\n--- a/drivers/net/virtio/virtio_ethdev.c\n+++ b/drivers/net/virtio/virtio_ethdev.c\n@@ -60,6 +60,7 @@ static int virtio_dev_stats_get(struct rte_eth_dev *dev,\n static int virtio_dev_xstats_get(struct rte_eth_dev *dev,\n \t\t\t\t struct rte_eth_xstat *xstats, unsigned n);\n static int virtio_dev_xstats_get_names(struct rte_eth_dev *dev,\n+\t\t\t\t       const uint64_t *ids,\n \t\t\t\t       struct rte_eth_xstat_name *xstats_names,\n \t\t\t\t       unsigned limit);\n static int virtio_dev_stats_reset(struct rte_eth_dev *dev);\n@@ -1045,6 +1046,7 @@ virtio_update_stats(struct rte_eth_dev *dev, struct rte_eth_stats *stats)\n }\n \n static int virtio_dev_xstats_get_names(struct rte_eth_dev *dev,\n+\t\t\t\t       const uint64_t *ids,\n \t\t\t\t       struct rte_eth_xstat_name *xstats_names,\n \t\t\t\t       __rte_unused unsigned limit)\n {\n@@ -1055,6 +1057,9 @@ static int virtio_dev_xstats_get_names(struct rte_eth_dev *dev,\n \tunsigned nstats = dev->data->nb_tx_queues * VIRTIO_NB_TXQ_XSTATS +\n \t\tdev->data->nb_rx_queues * VIRTIO_NB_RXQ_XSTATS;\n \n+\tif (ids != NULL)\n+\t\treturn -ENOTSUP;\n+\n \tif (xstats_names != NULL) {\n \t\t/* Note: limit checked in rte_eth_xstats_names() */\n \ndiff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c\nindex 2f40ae907d..48767e6db1 100644\n--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c\n+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c\n@@ -80,6 +80,7 @@ static int vmxnet3_dev_stats_get(struct rte_eth_dev *dev,\n \t\t\t\t  struct rte_eth_stats *stats);\n static int vmxnet3_dev_stats_reset(struct rte_eth_dev *dev);\n static int vmxnet3_dev_xstats_get_names(struct rte_eth_dev *dev,\n+\t\t\t\t\tconst uint64_t *ids,\n \t\t\t\t\tstruct rte_eth_xstat_name *xstats,\n \t\t\t\t\tunsigned int n);\n static int vmxnet3_dev_xstats_get(struct rte_eth_dev *dev,\n@@ -1201,6 +1202,7 @@ vmxnet3_hw_stats_save(struct vmxnet3_hw *hw)\n \n static int\n vmxnet3_dev_xstats_get_names(struct rte_eth_dev *dev,\n+\t\t\t     const uint64_t *ids,\n \t\t\t     struct rte_eth_xstat_name *xstats_names,\n \t\t\t     unsigned int n)\n {\n@@ -1209,6 +1211,9 @@ vmxnet3_dev_xstats_get_names(struct rte_eth_dev *dev,\n \t\tdev->data->nb_tx_queues * RTE_DIM(vmxnet3_txq_stat_strings) +\n \t\tdev->data->nb_rx_queues * RTE_DIM(vmxnet3_rxq_stat_strings);\n \n+\tif (ids != NULL)\n+\t\treturn -ENOTSUP;\n+\n \tif (!xstats_names || n < nstats)\n \t\treturn nstats;\n \ndiff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h\nindex 96dd0ecaf3..98b9a2ad9a 100644\n--- a/lib/ethdev/ethdev_driver.h\n+++ b/lib/ethdev/ethdev_driver.h\n@@ -227,29 +227,34 @@ typedef int (*eth_xstats_get_by_id_t)(struct rte_eth_dev *dev,\n  */\n typedef int (*eth_xstats_reset_t)(struct rte_eth_dev *dev);\n \n-typedef int (*eth_xstats_get_names_t)(struct rte_eth_dev *dev,\n-\tstruct rte_eth_xstat_name *xstats_names, unsigned int size);\n-/**< @internal Get names of extended stats of an Ethernet device. */\n-\n /**\n  * @internal\n  * Get names of extended stats of an Ethernet device.\n  *\n+ * If @p size is 0, get the number of available statistics.\n+ *\n+ * If @p ids is NULL, get names of all available statistics.\n+ *\n+ * Otherwise, get names of statistics specified by @p ids.\n+ *\n  * @param dev\n  *   ethdev handle of port.\n  * @param ids\n- *   IDs array to retrieve specific statistics. Must not be NULL.\n+ *   IDs array to retrieve specific statistics.\n  * @param xstats_names\n  *   An rte_eth_xstat_name array of at least @p size elements to be filled.\n- *   Must not be NULL.\n  * @param size\n  *   Element count in @p ids and @p xstats_names.\n  *\n  * @return\n+ *   - A number greater than @p size and equal to the number of extended\n+ *     statistics if @p ids is NULL and @p size is too small to return\n+ *     names of available statistics.\n  *   - A number of filled in stats.\n+ *   - -ENOTSUP if non-NULL @p ids are not supported\n  *   - A negative value on error.\n  */\n-typedef int (*eth_xstats_get_names_by_id_t)(struct rte_eth_dev *dev,\n+typedef int (*eth_xstats_get_names_t)(struct rte_eth_dev *dev,\n \tconst uint64_t *ids, struct rte_eth_xstat_name *xstats_names,\n \tunsigned int size);\n \n@@ -936,8 +941,6 @@ struct eth_dev_ops {\n \n \teth_xstats_get_by_id_t     xstats_get_by_id;\n \t/**< Get extended device statistic values by ID. */\n-\teth_xstats_get_names_by_id_t xstats_get_names_by_id;\n-\t/**< Get name of extended device statistics by ID. */\n \n \teth_tm_ops_get_t tm_ops_get;\n \t/**< Get Traffic Management (TM) operations. */\ndiff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c\nindex 655d7be3b5..c951c0ba35 100644\n--- a/lib/ethdev/rte_ethdev.c\n+++ b/lib/ethdev/rte_ethdev.c\n@@ -2867,7 +2867,7 @@ eth_dev_get_xstats_count(uint16_t port_id)\n \tRTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);\n \tdev = &rte_eth_devices[port_id];\n \tif (dev->dev_ops->xstats_get_names != NULL) {\n-\t\tcount = (*dev->dev_ops->xstats_get_names)(dev, NULL, 0);\n+\t\tcount = (*dev->dev_ops->xstats_get_names)(dev, NULL, NULL, 0);\n \t\tif (count < 0)\n \t\t\treturn eth_err(port_id, count);\n \t} else\n@@ -3005,7 +3005,7 @@ rte_eth_xstats_get_names_by_id(uint16_t port_id,\n \tif (ids && !xstats_names)\n \t\treturn -EINVAL;\n \n-\tif (ids && dev->dev_ops->xstats_get_names_by_id != NULL && size > 0) {\n+\tif (ids && dev->dev_ops->xstats_get_names != NULL && size > 0) {\n \t\tuint64_t ids_copy[size];\n \n \t\tfor (i = 0; i < size; i++) {\n@@ -3021,9 +3021,16 @@ rte_eth_xstats_get_names_by_id(uint16_t port_id,\n \t\t\tids_copy[i] = ids[i] - basic_count;\n \t\t}\n \n-\t\tif (no_basic_stat_requested)\n-\t\t\treturn (*dev->dev_ops->xstats_get_names_by_id)(dev,\n+\t\tif (no_basic_stat_requested) {\n+\t\t\tret = (*dev->dev_ops->xstats_get_names)(dev,\n \t\t\t\t\tids_copy, xstats_names, size);\n+\t\t\tif (ret == 0 || ret != -ENOTSUP)\n+\t\t\t\treturn ret;\n+\t\t\t/*\n+\t\t\t * Driver does not support getting names by IDs.\n+\t\t\t * Fallback to support on ethdev layer.\n+\t\t\t */\n+\t\t}\n \t}\n \n \t/* Retrieve all stats */\n@@ -3104,7 +3111,7 @@ rte_eth_xstats_get_names(uint16_t port_id,\n \t\t * to end of list.\n \t\t */\n \t\tcnt_driver_entries = (*dev->dev_ops->xstats_get_names)(\n-\t\t\tdev,\n+\t\t\tdev, NULL,\n \t\t\txstats_names + cnt_used_entries,\n \t\t\tsize - cnt_used_entries);\n \t\tif (cnt_driver_entries < 0)\n",
    "prefixes": [
        "v9",
        "5/5"
    ]
}