get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 135597,
    "url": "http://patches.dpdk.org/api/patches/135597/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20231227042119.72469-10-ajit.khaparde@broadcom.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": "<20231227042119.72469-10-ajit.khaparde@broadcom.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20231227042119.72469-10-ajit.khaparde@broadcom.com",
    "date": "2023-12-27T04:21:10",
    "name": "[v3,09/18] net/bnxt: extend RSS hash support for P7 devices",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "d6417d5f09322f3e294b63e3bee83b642f5ef135",
    "submitter": {
        "id": 501,
        "url": "http://patches.dpdk.org/api/people/501/?format=api",
        "name": "Ajit Khaparde",
        "email": "ajit.khaparde@broadcom.com"
    },
    "delegate": {
        "id": 1766,
        "url": "http://patches.dpdk.org/api/users/1766/?format=api",
        "username": "ajitkhaparde",
        "first_name": "Ajit",
        "last_name": "Khaparde",
        "email": "ajit.khaparde@broadcom.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20231227042119.72469-10-ajit.khaparde@broadcom.com/mbox/",
    "series": [
        {
            "id": 30672,
            "url": "http://patches.dpdk.org/api/series/30672/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=30672",
            "date": "2023-12-27T04:21:01",
            "name": "bnxt patchset",
            "version": 3,
            "mbox": "http://patches.dpdk.org/series/30672/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/135597/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/135597/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 2B77D437A1;\n\tWed, 27 Dec 2023 05:22:44 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 2ED2840A75;\n\tWed, 27 Dec 2023 05:21:44 +0100 (CET)",
            "from mail-qt1-f174.google.com (mail-qt1-f174.google.com\n [209.85.160.174])\n by mails.dpdk.org (Postfix) with ESMTP id 11C974069D\n for <dev@dpdk.org>; Wed, 27 Dec 2023 05:21:39 +0100 (CET)",
            "by mail-qt1-f174.google.com with SMTP id\n d75a77b69052e-427e83601c4so3805221cf.0\n for <dev@dpdk.org>; Tue, 26 Dec 2023 20:21:39 -0800 (PST)",
            "from localhost.localdomain\n ([2605:a601:a780:1400:c066:75e3:74c8:50e6])\n by smtp.gmail.com with ESMTPSA id\n bt7-20020ac86907000000b00427e120889bsm1415488qtb.91.2023.12.26.20.21.36\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Tue, 26 Dec 2023 20:21:36 -0800 (PST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=broadcom.com; s=google; t=1703650898; x=1704255698; 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=jFkdE5yxNFM1s+xri0E7kWHQCY7JdOrW6/qJ/p/33JM=;\n b=DQaV+b37PJHHKRizRZlWE1JE5q2A46QujbuT7x/fMpj3bANQh06u1qtjTokPRXqSVN\n /lMGIw/D4LrarmT1JuY0TEoUODBHOAZ4TAzgAYR9XFCepC1gIqHLsCzxyXO6d2v+8ND+\n 2oaoCzX7taQQURI2Ip8NjCoeMBOF0ZUzl9qSw=",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20230601; t=1703650898; x=1704255698;\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=jFkdE5yxNFM1s+xri0E7kWHQCY7JdOrW6/qJ/p/33JM=;\n b=nkSgajJEpGsLQxxaCTkUdj/4epHWQsIKCBDwotw9SsxtTc4CfVKt0ZXykEBXGRthXl\n oZ+CKtWf/4Z9gGX5nF04P3UKzndZyoBuPmvyzX/cI1L7/rsyC5yki+lSOaBDYfNJWjJi\n y3tvsjRLjPiDTn6CsR+my0CP8oVXxSq9P0jI+qwt/k1lu5hymngk8sAfHHoOvvY0sa58\n Wi/ofrhKKiiSdmFZkQhYJH1gsKySPX6V7oOsBx3zls88KXriIaR4V7d/wWcdkBBieveG\n wBzvTvIz6A1Tzcsrjdg9BVwqr7GAFLiuaash4mDuR2+9VK5dDRXwInqSSr4Kl6x/xNbQ\n DrbA==",
        "X-Gm-Message-State": "AOJu0YzMv4YHh6v2T9Vc+rahdnLIdE5oDZRdAPwiOxluSsw2EMb0TU9m\n mJTLsA0jKrqWM75iWsuOhaE2Yu52sce9ubiB9w83cY1WmzxJCQxQA41mgFOJQwjzgOH7dP0COPg\n z+gFUfhShgT+8dwjXJ14R+hXGPP0UTgMLDeDQ77uprlsNxLSWFbc6r130G0tFAdyeougMK8835P\n M=",
        "X-Google-Smtp-Source": "\n AGHT+IGd9p+wIpYO2FNf9RpkE2fplKgpRbDwP6yPGd1okbF0rNZPsd4LqEOZrAEC+AMXtMwcEH7XGw==",
        "X-Received": "by 2002:a05:622a:107:b0:427:f034:b74 with SMTP id\n u7-20020a05622a010700b00427f0340b74mr69375qtw.73.1703650897804;\n Tue, 26 Dec 2023 20:21:37 -0800 (PST)",
        "From": "Ajit Khaparde <ajit.khaparde@broadcom.com>",
        "To": "dev@dpdk.org",
        "Cc": "Damodharam Ammepalli <damodharam.ammepalli@broadcom.com>",
        "Subject": "[PATCH v3 09/18] net/bnxt: extend RSS hash support for P7 devices",
        "Date": "Tue, 26 Dec 2023 20:21:10 -0800",
        "Message-Id": "<20231227042119.72469-10-ajit.khaparde@broadcom.com>",
        "X-Mailer": "git-send-email 2.39.2 (Apple Git-143)",
        "In-Reply-To": "<20231227042119.72469-1-ajit.khaparde@broadcom.com>",
        "References": "<20231227042119.72469-1-ajit.khaparde@broadcom.com>",
        "MIME-Version": "1.0",
        "Content-Type": "multipart/signed; protocol=\"application/pkcs7-signature\";\n micalg=sha-256; boundary=\"0000000000009d07b8060d7622a5\"",
        "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": "P7 adapters support XOR based and checksum based RSS hashing.\nAdd support for checksum and XOR based RSS hash for these adapters.\n\nSigned-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>\nReviewed-by: Damodharam Ammepalli <damodharam.ammepalli@broadcom.com>\n---\n drivers/net/bnxt/bnxt.h        |  15 +--\n drivers/net/bnxt/bnxt_ethdev.c |  72 ++++++---------\n drivers/net/bnxt/bnxt_flow.c   |  37 +++++++-\n drivers/net/bnxt/bnxt_hwrm.c   |   6 ++\n drivers/net/bnxt/bnxt_reps.c   |   2 +-\n drivers/net/bnxt/bnxt_vnic.c   | 161 +++++++++++++++++++++++++++++++--\n drivers/net/bnxt/bnxt_vnic.h   |  18 +++-\n 7 files changed, 242 insertions(+), 69 deletions(-)",
    "diff": "diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h\nindex cd85a944e8..e7b288c849 100644\n--- a/drivers/net/bnxt/bnxt.h\n+++ b/drivers/net/bnxt/bnxt.h\n@@ -638,15 +638,6 @@ struct bnxt_rep_info {\n #define BNXT_FW_STATUS_HEALTHY\t\t0x8000\n #define BNXT_FW_STATUS_SHUTDOWN\t\t0x100000\n \n-#define BNXT_ETH_RSS_SUPPORT (\t\\\n-\tRTE_ETH_RSS_IPV4 |\t\t\\\n-\tRTE_ETH_RSS_NONFRAG_IPV4_TCP |\t\\\n-\tRTE_ETH_RSS_NONFRAG_IPV4_UDP |\t\\\n-\tRTE_ETH_RSS_IPV6 |\t\t\\\n-\tRTE_ETH_RSS_NONFRAG_IPV6_TCP |\t\\\n-\tRTE_ETH_RSS_NONFRAG_IPV6_UDP |\t\\\n-\tRTE_ETH_RSS_LEVEL_MASK)\n-\n #define BNXT_HWRM_SHORT_REQ_LEN\t\tsizeof(struct hwrm_short_input)\n \n struct bnxt_flow_stat_info {\n@@ -815,7 +806,10 @@ struct bnxt {\n #define BNXT_VNIC_CAP_VLAN_RX_STRIP\tBIT(3)\n #define BNXT_RX_VLAN_STRIP_EN(bp)\t((bp)->vnic_cap_flags & BNXT_VNIC_CAP_VLAN_RX_STRIP)\n #define BNXT_VNIC_CAP_OUTER_RSS_TRUSTED_VF\tBIT(4)\n-#define BNXT_VNIC_CAP_L2_CQE_MODE\t\tBIT(8)\n+#define BNXT_VNIC_CAP_XOR_MODE\t\tBIT(5)\n+#define BNXT_VNIC_CAP_CHKSM_MODE\tBIT(6)\n+#define BNXT_VNIC_CAP_L2_CQE_MODE\tBIT(8)\n+\n \tunsigned int\t\trx_nr_rings;\n \tunsigned int\t\trx_cp_nr_rings;\n \tunsigned int\t\trx_num_qs_per_vnic;\n@@ -1176,4 +1170,5 @@ void bnxt_handle_vf_cfg_change(void *arg);\n int bnxt_flow_meter_ops_get(struct rte_eth_dev *eth_dev, void *arg);\n struct bnxt_vnic_info *bnxt_get_default_vnic(struct bnxt *bp);\n struct tf *bnxt_get_tfp_session(struct bnxt *bp, enum bnxt_session_type type);\n+uint64_t bnxt_eth_rss_support(struct bnxt *bp);\n #endif\ndiff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c\nindex 0f1c4326c4..ef5e65ff16 100644\n--- a/drivers/net/bnxt/bnxt_ethdev.c\n+++ b/drivers/net/bnxt/bnxt_ethdev.c\n@@ -982,6 +982,25 @@ uint32_t bnxt_get_speed_capabilities(struct bnxt *bp)\n \treturn speed_capa;\n }\n \n+uint64_t bnxt_eth_rss_support(struct bnxt *bp)\n+{\n+\tuint64_t support;\n+\n+\tsupport = RTE_ETH_RSS_IPV4 |\n+\t\t  RTE_ETH_RSS_NONFRAG_IPV4_TCP |\n+\t\t  RTE_ETH_RSS_NONFRAG_IPV4_UDP |\n+\t\t  RTE_ETH_RSS_IPV6 |\n+\t\t  RTE_ETH_RSS_NONFRAG_IPV6_TCP |\n+\t\t  RTE_ETH_RSS_NONFRAG_IPV6_UDP |\n+\t\t  RTE_ETH_RSS_LEVEL_MASK;\n+\n+\tif (bp->vnic_cap_flags & BNXT_VNIC_CAP_CHKSM_MODE)\n+\t\tsupport |= (RTE_ETH_RSS_IPV4_CHKSUM |\n+\t\t\t    RTE_ETH_RSS_L4_CHKSUM);\n+\n+\treturn support;\n+}\n+\n static int bnxt_dev_info_get_op(struct rte_eth_dev *eth_dev,\n \t\t\t\tstruct rte_eth_dev_info *dev_info)\n {\n@@ -1023,7 +1042,7 @@ static int bnxt_dev_info_get_op(struct rte_eth_dev *eth_dev,\n \tdev_info->tx_queue_offload_capa = RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE;\n \tdev_info->tx_offload_capa = bnxt_get_tx_port_offloads(bp) |\n \t\t\t\t    dev_info->tx_queue_offload_capa;\n-\tdev_info->flow_type_rss_offloads = BNXT_ETH_RSS_SUPPORT;\n+\tdev_info->flow_type_rss_offloads = bnxt_eth_rss_support(bp);\n \n \tdev_info->speed_capa = bnxt_get_speed_capabilities(bp);\n \tdev_info->dev_capa = RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP |\n@@ -2175,7 +2194,7 @@ static int bnxt_rss_hash_update_op(struct rte_eth_dev *eth_dev,\n \t\tif (!rss_conf->rss_hf)\n \t\t\tPMD_DRV_LOG(ERR, \"Hash type NONE\\n\");\n \t} else {\n-\t\tif (rss_conf->rss_hf & BNXT_ETH_RSS_SUPPORT)\n+\t\tif (rss_conf->rss_hf & bnxt_eth_rss_support(bp))\n \t\t\treturn -EINVAL;\n \t}\n \n@@ -2185,6 +2204,12 @@ static int bnxt_rss_hash_update_op(struct rte_eth_dev *eth_dev,\n \tvnic->hash_mode =\n \t\tbnxt_rte_to_hwrm_hash_level(bp, rss_conf->rss_hf,\n \t\t\t\t\t    RTE_ETH_RSS_LEVEL(rss_conf->rss_hf));\n+\trc = bnxt_rte_eth_to_hwrm_ring_select_mode(bp, rss_conf->rss_hf, vnic);\n+\tif (rc != 0)\n+\t\treturn rc;\n+\n+\t/* Cache the hash function */\n+\tbp->rss_conf.rss_hf = rss_conf->rss_hf;\n \n \t/* Cache the hash function */\n \tbp->rss_conf.rss_hf = rss_conf->rss_hf;\n@@ -2218,60 +2243,21 @@ static int bnxt_rss_hash_conf_get_op(struct rte_eth_dev *eth_dev,\n \tstruct bnxt *bp = eth_dev->data->dev_private;\n \tstruct bnxt_vnic_info *vnic = bnxt_get_default_vnic(bp);\n \tint len, rc;\n-\tuint32_t hash_types;\n \n \trc = is_bnxt_in_error(bp);\n \tif (rc)\n \t\treturn rc;\n \n-\t/* RSS configuration is the same for all VNICs */\n+\t/* Return the RSS configuration of the default VNIC. */\n \tif (vnic && vnic->rss_hash_key) {\n \t\tif (rss_conf->rss_key) {\n \t\t\tlen = rss_conf->rss_key_len <= HW_HASH_KEY_SIZE ?\n \t\t\t      rss_conf->rss_key_len : HW_HASH_KEY_SIZE;\n \t\t\tmemcpy(rss_conf->rss_key, vnic->rss_hash_key, len);\n \t\t}\n-\n-\t\thash_types = vnic->hash_type;\n-\t\trss_conf->rss_hf = 0;\n-\t\tif (hash_types & HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_IPV4) {\n-\t\t\trss_conf->rss_hf |= RTE_ETH_RSS_IPV4;\n-\t\t\thash_types &= ~HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_IPV4;\n-\t\t}\n-\t\tif (hash_types & HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_TCP_IPV4) {\n-\t\t\trss_conf->rss_hf |= RTE_ETH_RSS_NONFRAG_IPV4_TCP;\n-\t\t\thash_types &=\n-\t\t\t\t~HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_TCP_IPV4;\n-\t\t}\n-\t\tif (hash_types & HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_UDP_IPV4) {\n-\t\t\trss_conf->rss_hf |= RTE_ETH_RSS_NONFRAG_IPV4_UDP;\n-\t\t\thash_types &=\n-\t\t\t\t~HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_UDP_IPV4;\n-\t\t}\n-\t\tif (hash_types & HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_IPV6) {\n-\t\t\trss_conf->rss_hf |= RTE_ETH_RSS_IPV6;\n-\t\t\thash_types &= ~HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_IPV6;\n-\t\t}\n-\t\tif (hash_types & HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_TCP_IPV6) {\n-\t\t\trss_conf->rss_hf |= RTE_ETH_RSS_NONFRAG_IPV6_TCP;\n-\t\t\thash_types &=\n-\t\t\t\t~HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_TCP_IPV6;\n-\t\t}\n-\t\tif (hash_types & HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_UDP_IPV6) {\n-\t\t\trss_conf->rss_hf |= RTE_ETH_RSS_NONFRAG_IPV6_UDP;\n-\t\t\thash_types &=\n-\t\t\t\t~HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_UDP_IPV6;\n-\t\t}\n-\n+\t\tbnxt_hwrm_rss_to_rte_hash_conf(vnic, &rss_conf->rss_hf);\n \t\trss_conf->rss_hf |=\n \t\t\tbnxt_hwrm_to_rte_rss_level(bp, vnic->hash_mode);\n-\n-\t\tif (hash_types) {\n-\t\t\tPMD_DRV_LOG(ERR,\n-\t\t\t\t\"Unknown RSS config from firmware (%08x), RSS disabled\",\n-\t\t\t\tvnic->hash_type);\n-\t\t\treturn -ENOTSUP;\n-\t\t}\n \t} else {\n \t\trss_conf->rss_hf = 0;\n \t}\ndiff --git a/drivers/net/bnxt/bnxt_flow.c b/drivers/net/bnxt/bnxt_flow.c\nindex 15f0e1b308..2d707b48d2 100644\n--- a/drivers/net/bnxt/bnxt_flow.c\n+++ b/drivers/net/bnxt/bnxt_flow.c\n@@ -881,6 +881,7 @@ static void bnxt_vnic_cleanup(struct bnxt *bp, struct bnxt_vnic_info *vnic)\n \tvnic->fw_grp_ids = NULL;\n \n \tvnic->rx_queue_cnt = 0;\n+\tvnic->hash_type = 0;\n }\n \n static int bnxt_vnic_prep(struct bnxt *bp, struct bnxt_vnic_info *vnic,\n@@ -1067,7 +1068,7 @@ bnxt_vnic_rss_cfg_update(struct bnxt *bp,\n {\n \tconst struct rte_flow_action_rss *rss;\n \tunsigned int rss_idx, i, j, fw_idx;\n-\tuint16_t hash_type;\n+\tuint32_t hash_type;\n \tuint64_t types;\n \tint rc;\n \n@@ -1115,9 +1116,9 @@ bnxt_vnic_rss_cfg_update(struct bnxt *bp,\n \t\t}\n \t}\n \n-\t/* Currently only Toeplitz hash is supported. */\n-\tif (rss->func != RTE_ETH_HASH_FUNCTION_DEFAULT &&\n-\t    rss->func != RTE_ETH_HASH_FUNCTION_TOEPLITZ) {\n+\tif (BNXT_IS_HASH_FUNC_DEFAULT(rss->func) &&\n+\t    BNXT_IS_HASH_FUNC_TOEPLITZ(rss->func) &&\n+\t    BNXT_IS_HASH_FUNC_SIMPLE_XOR(bp, rss->func)) {\n \t\trte_flow_error_set(error,\n \t\t\t\t   ENOTSUP,\n \t\t\t\t   RTE_FLOW_ERROR_TYPE_ACTION,\n@@ -1175,6 +1176,34 @@ bnxt_vnic_rss_cfg_update(struct bnxt *bp,\n \tvnic->hash_mode =\n \t\tbnxt_rte_to_hwrm_hash_level(bp, rss->types, rss->level);\n \n+\t/* For P7 chips update the hash_type if hash_type not explicitly passed.\n+\t * TODO: For P5 chips.\n+\t */\n+\tif (BNXT_CHIP_P7(bp) &&\n+\t    vnic->hash_mode == BNXT_HASH_MODE_DEFAULT && !hash_type)\n+\t\tvnic->hash_type = HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_IPV4 |\n+\t\t\tHWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_IPV6;\n+\n+\t/* TODO:\n+\t * hash will be performed on the L3 and L4 packet headers.\n+\t * specific RSS hash types like IPv4-TCP etc... or L4-chksum or IPV4-chksum\n+\t * will NOT have any bearing and will not be honored.\n+\t * Check and reject flow create accordingly. TODO.\n+\t */\n+\n+\trc = bnxt_rte_flow_to_hwrm_ring_select_mode(rss->func,\n+\t\t\t\t\t\t    rss->types,\n+\t\t\t\t\t\t    bp, vnic);\n+\tif (rc) {\n+\t\trte_flow_error_set(error,\n+\t\t\t\t   ENOTSUP,\n+\t\t\t\t   RTE_FLOW_ERROR_TYPE_ACTION,\n+\t\t\t\t   act,\n+\t\t\t\t   \"Unsupported RSS hash parameters\");\n+\t\trc = -rte_errno;\n+\t\tgoto ret;\n+\t}\n+\n \t/* Update RSS key only if key_len != 0 */\n \tif (rss->key_len != 0)\n \t\tmemcpy(vnic->rss_hash_key, rss->key, rss->key_len);\ndiff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c\nindex d649f217ec..587433a878 100644\n--- a/drivers/net/bnxt/bnxt_hwrm.c\n+++ b/drivers/net/bnxt/bnxt_hwrm.c\n@@ -1025,6 +1025,12 @@ int bnxt_hwrm_vnic_qcaps(struct bnxt *bp)\n \t\tPMD_DRV_LOG(DEBUG, \"Rx VLAN strip capability enabled\\n\");\n \t}\n \n+\tif (flags & HWRM_VNIC_QCAPS_OUTPUT_FLAGS_RING_SELECT_MODE_XOR_CAP)\n+\t\tbp->vnic_cap_flags |= BNXT_VNIC_CAP_XOR_MODE;\n+\n+\tif (flags & HWRM_VNIC_QCAPS_OUTPUT_FLAGS_RING_SELECT_MODE_TOEPLITZ_CHKSM_CAP)\n+\t\tbp->vnic_cap_flags |= BNXT_VNIC_CAP_CHKSM_MODE;\n+\n \tbp->max_tpa_v2 = rte_le_to_cpu_16(resp->max_aggs_supported);\n \n \tHWRM_UNLOCK();\ndiff --git a/drivers/net/bnxt/bnxt_reps.c b/drivers/net/bnxt/bnxt_reps.c\nindex 78337431af..d96d972904 100644\n--- a/drivers/net/bnxt/bnxt_reps.c\n+++ b/drivers/net/bnxt/bnxt_reps.c\n@@ -569,7 +569,7 @@ int bnxt_rep_dev_info_get_op(struct rte_eth_dev *eth_dev,\n \n \tdev_info->rx_offload_capa = bnxt_get_rx_port_offloads(parent_bp);\n \tdev_info->tx_offload_capa = bnxt_get_tx_port_offloads(parent_bp);\n-\tdev_info->flow_type_rss_offloads = BNXT_ETH_RSS_SUPPORT;\n+\tdev_info->flow_type_rss_offloads = bnxt_eth_rss_support(parent_bp);\n \n \tdev_info->switch_info.name = eth_dev->device->name;\n \tdev_info->switch_info.domain_id = rep_bp->switch_domain_id;\ndiff --git a/drivers/net/bnxt/bnxt_vnic.c b/drivers/net/bnxt/bnxt_vnic.c\nindex bf93120d28..6a57f85ea7 100644\n--- a/drivers/net/bnxt/bnxt_vnic.c\n+++ b/drivers/net/bnxt/bnxt_vnic.c\n@@ -256,10 +256,15 @@ int bnxt_vnic_grp_alloc(struct bnxt *bp, struct bnxt_vnic_info *vnic)\n \treturn 0;\n }\n \n-uint16_t bnxt_rte_to_hwrm_hash_types(uint64_t rte_type)\n+uint32_t bnxt_rte_to_hwrm_hash_types(uint64_t rte_type)\n {\n-\tuint16_t hwrm_type = 0;\n+\tuint32_t hwrm_type = 0;\n \n+\tif (rte_type & RTE_ETH_RSS_IPV4_CHKSUM)\n+\t\thwrm_type |= HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_IPV4;\n+\tif (rte_type & RTE_ETH_RSS_L4_CHKSUM)\n+\t\thwrm_type |= HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_IPV4 |\n+\t\t\t     HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_IPV6;\n \tif ((rte_type & RTE_ETH_RSS_IPV4) ||\n \t    (rte_type & RTE_ETH_RSS_ECPRI))\n \t\thwrm_type |= HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_IPV4;\n@@ -273,6 +278,9 @@ uint16_t bnxt_rte_to_hwrm_hash_types(uint64_t rte_type)\n \t\thwrm_type |= HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_TCP_IPV6;\n \tif (rte_type & RTE_ETH_RSS_NONFRAG_IPV6_UDP)\n \t\thwrm_type |= HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_UDP_IPV6;\n+\tif (rte_type & RTE_ETH_RSS_IPV4_CHKSUM)\n+\t\thwrm_type |=\n+\t\t\tHWRM_VNIC_RSS_CFG_INPUT_RING_SELECT_MODE_TOEPLITZ_CHECKSUM;\n \n \treturn hwrm_type;\n }\n@@ -287,6 +295,8 @@ int bnxt_rte_to_hwrm_hash_level(struct bnxt *bp, uint64_t hash_f, uint32_t lvl)\n \t\t\t     RTE_ETH_RSS_NONFRAG_IPV6_TCP));\n \tbool l3_only = l3 && !l4;\n \tbool l3_and_l4 = l3 && l4;\n+\tbool cksum = !!(hash_f &\n+\t\t\t(RTE_ETH_RSS_IPV4_CHKSUM | RTE_ETH_RSS_L4_CHKSUM));\n \n \t/* If FW has not advertised capability to configure outer/inner\n \t * RSS hashing , just log a message. HW will work in default RSS mode.\n@@ -302,12 +312,12 @@ int bnxt_rte_to_hwrm_hash_level(struct bnxt *bp, uint64_t hash_f, uint32_t lvl)\n \tswitch (lvl) {\n \tcase BNXT_RSS_LEVEL_INNERMOST:\n \t\t/* Irrespective of what RTE says, FW always does 4 tuple */\n-\t\tif (l3_and_l4 || l4 || l3_only)\n+\t\tif (l3_and_l4 || l4 || l3_only || cksum)\n \t\t\tmode = BNXT_HASH_MODE_INNERMOST;\n \t\tbreak;\n \tcase BNXT_RSS_LEVEL_OUTERMOST:\n \t\t/* Irrespective of what RTE says, FW always does 4 tuple */\n-\t\tif (l3_and_l4 || l4 || l3_only)\n+\t\tif (l3_and_l4 || l4 || l3_only || cksum)\n \t\t\tmode = BNXT_HASH_MODE_OUTERMOST;\n \t\tbreak;\n \tdefault:\n@@ -733,6 +743,16 @@ bnxt_vnic_rss_create(struct bnxt *bp,\n \t\tgoto fail_cleanup;\n \t}\n \n+\t/* Remove unsupported types */\n+\trss_info->rss_types &= bnxt_eth_rss_support(bp);\n+\n+\t/* If only unsupported type(s) are specified then quit */\n+\tif (rss_info->rss_types == 0) {\n+\t\tPMD_DRV_LOG(ERR,\n+\t\t\t    \"Unsupported RSS hash type(s)\\n\");\n+\t\tgoto fail_cleanup;\n+\t}\n+\n \t/* hwrm_type conversion */\n \tvnic->hash_type = bnxt_rte_to_hwrm_hash_types(rss_info->rss_types);\n \tvnic->hash_mode = bnxt_rte_to_hwrm_hash_level(bp, rss_info->rss_types,\n@@ -803,9 +823,11 @@ bnxt_vnic_rss_hash_algo_update(struct bnxt *bp,\n \t\t\t       struct bnxt_vnic_rss_info *rss_info)\n {\n \tuint8_t old_rss_hash_key[HW_HASH_KEY_SIZE] = { 0 };\n-\tuint16_t\thash_type;\n-\tuint8_t\t\thash_mode;\n+\tuint32_t hash_type;\n+\tuint8_t hash_mode;\n+\tuint8_t ring_mode;\n \tuint32_t apply = 0;\n+\tint rc;\n \n \t/* validate key length */\n \tif (rss_info->key_len != 0 && rss_info->key_len != HW_HASH_KEY_SIZE) {\n@@ -815,12 +837,40 @@ bnxt_vnic_rss_hash_algo_update(struct bnxt *bp,\n \t\treturn -EINVAL;\n \t}\n \n+\t/* Remove unsupported types */\n+\trss_info->rss_types &= bnxt_eth_rss_support(bp);\n+\n+\t/* If only unsupported type(s) are specified then quit */\n+\tif (!rss_info->rss_types) {\n+\t\tPMD_DRV_LOG(ERR,\n+\t\t\t    \"Unsupported RSS hash type\\n\");\n+\t\treturn -EINVAL;\n+\t}\n+\n \t/* hwrm_type conversion */\n \thash_type = bnxt_rte_to_hwrm_hash_types(rss_info->rss_types);\n \thash_mode = bnxt_rte_to_hwrm_hash_level(bp, rss_info->rss_types,\n \t\t\t\t\t\trss_info->rss_level);\n+\tring_mode = vnic->ring_select_mode;\n+\n+\t/* For P7 chips update the hash_type if hash_type not explicitly passed.\n+\t * TODO: For P5 chips.\n+\t */\n+\tif (BNXT_CHIP_P7(bp) &&\n+\t    hash_mode == BNXT_HASH_MODE_DEFAULT && !hash_type)\n+\t\tvnic->hash_type = HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_IPV4 |\n+\t\t\tHWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_IPV6;\n+\n+\trc = bnxt_rte_flow_to_hwrm_ring_select_mode(rss_info->rss_func,\n+\t\t\t\t\t\t    rss_info->rss_types,\n+\t\t\t\t\t\t    bp,\n+\t\t\t\t\t\t    vnic);\n+\tif (rc)\n+\t\treturn -EINVAL;\n+\n \tif (vnic->hash_mode != hash_mode ||\n-\t    vnic->hash_type != hash_type) {\n+\t    vnic->hash_type != hash_type ||\n+\t    vnic->ring_select_mode != ring_mode) {\n \t\tapply = 1;\n \t\tvnic->hash_mode = hash_mode;\n \t\tvnic->hash_type = hash_type;\n@@ -839,10 +889,10 @@ bnxt_vnic_rss_hash_algo_update(struct bnxt *bp,\n \tif (apply) {\n \t\tif (bnxt_hwrm_vnic_rss_cfg(bp, vnic)) {\n \t\t\tmemcpy(vnic->rss_hash_key, old_rss_hash_key, HW_HASH_KEY_SIZE);\n-\t\t\tBNXT_TF_DBG(ERR, \"Error configuring vnic RSS config\\n\");\n+\t\t\tPMD_DRV_LOG(ERR, \"Error configuring vnic RSS config\\n\");\n \t\t\treturn -EINVAL;\n \t\t}\n-\t\tBNXT_TF_DBG(INFO, \"Rss config successfully applied\\n\");\n+\t\tPMD_DRV_LOG(INFO, \"Rss config successfully applied\\n\");\n \t}\n \treturn 0;\n }\n@@ -1245,3 +1295,96 @@ bnxt_get_default_vnic(struct bnxt *bp)\n {\n \treturn &bp->vnic_info[bp->vnic_queue_db.dflt_vnic_id];\n }\n+\n+uint8_t _bnxt_rte_to_hwrm_ring_select_mode(enum rte_eth_hash_function hash_f)\n+{\n+\t/* If RTE_ETH_HASH_FUNCTION_DEFAULT || RTE_ETH_HASH_FUNCTION_TOEPLITZ */\n+\tuint8_t mode = HWRM_VNIC_RSS_CFG_INPUT_RING_SELECT_MODE_TOEPLITZ;\n+\n+\tif (hash_f == RTE_ETH_HASH_FUNCTION_SIMPLE_XOR)\n+\t\tmode = HWRM_VNIC_RSS_CFG_INPUT_RING_SELECT_MODE_XOR;\n+\n+\treturn mode;\n+}\n+\n+int bnxt_rte_flow_to_hwrm_ring_select_mode(enum rte_eth_hash_function hash_f,\n+\t\t\t\t\t   uint64_t types, struct bnxt *bp,\n+\t\t\t\t\t   struct bnxt_vnic_info *vnic)\n+{\n+\tif (hash_f != RTE_ETH_HASH_FUNCTION_TOEPLITZ &&\n+\t    hash_f != RTE_ETH_HASH_FUNCTION_DEFAULT) {\n+\t\tif (hash_f == RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ ||\n+\t\t    (!BNXT_CHIP_P7(bp) && hash_f == RTE_ETH_HASH_FUNCTION_SIMPLE_XOR)) {\n+\t\t\tPMD_DRV_LOG(ERR, \"Unsupported hash function\\n\");\n+\t\t\treturn -ENOTSUP;\n+\t\t}\n+\t}\n+\n+\tif (types & RTE_ETH_RSS_IPV4_CHKSUM || types & RTE_ETH_RSS_L4_CHKSUM) {\n+\t\tif ((bp->vnic_cap_flags & BNXT_VNIC_CAP_CHKSM_MODE) &&\n+\t\t\t(hash_f == RTE_ETH_HASH_FUNCTION_DEFAULT ||\n+\t\t\t hash_f == RTE_ETH_HASH_FUNCTION_TOEPLITZ)) {\n+\t\t\t/* Checksum mode cannot with hash func makes no sense */\n+\t\t\tvnic->ring_select_mode =\n+\t\t\t\tHWRM_VNIC_RSS_CFG_INPUT_RING_SELECT_MODE_TOEPLITZ_CHECKSUM;\n+\t\t\t/* shadow copy types as !hash_f is always true with default func */\n+\t\t\treturn 0;\n+\t\t}\n+\t\tPMD_DRV_LOG(ERR, \"Hash function not supported with checksun type\\n\");\n+\t\treturn -ENOTSUP;\n+\t}\n+\n+\tvnic->ring_select_mode = _bnxt_rte_to_hwrm_ring_select_mode(hash_f);\n+\treturn 0;\n+}\n+\n+int bnxt_rte_eth_to_hwrm_ring_select_mode(struct bnxt *bp, uint64_t types,\n+\t\t\t\t\t  struct bnxt_vnic_info *vnic)\n+{\n+\t/* If the config update comes via ethdev, there is no way to\n+\t * specify anything for hash function.\n+\t * So its either TOEPLITZ or the Checksum mode.\n+\t * Note that checksum mode is not supported on older devices.\n+\t */\n+\tif (types == RTE_ETH_RSS_IPV4_CHKSUM) {\n+\t\tif (bp->vnic_cap_flags & BNXT_VNIC_CAP_CHKSM_MODE)\n+\t\t\tvnic->ring_select_mode =\n+\t\t\tHWRM_VNIC_RSS_CFG_INPUT_RING_SELECT_MODE_TOEPLITZ_CHECKSUM;\n+\t\telse\n+\t\t\treturn -ENOTSUP;\n+\t}\n+\n+\t/* Older devices can support TOEPLITZ only.\n+\t * Thor2 supports other hash functions, but can't change using this path.\n+\t */\n+\tvnic->ring_select_mode =\n+\t\tHWRM_VNIC_RSS_CFG_INPUT_RING_SELECT_MODE_TOEPLITZ;\n+\treturn 0;\n+}\n+\n+void bnxt_hwrm_rss_to_rte_hash_conf(struct bnxt_vnic_info *vnic,\n+\t\t\t\t    uint64_t *rss_conf)\n+{\n+\tuint32_t hash_types;\n+\n+\thash_types = vnic->hash_type;\n+\t*rss_conf = 0;\n+\tif (hash_types & HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_IPV4)\n+\t\t*rss_conf |= RTE_ETH_RSS_IPV4;\n+\tif (hash_types & HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_TCP_IPV4)\n+\t\t*rss_conf |= RTE_ETH_RSS_NONFRAG_IPV4_TCP;\n+\tif (hash_types & HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_UDP_IPV4)\n+\t\t*rss_conf |= RTE_ETH_RSS_NONFRAG_IPV4_UDP;\n+\tif (hash_types & HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_IPV6)\n+\t\t*rss_conf |= RTE_ETH_RSS_IPV6;\n+\tif (hash_types & HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_TCP_IPV6)\n+\t\t*rss_conf |= RTE_ETH_RSS_NONFRAG_IPV6_TCP;\n+\tif (hash_types & HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_UDP_IPV6)\n+\t\t*rss_conf |= RTE_ETH_RSS_NONFRAG_IPV6_UDP;\n+\tif (hash_types & HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_AH_SPI_IPV6 ||\n+\t    hash_types & HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_AH_SPI_IPV4)\n+\t\t*rss_conf |= RTE_ETH_RSS_AH;\n+\tif (hash_types & HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_ESP_SPI_IPV6 ||\n+\t    hash_types & HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_ESP_SPI_IPV4)\n+\t\t*rss_conf |= RTE_ETH_RSS_ESP;\n+}\ndiff --git a/drivers/net/bnxt/bnxt_vnic.h b/drivers/net/bnxt/bnxt_vnic.h\nindex 7a6a0aa739..d01c9ebdb4 100644\n--- a/drivers/net/bnxt/bnxt_vnic.h\n+++ b/drivers/net/bnxt/bnxt_vnic.h\n@@ -31,6 +31,11 @@\n \t (BNXT_VF(bp) && BNXT_VF_IS_TRUSTED(bp) &&\t\t\t\t\\\n \t  !((bp)->vnic_cap_flags & BNXT_VNIC_CAP_OUTER_RSS_TRUSTED_VF)) ||\t\\\n \t (BNXT_VF(bp) && !BNXT_VF_IS_TRUSTED(bp)))\n+#define BNXT_IS_HASH_FUNC_DEFAULT(f)\t((f) != RTE_ETH_HASH_FUNCTION_DEFAULT)\n+#define BNXT_IS_HASH_FUNC_TOEPLITZ(f)\t((f) != RTE_ETH_HASH_FUNCTION_TOEPLITZ)\n+#define BNXT_IS_HASH_FUNC_SIMPLE_XOR(b, f)\t\\\n+\t((b)->vnic_cap_flags & BNXT_VNIC_CAP_XOR_MODE && \\\n+\t ((f) != RTE_ETH_HASH_FUNCTION_SIMPLE_XOR))\n \n struct bnxt_vnic_info {\n \tSTAILQ_ENTRY(bnxt_vnic_info)\tnext;\n@@ -73,6 +78,7 @@ struct bnxt_vnic_info {\n \n \tSTAILQ_HEAD(, bnxt_filter_info)\tfilter;\n \tSTAILQ_HEAD(, rte_flow)\tflow_list;\n+\tuint8_t\t\tring_select_mode;\n };\n \n struct bnxt_vnic_queue_db {\n@@ -83,6 +89,7 @@ struct bnxt_vnic_queue_db {\n \n /* RSS structure to pass values as an structure argument*/\n struct bnxt_vnic_rss_info {\n+\tuint32_t rss_func;\n \tuint32_t rss_level;\n \tuint64_t rss_types;\n \tuint32_t key_len; /**< Hash key length in bytes. */\n@@ -102,7 +109,7 @@ void bnxt_free_vnic_mem(struct bnxt *bp);\n int bnxt_alloc_vnic_mem(struct bnxt *bp);\n int bnxt_vnic_grp_alloc(struct bnxt *bp, struct bnxt_vnic_info *vnic);\n void bnxt_prandom_bytes(void *dest_ptr, size_t len);\n-uint16_t bnxt_rte_to_hwrm_hash_types(uint64_t rte_type);\n+uint32_t bnxt_rte_to_hwrm_hash_types(uint64_t rte_type);\n int bnxt_rte_to_hwrm_hash_level(struct bnxt *bp, uint64_t hash_f, uint32_t lvl);\n uint64_t bnxt_hwrm_to_rte_rss_level(struct bnxt *bp, uint32_t mode);\n \n@@ -139,5 +146,12 @@ struct bnxt_vnic_info *\n bnxt_vnic_queue_id_get_next(struct bnxt *bp, uint16_t queue_id,\n \t\t\t    uint16_t *vnic_idx);\n void bnxt_vnic_tpa_cfg(struct bnxt *bp, uint16_t queue_id, bool flag);\n-\n+uint8_t _bnxt_rte_to_hwrm_ring_select_mode(enum rte_eth_hash_function hash_f);\n+int bnxt_rte_flow_to_hwrm_ring_select_mode(enum rte_eth_hash_function hash_f,\n+\t\t\t\t\t   uint64_t types, struct bnxt *bp,\n+\t\t\t\t\t   struct bnxt_vnic_info *vnic);\n+int bnxt_rte_eth_to_hwrm_ring_select_mode(struct bnxt *bp, uint64_t types,\n+\t\t\t\t\t  struct bnxt_vnic_info *vnic);\n+void bnxt_hwrm_rss_to_rte_hash_conf(struct bnxt_vnic_info *vnic,\n+\t\t\t\t    uint64_t *rss_conf);\n #endif\n",
    "prefixes": [
        "v3",
        "09/18"
    ]
}