get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 89375,
    "url": "https://patches.dpdk.org/api/patches/89375/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1615974620-50092-6-git-send-email-humin29@huawei.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": "<1615974620-50092-6-git-send-email-humin29@huawei.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1615974620-50092-6-git-send-email-humin29@huawei.com",
    "date": "2021-03-17T09:50:17",
    "name": "[v4,5/8] net/hns3: support imissed stats for PF/VF",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "f005e31061d5d523bff187953dab55b639ac5f58",
    "submitter": {
        "id": 1944,
        "url": "https://patches.dpdk.org/api/people/1944/?format=api",
        "name": "humin (Q)",
        "email": "humin29@huawei.com"
    },
    "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/1615974620-50092-6-git-send-email-humin29@huawei.com/mbox/",
    "series": [
        {
            "id": 15737,
            "url": "https://patches.dpdk.org/api/series/15737/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=15737",
            "date": "2021-03-17T09:50:12",
            "name": "features and bugfixes for hns3",
            "version": 4,
            "mbox": "https://patches.dpdk.org/series/15737/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/89375/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/89375/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 46726A00C2;\n\tWed, 17 Mar 2021 10:49:53 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id C78B1140F25;\n\tWed, 17 Mar 2021 10:49:49 +0100 (CET)",
            "from szxga05-in.huawei.com (szxga05-in.huawei.com [45.249.212.191])\n by mails.dpdk.org (Postfix) with ESMTP id 4C681140EE3\n for <dev@dpdk.org>; Wed, 17 Mar 2021 10:49:47 +0100 (CET)",
            "from DGGEMS403-HUB.china.huawei.com (unknown [172.30.72.59])\n by szxga05-in.huawei.com (SkyGuard) with ESMTP id 4F0lh86WkqzrXp8\n for <dev@dpdk.org>; Wed, 17 Mar 2021 17:47:52 +0800 (CST)",
            "from localhost.localdomain (10.69.192.56) by\n DGGEMS403-HUB.china.huawei.com (10.3.19.203) with Microsoft SMTP Server id\n 14.3.498.0; Wed, 17 Mar 2021 17:49:44 +0800"
        ],
        "From": "\"Min Hu (Connor)\" <humin29@huawei.com>",
        "To": "<dev@dpdk.org>",
        "CC": "<ferruh.yigit@intel.com>",
        "Date": "Wed, 17 Mar 2021 17:50:17 +0800",
        "Message-ID": "<1615974620-50092-6-git-send-email-humin29@huawei.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-Reply-To": "<1615974620-50092-1-git-send-email-humin29@huawei.com>",
        "References": "<1615357493-42394-1-git-send-email-humin29@huawei.com>\n <1615974620-50092-1-git-send-email-humin29@huawei.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[10.69.192.56]",
        "X-CFilter-Loop": "Reflected",
        "Subject": "[dpdk-dev] [PATCH v4 5/8] net/hns3: support imissed stats for PF/VF",
        "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": "This patch added function level imissed stats for PF and VF. In kunpeng920,\nimissed is supported, only including RPU drop stats in PF. In kunpeng930,\nimissed is supported,including RPU drop stats and SSU drop stats in PF.\n\nSigned-off-by: Min Hu (Connor) <humin29@huawei.com>\n---\n drivers/net/hns3/hns3_cmd.h       |  13 +++\n drivers/net/hns3/hns3_ethdev.c    |   2 +\n drivers/net/hns3/hns3_ethdev.h    |  21 ++++\n drivers/net/hns3/hns3_ethdev_vf.c |   9 ++\n drivers/net/hns3/hns3_regs.h      |   2 +\n drivers/net/hns3/hns3_stats.c     | 234 +++++++++++++++++++++++++++++---------\n drivers/net/hns3/hns3_stats.h     |   1 +\n 7 files changed, 230 insertions(+), 52 deletions(-)",
    "diff": "diff --git a/drivers/net/hns3/hns3_cmd.h b/drivers/net/hns3/hns3_cmd.h\nindex 094bf7e..4126574 100644\n--- a/drivers/net/hns3/hns3_cmd.h\n+++ b/drivers/net/hns3/hns3_cmd.h\n@@ -111,6 +111,8 @@ enum hns3_opcode_type {\n \n \tHNS3_OPC_QUERY_DEV_SPECS        = 0x0050,\n \n+\tHNS3_OPC_SSU_DROP_REG           = 0x0065,\n+\n \t/* MAC command */\n \tHNS3_OPC_CONFIG_MAC_MODE        = 0x0301,\n \tHNS3_OPC_QUERY_LINK_STATUS      = 0x0307,\n@@ -957,6 +959,17 @@ struct hns3_query_rpu_cmd {\n \tuint32_t rsv2[2];\n };\n \n+#define HNS3_OPC_SSU_DROP_REG_NUM 2\n+\n+struct hns3_query_ssu_cmd {\n+\tuint8_t rxtx;\n+\tuint8_t rsv[3];\n+\tuint32_t full_drop_cnt;\n+\tuint32_t part_drop_cnt;\n+\tuint32_t oq_glb_drop_cnt;\n+\tuint32_t rev1[2];\n+};\n+\n #define HNS3_MAX_TQP_NUM_HIP08_PF\t64\n #define HNS3_DEFAULT_TX_BUF\t\t0x4000    /* 16k  bytes */\n #define HNS3_TOTAL_PKT_BUF\t\t0x108000  /* 1.03125M bytes */\ndiff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c\nindex 139e893..82538d4 100644\n--- a/drivers/net/hns3/hns3_ethdev.c\n+++ b/drivers/net/hns3/hns3_ethdev.c\n@@ -3122,6 +3122,7 @@ hns3_get_capability(struct hns3_hw *hw)\n \t\thw->intr.gl_unit = HNS3_INTR_COALESCE_GL_UINT_2US;\n \t\thw->tso_mode = HNS3_TSO_SW_CAL_PSEUDO_H_CSUM;\n \t\thw->vlan_mode = HNS3_SW_SHIFT_AND_DISCARD_MODE;\n+\t\thw->drop_stats_mode = HNS3_PKTS_DROP_STATS_MODE1;\n \t\thw->min_tx_pkt_len = HNS3_HIP08_MIN_TX_PKT_LEN;\n \t\tpf->tqp_config_mode = HNS3_FIXED_MAX_TQP_NUM_MODE;\n \t\thw->rss_info.ipv6_sctp_offload_supported = false;\n@@ -3140,6 +3141,7 @@ hns3_get_capability(struct hns3_hw *hw)\n \thw->intr.gl_unit = HNS3_INTR_COALESCE_GL_UINT_1US;\n \thw->tso_mode = HNS3_TSO_HW_CAL_PSEUDO_H_CSUM;\n \thw->vlan_mode = HNS3_HW_SHIFT_AND_DISCARD_MODE;\n+\thw->drop_stats_mode = HNS3_PKTS_DROP_STATS_MODE2;\n \thw->min_tx_pkt_len = HNS3_HIP09_MIN_TX_PKT_LEN;\n \tpf->tqp_config_mode = HNS3_FLEX_MAX_TQP_NUM_MODE;\n \thw->rss_info.ipv6_sctp_offload_supported = true;\ndiff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h\nindex 314916c..6e74ec8 100644\n--- a/drivers/net/hns3/hns3_ethdev.h\n+++ b/drivers/net/hns3/hns3_ethdev.h\n@@ -426,6 +426,9 @@ struct hns3_queue_intr {\n #define HNS3_TSO_SW_CAL_PSEUDO_H_CSUM\t\t0\n #define HNS3_TSO_HW_CAL_PSEUDO_H_CSUM\t\t1\n \n+#define HNS3_PKTS_DROP_STATS_MODE1\t\t0\n+#define HNS3_PKTS_DROP_STATS_MODE2\t\t1\n+\n struct hns3_hw {\n \tstruct rte_eth_dev_data *data;\n \tvoid *io_base;\n@@ -544,6 +547,24 @@ struct hns3_hw {\n \t *     port won't be copied to the function which has set promisc mode.\n \t */\n \tuint8_t promisc_mode;\n+\n+\t/*\n+\t * drop_stats_mode mode.\n+\t * value range:\n+\t *      HNS3_PKTS_DROP_STATS_MODE1/HNS3_PKTS_DROP_STATS_MODE2\n+\t *\n+\t *  - HNS3_PKTS_DROP_STATS_MODE1\n+\t *     This mode for kunpeng920. In this mode, port level imissed stats\n+\t *     is supported. It only includes RPU drop stats.\n+\t *\n+\t *  - HNS3_PKTS_DROP_STATS_MODE2\n+\t *     This mode for kunpeng930. In this mode, imissed stats and oerrors\n+\t *     stats is supported. Function level imissed stats is supported. It\n+\t *     includes RPU drop stats in VF, and includes both RPU drop stats\n+\t *     and SSU drop stats in PF. Oerror stats is also supported in PF.\n+\t */\n+\tuint8_t drop_stats_mode;\n+\n \tuint8_t max_non_tso_bd_num; /* max BD number of one non-TSO packet */\n \n \tstruct hns3_port_base_vlan_config port_base_vlan_cfg;\ndiff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c\nindex e1e41b8..7ee468f 100644\n--- a/drivers/net/hns3/hns3_ethdev_vf.c\n+++ b/drivers/net/hns3/hns3_ethdev_vf.c\n@@ -1221,6 +1221,7 @@ hns3vf_get_capability(struct hns3_hw *hw)\n \t\thw->intr.mapping_mode = HNS3_INTR_MAPPING_VEC_RSV_ONE;\n \t\thw->intr.gl_unit = HNS3_INTR_COALESCE_GL_UINT_2US;\n \t\thw->tso_mode = HNS3_TSO_SW_CAL_PSEUDO_H_CSUM;\n+\t\thw->drop_stats_mode = HNS3_PKTS_DROP_STATS_MODE1;\n \t\thw->min_tx_pkt_len = HNS3_HIP08_MIN_TX_PKT_LEN;\n \t\thw->rss_info.ipv6_sctp_offload_supported = false;\n \t\thw->promisc_mode = HNS3_UNLIMIT_PROMISC_MODE;\n@@ -1238,6 +1239,7 @@ hns3vf_get_capability(struct hns3_hw *hw)\n \thw->intr.mapping_mode = HNS3_INTR_MAPPING_VEC_ALL;\n \thw->intr.gl_unit = HNS3_INTR_COALESCE_GL_UINT_1US;\n \thw->tso_mode = HNS3_TSO_HW_CAL_PSEUDO_H_CSUM;\n+\thw->drop_stats_mode = HNS3_PKTS_DROP_STATS_MODE2;\n \thw->min_tx_pkt_len = HNS3_HIP09_MIN_TX_PKT_LEN;\n \thw->rss_info.ipv6_sctp_offload_supported = true;\n \thw->promisc_mode = HNS3_LIMIT_PROMISC_MODE;\n@@ -1875,6 +1877,13 @@ hns3vf_init_vf(struct rte_eth_dev *eth_dev)\n \tif (ret)\n \t\tgoto err_get_config;\n \n+\t/* Hardware statistics of imissed registers cleared. */\n+\tret = hns3_update_imissed_stats(hw, true);\n+\tif (ret) {\n+\t\thns3_err(hw, \"clear imissed stats failed, ret = %d\", ret);\n+\t\tgoto err_set_tc_queue;\n+\t}\n+\n \tret = hns3vf_set_tc_queue_mapping(hns, hw->tqps_num, hw->tqps_num);\n \tif (ret) {\n \t\tPMD_INIT_LOG(ERR, \"failed to set tc info, ret = %d.\", ret);\ndiff --git a/drivers/net/hns3/hns3_regs.h b/drivers/net/hns3/hns3_regs.h\nindex 0540554..e141fe1 100644\n--- a/drivers/net/hns3/hns3_regs.h\n+++ b/drivers/net/hns3/hns3_regs.h\n@@ -36,6 +36,8 @@\n #define HNS3_GLOBAL_RESET_REG\t\t0x20A00\n #define HNS3_FUN_RST_ING\t\t0x20C00\n #define HNS3_GRO_EN_REG\t\t\t0x28000\n+\n+#define HNS3_RPU_DROP_CNT_REG\t\t0x28004\n #define HNS3_RXD_ADV_LAYOUT_EN_REG\t0x28008\n \n /* Vector0 register bits for reset */\ndiff --git a/drivers/net/hns3/hns3_stats.c b/drivers/net/hns3/hns3_stats.c\nindex 7cda36c..76df847 100644\n--- a/drivers/net/hns3/hns3_stats.c\n+++ b/drivers/net/hns3/hns3_stats.c\n@@ -269,6 +269,8 @@ static const struct hns3_xstats_name_offset hns3_tx_queue_strings[] = {\n static const struct hns3_xstats_name_offset hns3_imissed_stats_strings[] = {\n \t{\"RPU_DROP_CNT\",\n \t\tHNS3_IMISSED_STATS_FIELD_OFFSET(rpu_rx_drop_cnt)},\n+\t{\"SSU_DROP_CNT\",\n+\t\tHNS3_IMISSED_STATS_FIELD_OFFSET(ssu_rx_drop_cnt)},\n };\n \n #define HNS3_NUM_MAC_STATS (sizeof(hns3_mac_strings) / \\\n@@ -301,8 +303,7 @@ static const struct hns3_xstats_name_offset hns3_imissed_stats_strings[] = {\n #define HNS3_NUM_IMISSED_XSTATS (sizeof(hns3_imissed_stats_strings) / \\\n \tsizeof(hns3_imissed_stats_strings[0]))\n \n-#define HNS3_FIX_NUM_STATS (HNS3_NUM_MAC_STATS + \\\n-\t\t\t    HNS3_NUM_RESET_XSTATS + HNS3_NUM_IMISSED_XSTATS)\n+#define HNS3_FIX_NUM_STATS (HNS3_NUM_MAC_STATS + HNS3_NUM_RESET_XSTATS)\n \n static void hns3_tqp_stats_clear(struct hns3_hw *hw);\n \n@@ -419,7 +420,7 @@ hns3_query_update_mac_stats(struct rte_eth_dev *dev)\n }\n \n static int\n-hns3_update_rpu_drop_stats(struct hns3_hw *hw)\n+hns3_update_port_rpu_drop_stats(struct hns3_hw *hw)\n {\n \tstruct hns3_rx_missed_stats *stats = &hw->imissed_stats;\n \tstruct hns3_query_rpu_cmd *req;\n@@ -449,11 +450,90 @@ hns3_update_rpu_drop_stats(struct hns3_hw *hw)\n \treturn 0;\n }\n \n+static void\n+hns3_update_function_rpu_drop_stats(struct hns3_hw *hw)\n+{\n+\tstruct hns3_rx_missed_stats *stats = &hw->imissed_stats;\n+\n+\tstats->rpu_rx_drop_cnt += hns3_read_dev(hw, HNS3_RPU_DROP_CNT_REG);\n+}\n+\n+static int\n+hns3_update_rpu_drop_stats(struct hns3_hw *hw)\n+{\n+\tstruct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw);\n+\tint ret = 0;\n+\n+\tif (hw->drop_stats_mode == HNS3_PKTS_DROP_STATS_MODE1 && !hns->is_vf)\n+\t\tret = hns3_update_port_rpu_drop_stats(hw);\n+\telse if (hw->drop_stats_mode == HNS3_PKTS_DROP_STATS_MODE2)\n+\t\thns3_update_function_rpu_drop_stats(hw);\n+\n+\treturn ret;\n+}\n+\n+static int\n+hns3_get_ssu_drop_stats(struct hns3_hw *hw, struct hns3_cmd_desc *desc,\n+\t\t\tint bd_num, bool is_rx)\n+{\n+\tstruct hns3_query_ssu_cmd *req;\n+\tint ret;\n+\tint i;\n+\n+\tfor (i = 0; i < bd_num - 1; i++) {\n+\t\thns3_cmd_setup_basic_desc(&desc[i],\n+\t\t\t\t\t  HNS3_OPC_SSU_DROP_REG, true);\n+\t\tdesc[i].flag |= rte_cpu_to_le_16(HNS3_CMD_FLAG_NEXT);\n+\t}\n+\thns3_cmd_setup_basic_desc(&desc[i], HNS3_OPC_SSU_DROP_REG, true);\n+\treq = (struct hns3_query_ssu_cmd *)desc[0].data;\n+\treq->rxtx = is_rx ? 0 : 1;\n+\tret = hns3_cmd_send(hw, desc, bd_num);\n+\n+\treturn ret;\n+}\n+\n+static int\n+hns3_update_port_rx_ssu_drop_stats(struct hns3_hw *hw)\n+{\n+\tstruct hns3_rx_missed_stats *stats = &hw->imissed_stats;\n+\tstruct hns3_cmd_desc desc[HNS3_OPC_SSU_DROP_REG_NUM];\n+\tstruct hns3_query_ssu_cmd *req;\n+\tuint64_t cnt;\n+\tint ret;\n+\n+\tret = hns3_get_ssu_drop_stats(hw, desc, HNS3_OPC_SSU_DROP_REG_NUM,\n+\t\t\t\t      true);\n+\tif (ret) {\n+\t\thns3_err(hw, \"failed to get Rx SSU drop stats, ret = %d\", ret);\n+\t\treturn ret;\n+\t}\n+\n+\treq = (struct hns3_query_ssu_cmd *)desc[0].data;\n+\tcnt = rte_le_to_cpu_32(req->oq_glb_drop_cnt) +\n+\t\trte_le_to_cpu_32(req->full_drop_cnt) +\n+\t\trte_le_to_cpu_32(req->part_drop_cnt);\n+\n+\tstats->ssu_rx_drop_cnt += cnt;\n+\n+\treturn 0;\n+}\n+\n int\n hns3_update_imissed_stats(struct hns3_hw *hw, bool is_clear)\n {\n+\tstruct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw);\n \tint ret;\n \n+\tif (hw->drop_stats_mode == HNS3_PKTS_DROP_STATS_MODE1 && hns->is_vf)\n+\t\treturn 0;\n+\n+\tif (hw->drop_stats_mode == HNS3_PKTS_DROP_STATS_MODE2 && !hns->is_vf) {\n+\t\tret = hns3_update_port_rx_ssu_drop_stats(hw);\n+\t\tif (ret)\n+\t\t\treturn ret;\n+\t}\n+\n \tret = hns3_update_rpu_drop_stats(hw);\n \tif (ret)\n \t\treturn ret;\n@@ -488,19 +568,17 @@ hns3_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *rte_stats)\n \tuint16_t i;\n \tint ret;\n \n-\tif (!hns->is_vf) {\n-\t\t/* Update imissed stats */\n-\t\tret = hns3_update_imissed_stats(hw, false);\n-\t\tif (ret) {\n-\t\t\thns3_err(hw, \"update imissed stats failed, ret = %d\",\n-\t\t\t\t ret);\n-\t\t\treturn ret;\n-\t\t}\n-\n-\t\trte_stats->imissed = imissed_stats->rpu_rx_drop_cnt;\n+\t/* Update imissed stats */\n+\tret = hns3_update_imissed_stats(hw, false);\n+\tif (ret) {\n+\t\thns3_err(hw, \"update imissed stats failed, ret = %d\",\n+\t\t\t ret);\n+\t\treturn ret;\n \t}\n+\trte_stats->imissed = imissed_stats->rpu_rx_drop_cnt +\n+\t\t\t\timissed_stats->ssu_rx_drop_cnt;\n \n-\t/* Reads all the stats of a rxq in a loop to keep them synchronized */\n+\t/* Get the error stats and bytes of received packets */\n \tfor (i = 0; i < eth_dev->data->nb_rx_queues; i++) {\n \t\trxq = eth_dev->data->rx_queues[i];\n \t\tif (rxq == NULL)\n@@ -556,17 +634,14 @@ hns3_stats_reset(struct rte_eth_dev *eth_dev)\n \tuint16_t i;\n \tint ret;\n \n-\tif (!hns->is_vf) {\n-\t\t/*\n-\t\t * Note: Reading hardware statistics of imissed registers will\n-\t\t * clear them.\n-\t\t */\n-\t\tret = hns3_update_imissed_stats(hw, true);\n-\t\tif (ret) {\n-\t\t\thns3_err(hw, \"clear imissed stats failed, ret = %d\",\n-\t\t\t\t ret);\n-\t\t\treturn ret;\n-\t\t}\n+\t/*\n+\t * Note: Reading hardware statistics of imissed registers will\n+\t * clear them.\n+\t */\n+\tret = hns3_update_imissed_stats(hw, true);\n+\tif (ret) {\n+\t\thns3_err(hw, \"clear imissed stats failed, ret = %d\", ret);\n+\t\treturn ret;\n \t}\n \n \tfor (i = 0; i < eth_dev->data->nb_rx_queues; i++) {\n@@ -630,6 +705,22 @@ hns3_mac_stats_reset(__rte_unused struct rte_eth_dev *dev)\n \treturn 0;\n }\n \n+static int\n+hns3_get_imissed_stats_num(struct hns3_adapter *hns)\n+{\n+#define NO_IMISSED_STATS_NUM   0\n+#define RPU_STATS_ITEM_NUM     1\n+\tstruct hns3_hw *hw = &hns->hw;\n+\n+\tif (hw->drop_stats_mode == HNS3_PKTS_DROP_STATS_MODE1 && hns->is_vf)\n+\t\treturn NO_IMISSED_STATS_NUM;\n+\n+\tif (hw->drop_stats_mode == HNS3_PKTS_DROP_STATS_MODE2 && !hns->is_vf)\n+\t\treturn HNS3_NUM_IMISSED_XSTATS;\n+\n+\treturn RPU_STATS_ITEM_NUM;\n+}\n+\n /* This function calculates the number of xstats based on the current config */\n static int\n hns3_xstats_calc_num(struct rte_eth_dev *dev)\n@@ -647,13 +738,17 @@ hns3_xstats_calc_num(struct rte_eth_dev *dev)\n \tuint16_t nb_tx_q = dev->data->nb_tx_queues;\n \tint rx_comm_stats_num = nb_rx_q * HNS3_PF_VF_RX_COMM_STATS_NUM;\n \tint tx_comm_stats_num = nb_tx_q * HNS3_PF_VF_TX_COMM_STATS_NUM;\n+\tint stats_num;\n+\n+\tstats_num = rx_comm_stats_num + tx_comm_stats_num;\n+\tstats_num += hns3_get_imissed_stats_num(hns);\n \n \tif (hns->is_vf)\n-\t\treturn rx_comm_stats_num + tx_comm_stats_num +\n-\t\t\tHNS3_NUM_RESET_XSTATS;\n+\t\tstats_num += HNS3_NUM_RESET_XSTATS;\n \telse\n-\t\treturn rx_comm_stats_num + tx_comm_stats_num +\n-\t\t\tHNS3_FIX_NUM_STATS;\n+\t\tstats_num += HNS3_FIX_NUM_STATS;\n+\n+\treturn stats_num;\n }\n \n static void\n@@ -835,6 +930,31 @@ hns3_tqp_basic_stats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,\n \thns3_txq_basic_stats_get(dev, xstats, count);\n }\n \n+static void\n+hns3_imissed_stats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,\n+\t\t\t  int *count)\n+{\n+\tstruct hns3_adapter *hns = dev->data->dev_private;\n+\tstruct hns3_hw *hw = &hns->hw;\n+\tstruct hns3_rx_missed_stats *imissed_stats = &hw->imissed_stats;\n+\tint imissed_stats_num;\n+\tint cnt = *count;\n+\tchar *addr;\n+\tuint16_t i;\n+\n+\timissed_stats_num = hns3_get_imissed_stats_num(hns);\n+\n+\tfor (i = 0; i < imissed_stats_num; i++) {\n+\t\taddr = (char *)imissed_stats +\n+\t\t\thns3_imissed_stats_strings[i].offset;\n+\t\txstats[cnt].value = *(uint64_t *)addr;\n+\t\txstats[cnt].id = cnt;\n+\t\tcnt++;\n+\t}\n+\n+\t*count = cnt;\n+}\n+\n /*\n  * Retrieve extended(tqp | Mac) statistics of an Ethernet device.\n  * @param dev\n@@ -854,7 +974,6 @@ hns3_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,\n {\n \tstruct hns3_adapter *hns = dev->data->dev_private;\n \tstruct hns3_hw *hw = &hns->hw;\n-\tstruct hns3_rx_missed_stats *imissed_stats = &hw->imissed_stats;\n \tstruct hns3_mac_stats *mac_stats = &hw->mac_stats;\n \tstruct hns3_reset_stats *reset_stats = &hw->reset.stats;\n \tstruct hns3_rx_bd_errors_stats *rx_err_stats;\n@@ -890,24 +1009,17 @@ hns3_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,\n \t\t\txstats[count].id = count;\n \t\t\tcount++;\n \t\t}\n+\t}\n \n-\t\tret = hns3_update_imissed_stats(hw, false);\n-\t\tif (ret) {\n-\t\t\thns3_err(hw, \"update imissed stats failed, ret = %d\",\n-\t\t\t\t ret);\n-\t\t\treturn ret;\n-\t\t}\n-\n-\t\tfor (i = 0; i < HNS3_NUM_IMISSED_XSTATS; i++) {\n-\t\t\taddr = (char *)imissed_stats +\n-\t\t\t\thns3_imissed_stats_strings[i].offset;\n-\t\t\txstats[count].value = *(uint64_t *)addr;\n-\t\t\txstats[count].id = count;\n-\t\t\tcount++;\n-\t\t}\n-\n+\tret = hns3_update_imissed_stats(hw, false);\n+\tif (ret) {\n+\t\thns3_err(hw, \"update imissed stats failed, ret = %d\",\n+\t\t\t ret);\n+\t\treturn ret;\n \t}\n \n+\thns3_imissed_stats_get(dev, xstats, &count);\n+\n \t/* Get the reset stat */\n \tfor (i = 0; i < HNS3_NUM_RESET_XSTATS; i++) {\n \t\taddr = (char *)reset_stats + hns3_reset_stats_strings[i].offset;\n@@ -992,6 +1104,28 @@ hns3_tqp_dfx_stats_name_get(struct rte_eth_dev *dev,\n \t}\n }\n \n+static void\n+hns3_imissed_stats_name_get(struct rte_eth_dev *dev,\n+\t\t\t    struct rte_eth_xstat_name *xstats_names,\n+\t\t\t    uint32_t *count)\n+{\n+\tstruct hns3_adapter *hns = dev->data->dev_private;\n+\tuint32_t cnt = *count;\n+\tint imissed_stats_num;\n+\tuint16_t i;\n+\n+\timissed_stats_num = hns3_get_imissed_stats_num(hns);\n+\n+\tfor (i = 0; i < imissed_stats_num; i++) {\n+\t\tsnprintf(xstats_names[cnt].name,\n+\t\t\t sizeof(xstats_names[cnt].name),\n+\t\t\t \"%s\", hns3_imissed_stats_strings[i].name);\n+\t\tcnt++;\n+\t}\n+\n+\t*count = cnt;\n+}\n+\n /*\n  * Retrieve names of extended statistics of an Ethernet device.\n  *\n@@ -1040,14 +1174,10 @@ hns3_dev_xstats_get_names(struct rte_eth_dev *dev,\n \t\t\t\t \"%s\", hns3_mac_strings[i].name);\n \t\t\tcount++;\n \t\t}\n-\n-\t\tfor (i = 0; i < HNS3_NUM_IMISSED_XSTATS; i++) {\n-\t\t\tsnprintf(xstats_names[count].name,\n-\t\t\t\t sizeof(xstats_names[count].name),\n-\t\t\t\t \"%s\", hns3_imissed_stats_strings[i].name);\n-\t\t\tcount++;\n-\t\t}\n \t}\n+\n+\thns3_imissed_stats_name_get(dev, xstats_names, &count);\n+\n \tfor (i = 0; i < HNS3_NUM_RESET_XSTATS; i++) {\n \t\tsnprintf(xstats_names[count].name,\n \t\t\t sizeof(xstats_names[count].name),\ndiff --git a/drivers/net/hns3/hns3_stats.h b/drivers/net/hns3/hns3_stats.h\nindex 8ea69b4..273be42 100644\n--- a/drivers/net/hns3/hns3_stats.h\n+++ b/drivers/net/hns3/hns3_stats.h\n@@ -112,6 +112,7 @@ struct hns3_mac_stats {\n \n struct hns3_rx_missed_stats {\n \tuint64_t rpu_rx_drop_cnt;\n+\tuint64_t ssu_rx_drop_cnt;\n };\n \n /* store statistics names and its offset in stats structure */\n",
    "prefixes": [
        "v4",
        "5/8"
    ]
}