get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 95149,
    "url": "https://patches.dpdk.org/api/patches/95149/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/4c94348a10e82f95a7c6c4a9780775619b90a323.1625157360.git.rahul.lakkireddy@chelsio.com/",
    "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": "<4c94348a10e82f95a7c6c4a9780775619b90a323.1625157360.git.rahul.lakkireddy@chelsio.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/4c94348a10e82f95a7c6c4a9780775619b90a323.1625157360.git.rahul.lakkireddy@chelsio.com",
    "date": "2021-07-01T16:56:24",
    "name": "[v2,1/2] net/cxgbe: add support for xstats API",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "6f402f5228acd2f0cb1b2cdf980e359b49ed9e71",
    "submitter": {
        "id": 241,
        "url": "https://patches.dpdk.org/api/people/241/?format=api",
        "name": "Rahul Lakkireddy",
        "email": "rahul.lakkireddy@chelsio.com"
    },
    "delegate": {
        "id": 3961,
        "url": "https://patches.dpdk.org/api/users/3961/?format=api",
        "username": "arybchenko",
        "first_name": "Andrew",
        "last_name": "Rybchenko",
        "email": "andrew.rybchenko@oktetlabs.ru"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/4c94348a10e82f95a7c6c4a9780775619b90a323.1625157360.git.rahul.lakkireddy@chelsio.com/mbox/",
    "series": [
        {
            "id": 17582,
            "url": "https://patches.dpdk.org/api/series/17582/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=17582",
            "date": "2021-07-01T16:56:23",
            "name": "net/cxgbe: add support for xstats API",
            "version": 2,
            "mbox": "https://patches.dpdk.org/series/17582/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/95149/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/95149/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 849FEA0A0C;\n\tThu,  1 Jul 2021 18:57:09 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id C8E7A41337;\n\tThu,  1 Jul 2021 18:57:06 +0200 (CEST)",
            "from stargate.chelsio.com (stargate.chelsio.com [12.32.117.8])\n by mails.dpdk.org (Postfix) with ESMTP id F1B2A41336\n for <dev@dpdk.org>; Thu,  1 Jul 2021 18:57:04 +0200 (CEST)",
            "from localhost (scalar.blr.asicdesigners.com [10.193.185.94])\n by stargate.chelsio.com (8.13.8/8.13.8) with ESMTP id 161Gv2Y1003724\n for <dev@dpdk.org>; Thu, 1 Jul 2021 09:57:03 -0700"
        ],
        "From": "Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>",
        "To": "dev@dpdk.org",
        "Date": "Thu,  1 Jul 2021 22:26:24 +0530",
        "Message-Id": "\n <4c94348a10e82f95a7c6c4a9780775619b90a323.1625157360.git.rahul.lakkireddy@chelsio.com>",
        "X-Mailer": "git-send-email 2.5.3",
        "In-Reply-To": [
            "<cover.1625157360.git.rahul.lakkireddy@chelsio.com>",
            "<cover.1625157360.git.rahul.lakkireddy@chelsio.com>"
        ],
        "References": [
            "<cover.1622738751.git.rahul.lakkireddy@chelsio.com>\n <cover.1625157360.git.rahul.lakkireddy@chelsio.com>",
            "<cover.1625157360.git.rahul.lakkireddy@chelsio.com>"
        ],
        "Subject": "[dpdk-dev] [PATCH v2 1/2] net/cxgbe: add support for xstats API",
        "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": "Add support to fetch port and queue stats via xstats API.\n\nSigned-off-by: Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>\n---\nv2:\n- Perform explicit checks for NULL in conditions.\n- Use rte_strlcpy() instead of strcpy().\n\n drivers/net/cxgbe/cxgbe_ethdev.c | 303 ++++++++++++++++++++++++++++++-\n 1 file changed, 294 insertions(+), 9 deletions(-)",
    "diff": "diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c\nindex 550843b4d7..5bbf7f28af 100644\n--- a/drivers/net/cxgbe/cxgbe_ethdev.c\n+++ b/drivers/net/cxgbe/cxgbe_ethdev.c\n@@ -778,24 +778,304 @@ static int cxgbe_dev_stats_reset(struct rte_eth_dev *eth_dev)\n \n \tcxgbe_stats_reset(pi);\n \tfor (i = 0; i < pi->n_rx_qsets; i++) {\n-\t\tstruct sge_eth_rxq *rxq =\n-\t\t\t&s->ethrxq[pi->first_rxqset + i];\n+\t\tstruct sge_eth_rxq *rxq = &s->ethrxq[pi->first_rxqset + i];\n \n-\t\trxq->stats.pkts = 0;\n-\t\trxq->stats.rx_bytes = 0;\n+\t\tmemset(&rxq->stats, 0, sizeof(rxq->stats));\n \t}\n \tfor (i = 0; i < pi->n_tx_qsets; i++) {\n-\t\tstruct sge_eth_txq *txq =\n-\t\t\t&s->ethtxq[pi->first_txqset + i];\n+\t\tstruct sge_eth_txq *txq = &s->ethtxq[pi->first_txqset + i];\n \n-\t\ttxq->stats.pkts = 0;\n-\t\ttxq->stats.tx_bytes = 0;\n-\t\ttxq->stats.mapping_err = 0;\n+\t\tmemset(&txq->stats, 0, sizeof(txq->stats));\n \t}\n \n \treturn 0;\n }\n \n+/* Store extended statistics names and its offset in stats structure  */\n+struct cxgbe_dev_xstats_name_off {\n+\tchar name[RTE_ETH_XSTATS_NAME_SIZE];\n+\tunsigned int offset;\n+};\n+\n+static const struct cxgbe_dev_xstats_name_off cxgbe_dev_rxq_stats_strings[] = {\n+\t{\"packets\", offsetof(struct sge_eth_rx_stats, pkts)},\n+\t{\"bytes\", offsetof(struct sge_eth_rx_stats, rx_bytes)},\n+\t{\"checksum_offloads\", offsetof(struct sge_eth_rx_stats, rx_cso)},\n+\t{\"vlan_extractions\", offsetof(struct sge_eth_rx_stats, vlan_ex)},\n+\t{\"dropped_packets\", offsetof(struct sge_eth_rx_stats, rx_drops)},\n+};\n+\n+static const struct cxgbe_dev_xstats_name_off cxgbe_dev_txq_stats_strings[] = {\n+\t{\"packets\", offsetof(struct sge_eth_tx_stats, pkts)},\n+\t{\"bytes\", offsetof(struct sge_eth_tx_stats, tx_bytes)},\n+\t{\"tso_requests\", offsetof(struct sge_eth_tx_stats, tso)},\n+\t{\"checksum_offloads\", offsetof(struct sge_eth_tx_stats, tx_cso)},\n+\t{\"vlan_insertions\", offsetof(struct sge_eth_tx_stats, vlan_ins)},\n+\t{\"packet_mapping_errors\",\n+\t offsetof(struct sge_eth_tx_stats, mapping_err)},\n+\t{\"coalesced_wrs\", offsetof(struct sge_eth_tx_stats, coal_wr)},\n+\t{\"coalesced_packets\", offsetof(struct sge_eth_tx_stats, coal_pkts)},\n+};\n+\n+static const struct cxgbe_dev_xstats_name_off cxgbe_dev_port_stats_strings[] = {\n+\t{\"tx_bytes\", offsetof(struct port_stats, tx_octets)},\n+\t{\"tx_packets\", offsetof(struct port_stats, tx_frames)},\n+\t{\"tx_broadcast_packets\", offsetof(struct port_stats, tx_bcast_frames)},\n+\t{\"tx_multicast_packets\", offsetof(struct port_stats, tx_mcast_frames)},\n+\t{\"tx_unicast_packets\", offsetof(struct port_stats, tx_ucast_frames)},\n+\t{\"tx_error_packets\", offsetof(struct port_stats, tx_error_frames)},\n+\t{\"tx_size_64_packets\", offsetof(struct port_stats, tx_frames_64)},\n+\t{\"tx_size_65_to_127_packets\",\n+\t offsetof(struct port_stats, tx_frames_65_127)},\n+\t{\"tx_size_128_to_255_packets\",\n+\t offsetof(struct port_stats, tx_frames_128_255)},\n+\t{\"tx_size_256_to_511_packets\",\n+\t offsetof(struct port_stats, tx_frames_256_511)},\n+\t{\"tx_size_512_to_1023_packets\",\n+\t offsetof(struct port_stats, tx_frames_512_1023)},\n+\t{\"tx_size_1024_to_1518_packets\",\n+\t offsetof(struct port_stats, tx_frames_1024_1518)},\n+\t{\"tx_size_1519_to_max_packets\",\n+\t offsetof(struct port_stats, tx_frames_1519_max)},\n+\t{\"tx_drop_packets\", offsetof(struct port_stats, tx_drop)},\n+\t{\"tx_pause_frames\", offsetof(struct port_stats, tx_pause)},\n+\t{\"tx_ppp_pri0_packets\", offsetof(struct port_stats, tx_ppp0)},\n+\t{\"tx_ppp_pri1_packets\", offsetof(struct port_stats, tx_ppp1)},\n+\t{\"tx_ppp_pri2_packets\", offsetof(struct port_stats, tx_ppp2)},\n+\t{\"tx_ppp_pri3_packets\", offsetof(struct port_stats, tx_ppp3)},\n+\t{\"tx_ppp_pri4_packets\", offsetof(struct port_stats, tx_ppp4)},\n+\t{\"tx_ppp_pri5_packets\", offsetof(struct port_stats, tx_ppp5)},\n+\t{\"tx_ppp_pri6_packets\", offsetof(struct port_stats, tx_ppp6)},\n+\t{\"tx_ppp_pri7_packets\", offsetof(struct port_stats, tx_ppp7)},\n+\t{\"rx_bytes\", offsetof(struct port_stats, rx_octets)},\n+\t{\"rx_packets\", offsetof(struct port_stats, rx_frames)},\n+\t{\"rx_broadcast_packets\", offsetof(struct port_stats, rx_bcast_frames)},\n+\t{\"rx_multicast_packets\", offsetof(struct port_stats, rx_mcast_frames)},\n+\t{\"rx_unicast_packets\", offsetof(struct port_stats, rx_ucast_frames)},\n+\t{\"rx_too_long_packets\", offsetof(struct port_stats, rx_too_long)},\n+\t{\"rx_jabber_packets\", offsetof(struct port_stats, rx_jabber)},\n+\t{\"rx_fcs_error_packets\", offsetof(struct port_stats, rx_fcs_err)},\n+\t{\"rx_length_error_packets\", offsetof(struct port_stats, rx_len_err)},\n+\t{\"rx_symbol_error_packets\",\n+\t offsetof(struct port_stats, rx_symbol_err)},\n+\t{\"rx_short_packets\", offsetof(struct port_stats, rx_runt)},\n+\t{\"rx_size_64_packets\", offsetof(struct port_stats, rx_frames_64)},\n+\t{\"rx_size_65_to_127_packets\",\n+\t offsetof(struct port_stats, rx_frames_65_127)},\n+\t{\"rx_size_128_to_255_packets\",\n+\t offsetof(struct port_stats, rx_frames_128_255)},\n+\t{\"rx_size_256_to_511_packets\",\n+\t offsetof(struct port_stats, rx_frames_256_511)},\n+\t{\"rx_size_512_to_1023_packets\",\n+\t offsetof(struct port_stats, rx_frames_512_1023)},\n+\t{\"rx_size_1024_to_1518_packets\",\n+\t offsetof(struct port_stats, rx_frames_1024_1518)},\n+\t{\"rx_size_1519_to_max_packets\",\n+\t offsetof(struct port_stats, rx_frames_1519_max)},\n+\t{\"rx_pause_packets\", offsetof(struct port_stats, rx_pause)},\n+\t{\"rx_ppp_pri0_packets\", offsetof(struct port_stats, rx_ppp0)},\n+\t{\"rx_ppp_pri1_packets\", offsetof(struct port_stats, rx_ppp1)},\n+\t{\"rx_ppp_pri2_packets\", offsetof(struct port_stats, rx_ppp2)},\n+\t{\"rx_ppp_pri3_packets\", offsetof(struct port_stats, rx_ppp3)},\n+\t{\"rx_ppp_pri4_packets\", offsetof(struct port_stats, rx_ppp4)},\n+\t{\"rx_ppp_pri5_packets\", offsetof(struct port_stats, rx_ppp5)},\n+\t{\"rx_ppp_pri6_packets\", offsetof(struct port_stats, rx_ppp6)},\n+\t{\"rx_ppp_pri7_packets\", offsetof(struct port_stats, rx_ppp7)},\n+\t{\"rx_bg0_dropped_packets\", offsetof(struct port_stats, rx_ovflow0)},\n+\t{\"rx_bg1_dropped_packets\", offsetof(struct port_stats, rx_ovflow1)},\n+\t{\"rx_bg2_dropped_packets\", offsetof(struct port_stats, rx_ovflow2)},\n+\t{\"rx_bg3_dropped_packets\", offsetof(struct port_stats, rx_ovflow3)},\n+\t{\"rx_bg0_truncated_packets\", offsetof(struct port_stats, rx_trunc0)},\n+\t{\"rx_bg1_truncated_packets\", offsetof(struct port_stats, rx_trunc1)},\n+\t{\"rx_bg2_truncated_packets\", offsetof(struct port_stats, rx_trunc2)},\n+\t{\"rx_bg3_truncated_packets\", offsetof(struct port_stats, rx_trunc3)},\n+};\n+\n+#define CXGBE_NB_RXQ_STATS RTE_DIM(cxgbe_dev_rxq_stats_strings)\n+#define CXGBE_NB_TXQ_STATS RTE_DIM(cxgbe_dev_txq_stats_strings)\n+#define CXGBE_NB_PORT_STATS RTE_DIM(cxgbe_dev_port_stats_strings)\n+\n+static u16 cxgbe_dev_xstats_count(struct port_info *pi)\n+{\n+\treturn CXGBE_NB_PORT_STATS +\n+\t       (pi->n_tx_qsets * CXGBE_NB_TXQ_STATS) +\n+\t       (pi->n_rx_qsets * CXGBE_NB_RXQ_STATS);\n+}\n+\n+static int cxgbe_dev_xstats(struct rte_eth_dev *dev,\n+\t\t\t    struct rte_eth_xstat_name *xstats_names,\n+\t\t\t    struct rte_eth_xstat *xstats, unsigned int size)\n+{\n+\tconst struct cxgbe_dev_xstats_name_off *xstats_str;\n+\tstruct port_info *pi = dev->data->dev_private;\n+\tstruct adapter *adap = pi->adapter;\n+\tstruct sge *s = &adap->sge;\n+\tstruct port_stats ps;\n+\tu16 count, i, qid;\n+\tu64 *stats_ptr;\n+\n+\tcount = cxgbe_dev_xstats_count(pi);\n+\tif (size < count)\n+\t\treturn count;\n+\n+\t/* port stats */\n+\tcxgbe_stats_get(pi, &ps);\n+\n+\tcount = 0;\n+\txstats_str = cxgbe_dev_port_stats_strings;\n+\tfor (i = 0; i < CXGBE_NB_PORT_STATS; i++, count++) {\n+\t\tif (xstats_names != NULL)\n+\t\t\tsnprintf(xstats_names[count].name,\n+\t\t\t\t sizeof(xstats_names[count].name),\n+\t\t\t\t \"%s\", xstats_str[i].name);\n+\t\tif (xstats != NULL) {\n+\t\t\tstats_ptr = RTE_PTR_ADD(&ps,\n+\t\t\t\t\t\txstats_str[i].offset);\n+\t\t\txstats[count].value = *stats_ptr;\n+\t\t\txstats[count].id = count;\n+\t\t}\n+\t}\n+\n+\t/* per-txq stats */\n+\txstats_str = cxgbe_dev_txq_stats_strings;\n+\tfor (qid = 0; qid < pi->n_tx_qsets; qid++) {\n+\t\tstruct sge_eth_txq *txq = &s->ethtxq[pi->first_txqset + qid];\n+\n+\t\tfor (i = 0; i < CXGBE_NB_TXQ_STATS; i++, count++) {\n+\t\t\tif (xstats_names != NULL)\n+\t\t\t\tsnprintf(xstats_names[count].name,\n+\t\t\t\t\t sizeof(xstats_names[count].name),\n+\t\t\t\t\t \"tx_q%u_%s\",\n+\t\t\t\t\t qid, xstats_str[i].name);\n+\t\t\tif (xstats != NULL) {\n+\t\t\t\tstats_ptr = RTE_PTR_ADD(&txq->stats,\n+\t\t\t\t\t\t\txstats_str[i].offset);\n+\t\t\t\txstats[count].value = *stats_ptr;\n+\t\t\t\txstats[count].id = count;\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\t/* per-rxq stats */\n+\txstats_str = cxgbe_dev_rxq_stats_strings;\n+\tfor (qid = 0; qid < pi->n_rx_qsets; qid++) {\n+\t\tstruct sge_eth_rxq *rxq = &s->ethrxq[pi->first_rxqset + qid];\n+\n+\t\tfor (i = 0; i < CXGBE_NB_RXQ_STATS; i++, count++) {\n+\t\t\tif (xstats_names != NULL)\n+\t\t\t\tsnprintf(xstats_names[count].name,\n+\t\t\t\t\t sizeof(xstats_names[count].name),\n+\t\t\t\t\t \"rx_q%u_%s\",\n+\t\t\t\t\t qid, xstats_str[i].name);\n+\t\t\tif (xstats != NULL) {\n+\t\t\t\tstats_ptr = RTE_PTR_ADD(&rxq->stats,\n+\t\t\t\t\t\t\txstats_str[i].offset);\n+\t\t\t\txstats[count].value = *stats_ptr;\n+\t\t\t\txstats[count].id = count;\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\treturn count;\n+}\n+\n+/* Get port extended statistics by id.\n+ */\n+static int cxgbe_dev_xstats_get_by_id(struct rte_eth_dev *dev,\n+\t\t\t\t      const uint64_t *ids, uint64_t *values,\n+\t\t\t\t      unsigned int n)\n+{\n+\tstruct port_info *pi = dev->data->dev_private;\n+\tstruct rte_eth_xstat *xstats_copy;\n+\tu16 count, i;\n+\tint ret = 0;\n+\n+\tcount = cxgbe_dev_xstats_count(pi);\n+\tif (ids == NULL || values == NULL)\n+\t\treturn count;\n+\n+\txstats_copy = rte_calloc(NULL, count, sizeof(*xstats_copy), 0);\n+\tif (xstats_copy == NULL)\n+\t\treturn -ENOMEM;\n+\n+\tcxgbe_dev_xstats(dev, NULL, xstats_copy, count);\n+\n+\tfor (i = 0; i < n; i++) {\n+\t\tif (ids[i] >= count) {\n+\t\t\tret = -EINVAL;\n+\t\t\tgoto out_err;\n+\t\t}\n+\t\tvalues[i] = xstats_copy[ids[i]].value;\n+\t}\n+\n+\tret = n;\n+\n+out_err:\n+\trte_free(xstats_copy);\n+\treturn ret;\n+}\n+\n+/* Get names of port extended statistics by id.\n+ */\n+static int cxgbe_dev_xstats_get_names_by_id(struct rte_eth_dev *dev,\n+\t\t\t\t\t    struct rte_eth_xstat_name *xnames,\n+\t\t\t\t\t    const uint64_t *ids, unsigned int n)\n+{\n+\tstruct port_info *pi = dev->data->dev_private;\n+\tstruct rte_eth_xstat_name *xnames_copy;\n+\tu16 count, i;\n+\tint ret = 0;\n+\n+\tcount = cxgbe_dev_xstats_count(pi);\n+\tif (ids == NULL || xnames == NULL)\n+\t\treturn count;\n+\n+\txnames_copy = rte_calloc(NULL, count, sizeof(*xnames_copy), 0);\n+\tif (xnames_copy == NULL)\n+\t\treturn -ENOMEM;\n+\n+\tcxgbe_dev_xstats(dev, xnames_copy, NULL, count);\n+\n+\tfor (i = 0; i < n; i++) {\n+\t\tif (ids[i] >= count) {\n+\t\t\tret = -EINVAL;\n+\t\t\tgoto out_err;\n+\t\t}\n+\t\trte_strlcpy(xnames[i].name, xnames_copy[ids[i]].name,\n+\t\t\t    sizeof(xnames[i].name));\n+\t}\n+\n+\tret = n;\n+\n+out_err:\n+\trte_free(xnames_copy);\n+\treturn ret;\n+}\n+\n+/* Get port extended statistics.\n+ */\n+static int cxgbe_dev_xstats_get(struct rte_eth_dev *dev,\n+\t\t\t\tstruct rte_eth_xstat *xstats, unsigned int n)\n+{\n+\treturn cxgbe_dev_xstats(dev, NULL, xstats, n);\n+}\n+\n+/* Get names of port extended statistics.\n+ */\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+ */\n+static int cxgbe_dev_xstats_reset(struct rte_eth_dev *dev)\n+{\n+\treturn cxgbe_dev_stats_reset(dev);\n+}\n+\n static int cxgbe_flow_ctrl_get(struct rte_eth_dev *eth_dev,\n \t\t\t       struct rte_eth_fc_conf *fc_conf)\n {\n@@ -1351,6 +1631,11 @@ static const struct eth_dev_ops cxgbe_eth_dev_ops = {\n \t.flow_ops_get           = cxgbe_dev_flow_ops_get,\n \t.stats_get\t\t= cxgbe_dev_stats_get,\n \t.stats_reset\t\t= cxgbe_dev_stats_reset,\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,\n \t.get_eeprom_length\t= cxgbe_get_eeprom_length,\n",
    "prefixes": [
        "v2",
        "1/2"
    ]
}