get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 105262,
    "url": "http://patches.dpdk.org/api/patches/105262/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/332ed0b3b8dedbf236fbeb63a40813f6d8357e58.1639636621.git.songyl@ramaxel.com/",
    "project": {
        "id": 1,
        "url": "http://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": "<332ed0b3b8dedbf236fbeb63a40813f6d8357e58.1639636621.git.songyl@ramaxel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/332ed0b3b8dedbf236fbeb63a40813f6d8357e58.1639636621.git.songyl@ramaxel.com",
    "date": "2021-12-18T02:51:49",
    "name": "[v1,22/25] net/spnic: net/spnic: support xstats statistics",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "9a9874cc8c5cfe0336fea5c4d538e07d8fc832b3",
    "submitter": {
        "id": 2455,
        "url": "http://patches.dpdk.org/api/people/2455/?format=api",
        "name": "Yanling Song",
        "email": "songyl@ramaxel.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/332ed0b3b8dedbf236fbeb63a40813f6d8357e58.1639636621.git.songyl@ramaxel.com/mbox/",
    "series": [
        {
            "id": 20973,
            "url": "http://patches.dpdk.org/api/series/20973/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=20973",
            "date": "2021-12-18T02:51:28",
            "name": "Net/SPNIC: support SPNIC into DPDK 22.03",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/20973/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/105262/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/105262/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 E1E8BA04A4;\n\tSat, 18 Dec 2021 03:55:17 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 7FBF542706;\n\tSat, 18 Dec 2021 03:52:54 +0100 (CET)",
            "from VLXDG1SPAM1.ramaxel.com (email.unionmem.com [221.4.138.186])\n by mails.dpdk.org (Postfix) with ESMTP id 26BBB41156\n for <dev@dpdk.org>; Sat, 18 Dec 2021 03:52:48 +0100 (CET)",
            "from V12DG1MBS01.ramaxel.local (v12dg1mbs01.ramaxel.local\n [172.26.18.31])\n by VLXDG1SPAM1.ramaxel.com with ESMTPS id 1BI2q3PI010365\n (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL);\n Sat, 18 Dec 2021 10:52:03 +0800 (GMT-8)\n (envelope-from songyl@ramaxel.com)",
            "from localhost.localdomain (10.64.9.47) by V12DG1MBS01.ramaxel.local\n (172.26.18.31) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2308.14; Sat, 18\n Dec 2021 10:52:02 +0800"
        ],
        "From": "Yanling Song <songyl@ramaxel.com>",
        "To": "<dev@dpdk.org>",
        "CC": "<songyl@ramaxel.com>, <yanling.song@linux.dev>, <yanggan@ramaxel.com>,\n <ferruh.yigit@intel.com>",
        "Subject": "[PATCH v1 22/25] net/spnic: net/spnic: support xstats statistics",
        "Date": "Sat, 18 Dec 2021 10:51:49 +0800",
        "Message-ID": "\n <332ed0b3b8dedbf236fbeb63a40813f6d8357e58.1639636621.git.songyl@ramaxel.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<cover.1639636621.git.songyl@ramaxel.com>",
        "References": "<cover.1639636621.git.songyl@ramaxel.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[10.64.9.47]",
        "X-ClientProxiedBy": "V12DG1MBS01.ramaxel.local (172.26.18.31) To\n V12DG1MBS01.ramaxel.local (172.26.18.31)",
        "X-DNSRBL": "",
        "X-MAIL": "VLXDG1SPAM1.ramaxel.com 1BI2q3PI010365",
        "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"
    },
    "content": "This commit implements DFX statistics of\nphysical port, function, Rx queues and Tx queues,\nwhich includes MAC statistic, unicast/multicast/broadcast\npackets statistic, rx_mbuf, tx_busy and etc.\n\nSigned-off-by: Yanling Song <songyl@ramaxel.com>\n---\n drivers/net/spnic/base/spnic_nic_cfg.c | 118 ++++++\n drivers/net/spnic/base/spnic_nic_cfg.h | 206 +++++++++++\n drivers/net/spnic/spnic_ethdev.c       | 474 +++++++++++++++++++++++++\n 3 files changed, 798 insertions(+)",
    "diff": "diff --git a/drivers/net/spnic/base/spnic_nic_cfg.c b/drivers/net/spnic/base/spnic_nic_cfg.c\nindex 24336a2096..ce77b306db 100644\n--- a/drivers/net/spnic/base/spnic_nic_cfg.c\n+++ b/drivers/net/spnic/base/spnic_nic_cfg.c\n@@ -493,6 +493,124 @@ int spnic_get_pause_info(void *hwdev, struct nic_pause_config *nic_pause)\n \treturn spnic_cfg_hw_pause(hwdev, SPNIC_CMD_OP_GET, nic_pause);\n }\n \n+int spnic_get_vport_stats(void *hwdev, struct spnic_vport_stats *stats)\n+{\n+\tstruct spnic_port_stats_info stats_info;\n+\tstruct spnic_cmd_vport_stats vport_stats;\n+\tu16 out_size = sizeof(vport_stats);\n+\tint err;\n+\n+\tif (!hwdev || !stats)\n+\t\treturn -EINVAL;\n+\n+\tmemset(&stats_info, 0, sizeof(stats_info));\n+\tmemset(&vport_stats, 0, sizeof(vport_stats));\n+\n+\tstats_info.func_id = spnic_global_func_id(hwdev);\n+\n+\terr = l2nic_msg_to_mgmt_sync(hwdev, SPNIC_CMD_GET_VPORT_STAT,\n+\t\t\t\t     &stats_info, sizeof(stats_info),\n+\t\t\t\t     &vport_stats, &out_size);\n+\tif (err || !out_size || vport_stats.msg_head.status) {\n+\t\tPMD_DRV_LOG(ERR, \"Get function stats failed, err: %d, status: 0x%x, out size: 0x%x\",\n+\t\t\t    err, vport_stats.msg_head.status, out_size);\n+\t\treturn -EIO;\n+\t}\n+\n+\tmemcpy(stats, &vport_stats.stats, sizeof(*stats));\n+\n+\treturn 0;\n+}\n+\n+int spnic_get_phy_port_stats(void *hwdev, struct mag_phy_port_stats *stats)\n+{\n+\tstruct mag_cmd_get_port_stat *port_stats = NULL;\n+\tstruct mag_cmd_port_stats_info stats_info;\n+\tu16 out_size = sizeof(*port_stats);\n+\tint err;\n+\n+\tport_stats = rte_zmalloc(\"port_stats\", sizeof(*port_stats), 0);\n+\tif (!port_stats)\n+\t\treturn -ENOMEM;\n+\n+\tmemset(&stats_info, 0, sizeof(stats_info));\n+\tstats_info.port_id = spnic_physical_port_id(hwdev);\n+\n+\terr = mag_msg_to_mgmt_sync(hwdev, MAG_CMD_GET_PORT_STAT,\n+\t\t\t\t   &stats_info, sizeof(stats_info),\n+\t\t\t\t   port_stats, &out_size);\n+\tif (err || !out_size || port_stats->head.status) {\n+\t\tPMD_DRV_LOG(ERR,\n+\t\t\t\"Failed to get port statistics, err: %d, status: 0x%x, out size: 0x%x\\n\",\n+\t\t\terr, port_stats->head.status, out_size);\n+\t\terr = -EIO;\n+\t\tgoto out;\n+\t}\n+\n+\tmemcpy(stats, &port_stats->counter, sizeof(*stats));\n+\n+out:\n+\trte_free(port_stats);\n+\n+\treturn err;\n+}\n+\n+int spnic_clear_vport_stats(void *hwdev)\n+{\n+\tstruct spnic_cmd_clear_vport_stats clear_vport_stats;\n+\tu16 out_size = sizeof(clear_vport_stats);\n+\tint err;\n+\n+\tif (!hwdev) {\n+\t\tPMD_DRV_LOG(ERR, \"Hwdev is NULL\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tmemset(&clear_vport_stats, 0, sizeof(clear_vport_stats));\n+\tclear_vport_stats.func_id = spnic_global_func_id(hwdev);\n+\n+\terr = l2nic_msg_to_mgmt_sync(hwdev, SPNIC_CMD_CLEAN_VPORT_STAT,\n+\t\t\t\t     &clear_vport_stats,\n+\t\t\t\t     sizeof(clear_vport_stats),\n+\t\t\t\t     &clear_vport_stats, &out_size);\n+\tif (err || !out_size || clear_vport_stats.msg_head.status) {\n+\t\tPMD_DRV_LOG(ERR, \"Clear vport stats failed, err: %d, status: 0x%x, out size: 0x%x\",\n+\t\t\t    err, clear_vport_stats.msg_head.status, out_size);\n+\t\treturn -EIO;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+int spnic_clear_phy_port_stats(void *hwdev)\n+{\n+\tstruct mag_cmd_clr_port_stat *port_stats = NULL;\n+\tu16 out_size = sizeof(*port_stats);\n+\tint err;\n+\n+\tport_stats = rte_zmalloc(\"port_stats\", sizeof(*port_stats), 0);\n+\tif (!port_stats)\n+\t\treturn -ENOMEM;\n+\n+\tport_stats->port_id = spnic_physical_port_id(hwdev);\n+\n+\terr = mag_msg_to_mgmt_sync(hwdev, MAG_CMD_GET_PORT_STAT,\n+\t\t\t\t   &port_stats, sizeof(port_stats),\n+\t\t\t\t   port_stats, &out_size);\n+\tif (err || !out_size || port_stats->head.status) {\n+\t\tPMD_DRV_LOG(ERR,\n+\t\t\t\"Failed to get port statistics, err: %d, status: 0x%x, out size: 0x%x\\n\",\n+\t\t\terr, port_stats->head.status, out_size);\n+\t\terr = -EIO;\n+\t\tgoto out;\n+\t}\n+\n+out:\n+\trte_free(port_stats);\n+\n+\treturn err;\n+}\n+\n static int spnic_set_function_table(void *hwdev, u32 cfg_bitmap,\n \t\t\t\t     struct spnic_func_tbl_cfg *cfg)\n {\ndiff --git a/drivers/net/spnic/base/spnic_nic_cfg.h b/drivers/net/spnic/base/spnic_nic_cfg.h\nindex 2cdaada2ea..e5e4ffea4b 100644\n--- a/drivers/net/spnic/base/spnic_nic_cfg.h\n+++ b/drivers/net/spnic/base/spnic_nic_cfg.h\n@@ -259,6 +259,160 @@ struct spnic_cmd_clear_qp_resource {\n \tu16 rsvd1;\n };\n \n+struct spnic_port_stats_info {\n+\tstruct mgmt_msg_head msg_head;\n+\n+\tu16 func_id;\n+\tu16 rsvd1;\n+};\n+\n+struct spnic_vport_stats {\n+\tu64 tx_unicast_pkts_vport;\n+\tu64 tx_unicast_bytes_vport;\n+\tu64 tx_multicast_pkts_vport;\n+\tu64 tx_multicast_bytes_vport;\n+\tu64 tx_broadcast_pkts_vport;\n+\tu64 tx_broadcast_bytes_vport;\n+\n+\tu64 rx_unicast_pkts_vport;\n+\tu64 rx_unicast_bytes_vport;\n+\tu64 rx_multicast_pkts_vport;\n+\tu64 rx_multicast_bytes_vport;\n+\tu64 rx_broadcast_pkts_vport;\n+\tu64 rx_broadcast_bytes_vport;\n+\n+\tu64 tx_discard_vport;\n+\tu64 rx_discard_vport;\n+\tu64 tx_err_vport;\n+\tu64 rx_err_vport;\n+};\n+\n+struct spnic_cmd_vport_stats {\n+\tstruct mgmt_msg_head msg_head;\n+\n+\tu32 stats_size;\n+\tu32 rsvd1;\n+\tstruct spnic_vport_stats stats;\n+\tu64 rsvd2[6];\n+};\n+\n+struct mag_phy_port_stats {\n+\tu64 mac_tx_fragment_pkt_num;\n+\tu64 mac_tx_undersize_pkt_num;\n+\tu64 mac_tx_undermin_pkt_num;\n+\tu64 mac_tx_64_oct_pkt_num;\n+\tu64 mac_tx_65_127_oct_pkt_num;\n+\tu64 mac_tx_128_255_oct_pkt_num;\n+\tu64 mac_tx_256_511_oct_pkt_num;\n+\tu64 mac_tx_512_1023_oct_pkt_num;\n+\tu64 mac_tx_1024_1518_oct_pkt_num;\n+\tu64 mac_tx_1519_2047_oct_pkt_num;\n+\tu64 mac_tx_2048_4095_oct_pkt_num;\n+\tu64 mac_tx_4096_8191_oct_pkt_num;\n+\tu64 mac_tx_8192_9216_oct_pkt_num;\n+\tu64 mac_tx_9217_12287_oct_pkt_num;\n+\tu64 mac_tx_12288_16383_oct_pkt_num;\n+\tu64 mac_tx_1519_max_bad_pkt_num;\n+\tu64 mac_tx_1519_max_good_pkt_num;\n+\tu64 mac_tx_oversize_pkt_num;\n+\tu64 mac_tx_jabber_pkt_num;\n+\tu64 mac_tx_bad_pkt_num;\n+\tu64 mac_tx_bad_oct_num;\n+\tu64 mac_tx_good_pkt_num;\n+\tu64 mac_tx_good_oct_num;\n+\tu64 mac_tx_total_pkt_num;\n+\tu64 mac_tx_total_oct_num;\n+\tu64 mac_tx_uni_pkt_num;\n+\tu64 mac_tx_multi_pkt_num;\n+\tu64 mac_tx_broad_pkt_num;\n+\tu64 mac_tx_pause_num;\n+\tu64 mac_tx_pfc_pkt_num;\n+\tu64 mac_tx_pfc_pri0_pkt_num;\n+\tu64 mac_tx_pfc_pri1_pkt_num;\n+\tu64 mac_tx_pfc_pri2_pkt_num;\n+\tu64 mac_tx_pfc_pri3_pkt_num;\n+\tu64 mac_tx_pfc_pri4_pkt_num;\n+\tu64 mac_tx_pfc_pri5_pkt_num;\n+\tu64 mac_tx_pfc_pri6_pkt_num;\n+\tu64 mac_tx_pfc_pri7_pkt_num;\n+\tu64 mac_tx_control_pkt_num;\n+\tu64 mac_tx_err_all_pkt_num;\n+\tu64 mac_tx_from_app_good_pkt_num;\n+\tu64 mac_tx_from_app_bad_pkt_num;\n+\n+\tu64 mac_rx_fragment_pkt_num;\n+\tu64 mac_rx_undersize_pkt_num;\n+\tu64 mac_rx_undermin_pkt_num;\n+\tu64 mac_rx_64_oct_pkt_num;\n+\tu64 mac_rx_65_127_oct_pkt_num;\n+\tu64 mac_rx_128_255_oct_pkt_num;\n+\tu64 mac_rx_256_511_oct_pkt_num;\n+\tu64 mac_rx_512_1023_oct_pkt_num;\n+\tu64 mac_rx_1024_1518_oct_pkt_num;\n+\tu64 mac_rx_1519_2047_oct_pkt_num;\n+\tu64 mac_rx_2048_4095_oct_pkt_num;\n+\tu64 mac_rx_4096_8191_oct_pkt_num;\n+\tu64 mac_rx_8192_9216_oct_pkt_num;\n+\tu64 mac_rx_9217_12287_oct_pkt_num;\n+\tu64 mac_rx_12288_16383_oct_pkt_num;\n+\tu64 mac_rx_1519_max_bad_pkt_num;\n+\tu64 mac_rx_1519_max_good_pkt_num;\n+\tu64 mac_rx_oversize_pkt_num;\n+\tu64 mac_rx_jabber_pkt_num;\n+\tu64 mac_rx_bad_pkt_num;\n+\tu64 mac_rx_bad_oct_num;\n+\tu64 mac_rx_good_pkt_num;\n+\tu64 mac_rx_good_oct_num;\n+\tu64 mac_rx_total_pkt_num;\n+\tu64 mac_rx_total_oct_num;\n+\tu64 mac_rx_uni_pkt_num;\n+\tu64 mac_rx_multi_pkt_num;\n+\tu64 mac_rx_broad_pkt_num;\n+\tu64 mac_rx_pause_num;\n+\tu64 mac_rx_pfc_pkt_num;\n+\tu64 mac_rx_pfc_pri0_pkt_num;\n+\tu64 mac_rx_pfc_pri1_pkt_num;\n+\tu64 mac_rx_pfc_pri2_pkt_num;\n+\tu64 mac_rx_pfc_pri3_pkt_num;\n+\tu64 mac_rx_pfc_pri4_pkt_num;\n+\tu64 mac_rx_pfc_pri5_pkt_num;\n+\tu64 mac_rx_pfc_pri6_pkt_num;\n+\tu64 mac_rx_pfc_pri7_pkt_num;\n+\tu64 mac_rx_control_pkt_num;\n+\tu64 mac_rx_sym_err_pkt_num;\n+\tu64 mac_rx_fcs_err_pkt_num;\n+\tu64 mac_rx_send_app_good_pkt_num;\n+\tu64 mac_rx_send_app_bad_pkt_num;\n+\tu64 mac_rx_unfilter_pkt_num;\n+};\n+\n+struct mag_cmd_port_stats_info {\n+\tstruct mgmt_msg_head head;\n+\n+\tu8 port_id;\n+\tu8 rsvd0[3];\n+};\n+\n+struct mag_cmd_get_port_stat {\n+\tstruct mgmt_msg_head head;\n+\n+\tstruct mag_phy_port_stats counter;\n+\tu64 rsvd1[15];\n+};\n+\n+struct mag_cmd_clr_port_stat {\n+\tstruct mgmt_msg_head head;\n+\n+\tu8 port_id;\n+\tu8 rsvd0[3];\n+};\n+\n+struct spnic_cmd_clear_vport_stats {\n+\tstruct mgmt_msg_head msg_head;\n+\n+\tu16 func_id;\n+\tu16 rsvd;\n+};\n \n enum spnic_func_tbl_cfg_bitmap {\n \tFUNC_CFG_INIT,\n@@ -586,6 +740,58 @@ int spnic_set_pause_info(void *hwdev, struct nic_pause_config nic_pause);\n  */\n int spnic_get_pause_info(void *hwdev, struct nic_pause_config *nic_pause);\n \n+/**\n+ * Get function stats\n+ *\n+ * @param[in] hwdev\n+ *   Device pointer to hwdev\n+ * @param[out] stats\n+ *   Function stats\n+ *\n+ * @retval zero : Success\n+ * @retval non-zero : Failure\n+ */\n+int spnic_get_vport_stats(void *hwdev, struct spnic_vport_stats *stats);\n+\n+/**\n+ * Get port stats\n+ *\n+ * @param[in] hwdev\n+ *   Device pointer to hwdev\n+ * @param[out] stats\n+ *   Port stats\n+ *\n+ * @retval zero : Success\n+ * @retval non-zero : Failure\n+ */\n+int spnic_get_phy_port_stats(void *hwdev, struct mag_phy_port_stats *stats);\n+\n+/**\n+ * Clear function stats\n+ *\n+ * @param[in] hwdev\n+ *   Device pointer to hwdev\n+ * @param[out] stats\n+ *   Function stats\n+ *\n+ * @retval zero : Success\n+ * @retval non-zero : Failure\n+ */\n+int spnic_clear_vport_stats(void *hwdev);\n+\n+/**\n+ * Clear port stats\n+ *\n+ * @param[in] hwdev\n+ *   Device pointer to hwdev\n+ * @param[out] stats\n+ *   Port stats\n+ *\n+ * @retval zero : Success\n+ * @retval non-zero : Failure\n+ */\n+int spnic_clear_phy_port_stats(void *hwdev);\n+\n /**\n  * Init nic hwdev\n  *\ndiff --git a/drivers/net/spnic/spnic_ethdev.c b/drivers/net/spnic/spnic_ethdev.c\nindex 2cd68e0178..4de86fd08a 100644\n--- a/drivers/net/spnic/spnic_ethdev.c\n+++ b/drivers/net/spnic/spnic_ethdev.c\n@@ -66,6 +66,171 @@ enum spnic_rx_mod {\n #define SPNIC_DEFAULT_RX_MODE\t(SPNIC_RX_MODE_UC | SPNIC_RX_MODE_MC | \\\n \t\t\t\tSPNIC_RX_MODE_BC)\n \n+struct spnic_xstats_name_off {\n+\tchar name[RTE_ETH_XSTATS_NAME_SIZE];\n+\tu32  offset;\n+};\n+\n+#define SPNIC_FUNC_STAT(_stat_item) {\t\\\n+\t.name = #_stat_item, \\\n+\t.offset = offsetof(struct spnic_vport_stats, _stat_item) \\\n+}\n+\n+#define SPNIC_PORT_STAT(_stat_item) { \\\n+\t.name = #_stat_item, \\\n+\t.offset = offsetof(struct mag_phy_port_stats, _stat_item) \\\n+}\n+\n+static const struct spnic_xstats_name_off spnic_vport_stats_strings[] = {\n+\tSPNIC_FUNC_STAT(tx_unicast_pkts_vport),\n+\tSPNIC_FUNC_STAT(tx_unicast_bytes_vport),\n+\tSPNIC_FUNC_STAT(tx_multicast_pkts_vport),\n+\tSPNIC_FUNC_STAT(tx_multicast_bytes_vport),\n+\tSPNIC_FUNC_STAT(tx_broadcast_pkts_vport),\n+\tSPNIC_FUNC_STAT(tx_broadcast_bytes_vport),\n+\n+\tSPNIC_FUNC_STAT(rx_unicast_pkts_vport),\n+\tSPNIC_FUNC_STAT(rx_unicast_bytes_vport),\n+\tSPNIC_FUNC_STAT(rx_multicast_pkts_vport),\n+\tSPNIC_FUNC_STAT(rx_multicast_bytes_vport),\n+\tSPNIC_FUNC_STAT(rx_broadcast_pkts_vport),\n+\tSPNIC_FUNC_STAT(rx_broadcast_bytes_vport),\n+\n+\tSPNIC_FUNC_STAT(tx_discard_vport),\n+\tSPNIC_FUNC_STAT(rx_discard_vport),\n+\tSPNIC_FUNC_STAT(tx_err_vport),\n+\tSPNIC_FUNC_STAT(rx_err_vport),\n+};\n+\n+#define SPNIC_VPORT_XSTATS_NUM (sizeof(spnic_vport_stats_strings) / \\\n+\t\tsizeof(spnic_vport_stats_strings[0]))\n+\n+static const struct spnic_xstats_name_off spnic_phyport_stats_strings[] = {\n+\tSPNIC_PORT_STAT(mac_tx_fragment_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_undersize_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_undermin_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_64_oct_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_65_127_oct_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_128_255_oct_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_256_511_oct_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_512_1023_oct_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_1024_1518_oct_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_1519_2047_oct_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_2048_4095_oct_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_4096_8191_oct_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_8192_9216_oct_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_9217_12287_oct_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_12288_16383_oct_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_1519_max_bad_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_1519_max_good_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_oversize_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_jabber_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_bad_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_bad_oct_num),\n+\tSPNIC_PORT_STAT(mac_tx_good_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_good_oct_num),\n+\tSPNIC_PORT_STAT(mac_tx_total_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_total_oct_num),\n+\tSPNIC_PORT_STAT(mac_tx_uni_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_multi_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_broad_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_pause_num),\n+\tSPNIC_PORT_STAT(mac_tx_pfc_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_pfc_pri0_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_pfc_pri1_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_pfc_pri2_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_pfc_pri3_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_pfc_pri4_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_pfc_pri5_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_pfc_pri6_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_pfc_pri7_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_control_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_err_all_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_from_app_good_pkt_num),\n+\tSPNIC_PORT_STAT(mac_tx_from_app_bad_pkt_num),\n+\n+\tSPNIC_PORT_STAT(mac_rx_fragment_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_undersize_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_undermin_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_64_oct_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_65_127_oct_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_128_255_oct_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_256_511_oct_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_512_1023_oct_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_1024_1518_oct_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_1519_2047_oct_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_2048_4095_oct_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_4096_8191_oct_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_8192_9216_oct_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_9217_12287_oct_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_12288_16383_oct_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_1519_max_bad_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_1519_max_good_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_oversize_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_jabber_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_bad_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_bad_oct_num),\n+\tSPNIC_PORT_STAT(mac_rx_good_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_good_oct_num),\n+\tSPNIC_PORT_STAT(mac_rx_total_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_total_oct_num),\n+\tSPNIC_PORT_STAT(mac_rx_uni_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_multi_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_broad_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_pause_num),\n+\tSPNIC_PORT_STAT(mac_rx_pfc_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_pfc_pri0_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_pfc_pri1_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_pfc_pri2_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_pfc_pri3_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_pfc_pri4_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_pfc_pri5_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_pfc_pri6_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_pfc_pri7_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_control_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_sym_err_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_fcs_err_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_send_app_good_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_send_app_bad_pkt_num),\n+\tSPNIC_PORT_STAT(mac_rx_unfilter_pkt_num)\n+};\n+\n+#define SPNIC_PHYPORT_XSTATS_NUM (sizeof(spnic_phyport_stats_strings) / \\\n+\t\tsizeof(spnic_phyport_stats_strings[0]))\n+\n+static const struct spnic_xstats_name_off spnic_rxq_stats_strings[] = {\n+\t{\"rx_nombuf\", offsetof(struct spnic_rxq_stats, rx_nombuf)},\n+\t{\"burst_pkt\", offsetof(struct spnic_rxq_stats, burst_pkts)},\n+};\n+\n+#define SPNIC_RXQ_XSTATS_NUM (sizeof(spnic_rxq_stats_strings) / \\\n+\t\tsizeof(spnic_rxq_stats_strings[0]))\n+\n+static const struct spnic_xstats_name_off spnic_txq_stats_strings[] = {\n+\t{\"tx_busy\", offsetof(struct spnic_txq_stats, tx_busy)},\n+\t{\"offload_errors\", offsetof(struct spnic_txq_stats, off_errs)},\n+\t{\"burst_pkts\", offsetof(struct spnic_txq_stats, burst_pkts)},\n+\t{\"sge_len0\", offsetof(struct spnic_txq_stats, sge_len0)},\n+\t{\"mbuf_null\", offsetof(struct spnic_txq_stats, mbuf_null)},\n+};\n+\n+#define SPNIC_TXQ_XSTATS_NUM (sizeof(spnic_txq_stats_strings) / \\\n+\t\tsizeof(spnic_txq_stats_strings[0]))\n+\n+static int spnic_xstats_calc_num(struct spnic_nic_dev *nic_dev)\n+{\n+\tif (SPNIC_IS_VF(nic_dev->hwdev)) {\n+\t\treturn (SPNIC_VPORT_XSTATS_NUM +\n+\t\t\tSPNIC_RXQ_XSTATS_NUM * nic_dev->num_rqs +\n+\t\t\tSPNIC_TXQ_XSTATS_NUM * nic_dev->num_sqs);\n+\t} else {\n+\t\treturn (SPNIC_VPORT_XSTATS_NUM +\n+\t\t\tSPNIC_PHYPORT_XSTATS_NUM +\n+\t\t\tSPNIC_RXQ_XSTATS_NUM * nic_dev->num_rqs +\n+\t\t\tSPNIC_TXQ_XSTATS_NUM * nic_dev->num_sqs);\n+\t}\n+}\n+\n #define SPNIC_MAX_QUEUE_DEPTH\t\t16384\n #define SPNIC_MIN_QUEUE_DEPTH\t\t128\n #define SPNIC_TXD_ALIGN\t\t\t1\n@@ -1846,6 +2011,305 @@ static int spnic_rss_reta_update(struct rte_eth_dev *dev,\n \treturn err;\n }\n \n+/**\n+ * Get device generic statistics.\n+ *\n+ * @param[in] dev\n+ *   Pointer to ethernet device structure.\n+ * @param[out] stats\n+ *   Stats structure output buffer.\n+ *\n+ * @retval zero: Success\n+ * @retval non-zero: Failure\n+ */\n+static int spnic_dev_stats_get(struct rte_eth_dev *dev,\n+\t\t\t       struct rte_eth_stats *stats)\n+{\n+\tstruct spnic_nic_dev *nic_dev = SPNIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev);\n+\tstruct spnic_vport_stats vport_stats;\n+\tstruct spnic_rxq *rxq = NULL;\n+\tstruct spnic_txq *txq = NULL;\n+\tint i, err, q_num;\n+\tu64 rx_discards_pmd = 0;\n+\n+\terr = spnic_get_vport_stats(nic_dev->hwdev, &vport_stats);\n+\tif (err) {\n+\t\tPMD_DRV_LOG(ERR, \"Get vport stats from fw failed, nic_dev: %s\",\n+\t\t\t    nic_dev->dev_name);\n+\t\treturn err;\n+\t}\n+\n+\tdev->data->rx_mbuf_alloc_failed = 0;\n+\n+\t/* Rx queue stats */\n+\tq_num = (nic_dev->num_rqs < RTE_ETHDEV_QUEUE_STAT_CNTRS) ?\n+\t\tnic_dev->num_rqs : RTE_ETHDEV_QUEUE_STAT_CNTRS;\n+\tfor (i = 0; i < q_num; i++) {\n+\t\trxq = nic_dev->rxqs[i];\n+\t\tstats->q_ipackets[i] = rxq->rxq_stats.packets;\n+\t\tstats->q_ibytes[i] = rxq->rxq_stats.bytes;\n+\t\tstats->q_errors[i] = rxq->rxq_stats.dropped;\n+\n+\t\tstats->ierrors += rxq->rxq_stats.errors;\n+\t\trx_discards_pmd += rxq->rxq_stats.dropped;\n+\t\tdev->data->rx_mbuf_alloc_failed += rxq->rxq_stats.rx_nombuf;\n+\t}\n+\n+\t/* Tx queue stats */\n+\tq_num = (nic_dev->num_sqs < RTE_ETHDEV_QUEUE_STAT_CNTRS) ?\n+\t\tnic_dev->num_sqs : RTE_ETHDEV_QUEUE_STAT_CNTRS;\n+\tfor (i = 0; i < q_num; i++) {\n+\t\ttxq = nic_dev->txqs[i];\n+\t\tstats->q_opackets[i] = txq->txq_stats.packets;\n+\t\tstats->q_obytes[i] = txq->txq_stats.bytes;\n+\t\tstats->oerrors += (txq->txq_stats.tx_busy +\n+\t\t\t\t  txq->txq_stats.off_errs);\n+\t}\n+\n+\t/* Vport stats */\n+\tstats->oerrors += vport_stats.tx_discard_vport;\n+\n+\tstats->imissed = vport_stats.rx_discard_vport + rx_discards_pmd;\n+\n+\tstats->ipackets = (vport_stats.rx_unicast_pkts_vport +\n+\t\t\t  vport_stats.rx_multicast_pkts_vport +\n+\t\t\t  vport_stats.rx_broadcast_pkts_vport -\n+\t\t\t  rx_discards_pmd);\n+\n+\tstats->opackets = (vport_stats.tx_unicast_pkts_vport +\n+\t\t\t  vport_stats.tx_multicast_pkts_vport +\n+\t\t\t  vport_stats.tx_broadcast_pkts_vport);\n+\n+\tstats->ibytes = (vport_stats.rx_unicast_bytes_vport +\n+\t\t\tvport_stats.rx_multicast_bytes_vport +\n+\t\t\tvport_stats.rx_broadcast_bytes_vport);\n+\n+\tstats->obytes = (vport_stats.tx_unicast_bytes_vport +\n+\t\t\tvport_stats.tx_multicast_bytes_vport +\n+\t\t\tvport_stats.tx_broadcast_bytes_vport);\n+\treturn 0;\n+}\n+\n+/**\n+ * Clear device generic statistics.\n+ *\n+ * @param[in] dev\n+ *   Pointer to ethernet device structure.\n+ *\n+ * @retval zero: Success\n+ * @retval non-zero: Failure\n+ */\n+static int spnic_dev_stats_reset(struct rte_eth_dev *dev)\n+{\n+\tstruct spnic_nic_dev *nic_dev = SPNIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev);\n+\tstruct spnic_rxq *rxq = NULL;\n+\tstruct spnic_txq *txq = NULL;\n+\tint qid;\n+\tint err;\n+\n+\terr = spnic_clear_vport_stats(nic_dev->hwdev);\n+\tif (err)\n+\t\treturn err;\n+\n+\tfor (qid = 0; qid < nic_dev->num_rqs; qid++) {\n+\t\trxq = nic_dev->rxqs[qid];\n+\t\tmemset(&rxq->rxq_stats, 0, sizeof(struct spnic_rxq_stats));\n+\t}\n+\n+\tfor (qid = 0; qid < nic_dev->num_sqs; qid++) {\n+\t\ttxq = nic_dev->txqs[qid];\n+\t\tmemset(&txq->txq_stats, 0, sizeof(struct spnic_txq_stats));\n+\t}\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * Get device extended statistics.\n+ *\n+ * @param[in] dev\n+ *   Pointer to ethernet device structure.\n+ * @param[out] xstats\n+ *   Pointer to rte extended stats table.\n+ * @param[in] n\n+ *   The size of the stats table.\n+ *\n+ * @retval positive: Number of extended stats on success and stats is filled\n+ * @retval negative: Failure\n+ */\n+static int spnic_dev_xstats_get(struct rte_eth_dev *dev,\n+\t\t\t\tstruct rte_eth_xstat *xstats, unsigned int n)\n+{\n+\tstruct spnic_nic_dev *nic_dev;\n+\tstruct mag_phy_port_stats port_stats;\n+\tstruct spnic_vport_stats vport_stats;\n+\tstruct spnic_rxq *rxq = NULL;\n+\tstruct spnic_rxq_stats rxq_stats;\n+\tstruct spnic_txq *txq = NULL;\n+\tstruct spnic_txq_stats txq_stats;\n+\tu16 qid;\n+\tu32 i;\n+\tint err, count;\n+\n+\tnic_dev = SPNIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev);\n+\tcount = spnic_xstats_calc_num(nic_dev);\n+\tif ((int)n < count)\n+\t\treturn count;\n+\n+\tcount = 0;\n+\n+\t/* Get stats from rxq stats structure */\n+\tfor (qid = 0; qid < nic_dev->num_rqs; qid++) {\n+\t\trxq = nic_dev->rxqs[qid];\n+\t\tmemcpy(&rxq_stats, &rxq->rxq_stats, sizeof(rxq->rxq_stats));\n+\n+\t\tfor (i = 0; i < SPNIC_RXQ_XSTATS_NUM; i++) {\n+\t\t\txstats[count].value =\n+\t\t\t\t*(uint64_t *)(((char *)&rxq_stats) +\n+\t\t\t\tspnic_rxq_stats_strings[i].offset);\n+\t\t\txstats[count].id = count;\n+\t\t\tcount++;\n+\t\t}\n+\t}\n+\n+\t/* Get stats from txq stats structure */\n+\tfor (qid = 0; qid < nic_dev->num_sqs; qid++) {\n+\t\ttxq = nic_dev->txqs[qid];\n+\t\tmemcpy(&txq_stats, &txq->txq_stats, sizeof(txq->txq_stats));\n+\n+\t\tfor (i = 0; i < SPNIC_TXQ_XSTATS_NUM; i++) {\n+\t\t\txstats[count].value =\n+\t\t\t\t*(uint64_t *)(((char *)&txq_stats) +\n+\t\t\t\tspnic_txq_stats_strings[i].offset);\n+\t\t\txstats[count].id = count;\n+\t\t\tcount++;\n+\t\t}\n+\t}\n+\n+\t/* Get stats from vport stats structure */\n+\terr = spnic_get_vport_stats(nic_dev->hwdev, &vport_stats);\n+\tif (err)\n+\t\treturn err;\n+\n+\tfor (i = 0; i < SPNIC_VPORT_XSTATS_NUM; i++) {\n+\t\txstats[count].value =\n+\t\t\t*(uint64_t *)(((char *)&vport_stats) +\n+\t\t\tspnic_vport_stats_strings[i].offset);\n+\t\txstats[count].id = count;\n+\t\tcount++;\n+\t}\n+\n+\tif (SPNIC_IS_VF(nic_dev->hwdev))\n+\t\treturn count;\n+\n+\t/* Get stats from phy port stats structure */\n+\terr = spnic_get_phy_port_stats(nic_dev->hwdev, &port_stats);\n+\tif (err)\n+\t\treturn err;\n+\n+\tfor (i = 0; i < SPNIC_PHYPORT_XSTATS_NUM; i++) {\n+\t\txstats[count].value = *(uint64_t *)(((char *)&port_stats) +\n+\t\t\t\tspnic_phyport_stats_strings[i].offset);\n+\t\txstats[count].id = count;\n+\t\tcount++;\n+\t}\n+\n+\treturn count;\n+}\n+\n+/**\n+ * Clear device extended statistics.\n+ *\n+ * @param[in] dev\n+ *   Pointer to ethernet device structure.\n+ *\n+ * @retval zero: Success\n+ * @retval non-zero: Failure\n+ */\n+static int spnic_dev_xstats_reset(struct rte_eth_dev *dev)\n+{\n+\tstruct spnic_nic_dev *nic_dev = SPNIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev);\n+\tint err;\n+\n+\terr = spnic_dev_stats_reset(dev);\n+\tif (err)\n+\t\treturn err;\n+\n+\tif (spnic_func_type(nic_dev->hwdev) != TYPE_VF) {\n+\t\terr = spnic_clear_phy_port_stats(nic_dev->hwdev);\n+\t\tif (err)\n+\t\t\treturn err;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * Retrieve names of extended device statistics\n+ *\n+ * @param[in] dev\n+ *   Pointer to ethernet device structure.\n+ * @param[out] xstats_names\n+ *   Buffer to insert names into.\n+ *\n+ * @return\n+ *   Number of xstats names.\n+ */\n+static int spnic_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      __rte_unused unsigned int limit)\n+{\n+\tstruct spnic_nic_dev *nic_dev = SPNIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev);\n+\tint count = 0;\n+\tu16 i, q_num;\n+\n+\tif (xstats_names == NULL)\n+\t\treturn spnic_xstats_calc_num(nic_dev);\n+\n+\t/* Get pmd rxq stats name */\n+\tfor (q_num = 0; q_num < nic_dev->num_rqs; q_num++) {\n+\t\tfor (i = 0; i < SPNIC_RXQ_XSTATS_NUM; i++) {\n+\t\t\tsnprintf(xstats_names[count].name,\n+\t\t\t\t sizeof(xstats_names[count].name),\n+\t\t\t\t \"rxq%d_%s_pmd\", q_num,\n+\t\t\t\t spnic_rxq_stats_strings[i].name);\n+\t\t\tcount++;\n+\t\t}\n+\t}\n+\n+\t/* Get pmd txq stats name */\n+\tfor (q_num = 0; q_num < nic_dev->num_sqs; q_num++) {\n+\t\tfor (i = 0; i < SPNIC_TXQ_XSTATS_NUM; i++) {\n+\t\t\tsnprintf(xstats_names[count].name,\n+\t\t\t\t sizeof(xstats_names[count].name),\n+\t\t\t\t \"txq%d_%s_pmd\", q_num,\n+\t\t\t\t spnic_txq_stats_strings[i].name);\n+\t\t\tcount++;\n+\t\t}\n+\t}\n+\n+\t/* Get vport stats name */\n+\tfor (i = 0; i < SPNIC_VPORT_XSTATS_NUM; i++) {\n+\t\tsnprintf(xstats_names[count].name,\n+\t\t\t sizeof(xstats_names[count].name),\n+\t\t\t \"%s\", spnic_vport_stats_strings[i].name);\n+\t\tcount++;\n+\t}\n+\n+\tif (SPNIC_IS_VF(nic_dev->hwdev))\n+\t\treturn count;\n+\n+\t/* Get phy port stats name */\n+\tfor (i = 0; i < SPNIC_PHYPORT_XSTATS_NUM; i++) {\n+\t\tsnprintf(xstats_names[count].name,\n+\t\t\t sizeof(xstats_names[count].name),\n+\t\t\t \"%s\", spnic_phyport_stats_strings[i].name);\n+\t\tcount++;\n+\t}\n+\n+\treturn count;\n+}\n+\n static void spnic_rxq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,\n \t\t\t       struct rte_eth_rxq_info *rxq_info)\n {\n@@ -2082,6 +2546,11 @@ static const struct eth_dev_ops spnic_pmd_ops = {\n \t.rss_hash_conf_get             = spnic_rss_conf_get,\n \t.reta_update                   = spnic_rss_reta_update,\n \t.reta_query                    = spnic_rss_reta_query,\n+\t.stats_get                     = spnic_dev_stats_get,\n+\t.stats_reset                   = spnic_dev_stats_reset,\n+\t.xstats_get                    = spnic_dev_xstats_get,\n+\t.xstats_reset                  = spnic_dev_xstats_reset,\n+\t.xstats_get_names              = spnic_dev_xstats_get_names,\n \t.rxq_info_get                  = spnic_rxq_info_get,\n \t.txq_info_get                  = spnic_txq_info_get,\n \t.mac_addr_set                  = spnic_set_mac_addr,\n@@ -2111,6 +2580,11 @@ static const struct eth_dev_ops spnic_pmd_vf_ops = {\n \t.rss_hash_conf_get             = spnic_rss_conf_get,\n \t.reta_update                   = spnic_rss_reta_update,\n \t.reta_query                    = spnic_rss_reta_query,\n+\t.stats_get                     = spnic_dev_stats_get,\n+\t.stats_reset                   = spnic_dev_stats_reset,\n+\t.xstats_get                    = spnic_dev_xstats_get,\n+\t.xstats_reset                  = spnic_dev_xstats_reset,\n+\t.xstats_get_names              = spnic_dev_xstats_get_names,\n \t.rxq_info_get                  = spnic_rxq_info_get,\n \t.txq_info_get                  = spnic_txq_info_get,\n \t.mac_addr_set                  = spnic_set_mac_addr,\n",
    "prefixes": [
        "v1",
        "22/25"
    ]
}