get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 58426,
    "url": "http://patches.dpdk.org/api/patches/58426/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20190903021901.25895-5-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": "<20190903021901.25895-5-ajit.khaparde@broadcom.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20190903021901.25895-5-ajit.khaparde@broadcom.com",
    "date": "2019-09-03T02:18:48",
    "name": "[04/17] net/bnxt: add support to create SMAC and inner DMAC filters",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "cbb1d77aefc7fe8e0cb436e0debbecd9d4247218",
    "submitter": {
        "id": 501,
        "url": "http://patches.dpdk.org/api/people/501/?format=api",
        "name": "Ajit Khaparde",
        "email": "ajit.khaparde@broadcom.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20190903021901.25895-5-ajit.khaparde@broadcom.com/mbox/",
    "series": [
        {
            "id": 6209,
            "url": "http://patches.dpdk.org/api/series/6209/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=6209",
            "date": "2019-09-03T02:18:44",
            "name": "bnxt patchset to improve rte flow support",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/6209/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/58426/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/58426/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id B825A1EAAA;\n\tTue,  3 Sep 2019 04:19:20 +0200 (CEST)",
            "from rnd-relay.smtp.broadcom.com (rnd-relay.smtp.broadcom.com\n\t[192.19.229.170]) by dpdk.org (Postfix) with ESMTP id C13852B94\n\tfor <dev@dpdk.org>; Tue,  3 Sep 2019 04:19:07 +0200 (CEST)",
            "from nis-sj1-27.broadcom.com (nis-sj1-27.lvn.broadcom.net\n\t[10.75.144.136])\n\tby rnd-relay.smtp.broadcom.com (Postfix) with ESMTP id 45D3830C1FB;\n\tMon,  2 Sep 2019 19:19:00 -0700 (PDT)",
            "from localhost.localdomain (unknown [10.230.30.225])\n\tby nis-sj1-27.broadcom.com (Postfix) with ESMTP id A1CB7AC078A;\n\tMon,  2 Sep 2019 19:19:06 -0700 (PDT)"
        ],
        "DKIM-Filter": "OpenDKIM Filter v2.10.3 rnd-relay.smtp.broadcom.com 45D3830C1FB",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com;\n\ts=dkimrelay; t=1567477140;\n\tbh=dn93HtJKdON1iUuiU5KEZtUpWtmFoKmWHMkI8RPimk0=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=bjZTIK+gjLUo2leuKhhD4IU9o4gkbONe2uvBsOoVuuETGyqLQpBsYwwQUyJxgahjx\n\t4UQ5kdKtYPzKMUhqnZn08J1k3Hc1T9QFXc0r5GmZp8FQuUIvVBt7QyOsk52PtcST/i\n\t18bo9uwZFXYqslwF8PwHJ0qvW0grMkZVvmQQDwtA=",
        "From": "Ajit Khaparde <ajit.khaparde@broadcom.com>",
        "To": "dev@dpdk.org",
        "Cc": "ferruh.yigit@intel.com, Somnath Kotur <somnath.kotur@broadcom.com>,\n\tRahul Gupta <rahul.gupta@broadcom.com>",
        "Date": "Mon,  2 Sep 2019 19:18:48 -0700",
        "Message-Id": "<20190903021901.25895-5-ajit.khaparde@broadcom.com>",
        "X-Mailer": "git-send-email 2.20.1 (Apple Git-117)",
        "In-Reply-To": "<20190903021901.25895-1-ajit.khaparde@broadcom.com>",
        "References": "<20190903021901.25895-1-ajit.khaparde@broadcom.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH 04/17] net/bnxt: add support to create SMAC and\n\tinner DMAC filters",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n\t<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\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "We are currently creating only outer DMAC filters.\nCreate SMAC and inner DMAC filters using HWRM_CFA_L2_FILTER_ALLOC.\nFor this the HWRM_CFA_L2_FILTER_ALLOC has already been updated.\n\nReviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>\nReviewed-by: Rahul Gupta <rahul.gupta@broadcom.com>\nSigned-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>\n---\n drivers/net/bnxt/bnxt.h        |  4 ++\n drivers/net/bnxt/bnxt_ethdev.c |  9 +++-\n drivers/net/bnxt/bnxt_filter.h |  8 +++\n drivers/net/bnxt/bnxt_flow.c   | 90 ++++++++++++++++++++++++++++------\n drivers/net/bnxt/bnxt_hwrm.c   | 44 ++++++++++++++++-\n drivers/net/bnxt/bnxt_hwrm.h   |  4 ++\n drivers/net/bnxt/bnxt_util.h   |  4 ++\n 7 files changed, 146 insertions(+), 17 deletions(-)",
    "diff": "diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h\nindex f0b1021cd..64cc06304 100644\n--- a/drivers/net/bnxt/bnxt.h\n+++ b/drivers/net/bnxt/bnxt.h\n@@ -445,6 +445,7 @@ struct bnxt {\n #define BNXT_FLAG_NEW_RM\t\t\tBIT(21)\n #define BNXT_FLAG_INIT_DONE\t\t\tBIT(22)\n #define BNXT_FLAG_FW_CAP_ERR_RECOVER_RELOAD\tBIT(23)\n+#define BNXT_FLAG_ADV_FLOW_MGMT\t\t\tBIT(24)\n #define BNXT_PF(bp)\t\t(!((bp)->flags & BNXT_FLAG_VF))\n #define BNXT_VF(bp)\t\t((bp)->flags & BNXT_FLAG_VF)\n #define BNXT_NPAR(bp)\t\t((bp)->port_partition_type)\n@@ -458,6 +459,9 @@ struct bnxt {\n #define BNXT_HAS_NQ(bp)\t\tBNXT_CHIP_THOR(bp)\n #define BNXT_HAS_RING_GRPS(bp)\t(!BNXT_CHIP_THOR(bp))\n \n+\tuint32_t\t\tflow_flags;\n+#define BNXT_FLOW_FLAG_L2_HDR_SRC_FILTER_EN\tBIT(0)\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;\ndiff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c\nindex 0c605202c..b72466467 100644\n--- a/drivers/net/bnxt/bnxt_ethdev.c\n+++ b/drivers/net/bnxt/bnxt_ethdev.c\n@@ -1006,6 +1006,7 @@ static int bnxt_mac_addr_add_op(struct rte_eth_dev *eth_dev,\n \n \tfilter->mac_index = index;\n \tmemcpy(filter->l2_addr, mac_addr, RTE_ETHER_ADDR_LEN);\n+\tfilter->flags |= HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_OUTERMOST;\n \n \trc = bnxt_hwrm_set_l2_filter(bp, vnic->fw_vnic_id, filter);\n \tif (!rc) {\n@@ -1674,6 +1675,7 @@ static int bnxt_add_vlan_filter(struct bnxt *bp, uint16_t vlan_id)\n \tfilter->l2_ivlan = vlan_id;\n \tfilter->l2_ivlan_mask = 0x0FFF;\n \tfilter->enables |= en;\n+\tfilter->flags |= HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_OUTERMOST;\n \trc = bnxt_hwrm_set_l2_filter(bp, vnic->fw_vnic_id, filter);\n \tif (rc) {\n \t\t/* Free the newly allocated filter as we were\n@@ -1777,7 +1779,8 @@ bnxt_set_default_mac_addr_op(struct rte_eth_dev *dev,\n \n \t\tmemcpy(filter->l2_addr, bp->mac_addr, RTE_ETHER_ADDR_LEN);\n \t\tmemset(filter->l2_addr_mask, 0xff, RTE_ETHER_ADDR_LEN);\n-\t\tfilter->flags |= HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_PATH_RX;\n+\t\tfilter->flags |= HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_PATH_RX |\n+\t\t\tHWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_OUTERMOST;\n \t\tfilter->enables |=\n \t\t\tHWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_ADDR |\n \t\t\tHWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_ADDR_MASK;\n@@ -4253,6 +4256,10 @@ static int bnxt_init_fw(struct bnxt *bp)\n \tif (rc)\n \t\treturn -EIO;\n \n+\trc = bnxt_hwrm_cfa_adv_flow_mgmt_qcaps(bp);\n+\tif (rc)\n+\t\treturn rc;\n+\n \trc = bnxt_hwrm_queue_qportcfg(bp);\n \tif (rc)\n \t\treturn rc;\ndiff --git a/drivers/net/bnxt/bnxt_filter.h b/drivers/net/bnxt/bnxt_filter.h\nindex 4fda3f03a..52d3582ba 100644\n--- a/drivers/net/bnxt/bnxt_filter.h\n+++ b/drivers/net/bnxt/bnxt_filter.h\n@@ -9,6 +9,13 @@\n #include <rte_ether.h>\n \n struct bnxt;\n+\n+#define BNXT_FLOW_L2_VALID_FLAG\t\t\tBIT(0)\n+#define BNXT_FLOW_L2_SRC_VALID_FLAG\t\tBIT(1)\n+#define BNXT_FLOW_L2_INNER_SRC_VALID_FLAG\tBIT(2)\n+#define BNXT_FLOW_L2_DST_VALID_FLAG\t\tBIT(3)\n+#define BNXT_FLOW_L2_INNER_DST_VALID_FLAG\tBIT(4)\n+\n struct bnxt_filter_info {\n \tSTAILQ_ENTRY(bnxt_filter_info)\tnext;\n \tuint64_t\t\tfw_l2_filter_id;\n@@ -28,6 +35,7 @@ struct bnxt_filter_info {\n \tuint32_t\t\tenables;\n \tuint8_t\t\t\tl2_addr[RTE_ETHER_ADDR_LEN];\n \tuint8_t\t\t\tl2_addr_mask[RTE_ETHER_ADDR_LEN];\n+\tuint32_t\t\tvalid_flags;\n \tuint16_t\t\tl2_ovlan;\n \tuint16_t\t\tl2_ovlan_mask;\n \tuint16_t\t\tl2_ivlan;\ndiff --git a/drivers/net/bnxt/bnxt_flow.c b/drivers/net/bnxt/bnxt_flow.c\nindex 9f8894c7c..4ba280fff 100644\n--- a/drivers/net/bnxt/bnxt_flow.c\n+++ b/drivers/net/bnxt/bnxt_flow.c\n@@ -86,8 +86,9 @@ bnxt_filter_type_check(const struct rte_flow_item pattern[],\n \n \twhile (item->type != RTE_FLOW_ITEM_TYPE_END) {\n \t\tswitch (item->type) {\n+\t\tcase RTE_FLOW_ITEM_TYPE_ANY:\n \t\tcase RTE_FLOW_ITEM_TYPE_ETH:\n-\t\t\tuse_ntuple = 1;\n+\t\t\tuse_ntuple = 0;\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ITEM_TYPE_VLAN:\n \t\t\tuse_ntuple = 0;\n@@ -111,9 +112,6 @@ bnxt_filter_type_check(const struct rte_flow_item pattern[],\n \t\t\t}\n \t\t\tuse_ntuple |= 1;\n \t\t\tbreak;\n-\t\tcase RTE_FLOW_ITEM_TYPE_ANY:\n-\t\t\tuse_ntuple = 0;\n-\t\t\tbreak;\n \t\tdefault:\n \t\t\tPMD_DRV_LOG(DEBUG, \"Unknown Flow type\\n\");\n \t\t\tuse_ntuple |= 0;\n@@ -146,13 +144,14 @@ bnxt_validate_and_parse_flow_type(struct bnxt *bp,\n \tuint8_t vni_mask[] = {0xFF, 0xFF, 0xFF};\n \tuint8_t tni_mask[] = {0xFF, 0xFF, 0xFF};\n \tconst struct rte_flow_item_vf *vf_spec;\n-\tuint32_t tenant_id_be = 0;\n+\tuint32_t tenant_id_be = 0, valid_flags = 0;\n \tbool vni_masked = 0;\n \tbool tni_masked = 0;\n+\tuint32_t en_ethertype;\n+\tuint8_t inner = 0;\n \tuint32_t vf = 0;\n-\tint use_ntuple;\n \tuint32_t en = 0;\n-\tuint32_t en_ethertype;\n+\tint use_ntuple;\n \tint dflt_vnic;\n \n \tuse_ntuple = bnxt_filter_type_check(pattern, error);\n@@ -177,6 +176,12 @@ bnxt_validate_and_parse_flow_type(struct bnxt *bp,\n \t\t}\n \n \t\tswitch (item->type) {\n+\t\tcase RTE_FLOW_ITEM_TYPE_ANY:\n+\t\t\tinner =\n+\t\t\t((const struct rte_flow_item_any *)item->spec)->num > 3;\n+\t\t\tif (inner)\n+\t\t\t\tPMD_DRV_LOG(DEBUG, \"Parse inner header\\n\");\n+\t\t\tbreak;\n \t\tcase RTE_FLOW_ITEM_TYPE_ETH:\n \t\t\tif (!item->spec || !item->mask)\n \t\t\t\tbreak;\n@@ -213,18 +218,24 @@ bnxt_validate_and_parse_flow_type(struct bnxt *bp,\n \n \t\t\tif (rte_is_broadcast_ether_addr(&eth_mask->dst)) {\n \t\t\t\trte_memcpy(filter->dst_macaddr,\n-\t\t\t\t\t   &eth_spec->dst, 6);\n+\t\t\t\t\t   &eth_spec->dst, RTE_ETHER_ADDR_LEN);\n \t\t\t\ten |= use_ntuple ?\n \t\t\t\t\tNTUPLE_FLTR_ALLOC_INPUT_EN_DST_MACADDR :\n \t\t\t\t\tEM_FLOW_ALLOC_INPUT_EN_DST_MACADDR;\n+\t\t\t\tvalid_flags |= inner ?\n+\t\t\t\t\tBNXT_FLOW_L2_INNER_DST_VALID_FLAG :\n+\t\t\t\t\tBNXT_FLOW_L2_DST_VALID_FLAG;\n \t\t\t}\n \n \t\t\tif (rte_is_broadcast_ether_addr(&eth_mask->src)) {\n \t\t\t\trte_memcpy(filter->src_macaddr,\n-\t\t\t\t\t   &eth_spec->src, 6);\n+\t\t\t\t\t   &eth_spec->src, RTE_ETHER_ADDR_LEN);\n \t\t\t\ten |= use_ntuple ?\n \t\t\t\t\tNTUPLE_FLTR_ALLOC_INPUT_EN_SRC_MACADDR :\n \t\t\t\t\tEM_FLOW_ALLOC_INPUT_EN_SRC_MACADDR;\n+\t\t\t\tvalid_flags |= inner ?\n+\t\t\t\t\tBNXT_FLOW_L2_INNER_SRC_VALID_FLAG :\n+\t\t\t\t\tBNXT_FLOW_L2_SRC_VALID_FLAG;\n \t\t\t} /*\n \t\t\t   * else {\n \t\t\t   *  PMD_DRV_LOG(ERR, \"Handle this condition\\n\");\n@@ -669,6 +680,7 @@ bnxt_validate_and_parse_flow_type(struct bnxt *bp,\n \t\titem++;\n \t}\n \tfilter->enables = en;\n+\tfilter->valid_flags = valid_flags;\n \n \treturn 0;\n }\n@@ -725,16 +737,44 @@ bnxt_get_l2_filter(struct bnxt *bp, struct bnxt_filter_info *nf,\n \tif (memcmp(f0->l2_addr, nf->dst_macaddr, RTE_ETHER_ADDR_LEN) == 0)\n \t\treturn f0;\n \n-\t/* This flow needs DST MAC which is not same as port/l2 */\n-\tPMD_DRV_LOG(DEBUG, \"Create L2 filter for DST MAC\\n\");\n+\t/* Alloc new L2 filter.\n+\t * This flow needs MAC filter which does not match port/l2 MAC.\n+\t */\n \tfilter1 = bnxt_get_unused_filter(bp);\n \tif (filter1 == NULL)\n \t\treturn NULL;\n \n-\tfilter1->flags = HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_PATH_RX;\n+\tfilter1->flags = HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_XDP_DISABLE;\n+\tfilter1->flags |= HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_PATH_RX;\n+\tif (nf->valid_flags & BNXT_FLOW_L2_SRC_VALID_FLAG ||\n+\t    nf->valid_flags & BNXT_FLOW_L2_DST_VALID_FLAG) {\n+\t\tfilter1->flags |=\n+\t\t\tHWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_OUTERMOST;\n+\t\tPMD_DRV_LOG(DEBUG, \"Create Outer filter\\n\");\n+\t}\n+\n+\tif (nf->valid_flags & BNXT_FLOW_L2_SRC_VALID_FLAG ||\n+\t    nf->valid_flags & BNXT_FLOW_L2_INNER_SRC_VALID_FLAG) {\n+\t\tPMD_DRV_LOG(DEBUG, \"Create L2 filter for SRC MAC\\n\");\n+\t\tfilter1->flags |=\n+\t\t\tHWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_SOURCE_VALID;\n+\t\tmemcpy(filter1->l2_addr, nf->src_macaddr, RTE_ETHER_ADDR_LEN);\n+\t} else {\n+\t\tPMD_DRV_LOG(DEBUG, \"Create L2 filter for DST MAC\\n\");\n+\t\tmemcpy(filter1->l2_addr, nf->dst_macaddr, RTE_ETHER_ADDR_LEN);\n+\t}\n+\n+\tif (nf->valid_flags & BNXT_FLOW_L2_DST_VALID_FLAG ||\n+\t    nf->valid_flags & BNXT_FLOW_L2_INNER_DST_VALID_FLAG) {\n+\t\t/* Tell the FW where to place the filter in the table. */\n+\t\tfilter1->pri_hint =\n+\t\t\tHWRM_CFA_L2_FILTER_ALLOC_INPUT_PRI_HINT_BELOW_FILTER;\n+\t\t/* This will place the filter in TCAM */\n+\t\tfilter1->l2_filter_id_hint = (uint64_t)-1;\n+\t}\n+\n \tfilter1->enables = HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_ADDR |\n \t\t\tL2_FILTER_ALLOC_INPUT_EN_L2_ADDR_MASK;\n-\tmemcpy(filter1->l2_addr, nf->dst_macaddr, RTE_ETHER_ADDR_LEN);\n \tmemset(filter1->l2_addr_mask, 0xff, RTE_ETHER_ADDR_LEN);\n \trc = bnxt_hwrm_set_l2_filter(bp, vnic->fw_vnic_id,\n \t\t\t\t     filter1);\n@@ -843,6 +883,7 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev,\n \t\t\tPMD_DRV_LOG(DEBUG, \"Group id is 0\\n\");\n \t\t\tvnic_id = act_q->index;\n \t\t}\n+\t\tPMD_DRV_LOG(DEBUG, \"VNIC found\\n\");\n \n \t\tvnic = &bp->vnic_info[vnic_id];\n \t\tif (vnic == NULL) {\n@@ -917,8 +958,20 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev,\n \t\t\tgoto ret;\n \t\t}\n \n+\t\tif (!(filter->valid_flags &\n+\t\t      ~(BNXT_FLOW_L2_DST_VALID_FLAG |\n+\t\t\tBNXT_FLOW_L2_SRC_VALID_FLAG |\n+\t\t\tBNXT_FLOW_L2_INNER_SRC_VALID_FLAG |\n+\t\t\tBNXT_FLOW_L2_INNER_DST_VALID_FLAG))) {\n+\t\t\tPMD_DRV_LOG(DEBUG, \"L2 filter created\\n\");\n+\t\t\tfilter->flags = filter1->flags;\n+\t\t\tfilter->enables = filter1->enables;\n+\t\t\tfilter->filter_type = HWRM_CFA_L2_FILTER;\n+\t\t\tmemset(filter->l2_addr_mask, 0xff, RTE_ETHER_ADDR_LEN);\n+\t\t\tfilter->pri_hint = filter1->pri_hint;\n+\t\t\tfilter->l2_filter_id_hint = filter1->l2_filter_id_hint;\n+\t\t}\n \t\tfilter->fw_l2_filter_id = filter1->fw_l2_filter_id;\n-\t\tPMD_DRV_LOG(DEBUG, \"VNIC found\\n\");\n \t\tbreak;\n \tcase RTE_FLOW_ACTION_TYPE_DROP:\n \t\tvnic0 = &bp->vnic_info[0];\n@@ -1009,6 +1062,15 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev,\n \n \t\tfilter->fw_l2_filter_id = filter1->fw_l2_filter_id;\n \t\tbreak;\n+\tcase RTE_FLOW_ACTION_TYPE_RSS:\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   \"This action is not supported right now.\");\n+\t\trc = -rte_errno;\n+\t\tgoto ret;\n+\t\t//break;\n \n \tdefault:\n \t\trte_flow_error_set(error,\ndiff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c\nindex c876ff75c..98a68ec65 100644\n--- a/drivers/net/bnxt/bnxt_hwrm.c\n+++ b/drivers/net/bnxt/bnxt_hwrm.c\n@@ -418,8 +418,6 @@ int bnxt_hwrm_set_l2_filter(struct bnxt *bp,\n \tHWRM_PREP(req, CFA_L2_FILTER_ALLOC, BNXT_USE_CHIMP_MB);\n \n \treq.flags = rte_cpu_to_le_32(filter->flags);\n-\treq.flags |=\n-\trte_cpu_to_le_32(HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_OUTERMOST);\n \n \tenables = filter->enables |\n \t      HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_DST_ID;\n@@ -449,6 +447,11 @@ int bnxt_hwrm_set_l2_filter(struct bnxt *bp,\n \t\treq.src_id = rte_cpu_to_le_32(filter->src_id);\n \tif (enables & HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_SRC_TYPE)\n \t\treq.src_type = filter->src_type;\n+\tif (filter->pri_hint) {\n+\t\treq.pri_hint = filter->pri_hint;\n+\t\treq.l2_filter_id_hint =\n+\t\t\trte_cpu_to_le_64(filter->l2_filter_id_hint);\n+\t}\n \n \treq.enables = rte_cpu_to_le_32(enables);\n \n@@ -1019,6 +1022,11 @@ int bnxt_hwrm_ver_get(struct bnxt *bp)\n \tif (dev_caps_cfg &\n \t    HWRM_VER_GET_OUTPUT_DEV_CAPS_CFG_TRUSTED_VF_SUPPORTED)\n \t\tPMD_DRV_LOG(DEBUG, \"FW supports Trusted VFs\\n\");\n+\tif (dev_caps_cfg &\n+\t    HWRM_VER_GET_OUTPUT_DEV_CAPS_CFG_CFA_ADV_FLOW_MGNT_SUPPORTED) {\n+\t\tbp->flags |= BNXT_FLAG_ADV_FLOW_MGMT;\n+\t\tPMD_DRV_LOG(DEBUG, \"FW supports advanced flow management\\n\");\n+\t}\n \n error:\n \tHWRM_UNLOCK();\n@@ -4858,3 +4866,35 @@ int bnxt_hwrm_fw_reset(struct bnxt *bp)\n \n \treturn rc;\n }\n+\n+int bnxt_hwrm_cfa_adv_flow_mgmt_qcaps(struct bnxt *bp)\n+{\n+\tstruct hwrm_cfa_adv_flow_mgnt_qcaps_output *resp =\n+\t\t\t\t\tbp->hwrm_cmd_resp_addr;\n+\tstruct hwrm_cfa_adv_flow_mgnt_qcaps_input req = {0};\n+\tuint32_t flags = 0;\n+\tint rc = 0;\n+\n+\tif (!(bp->flags & BNXT_FLAG_ADV_FLOW_MGMT))\n+\t\treturn rc;\n+\n+\tif (!(BNXT_PF(bp) || BNXT_VF_IS_TRUSTED(bp))) {\n+\t\tPMD_DRV_LOG(DEBUG,\n+\t\t\t    \"Not a PF or trusted VF. Command not supported\\n\");\n+\t\treturn 0;\n+\t}\n+\n+\tHWRM_PREP(req, CFA_ADV_FLOW_MGNT_QCAPS, BNXT_USE_KONG(bp));\n+\trc = bnxt_hwrm_send_message(bp, &req, sizeof(req), BNXT_USE_KONG(bp));\n+\n+\tHWRM_CHECK_RESULT();\n+\tflags = rte_le_to_cpu_32(resp->flags);\n+\tHWRM_UNLOCK();\n+\n+\tif (flags & HWRM_CFA_ADV_FLOW_MGNT_QCAPS_L2_HDR_SRC_FILTER_EN) {\n+\t\tbp->flow_flags |= BNXT_FLOW_FLAG_L2_HDR_SRC_FILTER_EN;\n+\t\tPMD_DRV_LOG(INFO, \"Source L2 header filtering enabled\\n\");\n+\t}\n+\n+\treturn rc;\n+}\ndiff --git a/drivers/net/bnxt/bnxt_hwrm.h b/drivers/net/bnxt/bnxt_hwrm.h\nindex f3234ae72..47b1e43ac 100644\n--- a/drivers/net/bnxt/bnxt_hwrm.h\n+++ b/drivers/net/bnxt/bnxt_hwrm.h\n@@ -38,6 +38,9 @@ struct bnxt_cp_ring_info;\n #define HWRM_FUNC_RESOURCE_QCAPS_OUTPUT_VF_RESV_STRATEGY_MINIMAL_STATIC \\\n \tHWRM_FUNC_RESOURCE_QCAPS_OUTPUT_VF_RESERVATION_STRATEGY_MINIMAL_STATIC\n \n+#define HWRM_CFA_ADV_FLOW_MGNT_QCAPS_L2_HDR_SRC_FILTER_EN \\\n+HWRM_CFA_ADV_FLOW_MGNT_QCAPS_OUTPUT_FLAGS_L2_HEADER_SOURCE_FIELDS_SUPPORTED\n+\n #define HWRM_SPEC_CODE_1_8_4\t\t0x10804\n #define HWRM_SPEC_CODE_1_9_0\t\t0x10900\n #define HWRM_SPEC_CODE_1_9_2\t\t0x10902\n@@ -209,4 +212,5 @@ int bnxt_hwrm_set_mac(struct bnxt *bp);\n int bnxt_hwrm_if_change(struct bnxt *bp, bool state);\n int bnxt_hwrm_error_recovery_qcfg(struct bnxt *bp);\n int bnxt_hwrm_fw_reset(struct bnxt *bp);\n+int bnxt_hwrm_cfa_adv_flow_mgmt_qcaps(struct bnxt *bp);\n #endif\ndiff --git a/drivers/net/bnxt/bnxt_util.h b/drivers/net/bnxt/bnxt_util.h\nindex a15b3a1a9..6ded7f657 100644\n--- a/drivers/net/bnxt/bnxt_util.h\n+++ b/drivers/net/bnxt/bnxt_util.h\n@@ -13,4 +13,8 @@\n int bnxt_check_zero_bytes(const uint8_t *bytes, int len);\n void bnxt_eth_hw_addr_random(uint8_t *mac_addr);\n \n+#ifndef BIT\n+#define BIT(a) (1UL << (a))\n+#endif /* BIT */\n+\n #endif /* _BNXT_UTIL_H_ */\n",
    "prefixes": [
        "04/17"
    ]
}