get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 68565,
    "url": "http://patchwork.dpdk.org/api/patches/68565/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/1586962156-11179-9-git-send-email-venkatkumar.duvvuru@broadcom.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.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": "<1586962156-11179-9-git-send-email-venkatkumar.duvvuru@broadcom.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1586962156-11179-9-git-send-email-venkatkumar.duvvuru@broadcom.com",
    "date": "2020-04-15T14:49:13",
    "name": "[08/11] net/bnxt: addition of session and function flow flush",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "d1fb65e431ccd036e143aa05e9e60ba5bd4fbdca",
    "submitter": {
        "id": 1635,
        "url": "http://patchwork.dpdk.org/api/people/1635/?format=api",
        "name": "Venkat Duvvuru",
        "email": "venkatkumar.duvvuru@broadcom.com"
    },
    "delegate": {
        "id": 1766,
        "url": "http://patchwork.dpdk.org/api/users/1766/?format=api",
        "username": "ajitkhaparde",
        "first_name": "Ajit",
        "last_name": "Khaparde",
        "email": "ajit.khaparde@broadcom.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/1586962156-11179-9-git-send-email-venkatkumar.duvvuru@broadcom.com/mbox/",
    "series": [
        {
            "id": 9397,
            "url": "http://patchwork.dpdk.org/api/series/9397/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=9397",
            "date": "2020-04-15T14:49:05",
            "name": "enhancements to host based flow table management",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/9397/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/68565/comments/",
    "check": "fail",
    "checks": "http://patchwork.dpdk.org/api/patches/68565/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 dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id BC698A0563;\n\tWed, 15 Apr 2020 16:52:02 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 6C26D1D931;\n\tWed, 15 Apr 2020 16:50:49 +0200 (CEST)",
            "from mail-pl1-f196.google.com (mail-pl1-f196.google.com\n [209.85.214.196]) by dpdk.org (Postfix) with ESMTP id E14761D920\n for <dev@dpdk.org>; Wed, 15 Apr 2020 16:50:45 +0200 (CEST)",
            "by mail-pl1-f196.google.com with SMTP id t16so74206plo.7\n for <dev@dpdk.org>; Wed, 15 Apr 2020 07:50:45 -0700 (PDT)",
            "from S60.dhcp.broadcom.net ([192.19.234.250])\n by smtp.gmail.com with ESMTPSA id 11sm13767969pfz.91.2020.04.15.07.50.42\n (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128);\n Wed, 15 Apr 2020 07:50:43 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com;\n s=google;\n h=from:to:cc:subject:date:message-id:in-reply-to:references;\n bh=CQnku5LoFd6ewzvkDTExA//7Ca64OzpyQJgUBUV8VDU=;\n b=Ln6h8iWXcTzhfgFf/fjTsuJffn1YGMWQPXXL0+kqeDHwZ3GF9WccAZn4p3EdvfN3BG\n ex0gXiy1w9YKB8+XRdEhvneqWuGB3Czgwt9qdSg06sFuZHIBKGhO4I44m+vyc00CIjlI\n iamjs9pM1yPX3lipq7ivpvtjCApLwrHlXjaXk=",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20161025;\n h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n :references;\n bh=CQnku5LoFd6ewzvkDTExA//7Ca64OzpyQJgUBUV8VDU=;\n b=uAPZoiXSjqF6j3S7DfdFonbFgg2M2C51MEu+q3i+9Aig6ctQhJh4KZ7ln/FPauKReQ\n LisvDsFQG8gMzLDAKH3+x2vg7iZLZeGCzeX1G8n1EcNsC81/600w8b86gKRyYpriRL7b\n /D9OsYQ0J3kCETpv8WaGHGzQyBCCnrsw0IoTOIzmXYy1dqM4i2dD8JaXDej1j5SnPLRQ\n V6J3TIcY6YWx71kMIXyAEjm9pbbd8LvXlULXl556qxKZ3z1A+CBOCEVSYnvobk+hoMcy\n v37x2S9X6j3t1Fe8uf1ycnsMDPsqoasc171kffIwe5xm8YDNLeQcx2wIHIF9pzJ9xxe0\n f/ew==",
        "X-Gm-Message-State": "AGi0PubchkbLS7IOTfF6XEmOf8GoNur6aYoGAbVrc54tkCpynHp+hYzo\n a1a1l7+rC39voHV9HBtfXz/X8Xw9uWYask/2O6APVEvvSkVllaNUyNmYlaagKsRTRm+jcMF9/dR\n x4MU4MJBCdjBy1SBxP8loHVsXGzQCnnkvGhtUgcAITlOCSLWrt0KILt/1wpzkA4LtTonj",
        "X-Google-Smtp-Source": "\n APiQypIbhvCJaaozFDv3XZxVZCDHorMJYtQhrlyckCPGhcI6ye6iC0ifW/XJ66GsDKFp3ypHTkBxXw==",
        "X-Received": "by 2002:a17:902:361:: with SMTP id\n 88mr3431280pld.279.1586962244196;\n Wed, 15 Apr 2020 07:50:44 -0700 (PDT)",
        "From": "Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com>",
        "To": "dev@dpdk.org",
        "Cc": "Kishore Padmanabha <kishore.padmanabha@broadcom.com>,\n Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com>",
        "Date": "Wed, 15 Apr 2020 20:19:13 +0530",
        "Message-Id": "\n <1586962156-11179-9-git-send-email-venkatkumar.duvvuru@broadcom.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-Reply-To": "\n <1586962156-11179-1-git-send-email-venkatkumar.duvvuru@broadcom.com>",
        "References": "\n <1586962156-11179-1-git-send-email-venkatkumar.duvvuru@broadcom.com>",
        "Subject": "[dpdk-dev] [PATCH 08/11] net/bnxt: addition of session and function\n\tflow flush",
        "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 <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": "From: Kishore Padmanabha <kishore.padmanabha@broadcom.com>\n\nThe ulp flow flush has been extended to support session flow\nflush and function flow flush. The session flow flush is called when\nthere the device is sole owner of the session and it deletes all the\nflows associated with that session. The function flow flush is\ncalled if the device function is not the sole owner of the session,\nit deletes all the flows that are associated with that device\nfunction.\n\nReviewed-by: Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com>\nReviewed-by: Michael Baucom <michael.baucom@broadcom.com>\nSigned-off-by: Kishore Padmanabha <kishore.padmanabha@broadcom.com>\nSigned-off-by: Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com>\n---\n drivers/net/bnxt/bnxt.h                 |   1 +\n drivers/net/bnxt/bnxt_ethdev.c          |  12 +++\n drivers/net/bnxt/tf_ulp/bnxt_ulp.c      |   9 +-\n drivers/net/bnxt/tf_ulp/bnxt_ulp_flow.c |  31 +++++--\n drivers/net/bnxt/tf_ulp/ulp_flow_db.c   | 149 ++++++++++++++++++++++++++++++--\n drivers/net/bnxt/tf_ulp/ulp_flow_db.h   |  46 +++++++++-\n drivers/net/bnxt/tf_ulp/ulp_mapper.c    |   2 +-\n drivers/net/bnxt/tf_ulp/ulp_mapper.h    |   1 +\n 8 files changed, 225 insertions(+), 26 deletions(-)",
    "diff": "diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h\nindex a70cdff..fb3bbdb 100644\n--- a/drivers/net/bnxt/bnxt.h\n+++ b/drivers/net/bnxt/bnxt.h\n@@ -737,5 +737,6 @@ void bnxt_ulp_deinit(struct bnxt *bp);\n \n uint16_t bnxt_get_vnic_id(uint16_t port);\n uint16_t bnxt_get_svif(uint16_t port_id, bool func_svif);\n+uint16_t bnxt_get_fw_func_id(uint16_t port);\n \n #endif\ndiff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c\nindex 5d5b8e0..76ac284 100644\n--- a/drivers/net/bnxt/bnxt_ethdev.c\n+++ b/drivers/net/bnxt/bnxt_ethdev.c\n@@ -4748,6 +4748,18 @@ bnxt_get_vnic_id(uint16_t port)\n \treturn vnic->fw_vnic_id;\n }\n \n+uint16_t\n+bnxt_get_fw_func_id(uint16_t port)\n+{\n+\tstruct rte_eth_dev *eth_dev;\n+\tstruct bnxt *bp;\n+\n+\teth_dev = &rte_eth_devices[port];\n+\tbp = eth_dev->data->dev_private;\n+\n+\treturn bp->fw_fid;\n+}\n+\n static int bnxt_init_fw(struct bnxt *bp)\n {\n \tuint16_t mtu;\ndiff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c\nindex 56e08f2..4c36747 100644\n--- a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c\n+++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c\n@@ -659,10 +659,8 @@ int32_t\n bnxt_ulp_cntxt_ptr2_flow_db_set(struct bnxt_ulp_context\t*ulp_ctx,\n \t\t\t\tstruct bnxt_ulp_flow_db\t*flow_db)\n {\n-\tif (!ulp_ctx || !ulp_ctx->cfg_data) {\n-\t\tBNXT_TF_DBG(ERR, \"Invalid ulp context data\\n\");\n+\tif (!ulp_ctx || !ulp_ctx->cfg_data)\n \t\treturn -EINVAL;\n-\t}\n \n \tulp_ctx->cfg_data->flow_db = flow_db;\n \treturn 0;\n@@ -672,10 +670,8 @@ bnxt_ulp_cntxt_ptr2_flow_db_set(struct bnxt_ulp_context\t*ulp_ctx,\n struct bnxt_ulp_flow_db\t*\n bnxt_ulp_cntxt_ptr2_flow_db_get(struct bnxt_ulp_context\t*ulp_ctx)\n {\n-\tif (!ulp_ctx || !ulp_ctx->cfg_data) {\n-\t\tBNXT_TF_DBG(ERR, \"Invalid ulp context data\\n\");\n+\tif (!ulp_ctx || !ulp_ctx->cfg_data)\n \t\treturn NULL;\n-\t}\n \n \treturn ulp_ctx->cfg_data->flow_db;\n }\n@@ -693,3 +689,4 @@ bnxt_ulp_eth_dev_ptr2_cntxt_get(struct rte_eth_dev\t*dev)\n \t}\n \treturn &bp->ulp_ctx;\n }\n+\ndiff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp_flow.c b/drivers/net/bnxt/tf_ulp/bnxt_ulp_flow.c\nindex 7f7aa24..f0c812c 100644\n--- a/drivers/net/bnxt/tf_ulp/bnxt_ulp_flow.c\n+++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp_flow.c\n@@ -125,6 +125,7 @@ bnxt_ulp_flow_create(struct rte_eth_dev *dev,\n \tmapper_cparms.act_prop = &params.act_prop;\n \tmapper_cparms.class_tid = class_id;\n \tmapper_cparms.act_tid = act_tmpl;\n+\tmapper_cparms.func_id = bnxt_get_fw_func_id(dev->data->port_id);\n \n \t/* call the ulp mapper to create the flow in the hardware */\n \tret = ulp_mapper_flow_create(ulp_ctx,\n@@ -202,7 +203,8 @@ bnxt_ulp_flow_destroy(struct rte_eth_dev *dev,\n {\n \tint ret = 0;\n \tstruct bnxt_ulp_context *ulp_ctx;\n-\tuint32_t fid;\n+\tuint32_t flow_id;\n+\tuint16_t func_id;\n \n \tulp_ctx = bnxt_ulp_eth_dev_ptr2_cntxt_get(dev);\n \tif (!ulp_ctx) {\n@@ -213,9 +215,19 @@ bnxt_ulp_flow_destroy(struct rte_eth_dev *dev,\n \t\treturn -EINVAL;\n \t}\n \n-\tfid = (uint32_t)(uintptr_t)flow;\n+\tflow_id = (uint32_t)(uintptr_t)flow;\n+\tfunc_id = bnxt_get_fw_func_id(dev->data->port_id);\n \n-\tret = ulp_mapper_flow_destroy(ulp_ctx, fid);\n+\tif (ulp_flow_db_validate_flow_func(ulp_ctx, flow_id, func_id) ==\n+\t    false) {\n+\t\tBNXT_TF_DBG(ERR, \"Incorrect device params\\n\");\n+\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t   RTE_FLOW_ERROR_TYPE_HANDLE, NULL,\n+\t\t\t\t   \"Failed to destroy flow.\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tret = ulp_mapper_flow_destroy(ulp_ctx, flow_id);\n \tif (ret)\n \t\trte_flow_error_set(error, -ret,\n \t\t\t\t   RTE_FLOW_ERROR_TYPE_HANDLE, NULL,\n@@ -230,8 +242,9 @@ bnxt_ulp_flow_flush(struct rte_eth_dev *eth_dev,\n \t\t    struct rte_flow_error *error)\n {\n \tstruct bnxt_ulp_context *ulp_ctx;\n-\tint32_t ret;\n+\tint32_t ret = 0;\n \tstruct bnxt *bp;\n+\tuint16_t func_id;\n \n \tulp_ctx = bnxt_ulp_eth_dev_ptr2_cntxt_get(eth_dev);\n \tif (!ulp_ctx) {\n@@ -244,10 +257,12 @@ bnxt_ulp_flow_flush(struct rte_eth_dev *eth_dev,\n \tbp = eth_dev->data->dev_private;\n \n \t/* Free the resources for the last device */\n-\tif (!ulp_ctx_deinit_allowed(bp))\n-\t\treturn 0;\n-\n-\tret = ulp_flow_db_flush_flows(ulp_ctx, BNXT_ULP_REGULAR_FLOW_TABLE);\n+\tif (ulp_ctx_deinit_allowed(bp)) {\n+\t\tret = ulp_flow_db_session_flow_flush(ulp_ctx);\n+\t} else if (bnxt_ulp_cntxt_ptr2_flow_db_get(ulp_ctx)) {\n+\t\tfunc_id = bnxt_get_fw_func_id(eth_dev->data->port_id);\n+\t\tret = ulp_flow_db_function_flow_flush(ulp_ctx, func_id);\n+\t}\n \tif (ret)\n \t\trte_flow_error_set(error, ret,\n \t\t\t\t   RTE_FLOW_ERROR_TYPE_HANDLE, NULL,\ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_flow_db.c b/drivers/net/bnxt/tf_ulp/ulp_flow_db.c\nindex 9e7f9f5..35a7f86 100644\n--- a/drivers/net/bnxt/tf_ulp/ulp_flow_db.c\n+++ b/drivers/net/bnxt/tf_ulp/ulp_flow_db.c\n@@ -210,6 +210,27 @@ ulp_flow_db_dealloc_resource(struct bnxt_ulp_flow_db *flow_db,\n }\n \n /*\n+ * Helper function to add function id to the flow table\n+ *\n+ * flow_db [in] Ptr to flow table\n+ * flow_id [in] The flow id of the flow\n+ * func_id [in] The func_id to be set, for reset pass zero\n+ *\n+ * returns none\n+ */\n+static void\n+ulp_flow_db_func_id_set(struct bnxt_ulp_flow_db *flow_db,\n+\t\t\tuint32_t flow_id,\n+\t\t\tuint32_t func_id)\n+{\n+\t/* set the function id in the function table */\n+\tif (flow_id < flow_db->func_id_tbl_size)\n+\t\tflow_db->func_id_tbl[flow_id] = func_id;\n+\telse /* This should never happen */\n+\t\tBNXT_TF_DBG(ERR, \"Invalid flow id, flowdb corrupt\\n\");\n+}\n+\n+/*\n  * Initialize the flow database. Memory is allocated in this\n  * call and assigned to the flow database.\n  *\n@@ -241,7 +262,7 @@ int32_t\tulp_flow_db_init(struct bnxt_ulp_context *ulp_ctxt)\n \tif (!flow_db) {\n \t\tBNXT_TF_DBG(ERR,\n \t\t\t    \"Failed to allocate memory for flow table ptr\\n\");\n-\t\tgoto error_free;\n+\t\treturn -ENOMEM;\n \t}\n \n \t/* Attach the flow database to the ulp context. */\n@@ -265,6 +286,17 @@ int32_t\tulp_flow_db_init(struct bnxt_ulp_context *ulp_ctxt)\n \tif (ulp_flow_db_alloc_resource(flow_db, BNXT_ULP_DEFAULT_FLOW_TABLE))\n \t\tgoto error_free;\n \n+\t/* add 1 since we are not using index 0 for flow id */\n+\tflow_db->func_id_tbl_size = dparms->num_flows + 1;\n+\t/* Allocate the function Id table */\n+\tflow_db->func_id_tbl = rte_zmalloc(\"bnxt_ulp_flow_db_func_id_table\",\n+\t\t\t\t\t   flow_db->func_id_tbl_size *\n+\t\t\t\t\t   sizeof(uint16_t), 0);\n+\tif (!flow_db->func_id_tbl) {\n+\t\tBNXT_TF_DBG(ERR,\n+\t\t\t    \"Failed to allocate mem for flow table func id\\n\");\n+\t\tgoto error_free;\n+\t}\n \t/* All good so return. */\n \treturn 0;\n error_free:\n@@ -297,6 +329,7 @@ int32_t\tulp_flow_db_deinit(struct bnxt_ulp_context *ulp_ctxt)\n \t/* Free up all the memory. */\n \tulp_flow_db_dealloc_resource(flow_db, BNXT_ULP_REGULAR_FLOW_TABLE);\n \tulp_flow_db_dealloc_resource(flow_db, BNXT_ULP_DEFAULT_FLOW_TABLE);\n+\trte_free(flow_db->func_id_tbl);\n \trte_free(flow_db);\n \n \treturn 0;\n@@ -311,12 +344,13 @@ int32_t\tulp_flow_db_deinit(struct bnxt_ulp_context *ulp_ctxt)\n  *\n  * returns 0 on success and negative on failure.\n  */\n-int32_t ulp_flow_db_fid_alloc(struct bnxt_ulp_context\t\t*ulp_ctxt,\n-\t\t\t      enum bnxt_ulp_flow_db_tables\ttbl_idx,\n-\t\t\t      uint32_t\t\t\t\t*fid)\n+int32_t ulp_flow_db_fid_alloc(struct bnxt_ulp_context *ulp_ctxt,\n+\t\t\t      enum bnxt_ulp_flow_db_tables tbl_idx,\n+\t\t\t      uint16_t func_id,\n+\t\t\t      uint32_t *fid)\n {\n-\tstruct bnxt_ulp_flow_db\t\t*flow_db;\n-\tstruct bnxt_ulp_flow_tbl\t*flow_tbl;\n+\tstruct bnxt_ulp_flow_db *flow_db;\n+\tstruct bnxt_ulp_flow_tbl *flow_tbl;\n \n \t*fid = 0; /* Initialize fid to invalid value */\n \tflow_db = bnxt_ulp_cntxt_ptr2_flow_db_get(ulp_ctxt);\n@@ -339,6 +373,10 @@ int32_t ulp_flow_db_fid_alloc(struct bnxt_ulp_context\t\t*ulp_ctxt,\n \tflow_tbl->head_index++;\n \tulp_flow_db_active_flow_set(flow_tbl, *fid, 1);\n \n+\t/* The function id update is only valid for regular flow table */\n+\tif (tbl_idx == BNXT_ULP_REGULAR_FLOW_TABLE)\n+\t\tulp_flow_db_func_id_set(flow_db, *fid, func_id);\n+\n \t/* all good, return success */\n \treturn 0;\n }\n@@ -555,6 +593,8 @@ int32_t\tulp_flow_db_fid_free(struct bnxt_ulp_context\t\t*ulp_ctxt,\n \t}\n \tflow_tbl->flow_tbl_stack[flow_tbl->head_index] = fid;\n \tulp_flow_db_active_flow_set(flow_tbl, fid, 0);\n+\tif (tbl_idx == BNXT_ULP_REGULAR_FLOW_TABLE)\n+\t\tulp_flow_db_func_id_set(flow_db, fid, 0);\n \n \t/* all good, return success */\n \treturn 0;\n@@ -636,19 +676,29 @@ ulp_flow_db_next_entry_get(struct bnxt_ulp_flow_tbl\t*flowtbl,\n \t\t\t   uint32_t\t\t\t*fid)\n {\n \tuint32_t\tlfid = *fid;\n-\tuint32_t\tidx;\n+\tuint32_t\tidx, s_idx, mod_fid;\n \tuint64_t\tbs;\n \n \tdo {\n+\t\t/* increment the flow id to find the next valid flow id */\n \t\tlfid++;\n \t\tif (lfid >= flowtbl->num_flows)\n \t\t\treturn -ENOENT;\n \t\tidx = lfid / ULP_INDEX_BITMAP_SIZE;\n+\t\tmod_fid = lfid % ULP_INDEX_BITMAP_SIZE;\n+\t\ts_idx = idx;\n \t\twhile (!(bs = flowtbl->active_flow_tbl[idx])) {\n \t\t\tidx++;\n \t\t\tif ((idx * ULP_INDEX_BITMAP_SIZE) >= flowtbl->num_flows)\n \t\t\t\treturn -ENOENT;\n \t\t}\n+\t\t/*\n+\t\t * remove the previous bits in the bitset bs to find the\n+\t\t * next non zero bit in the bitset. This needs to be done\n+\t\t * only if the idx is same as he one you started.\n+\t\t */\n+\t\tif (s_idx == idx)\n+\t\t\tbs &= (-1UL >> mod_fid);\n \t\tlfid = (idx * ULP_INDEX_BITMAP_SIZE) + __builtin_clzl(bs);\n \t\tif (*fid >= lfid) {\n \t\t\tBNXT_TF_DBG(ERR, \"Flow Database is corrupt\\n\");\n@@ -688,7 +738,90 @@ int32_t\tulp_flow_db_flush_flows(struct bnxt_ulp_context *ulp_ctx,\n \t}\n \tflow_tbl = &flow_db->flow_tbl[idx];\n \twhile (!ulp_flow_db_next_entry_get(flow_tbl, &fid))\n-\t\t(void)ulp_mapper_resources_free(ulp_ctx, fid, idx);\n+\t\tulp_mapper_resources_free(ulp_ctx, fid, idx);\n \n \treturn 0;\n }\n+\n+/*\n+ * Flush all flows in the flow database that belong to a device function.\n+ *\n+ * ulp_ctxt [in] Ptr to ulp context\n+ * tbl_idx [in] The index to table\n+ *\n+ * returns 0 on success or negative number on failure\n+ */\n+int32_t\n+ulp_flow_db_function_flow_flush(struct bnxt_ulp_context *ulp_ctx,\n+\t\t\t\tuint16_t func_id)\n+{\n+\tuint32_t flow_id = 0;\n+\tstruct bnxt_ulp_flow_db *flow_db;\n+\tstruct bnxt_ulp_flow_tbl *flow_tbl;\n+\n+\tif (!ulp_ctx || !func_id) {\n+\t\tBNXT_TF_DBG(ERR, \"Invalid Argument\\n\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tflow_db = bnxt_ulp_cntxt_ptr2_flow_db_get(ulp_ctx);\n+\tif (!flow_db) {\n+\t\tBNXT_TF_DBG(ERR, \"Flow database not found\\n\");\n+\t\treturn -EINVAL;\n+\t}\n+\tflow_tbl = &flow_db->flow_tbl[BNXT_ULP_REGULAR_FLOW_TABLE];\n+\twhile (!ulp_flow_db_next_entry_get(flow_tbl, &flow_id)) {\n+\t\tif (flow_db->func_id_tbl[flow_id] == func_id)\n+\t\t\tulp_mapper_resources_free(ulp_ctx, flow_id,\n+\t\t\t\t\t\t  BNXT_ULP_REGULAR_FLOW_TABLE);\n+\t}\n+\n+\treturn 0;\n+}\n+\n+/*\n+ * Flush all flows in the flow database that are associated with the session.\n+ *\n+ * ulp_ctxt [in] Ptr to ulp context\n+ *\n+ * returns 0 on success or negative number on failure\n+ */\n+int32_t\n+ulp_flow_db_session_flow_flush(struct bnxt_ulp_context *ulp_ctx)\n+{\n+\t/*\n+\t * TBD: Tf core implementation of FW session flush shall change this\n+\t * implementation.\n+\t */\n+\treturn ulp_flow_db_flush_flows(ulp_ctx, BNXT_ULP_REGULAR_FLOW_TABLE);\n+}\n+\n+/*\n+ * Check that flow id matches the function id or not\n+ *\n+ * ulp_ctxt [in] Ptr to ulp context\n+ * flow_db [in] Ptr to flow table\n+ * func_id [in] The func_id to be set, for reset pass zero.\n+ *\n+ * returns true on success or false on failure\n+ */\n+bool\n+ulp_flow_db_validate_flow_func(struct bnxt_ulp_context *ulp_ctx,\n+\t\t\t       uint32_t flow_id,\n+\t\t\t       uint32_t func_id)\n+{\n+\tstruct bnxt_ulp_flow_db *flow_db;\n+\n+\tflow_db = bnxt_ulp_cntxt_ptr2_flow_db_get(ulp_ctx);\n+\tif (!flow_db) {\n+\t\tBNXT_TF_DBG(ERR, \"Flow database not found\\n\");\n+\t\treturn false;\n+\t}\n+\n+\t/* set the function id in the function table */\n+\tif (flow_id < flow_db->func_id_tbl_size && func_id &&\n+\t    flow_db->func_id_tbl[flow_id] == func_id)\n+\t\treturn true;\n+\n+\treturn false;\n+}\ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_flow_db.h b/drivers/net/bnxt/tf_ulp/ulp_flow_db.h\nindex 5361dd0..ebca849 100644\n--- a/drivers/net/bnxt/tf_ulp/ulp_flow_db.h\n+++ b/drivers/net/bnxt/tf_ulp/ulp_flow_db.h\n@@ -51,6 +51,8 @@ enum bnxt_ulp_flow_db_tables {\n /* Structure for the flow database resource information. */\n struct bnxt_ulp_flow_db {\n \tstruct bnxt_ulp_flow_tbl\tflow_tbl[BNXT_ULP_FLOW_TABLE_MAX];\n+\tuint16_t\t\t\t*func_id_tbl;\n+\tuint32_t\t\t\tfunc_id_tbl_size;\n };\n \n /* flow db resource params to add resources */\n@@ -88,13 +90,15 @@ int32_t\tulp_flow_db_deinit(struct bnxt_ulp_context *ulp_ctxt);\n  *\n  * ulp_ctxt [in] Ptr to ulp_context\n  * tbl_idx [in] Specify it is regular or default flow\n+ * func_id [in] The function id of the device.Valid only for regular flows.\n  * fid [out] The index to the flow entry\n  *\n  * returns 0 on success and negative on failure.\n  */\n-int32_t ulp_flow_db_fid_alloc(struct bnxt_ulp_context\t\t*ulp_ctxt,\n-\t\t\t      enum bnxt_ulp_flow_db_tables\ttbl_idx,\n-\t\t\t      uint32_t\t\t\t\t*fid);\n+int32_t ulp_flow_db_fid_alloc(struct bnxt_ulp_context *ulp_ctxt,\n+\t\t\t      enum bnxt_ulp_flow_db_tables tbl_idx,\n+\t\t\t      uint16_t func_id,\n+\t\t\t      uint32_t *fid);\n \n /*\n  * Allocate the flow database entry.\n@@ -170,4 +174,40 @@ int32_t\tulp_flow_db_resource_get(struct bnxt_ulp_context\t*ulp_ctxt,\n int32_t\tulp_flow_db_flush_flows(struct bnxt_ulp_context *ulp_ctx,\n \t\t\t\tuint32_t\t\tidx);\n \n+/*\n+ * Flush all flows in the flow database that belong to a device function.\n+ *\n+ * ulp_ctxt [in] Ptr to ulp context\n+ * tbl_idx [in] The index to table\n+ *\n+ * returns 0 on success or negative number on failure\n+ */\n+int32_t\n+ulp_flow_db_function_flow_flush(struct bnxt_ulp_context *ulp_ctx,\n+\t\t\t\tuint16_t func_id);\n+\n+/*\n+ * Flush all flows in the flow database that are associated with the session.\n+ *\n+ * ulp_ctxt [in] Ptr to ulp context\n+ *\n+ * returns 0 on success or negative number on failure\n+ */\n+int32_t\n+ulp_flow_db_session_flow_flush(struct bnxt_ulp_context *ulp_ctx);\n+\n+/*\n+ * Check that flow id matches the function id or not\n+ *\n+ * ulp_ctxt [in] Ptr to ulp context\n+ * flow_db [in] Ptr to flow table\n+ * func_id [in] The func_id to be set, for reset pass zero.\n+ *\n+ * returns true on success or false on failure\n+ */\n+bool\n+ulp_flow_db_validate_flow_func(struct bnxt_ulp_context *ulp_ctx,\n+\t\t\t       uint32_t flow_id,\n+\t\t\t       uint32_t func_id);\n+\n #endif /* _ULP_FLOW_DB_H_ */\ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_mapper.c b/drivers/net/bnxt/tf_ulp/ulp_mapper.c\nindex b8907b6..8675247 100644\n--- a/drivers/net/bnxt/tf_ulp/ulp_mapper.c\n+++ b/drivers/net/bnxt/tf_ulp/ulp_mapper.c\n@@ -461,7 +461,6 @@ ulp_mapper_result_field_process(struct bnxt_ulp_mapper_parms *parms,\n \tdefault:\n \t\treturn -EINVAL;\n \t}\n-\n \treturn 0;\n }\n \n@@ -1481,6 +1480,7 @@ ulp_mapper_flow_create(struct bnxt_ulp_context *ulp_ctx,\n \t */\n \trc = ulp_flow_db_fid_alloc(ulp_ctx,\n \t\t\t\t   BNXT_ULP_REGULAR_FLOW_TABLE,\n+\t\t\t\t   cparms->func_id,\n \t\t\t\t   &parms.fid);\n \tif (rc) {\n \t\tBNXT_TF_DBG(ERR, \"Unable to allocate flow table entry\\n\");\ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_mapper.h b/drivers/net/bnxt/tf_ulp/ulp_mapper.h\nindex 24727a3..2fa6ffc 100644\n--- a/drivers/net/bnxt/tf_ulp/ulp_mapper.h\n+++ b/drivers/net/bnxt/tf_ulp/ulp_mapper.h\n@@ -46,6 +46,7 @@ struct bnxt_ulp_mapper_create_parms {\n \tstruct ulp_rte_act_prop\t\t*act_prop;\n \tuint32_t\t\t\tclass_tid;\n \tuint32_t\t\t\tact_tid;\n+\tuint16_t\t\t\tfunc_id;\n };\n \n /*\n",
    "prefixes": [
        "08/11"
    ]
}