get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 135546,
    "url": "https://patches.dpdk.org/api/patches/135546/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20231222215659.64993-17-ajit.khaparde@broadcom.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": "<20231222215659.64993-17-ajit.khaparde@broadcom.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20231222215659.64993-17-ajit.khaparde@broadcom.com",
    "date": "2023-12-22T21:56:57",
    "name": "[v2,16/18] net/bnxt: query extended stats from firmware",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "09da4a30f6f8fd24691f9423a5b0402f50b98868",
    "submitter": {
        "id": 501,
        "url": "https://patches.dpdk.org/api/people/501/?format=api",
        "name": "Ajit Khaparde",
        "email": "ajit.khaparde@broadcom.com"
    },
    "delegate": {
        "id": 1766,
        "url": "https://patches.dpdk.org/api/users/1766/?format=api",
        "username": "ajitkhaparde",
        "first_name": "Ajit",
        "last_name": "Khaparde",
        "email": "ajit.khaparde@broadcom.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20231222215659.64993-17-ajit.khaparde@broadcom.com/mbox/",
    "series": [
        {
            "id": 30663,
            "url": "https://patches.dpdk.org/api/series/30663/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=30663",
            "date": "2023-12-22T21:56:41",
            "name": "bnxt patchset",
            "version": 2,
            "mbox": "https://patches.dpdk.org/series/30663/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/135546/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/135546/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 78B6743762;\n\tFri, 22 Dec 2023 22:59:13 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 2D0B242ED3;\n\tFri, 22 Dec 2023 22:57:31 +0100 (CET)",
            "from mail-pj1-f47.google.com (mail-pj1-f47.google.com\n [209.85.216.47]) by mails.dpdk.org (Postfix) with ESMTP id 1C90A42EBF\n for <dev@dpdk.org>; Fri, 22 Dec 2023 22:57:29 +0100 (CET)",
            "by mail-pj1-f47.google.com with SMTP id\n 98e67ed59e1d1-28c0df4b42eso625124a91.1\n for <dev@dpdk.org>; Fri, 22 Dec 2023 13:57:29 -0800 (PST)",
            "from C02GC2QQMD6T.wifi.broadcom.net ([192.19.223.252])\n by smtp.gmail.com with ESMTPSA id\n sr5-20020a17090b4e8500b0028afd8b1e0bsm3540700pjb.57.2023.12.22.13.57.26\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Fri, 22 Dec 2023 13:57:26 -0800 (PST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=broadcom.com; s=google; t=1703282248; x=1703887048; darn=dpdk.org;\n h=mime-version:references:in-reply-to:message-id:date:subject:cc:to\n :from:from:to:cc:subject:date:message-id:reply-to;\n bh=Ycj0EsofbJQjIICVT7x2m7X1sI2SMZsR1m64F34VSZc=;\n b=VtSKF3FD4QjPfKFYaHTN1h1lUc2IiwJK9U08/ieDPIFK7yH4gkrAWxtvmkfYZjmIjl\n fBRK/MMCkauKKqggR2fLIMAN7tN7TUroLQYTilB0ieuaK2G9Vr27DXyh2pG4oEZswCDQ\n CXQrhpsxH8ev2IYTygKiaR/Mc6ABcx2gIZuc4=",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20230601; t=1703282248; x=1703887048;\n h=mime-version:references:in-reply-to:message-id:date:subject:cc:to\n :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;\n bh=Ycj0EsofbJQjIICVT7x2m7X1sI2SMZsR1m64F34VSZc=;\n b=dp5PLkSfRoz5eupUpc/i+qDR2WLRvK9Pk5nGv4Zmap9ERIpD8PoxxZLCfVfu8dns/b\n PFFPgWEo7en18hL4eqRAPCJFCNGpqYS4X9SNElGN0YmUNUhAAkumDN5CnmSD0iBOxUyf\n 8tGnNqJqQRgv/hOXxMQFdnPasRF6SdpfYW/AtomM31lshlKJvSYYLzTjMI+BmNqL/FRW\n IDTr6aA3SReVHMRFVluBTbihNX5EHUJT+N4eIo3XR+L82ogIE1L3P6pY4RUvN4Y2u6EV\n kcE577dmI3xJuzVocSUwva3mkV40c1jlJGo58ATuGX7E9w0x9fywbU6blfMCPA060wV0\n 7IPg==",
        "X-Gm-Message-State": "AOJu0YxnTEXdDSyMsDV9olpcfomFkyjeITgeGLGMjgW7GbSekWkRi9FW\n D+7wKeDI9UYJclmUkOFTi3xcojvSo1xbr0MwIeT7Tz19POXrlVEl/YZa2mb8wyoX0Z8FfoTG9yD\n GcdDLSEnDOYWK7O7jBulJOF/AczOKva1sa7l6zHLIBkaEGuZh6IRi+J4HG+siQO28KlEBLVxFHQ\n 0=",
        "X-Google-Smtp-Source": "\n AGHT+IH2WqJZrxhk4aADxRqnOSiamEXgV25QU3jsdkf5+uJumPEsOfQUuPa6niEU1+0/EtiJbFUBGQ==",
        "X-Received": "by 2002:a17:90b:19c1:b0:28b:c0f8:5c63 with SMTP id\n nm1-20020a17090b19c100b0028bc0f85c63mr2275609pjb.6.1703282247599;\n Fri, 22 Dec 2023 13:57:27 -0800 (PST)",
        "From": "Ajit Khaparde <ajit.khaparde@broadcom.com>",
        "To": "dev@dpdk.org",
        "Cc": "Damodharam Ammepalli <damodharam.ammepalli@broadcom.com>",
        "Subject": "[PATCH v2 16/18] net/bnxt: query extended stats from firmware",
        "Date": "Fri, 22 Dec 2023 13:56:57 -0800",
        "Message-Id": "<20231222215659.64993-17-ajit.khaparde@broadcom.com>",
        "X-Mailer": "git-send-email 2.39.2 (Apple Git-143)",
        "In-Reply-To": "<20231222215659.64993-1-ajit.khaparde@broadcom.com>",
        "References": "<20231222215659.64993-1-ajit.khaparde@broadcom.com>",
        "MIME-Version": "1.0",
        "Content-Type": "multipart/signed; protocol=\"application/pkcs7-signature\";\n micalg=sha-256; boundary=\"0000000000005dddfd060d204d5b\"",
        "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": "From: Damodharam Ammepalli <damodharam.ammepalli@broadcom.com>\n\nAdd the driver support for HWRM_STAT_EXT_CTX_QUERY HWRM\nmsg. In this patch only P7 chipset is enabled for this HWRM\nwhile P5 and previous generation remain with HWRM_STAT_CTX_QUERY.\n\nSigned-off-by: Damodharam Ammepalli <damodharam.ammepalli@broadcom.com>\nReviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>\n---\n drivers/net/bnxt/bnxt.h        |  49 ++++++\n drivers/net/bnxt/bnxt_cpr.h    |   3 +-\n drivers/net/bnxt/bnxt_ethdev.c |  36 ++++-\n drivers/net/bnxt/bnxt_hwrm.c   | 117 ++++++++++++++\n drivers/net/bnxt/bnxt_hwrm.h   |  12 +-\n drivers/net/bnxt/bnxt_ring.c   |   6 +-\n drivers/net/bnxt/bnxt_rxq.c    |   8 +-\n drivers/net/bnxt/bnxt_stats.c  | 279 ++++++++++++++++++++++++++++++---\n 8 files changed, 483 insertions(+), 27 deletions(-)",
    "diff": "diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h\nindex 858689533b..d91f0e427d 100644\n--- a/drivers/net/bnxt/bnxt.h\n+++ b/drivers/net/bnxt/bnxt.h\n@@ -705,6 +705,53 @@ struct bnxt_ring_stats {\n \tuint64_t\trx_agg_aborts;\n };\n \n+struct bnxt_ring_stats_ext {\n+\t/* Number of received unicast packets */\n+\tuint64_t        rx_ucast_pkts;\n+\t/* Number of received multicast packets */\n+\tuint64_t        rx_mcast_pkts;\n+\t/* Number of received broadcast packets */\n+\tuint64_t        rx_bcast_pkts;\n+\t/* Number of discarded packets on receive path */\n+\tuint64_t        rx_discard_pkts;\n+\t/* Number of packets on receive path with error */\n+\tuint64_t        rx_error_pkts;\n+\t/* Number of received bytes for unicast traffic */\n+\tuint64_t        rx_ucast_bytes;\n+\t/* Number of received bytes for multicast traffic */\n+\tuint64_t        rx_mcast_bytes;\n+\t/* Number of received bytes for broadcast traffic */\n+\tuint64_t        rx_bcast_bytes;\n+\t/* Number of transmitted unicast packets */\n+\tuint64_t        tx_ucast_pkts;\n+\t/* Number of transmitted multicast packets */\n+\tuint64_t        tx_mcast_pkts;\n+\t/* Number of transmitted broadcast packets */\n+\tuint64_t        tx_bcast_pkts;\n+\t/* Number of packets on transmit path with error */\n+\tuint64_t        tx_error_pkts;\n+\t/* Number of discarded packets on transmit path */\n+\tuint64_t        tx_discard_pkts;\n+\t/* Number of transmitted bytes for unicast traffic */\n+\tuint64_t        tx_ucast_bytes;\n+\t/* Number of transmitted bytes for multicast traffic */\n+\tuint64_t        tx_mcast_bytes;\n+\t/* Number of transmitted bytes for broadcast traffic */\n+\tuint64_t        tx_bcast_bytes;\n+\t/* Number of TPA eligible packets */\n+\tuint64_t        rx_tpa_eligible_pkt;\n+\t/* Number of TPA eligible bytes */\n+\tuint64_t        rx_tpa_eligible_bytes;\n+\t/* Number of TPA packets */\n+\tuint64_t        rx_tpa_pkt;\n+\t/* Number of TPA bytes */\n+\tuint64_t        rx_tpa_bytes;\n+\t/* Number of TPA errors */\n+\tuint64_t        rx_tpa_errors;\n+\t/* Number of TPA events */\n+\tuint64_t        rx_tpa_events;\n+};\n+\n enum bnxt_session_type {\n \tBNXT_SESSION_TYPE_REGULAR = 0,\n \tBNXT_SESSION_TYPE_SHARED_COMMON,\n@@ -982,6 +1029,8 @@ struct bnxt {\n \tuint16_t\t\ttx_cfa_action;\n \tstruct bnxt_ring_stats\t*prev_rx_ring_stats;\n \tstruct bnxt_ring_stats\t*prev_tx_ring_stats;\n+\tstruct bnxt_ring_stats_ext\t*prev_rx_ring_stats_ext;\n+\tstruct bnxt_ring_stats_ext\t*prev_tx_ring_stats_ext;\n \tstruct bnxt_vnic_queue_db vnic_queue_db;\n \n #define BNXT_MAX_MC_ADDRS\t((bp)->max_mcast_addr)\ndiff --git a/drivers/net/bnxt/bnxt_cpr.h b/drivers/net/bnxt/bnxt_cpr.h\nindex 26e81a6a7e..c7b3480dc9 100644\n--- a/drivers/net/bnxt/bnxt_cpr.h\n+++ b/drivers/net/bnxt/bnxt_cpr.h\n@@ -68,7 +68,8 @@ struct bnxt_cp_ring_info {\n \tstruct bnxt_db_info     cp_db;\n \trte_iova_t\t\tcp_desc_mapping;\n \n-\tstruct ctx_hw_stats\t*hw_stats;\n+\tchar\t\t\t*hw_stats;\n+\tuint16_t\t\thw_ring_stats_size;\n \trte_iova_t\t\thw_stats_map;\n \tuint32_t\t\thw_stats_ctx_id;\n \ndiff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c\nindex 625e5f1f9a..031028eda1 100644\n--- a/drivers/net/bnxt/bnxt_ethdev.c\n+++ b/drivers/net/bnxt/bnxt_ethdev.c\n@@ -732,15 +732,49 @@ static int bnxt_update_phy_setting(struct bnxt *bp)\n \n static void bnxt_free_prev_ring_stats(struct bnxt *bp)\n {\n+\t/* tpa v2 devices use ext variant local struct */\n+\tif (BNXT_TPA_V2_P7(bp)) {\n+\t\trte_free(bp->prev_rx_ring_stats_ext);\n+\t\trte_free(bp->prev_tx_ring_stats_ext);\n+\t\tbp->prev_rx_ring_stats_ext = NULL;\n+\t\tbp->prev_tx_ring_stats_ext = NULL;\n+\t\treturn;\n+\t}\n \trte_free(bp->prev_rx_ring_stats);\n \trte_free(bp->prev_tx_ring_stats);\n-\n \tbp->prev_rx_ring_stats = NULL;\n \tbp->prev_tx_ring_stats = NULL;\n }\n \n+static int bnxt_alloc_prev_ring_ext_stats(struct bnxt *bp)\n+{\n+\tbp->prev_rx_ring_stats_ext = rte_zmalloc(\"bnxt_prev_rx_ring_stats_ext\",\n+\t\t\t\t\t\t sizeof(struct bnxt_ring_stats_ext) *\n+\t\t\t\t\t\t bp->rx_cp_nr_rings,\n+\t\t\t\t\t\t 0);\n+\tif (bp->prev_rx_ring_stats_ext == NULL)\n+\t\treturn -ENOMEM;\n+\n+\tbp->prev_tx_ring_stats_ext = rte_zmalloc(\"bnxt_prev_tx_ring_stats_ext\",\n+\t\t\t\t\t\t sizeof(struct bnxt_ring_stats_ext) *\n+\t\t\t\t\t\t bp->tx_cp_nr_rings,\n+\t\t\t\t\t\t 0);\n+\n+\tif (bp->tx_cp_nr_rings > 0 && bp->prev_tx_ring_stats_ext == NULL)\n+\t\tgoto error;\n+\n+\treturn 0;\n+\n+error:\n+\tbnxt_free_prev_ring_stats(bp);\n+\treturn -ENOMEM;\n+}\n+\n static int bnxt_alloc_prev_ring_stats(struct bnxt *bp)\n {\n+\tif (BNXT_TPA_V2_P7(bp))\n+\t\treturn bnxt_alloc_prev_ring_ext_stats(bp);\n+\n \tbp->prev_rx_ring_stats =  rte_zmalloc(\"bnxt_prev_rx_ring_stats\",\n \t\t\t\t\t      sizeof(struct bnxt_ring_stats) *\n \t\t\t\t\t      bp->rx_cp_nr_rings,\ndiff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c\nindex 4f202361ea..802973ba97 100644\n--- a/drivers/net/bnxt/bnxt_hwrm.c\n+++ b/drivers/net/bnxt/bnxt_hwrm.c\n@@ -2386,6 +2386,8 @@ int bnxt_hwrm_stat_ctx_alloc(struct bnxt *bp, struct bnxt_cp_ring_info *cpr)\n \n \tHWRM_PREP(&req, HWRM_STAT_CTX_ALLOC, BNXT_USE_CHIMP_MB);\n \n+\treq.stats_dma_length = rte_cpu_to_le_16(BNXT_HWRM_CTX_GET_SIZE(bp));\n+\n \treq.update_period_ms = rte_cpu_to_le_32(0);\n \n \treq.stats_dma_addr = rte_cpu_to_le_64(cpr->hw_stats_map);\n@@ -5187,6 +5189,8 @@ static void bnxt_update_prev_stat(uint64_t *cntr, uint64_t *prev_cntr)\n \t * returned by HW in this iteration, so use the previous\n \t * iteration's counter value\n \t */\n+\tif (!cntr || !prev_cntr)\n+\t\treturn;\n \tif (*prev_cntr && *cntr == 0)\n \t\t*cntr = *prev_cntr;\n \telse\n@@ -5295,6 +5299,119 @@ int bnxt_hwrm_ring_stats(struct bnxt *bp, uint32_t cid, int idx,\n \treturn rc;\n }\n \n+int bnxt_hwrm_ring_stats_ext(struct bnxt *bp, uint32_t cid, int idx,\n+\t\t\t     struct bnxt_ring_stats_ext *ring_stats, bool rx)\n+{\n+\tint rc = 0;\n+\tstruct hwrm_stat_ext_ctx_query_input req = {.req_type = 0};\n+\tstruct hwrm_stat_ext_ctx_query_output *resp = bp->hwrm_cmd_resp_addr;\n+\n+\tHWRM_PREP(&req, HWRM_STAT_EXT_CTX_QUERY, BNXT_USE_CHIMP_MB);\n+\n+\treq.stat_ctx_id = rte_cpu_to_le_32(cid);\n+\trc = bnxt_hwrm_send_message(bp, &req, sizeof(req), BNXT_USE_CHIMP_MB);\n+\n+\tHWRM_CHECK_RESULT();\n+\n+\tif (rx) {\n+\t\tstruct bnxt_ring_stats_ext *prev_stats = &bp->prev_rx_ring_stats_ext[idx];\n+\n+\t\tring_stats->rx_ucast_pkts = rte_le_to_cpu_64(resp->rx_ucast_pkts);\n+\t\tbnxt_update_prev_stat(&ring_stats->rx_ucast_pkts,\n+\t\t\t\t      &prev_stats->rx_ucast_pkts);\n+\n+\t\tring_stats->rx_mcast_pkts = rte_le_to_cpu_64(resp->rx_mcast_pkts);\n+\t\tbnxt_update_prev_stat(&ring_stats->rx_mcast_pkts,\n+\t\t\t\t      &prev_stats->rx_mcast_pkts);\n+\n+\t\tring_stats->rx_bcast_pkts = rte_le_to_cpu_64(resp->rx_bcast_pkts);\n+\t\tbnxt_update_prev_stat(&ring_stats->rx_bcast_pkts,\n+\t\t\t\t      &prev_stats->rx_bcast_pkts);\n+\n+\t\tring_stats->rx_ucast_bytes = rte_le_to_cpu_64(resp->rx_ucast_bytes);\n+\t\tbnxt_update_prev_stat(&ring_stats->rx_ucast_bytes,\n+\t\t\t\t      &prev_stats->rx_ucast_bytes);\n+\n+\t\tring_stats->rx_mcast_bytes = rte_le_to_cpu_64(resp->rx_mcast_bytes);\n+\t\tbnxt_update_prev_stat(&ring_stats->rx_mcast_bytes,\n+\t\t\t\t      &prev_stats->rx_mcast_bytes);\n+\n+\t\tring_stats->rx_bcast_bytes = rte_le_to_cpu_64(resp->rx_bcast_bytes);\n+\t\tbnxt_update_prev_stat(&ring_stats->rx_bcast_bytes,\n+\t\t\t\t      &prev_stats->rx_bcast_bytes);\n+\n+\t\tring_stats->rx_discard_pkts = rte_le_to_cpu_64(resp->rx_discard_pkts);\n+\t\tbnxt_update_prev_stat(&ring_stats->rx_discard_pkts,\n+\t\t\t\t      &prev_stats->rx_discard_pkts);\n+\n+\t\tring_stats->rx_error_pkts = rte_le_to_cpu_64(resp->rx_error_pkts);\n+\t\tbnxt_update_prev_stat(&ring_stats->rx_error_pkts,\n+\t\t\t\t      &prev_stats->rx_error_pkts);\n+\n+\t\tring_stats->rx_tpa_eligible_pkt = rte_le_to_cpu_64(resp->rx_tpa_eligible_pkt);\n+\t\tbnxt_update_prev_stat(&ring_stats->rx_tpa_eligible_pkt,\n+\t\t\t\t      &prev_stats->rx_tpa_eligible_pkt);\n+\n+\t\tring_stats->rx_tpa_eligible_bytes = rte_le_to_cpu_64(resp->rx_tpa_eligible_bytes);\n+\t\tbnxt_update_prev_stat(&ring_stats->rx_tpa_eligible_bytes,\n+\t\t\t\t      &prev_stats->rx_tpa_eligible_bytes);\n+\n+\t\tring_stats->rx_tpa_pkt = rte_le_to_cpu_64(resp->rx_tpa_pkt);\n+\t\tbnxt_update_prev_stat(&ring_stats->rx_tpa_pkt,\n+\t\t\t\t      &prev_stats->rx_tpa_pkt);\n+\n+\t\tring_stats->rx_tpa_bytes = rte_le_to_cpu_64(resp->rx_tpa_bytes);\n+\t\tbnxt_update_prev_stat(&ring_stats->rx_tpa_bytes,\n+\t\t\t\t      &prev_stats->rx_tpa_bytes);\n+\n+\t\tring_stats->rx_tpa_errors = rte_le_to_cpu_64(resp->rx_tpa_errors);\n+\t\tbnxt_update_prev_stat(&ring_stats->rx_tpa_errors,\n+\t\t\t\t      &prev_stats->rx_tpa_errors);\n+\n+\t\tring_stats->rx_tpa_events = rte_le_to_cpu_64(resp->rx_tpa_events);\n+\t\tbnxt_update_prev_stat(&ring_stats->rx_tpa_events,\n+\t\t\t\t      &prev_stats->rx_tpa_events);\n+\t} else {\n+\t\tstruct bnxt_ring_stats_ext *prev_stats = &bp->prev_tx_ring_stats_ext[idx];\n+\n+\t\tring_stats->tx_ucast_pkts = rte_le_to_cpu_64(resp->tx_ucast_pkts);\n+\t\tbnxt_update_prev_stat(&ring_stats->tx_ucast_pkts,\n+\t\t\t\t      &prev_stats->tx_ucast_pkts);\n+\n+\t\tring_stats->tx_mcast_pkts = rte_le_to_cpu_64(resp->tx_mcast_pkts);\n+\t\tbnxt_update_prev_stat(&ring_stats->tx_mcast_pkts,\n+\t\t\t\t      &prev_stats->tx_mcast_pkts);\n+\n+\t\tring_stats->tx_bcast_pkts = rte_le_to_cpu_64(resp->tx_bcast_pkts);\n+\t\tbnxt_update_prev_stat(&ring_stats->tx_bcast_pkts,\n+\t\t\t\t      &prev_stats->tx_bcast_pkts);\n+\n+\t\tring_stats->tx_ucast_bytes = rte_le_to_cpu_64(resp->tx_ucast_bytes);\n+\t\tbnxt_update_prev_stat(&ring_stats->tx_ucast_bytes,\n+\t\t\t\t      &prev_stats->tx_ucast_bytes);\n+\n+\t\tring_stats->tx_mcast_bytes = rte_le_to_cpu_64(resp->tx_mcast_bytes);\n+\t\tbnxt_update_prev_stat(&ring_stats->tx_mcast_bytes,\n+\t\t\t\t      &prev_stats->tx_mcast_bytes);\n+\n+\t\tring_stats->tx_bcast_bytes = rte_le_to_cpu_64(resp->tx_bcast_bytes);\n+\t\tbnxt_update_prev_stat(&ring_stats->tx_bcast_bytes,\n+\t\t\t\t      &prev_stats->tx_bcast_bytes);\n+\n+\t\tring_stats->tx_discard_pkts = rte_le_to_cpu_64(resp->tx_discard_pkts);\n+\t\tbnxt_update_prev_stat(&ring_stats->tx_discard_pkts,\n+\t\t\t\t      &prev_stats->tx_discard_pkts);\n+\n+\t\tring_stats->tx_error_pkts = rte_le_to_cpu_64(resp->tx_error_pkts);\n+\t\tbnxt_update_prev_stat(&ring_stats->tx_error_pkts,\n+\t\t\t\t      &prev_stats->tx_error_pkts);\n+\t}\n+\n+\tHWRM_UNLOCK();\n+\n+\treturn rc;\n+}\n+\n int bnxt_hwrm_port_qstats(struct bnxt *bp)\n {\n \tstruct hwrm_port_qstats_input req = {0};\ndiff --git a/drivers/net/bnxt/bnxt_hwrm.h b/drivers/net/bnxt/bnxt_hwrm.h\nindex 179d5dc1f0..19fb35f223 100644\n--- a/drivers/net/bnxt/bnxt_hwrm.h\n+++ b/drivers/net/bnxt/bnxt_hwrm.h\n@@ -167,8 +167,14 @@ struct bnxt_pf_resource_info {\n \t BNXT_TUNNELED_OFFLOADS_CAP_GRE_EN(bp)   &&\t\t\\\n \t BNXT_TUNNELED_OFFLOADS_CAP_IPINIP_EN(bp))\n \n-#define BNXT_SIG_MODE_NRZ\tHWRM_PORT_PHY_QCFG_OUTPUT_SIGNAL_MODE_NRZ\n-#define BNXT_SIG_MODE_PAM4\tHWRM_PORT_PHY_QCFG_OUTPUT_SIGNAL_MODE_PAM4\n+/* Is this tpa_v2 and P7\n+ * Just add P5 to this once we validate on Thor FW\n+ */\n+#define BNXT_TPA_V2_P7(bp) ((bp)->max_tpa_v2 && BNXT_CHIP_P7(bp))\n+/* Get the size of the stat context size for DMA from HW */\n+#define BNXT_HWRM_CTX_GET_SIZE(bp)  (BNXT_TPA_V2_P7(bp) ?\t\\\n+\tsizeof(struct ctx_hw_stats_ext) :\t\t\t\\\n+\tsizeof(struct ctx_hw_stats))\n \n int bnxt_hwrm_cfa_l2_clear_rx_mask(struct bnxt *bp,\n \t\t\t\t   struct bnxt_vnic_info *vnic);\n@@ -352,6 +358,8 @@ int bnxt_hwrm_poll_ver_get(struct bnxt *bp);\n int bnxt_hwrm_rx_ring_reset(struct bnxt *bp, int queue_index);\n int bnxt_hwrm_ring_stats(struct bnxt *bp, uint32_t cid, int idx,\n \t\t\t struct bnxt_ring_stats *stats, bool rx);\n+int bnxt_hwrm_ring_stats_ext(struct bnxt *bp, uint32_t cid, int idx,\n+\t\t\t     struct bnxt_ring_stats_ext *ring_stats, bool rx);\n int bnxt_hwrm_read_sfp_module_eeprom_info(struct bnxt *bp, uint16_t i2c_addr,\n \t\t\t\t\t  uint16_t page_number, uint16_t start_addr,\n \t\t\t\t\t  uint16_t data_length, uint8_t *buf);\ndiff --git a/drivers/net/bnxt/bnxt_ring.c b/drivers/net/bnxt/bnxt_ring.c\nindex 4bf0b9c6ed..9e512321d9 100644\n--- a/drivers/net/bnxt/bnxt_ring.c\n+++ b/drivers/net/bnxt/bnxt_ring.c\n@@ -119,8 +119,7 @@ int bnxt_alloc_rings(struct bnxt *bp, unsigned int socket_id, uint16_t qidx,\n \tint ag_ring_len = 0;\n \n \tint stats_len = (tx_ring_info || rx_ring_info) ?\n-\t    RTE_CACHE_LINE_ROUNDUP(sizeof(struct hwrm_stat_ctx_query_output) -\n-\t\t\t\t   sizeof (struct hwrm_resp_hdr)) : 0;\n+\t    RTE_CACHE_LINE_ROUNDUP(BNXT_HWRM_CTX_GET_SIZE(bp)) : 0;\n \tstats_len = RTE_ALIGN(stats_len, 128);\n \n \tint cp_vmem_start = stats_len;\n@@ -305,8 +304,9 @@ int bnxt_alloc_rings(struct bnxt *bp, unsigned int socket_id, uint16_t qidx,\n \t\t*cp_ring->vmem = ((char *)mz->addr + stats_len);\n \tif (stats_len) {\n \t\tcp_ring_info->hw_stats = mz->addr;\n-\t\tcp_ring_info->hw_stats_map = mz_phys_addr;\n \t}\n+\tcp_ring_info->hw_stats_map = mz_phys_addr;\n+\n \tcp_ring_info->hw_stats_ctx_id = HWRM_NA_SIGNATURE;\n \n \tif (nq_ring_info) {\ndiff --git a/drivers/net/bnxt/bnxt_rxq.c b/drivers/net/bnxt/bnxt_rxq.c\nindex 575e7f193f..913856e6eb 100644\n--- a/drivers/net/bnxt/bnxt_rxq.c\n+++ b/drivers/net/bnxt/bnxt_rxq.c\n@@ -483,8 +483,12 @@ int bnxt_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id)\n \t/* reset the previous stats for the rx_queue since the counters\n \t * will be cleared when the queue is started.\n \t */\n-\tmemset(&bp->prev_rx_ring_stats[rx_queue_id], 0,\n-\t       sizeof(struct bnxt_ring_stats));\n+\tif (BNXT_TPA_V2_P7(bp))\n+\t\tmemset(&bp->prev_rx_ring_stats_ext[rx_queue_id], 0,\n+\t\t       sizeof(struct bnxt_ring_stats_ext));\n+\telse\n+\t\tmemset(&bp->prev_rx_ring_stats[rx_queue_id], 0,\n+\t\t       sizeof(struct bnxt_ring_stats));\n \n \t/* Set the queue state to started here.\n \t * We check the status of the queue while posting buffer.\ndiff --git a/drivers/net/bnxt/bnxt_stats.c b/drivers/net/bnxt/bnxt_stats.c\nindex 0e25207fc3..ee10fe0360 100644\n--- a/drivers/net/bnxt/bnxt_stats.c\n+++ b/drivers/net/bnxt/bnxt_stats.c\n@@ -258,6 +258,53 @@ static const struct bnxt_xstats_name_off bnxt_tx_stats_strings[] = {\n \t\t\t\ttx_stat_error)},\n };\n \n+static const struct bnxt_xstats_name_off bnxt_func_stats_ext_strings[] = {\n+\t{\"tx_ucast_pkts\", offsetof(struct hwrm_func_qstats_ext_output,\n+\t\t\t\ttx_ucast_pkts)},\n+\t{\"tx_mcast_pkts\", offsetof(struct hwrm_func_qstats_ext_output,\n+\t\t\t\ttx_mcast_pkts)},\n+\t{\"tx_bcast_pkts\", offsetof(struct hwrm_func_qstats_ext_output,\n+\t\t\t\ttx_bcast_pkts)},\n+\t{\"tx_discard_pkts\", offsetof(struct hwrm_func_qstats_ext_output,\n+\t\t\t\ttx_discard_pkts)},\n+\t{\"tx_drop_pkts\", offsetof(struct hwrm_func_qstats_ext_output,\n+\t\t\t\ttx_error_pkts)},\n+\t{\"tx_ucast_bytes\", offsetof(struct hwrm_func_qstats_ext_output,\n+\t\t\t\ttx_ucast_bytes)},\n+\t{\"tx_mcast_bytes\", offsetof(struct hwrm_func_qstats_ext_output,\n+\t\t\t\ttx_mcast_bytes)},\n+\t{\"tx_bcast_bytes\", offsetof(struct hwrm_func_qstats_ext_output,\n+\t\t\t\ttx_bcast_bytes)},\n+\t{\"rx_ucast_pkts\", offsetof(struct hwrm_func_qstats_ext_output,\n+\t\t\t\trx_ucast_pkts)},\n+\t{\"rx_mcast_pkts\", offsetof(struct hwrm_func_qstats_ext_output,\n+\t\t\t\trx_mcast_pkts)},\n+\t{\"rx_bcast_pkts\", offsetof(struct hwrm_func_qstats_ext_output,\n+\t\t\t\trx_bcast_pkts)},\n+\t{\"rx_discard_pkts\", offsetof(struct hwrm_func_qstats_ext_output,\n+\t\t\t\trx_discard_pkts)},\n+\t{\"rx_drop_pkts\", offsetof(struct hwrm_func_qstats_ext_output,\n+\t\t\t\trx_error_pkts)},\n+\t{\"rx_ucast_bytes\", offsetof(struct hwrm_func_qstats_ext_output,\n+\t\t\t\trx_ucast_bytes)},\n+\t{\"rx_mcast_bytes\", offsetof(struct hwrm_func_qstats_ext_output,\n+\t\t\t\trx_mcast_bytes)},\n+\t{\"rx_bcast_bytes\", offsetof(struct hwrm_func_qstats_ext_output,\n+\t\t\t\trx_bcast_bytes)},\n+\t{\"rx_tpa_eligible_pkt\", offsetof(struct hwrm_func_qstats_ext_output,\n+\t\t\t\trx_tpa_eligible_pkt)},\n+\t{\"rx_tpa_eligible_bytes\", offsetof(struct hwrm_func_qstats_ext_output,\n+\t\t\t\trx_tpa_eligible_bytes)},\n+\t{\"rx_tpa_pkt\", offsetof(struct hwrm_func_qstats_ext_output,\n+\t\t\t\trx_tpa_pkt)},\n+\t{\"rx_tpa_bytes\", offsetof(struct hwrm_func_qstats_ext_output,\n+\t\t\t\trx_tpa_bytes)},\n+\t{\"rx_tpa_errors\", offsetof(struct hwrm_func_qstats_ext_output,\n+\t\t\t\trx_tpa_errors)},\n+\t{\"rx_tpa_events\", offsetof(struct hwrm_func_qstats_ext_output,\n+\t\t\t\trx_tpa_events)},\n+};\n+\n static const struct bnxt_xstats_name_off bnxt_func_stats_strings[] = {\n \t{\"tx_ucast_pkts\", offsetof(struct hwrm_func_qstats_output,\n \t\t\t\ttx_ucast_pkts)},\n@@ -417,6 +464,12 @@ static const struct bnxt_xstats_name_off bnxt_rx_ext_stats_strings[] = {\n \t\t\t\trx_discard_packets_cos6)},\n \t{\"rx_discard_packets_cos7\", offsetof(struct rx_port_stats_ext,\n \t\t\t\trx_discard_packets_cos7)},\n+\t{\"rx_fec_corrected_blocks\", offsetof(struct rx_port_stats_ext,\n+\t\t\t\trx_fec_corrected_blocks)},\n+\t{\"rx_fec_uncorrectable_blocks\", offsetof(struct rx_port_stats_ext,\n+\t\t\t\trx_fec_uncorrectable_blocks)},\n+\t{\"rx_filter_miss\", offsetof(struct rx_port_stats_ext,\n+\t\t\t\trx_filter_miss)},\n };\n \n static const struct bnxt_xstats_name_off bnxt_tx_ext_stats_strings[] = {\n@@ -506,6 +559,45 @@ void bnxt_free_stats(struct bnxt *bp)\n \t}\n }\n \n+static void bnxt_fill_rte_eth_stats_ext(struct rte_eth_stats *stats,\n+\t\t\t\t\tstruct bnxt_ring_stats_ext *ring_stats,\n+\t\t\t\t\tunsigned int i, bool rx)\n+{\n+\tif (rx) {\n+\t\tstats->q_ipackets[i] = ring_stats->rx_ucast_pkts;\n+\t\tstats->q_ipackets[i] += ring_stats->rx_mcast_pkts;\n+\t\tstats->q_ipackets[i] += ring_stats->rx_bcast_pkts;\n+\n+\t\tstats->ipackets += stats->q_ipackets[i];\n+\n+\t\tstats->q_ibytes[i] = ring_stats->rx_ucast_bytes;\n+\t\tstats->q_ibytes[i] += ring_stats->rx_mcast_bytes;\n+\t\tstats->q_ibytes[i] += ring_stats->rx_bcast_bytes;\n+\n+\t\tstats->ibytes += stats->q_ibytes[i];\n+\n+\t\tstats->q_errors[i] = ring_stats->rx_discard_pkts;\n+\t\tstats->q_errors[i] += ring_stats->rx_error_pkts;\n+\n+\t\tstats->imissed += ring_stats->rx_discard_pkts;\n+\t\tstats->ierrors += ring_stats->rx_error_pkts;\n+\t} else {\n+\t\tstats->q_opackets[i] = ring_stats->tx_ucast_pkts;\n+\t\tstats->q_opackets[i] += ring_stats->tx_mcast_pkts;\n+\t\tstats->q_opackets[i] += ring_stats->tx_bcast_pkts;\n+\n+\t\tstats->opackets += stats->q_opackets[i];\n+\n+\t\tstats->q_obytes[i] = ring_stats->tx_ucast_bytes;\n+\t\tstats->q_obytes[i] += ring_stats->tx_mcast_bytes;\n+\t\tstats->q_obytes[i] += ring_stats->tx_bcast_bytes;\n+\n+\t\tstats->obytes += stats->q_obytes[i];\n+\n+\t\tstats->oerrors += ring_stats->tx_discard_pkts;\n+\t}\n+}\n+\n static void bnxt_fill_rte_eth_stats(struct rte_eth_stats *stats,\n \t\t\t\t    struct bnxt_ring_stats *ring_stats,\n \t\t\t\t    unsigned int i, bool rx)\n@@ -545,6 +637,57 @@ static void bnxt_fill_rte_eth_stats(struct rte_eth_stats *stats,\n \t}\n }\n \n+static int bnxt_stats_get_op_ext(struct rte_eth_dev *eth_dev,\n+\t\t\t\t struct rte_eth_stats *bnxt_stats)\n+{\n+\tint rc = 0;\n+\tunsigned int i;\n+\tstruct bnxt *bp = eth_dev->data->dev_private;\n+\tunsigned int num_q_stats;\n+\n+\tnum_q_stats = RTE_MIN(bp->rx_cp_nr_rings,\n+\t\t\t      (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS);\n+\n+\tfor (i = 0; i < num_q_stats; i++) {\n+\t\tstruct bnxt_rx_queue *rxq = bp->rx_queues[i];\n+\t\tstruct bnxt_cp_ring_info *cpr = rxq->cp_ring;\n+\t\tstruct bnxt_ring_stats_ext ring_stats = {0};\n+\n+\t\tif (!rxq->rx_started)\n+\t\t\tcontinue;\n+\n+\t\trc = bnxt_hwrm_ring_stats_ext(bp, cpr->hw_stats_ctx_id, i,\n+\t\t\t\t\t      &ring_stats, true);\n+\t\tif (unlikely(rc))\n+\t\t\treturn rc;\n+\n+\t\tbnxt_fill_rte_eth_stats_ext(bnxt_stats, &ring_stats, i, true);\n+\t\tbnxt_stats->rx_nombuf +=\n+\t\t\t\t__atomic_load_n(&rxq->rx_mbuf_alloc_fail, __ATOMIC_RELAXED);\n+\t}\n+\n+\tnum_q_stats = RTE_MIN(bp->tx_cp_nr_rings,\n+\t\t\t      (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS);\n+\n+\tfor (i = 0; i < num_q_stats; i++) {\n+\t\tstruct bnxt_tx_queue *txq = bp->tx_queues[i];\n+\t\tstruct bnxt_cp_ring_info *cpr = txq->cp_ring;\n+\t\tstruct bnxt_ring_stats_ext ring_stats = {0};\n+\n+\t\tif (!txq->tx_started)\n+\t\t\tcontinue;\n+\n+\t\trc = bnxt_hwrm_ring_stats_ext(bp, cpr->hw_stats_ctx_id, i,\n+\t\t\t\t\t      &ring_stats, false);\n+\t\tif (unlikely(rc))\n+\t\t\treturn rc;\n+\n+\t\tbnxt_fill_rte_eth_stats_ext(bnxt_stats, &ring_stats, i, false);\n+\t}\n+\n+\treturn rc;\n+}\n+\n int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,\n \t\t      struct rte_eth_stats *bnxt_stats)\n {\n@@ -560,6 +703,9 @@ int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,\n \tif (!eth_dev->data->dev_started)\n \t\treturn -EIO;\n \n+\tif (BNXT_TPA_V2_P7(bp))\n+\t\treturn bnxt_stats_get_op_ext(eth_dev, bnxt_stats);\n+\n \tnum_q_stats = RTE_MIN(bp->rx_cp_nr_rings,\n \t\t\t      (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS);\n \n@@ -609,8 +755,17 @@ static void bnxt_clear_prev_stat(struct bnxt *bp)\n \t * Clear the cached values of stats returned by HW in the previous\n \t * get operation.\n \t */\n-\tmemset(bp->prev_rx_ring_stats, 0, sizeof(struct bnxt_ring_stats) * bp->rx_cp_nr_rings);\n-\tmemset(bp->prev_tx_ring_stats, 0, sizeof(struct bnxt_ring_stats) * bp->tx_cp_nr_rings);\n+\tif (BNXT_TPA_V2_P7(bp)) {\n+\t\tmemset(bp->prev_rx_ring_stats_ext, 0,\n+\t\t       sizeof(struct bnxt_ring_stats_ext) * bp->rx_cp_nr_rings);\n+\t\tmemset(bp->prev_tx_ring_stats_ext, 0,\n+\t\t       sizeof(struct bnxt_ring_stats_ext) * bp->tx_cp_nr_rings);\n+\t} else {\n+\t\tmemset(bp->prev_rx_ring_stats, 0,\n+\t\t       sizeof(struct bnxt_ring_stats) * bp->rx_cp_nr_rings);\n+\t\tmemset(bp->prev_tx_ring_stats, 0,\n+\t\t       sizeof(struct bnxt_ring_stats) * bp->tx_cp_nr_rings);\n+\t}\n }\n \n int bnxt_stats_reset_op(struct rte_eth_dev *eth_dev)\n@@ -640,6 +795,42 @@ int bnxt_stats_reset_op(struct rte_eth_dev *eth_dev)\n \treturn ret;\n }\n \n+static void bnxt_fill_func_qstats_ext(struct hwrm_func_qstats_ext_output *func_qstats,\n+\t\t\t\t      struct bnxt_ring_stats_ext *ring_stats,\n+\t\t\t\t      bool rx)\n+{\n+\tif (rx) {\n+\t\tfunc_qstats->rx_ucast_pkts += ring_stats->rx_ucast_pkts;\n+\t\tfunc_qstats->rx_mcast_pkts += ring_stats->rx_mcast_pkts;\n+\t\tfunc_qstats->rx_bcast_pkts += ring_stats->rx_bcast_pkts;\n+\n+\t\tfunc_qstats->rx_ucast_bytes += ring_stats->rx_ucast_bytes;\n+\t\tfunc_qstats->rx_mcast_bytes += ring_stats->rx_mcast_bytes;\n+\t\tfunc_qstats->rx_bcast_bytes += ring_stats->rx_bcast_bytes;\n+\n+\t\tfunc_qstats->rx_discard_pkts += ring_stats->rx_discard_pkts;\n+\t\tfunc_qstats->rx_error_pkts += ring_stats->rx_error_pkts;\n+\n+\t\tfunc_qstats->rx_tpa_eligible_pkt += ring_stats->rx_tpa_eligible_pkt;\n+\t\tfunc_qstats->rx_tpa_eligible_bytes += ring_stats->rx_tpa_eligible_bytes;\n+\t\tfunc_qstats->rx_tpa_pkt += ring_stats->rx_tpa_pkt;\n+\t\tfunc_qstats->rx_tpa_bytes += ring_stats->rx_tpa_bytes;\n+\t\tfunc_qstats->rx_tpa_errors += ring_stats->rx_tpa_errors;\n+\t\tfunc_qstats->rx_tpa_events += ring_stats->rx_tpa_events;\n+\t} else {\n+\t\tfunc_qstats->tx_ucast_pkts += ring_stats->tx_ucast_pkts;\n+\t\tfunc_qstats->tx_mcast_pkts += ring_stats->tx_mcast_pkts;\n+\t\tfunc_qstats->tx_bcast_pkts += ring_stats->tx_bcast_pkts;\n+\n+\t\tfunc_qstats->tx_ucast_bytes += ring_stats->tx_ucast_bytes;\n+\t\tfunc_qstats->tx_mcast_bytes += ring_stats->tx_mcast_bytes;\n+\t\tfunc_qstats->tx_bcast_bytes += ring_stats->tx_bcast_bytes;\n+\n+\t\tfunc_qstats->tx_error_pkts += ring_stats->tx_error_pkts;\n+\t\tfunc_qstats->tx_discard_pkts += ring_stats->tx_discard_pkts;\n+\t}\n+}\n+\n static void bnxt_fill_func_qstats(struct hwrm_func_qstats_output *func_qstats,\n \t\t\t\t  struct bnxt_ring_stats *ring_stats,\n \t\t\t\t  bool rx)\n@@ -683,16 +874,21 @@ int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev,\n \tunsigned int tx_port_stats_ext_cnt;\n \tunsigned int stat_size = sizeof(uint64_t);\n \tstruct hwrm_func_qstats_output func_qstats = {0};\n-\tunsigned int stat_count;\n+\tstruct hwrm_func_qstats_ext_output func_qstats_ext = {0};\n+\tunsigned int stat_count, sz;\n \tint rc;\n \n \trc = is_bnxt_in_error(bp);\n \tif (rc)\n \t\treturn rc;\n \n+\tif (BNXT_TPA_V2_P7(bp))\n+\t\tsz = RTE_DIM(bnxt_func_stats_ext_strings);\n+\telse\n+\t\tsz = RTE_DIM(bnxt_func_stats_strings);\n+\n \tstat_count = RTE_DIM(bnxt_rx_stats_strings) +\n-\t\tRTE_DIM(bnxt_tx_stats_strings) +\n-\t\tRTE_DIM(bnxt_func_stats_strings) +\n+\t\tRTE_DIM(bnxt_tx_stats_strings) + sz +\n \t\tRTE_DIM(bnxt_rx_ext_stats_strings) +\n \t\tRTE_DIM(bnxt_tx_ext_stats_strings) +\n \t\tbnxt_flow_stats_cnt(bp);\n@@ -704,32 +900,51 @@ int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev,\n \t\tstruct bnxt_rx_queue *rxq = bp->rx_queues[i];\n \t\tstruct bnxt_cp_ring_info *cpr = rxq->cp_ring;\n \t\tstruct bnxt_ring_stats ring_stats = {0};\n+\t\tstruct bnxt_ring_stats_ext ring_stats_ext = {0};\n \n \t\tif (!rxq->rx_started)\n \t\t\tcontinue;\n \n-\t\trc = bnxt_hwrm_ring_stats(bp, cpr->hw_stats_ctx_id, i,\n-\t\t\t\t\t  &ring_stats, true);\n+\t\tif (BNXT_TPA_V2_P7(bp))\n+\t\t\trc = bnxt_hwrm_ring_stats_ext(bp, cpr->hw_stats_ctx_id, i,\n+\t\t\t\t\t\t      &ring_stats_ext, true);\n+\t\telse\n+\t\t\trc = bnxt_hwrm_ring_stats(bp, cpr->hw_stats_ctx_id, i,\n+\t\t\t\t\t\t  &ring_stats, true);\n+\n \t\tif (unlikely(rc))\n \t\t\treturn rc;\n \n-\t\tbnxt_fill_func_qstats(&func_qstats, &ring_stats, true);\n+\t\tif (BNXT_TPA_V2_P7(bp))\n+\t\t\tbnxt_fill_func_qstats_ext(&func_qstats_ext,\n+\t\t\t\t\t\t  &ring_stats_ext, true);\n+\t\telse\n+\t\t\tbnxt_fill_func_qstats(&func_qstats, &ring_stats, true);\n \t}\n \n \tfor (i = 0; i < bp->tx_cp_nr_rings; i++) {\n \t\tstruct bnxt_tx_queue *txq = bp->tx_queues[i];\n \t\tstruct bnxt_cp_ring_info *cpr = txq->cp_ring;\n \t\tstruct bnxt_ring_stats ring_stats = {0};\n+\t\tstruct bnxt_ring_stats_ext ring_stats_ext = {0};\n \n \t\tif (!txq->tx_started)\n \t\t\tcontinue;\n \n-\t\trc = bnxt_hwrm_ring_stats(bp, cpr->hw_stats_ctx_id, i,\n-\t\t\t\t\t  &ring_stats, false);\n+\t\tif (BNXT_TPA_V2_P7(bp))\n+\t\t\trc = bnxt_hwrm_ring_stats_ext(bp, cpr->hw_stats_ctx_id, i,\n+\t\t\t\t\t\t      &ring_stats_ext, false);\n+\t\telse\n+\t\t\trc = bnxt_hwrm_ring_stats(bp, cpr->hw_stats_ctx_id, i,\n+\t\t\t\t\t\t  &ring_stats, false);\n \t\tif (unlikely(rc))\n \t\t\treturn rc;\n \n-\t\tbnxt_fill_func_qstats(&func_qstats, &ring_stats, false);\n+\t\tif (BNXT_TPA_V2_P7(bp))\n+\t\t\tbnxt_fill_func_qstats_ext(&func_qstats_ext,\n+\t\t\t\t\t\t  &ring_stats_ext, false);\n+\t\telse\n+\t\t\tbnxt_fill_func_qstats(&func_qstats, &ring_stats, false);\n \t}\n \n \tbnxt_hwrm_port_qstats(bp);\n@@ -762,6 +977,15 @@ int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev,\n \t\tcount++;\n \t}\n \n+\tif (BNXT_TPA_V2_P7(bp)) {\n+\t\tfor (i = 0; i < RTE_DIM(bnxt_func_stats_ext_strings); i++) {\n+\t\t\txstats[count].id = count;\n+\t\t\txstats[count].value = *(uint64_t *)((char *)&func_qstats_ext +\n+\t\t\t\t\t\t\t    bnxt_func_stats_ext_strings[i].offset);\n+\t\t\tcount++;\n+\t\t}\n+\t\tgoto skip_func_stats;\n+\t}\n \tfor (i = 0; i < RTE_DIM(bnxt_func_stats_strings); i++) {\n \t\txstats[count].id = count;\n \t\txstats[count].value = *(uint64_t *)((char *)&func_qstats +\n@@ -769,6 +993,7 @@ int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev,\n \t\tcount++;\n \t}\n \n+skip_func_stats:\n \tfor (i = 0; i < rx_port_stats_ext_cnt; i++) {\n \t\tuint64_t *rx_stats_ext = (uint64_t *)bp->hw_rx_port_stats_ext;\n \n@@ -849,19 +1074,26 @@ int bnxt_dev_xstats_get_names_op(struct rte_eth_dev *eth_dev,\n \t\tunsigned int size)\n {\n \tstruct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;\n-\tconst unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +\n-\t\t\t\tRTE_DIM(bnxt_tx_stats_strings) +\n-\t\t\t\tRTE_DIM(bnxt_func_stats_strings) +\n-\t\t\t\tRTE_DIM(bnxt_rx_ext_stats_strings) +\n-\t\t\t\tRTE_DIM(bnxt_tx_ext_stats_strings) +\n-\t\t\t\tbnxt_flow_stats_cnt(bp);\n-\tunsigned int i, count = 0;\n+\tunsigned int stat_cnt;\n+\tunsigned int i, count = 0, sz;\n \tint rc;\n \n \trc = is_bnxt_in_error(bp);\n \tif (rc)\n \t\treturn rc;\n \n+\tif (BNXT_TPA_V2_P7(bp))\n+\t\tsz = RTE_DIM(bnxt_func_stats_ext_strings);\n+\telse\n+\t\tsz = RTE_DIM(bnxt_func_stats_strings);\n+\n+\tstat_cnt = RTE_DIM(bnxt_rx_stats_strings) +\n+\t\t\t\tRTE_DIM(bnxt_tx_stats_strings) +\n+\t\t\t\tsz +\n+\t\t\t\tRTE_DIM(bnxt_rx_ext_stats_strings) +\n+\t\t\t\tRTE_DIM(bnxt_tx_ext_stats_strings) +\n+\t\t\t\tbnxt_flow_stats_cnt(bp);\n+\n \tif (xstats_names == NULL || size < stat_cnt)\n \t\treturn stat_cnt;\n \n@@ -879,6 +1111,16 @@ int bnxt_dev_xstats_get_names_op(struct rte_eth_dev *eth_dev,\n \t\tcount++;\n \t}\n \n+\tif (BNXT_TPA_V2_P7(bp)) {\n+\t\tfor (i = 0; i < RTE_DIM(bnxt_func_stats_ext_strings); i++) {\n+\t\t\tstrlcpy(xstats_names[count].name,\n+\t\t\t\tbnxt_func_stats_ext_strings[i].name,\n+\t\t\t\tsizeof(xstats_names[count].name));\n+\t\t\tcount++;\n+\t\t}\n+\t\tgoto skip_func_stats;\n+\t}\n+\n \tfor (i = 0; i < RTE_DIM(bnxt_func_stats_strings); i++) {\n \t\tstrlcpy(xstats_names[count].name,\n \t\t\tbnxt_func_stats_strings[i].name,\n@@ -886,6 +1128,7 @@ int bnxt_dev_xstats_get_names_op(struct rte_eth_dev *eth_dev,\n \t\tcount++;\n \t}\n \n+skip_func_stats:\n \tfor (i = 0; i < RTE_DIM(bnxt_rx_ext_stats_strings); i++) {\n \t\tstrlcpy(xstats_names[count].name,\n \t\t\tbnxt_rx_ext_stats_strings[i].name,\n",
    "prefixes": [
        "v2",
        "16/18"
    ]
}