get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 41876,
    "url": "http://patches.dpdk.org/api/patches/41876/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20180628201549.3507-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": "<20180628201549.3507-10-ajit.khaparde@broadcom.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20180628201549.3507-10-ajit.khaparde@broadcom.com",
    "date": "2018-06-28T20:15:35",
    "name": "[v2,09/23] net/bnxt: fix Rx/Tx queue start/stop operations",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "ea94c30d9704092042f81cd68f7db4c65e112d31",
    "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/20180628201549.3507-10-ajit.khaparde@broadcom.com/mbox/",
    "series": [
        {
            "id": 300,
            "url": "http://patches.dpdk.org/api/series/300/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=300",
            "date": "2018-06-28T20:15:29",
            "name": "bnxt patchset",
            "version": 2,
            "mbox": "http://patches.dpdk.org/series/300/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/41876/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/41876/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 DDEC81B57B;\n\tThu, 28 Jun 2018 22:16:32 +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 9A9CB1B50E;\n\tThu, 28 Jun 2018 22:15:58 +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 526F130C032;\n\tThu, 28 Jun 2018 13:15:55 -0700 (PDT)",
            "from C02VPB22HTD6.dhcp.broadcom.net (c02vpb22htd6.dhcp.broadcom.net\n\t[10.136.50.120])\n\tby nis-sj1-27.broadcom.com (Postfix) with ESMTP id BF0B8AC0745;\n\tThu, 28 Jun 2018 13:15:54 -0700 (PDT)"
        ],
        "DKIM-Filter": "OpenDKIM Filter v2.10.3 rnd-relay.smtp.broadcom.com 526F130C032",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com;\n\ts=dkimrelay; t=1530216955;\n\tbh=V6k2e5e5fGePZ6YNdHq1BiKLa7883oxhX0go1s5iyqY=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=Q6WWjI4RxBowD1ErC++gQt32H+8VMNZZhDJF6DToTF8OUNwBd3ejWZhrcACT7KXOz\n\t5/eOud3tPPu2q3malb4O9mDyyDlTmvaPrkQK+b2Ch3z5WFjAaqNrFLD1dfvU8V/rk2\n\txDU7qBLEkWZ811qw2pQbhjP453k8qfiy1/KgvmNM=",
        "From": "Ajit Khaparde <ajit.khaparde@broadcom.com>",
        "To": "dev@dpdk.org",
        "Cc": "ferruh.yigit@intel.com, stable@dpdk.org,\n\tSomnath Kotur <somnath.kotur@broadcom.com>",
        "Date": "Thu, 28 Jun 2018 13:15:35 -0700",
        "Message-Id": "<20180628201549.3507-10-ajit.khaparde@broadcom.com>",
        "X-Mailer": "git-send-email 2.15.2 (Apple Git-101.1)",
        "In-Reply-To": "<20180628201549.3507-1-ajit.khaparde@broadcom.com>",
        "References": "<f02289d7-4111-ab00-9ce9-00dd5c8b3c18@intel.com>\n\t<20180628201549.3507-1-ajit.khaparde@broadcom.com>",
        "Subject": "[dpdk-dev] [PATCH v2 09/23] net/bnxt: fix Rx/Tx queue start/stop\n\toperations",
        "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": "Packets destined to the to-be-stopped queue should not be dropped\n(neither in HW nor in the driver), so re-program the RSS Table without\nthis queue on stop and add it back to the table on start unless it\nis a Representor VF.\n\nSince 0th entry is used for default ring, use fw_grp_id + 1 to change\nthe RSS table population logic by programming valid IDs instead of the\ndefault zeroth entry in case of an invalid fw_grp_id.\n\nDestroy and recreate the trio of Rx rings(compl, Rx, AG) every time in\nstart so that HW is in sync with software.\n\nFixes: 9b63c6fd70e3 (\"net/bnxt: support Rx/Tx queue start/stop\")\nCc: stable@dpdk.org\n\nSigned-off-by: Somnath Kotur <somnath.kotur@broadcom.com>\nReviewed-by: Ray Jui <ray.jui@broadcom.com>\nReviewed-by: Scott Branden <scott.branden@broadcom.com>\nReviewed-by: Randy Schacher <stuart.schacher@broadcom.com>\nSigned-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>\n\n--\nv1->v2: Fix checkpatch warning.\n---\n drivers/net/bnxt/bnxt.h        |  1 +\n drivers/net/bnxt/bnxt_ethdev.c | 10 ++++-\n drivers/net/bnxt/bnxt_hwrm.c   | 94 +++++++++++++++++++-----------------------\n drivers/net/bnxt/bnxt_hwrm.h   |  1 +\n drivers/net/bnxt/bnxt_ring.c   | 92 +++++++++++++++++++++++++++++++++++++++++\n drivers/net/bnxt/bnxt_ring.h   |  1 +\n drivers/net/bnxt/bnxt_rxq.c    | 54 +++++++++++++++++++-----\n drivers/net/bnxt/bnxt_rxq.h    |  4 ++\n drivers/net/bnxt/bnxt_rxr.c    | 16 +++++--\n 9 files changed, 206 insertions(+), 67 deletions(-)",
    "diff": "diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h\nindex 1a746097b..246b8d4d8 100644\n--- a/drivers/net/bnxt/bnxt.h\n+++ b/drivers/net/bnxt/bnxt.h\n@@ -27,6 +27,7 @@\n #define BNXT_MIN_RING_DESC\t16\n #define BNXT_MAX_TX_RING_DESC\t4096\n #define BNXT_MAX_RX_RING_DESC\t8192\n+#define BNXT_DB_SIZE\t\t0x80\n \n #define BNXT_INT_LAT_TMR_MIN\t\t\t75\n #define BNXT_INT_LAT_TMR_MAX\t\t\t150\ndiff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c\nindex 0bb3f29d9..22cf8fb93 100644\n--- a/drivers/net/bnxt/bnxt_ethdev.c\n+++ b/drivers/net/bnxt/bnxt_ethdev.c\n@@ -198,13 +198,14 @@ static int bnxt_alloc_mem(struct bnxt *bp)\n \n static int bnxt_init_chip(struct bnxt *bp)\n {\n-\tunsigned int i;\n+\tstruct bnxt_rx_queue *rxq;\n \tstruct rte_eth_link new;\n \tstruct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(bp->eth_dev);\n \tstruct rte_intr_handle *intr_handle = &pci_dev->intr_handle;\n \tuint32_t intr_vector = 0;\n \tuint32_t queue_id, base = BNXT_MISC_VEC_ID;\n \tuint32_t vec = BNXT_MISC_VEC_ID;\n+\tunsigned int i, j;\n \tint rc;\n \n \t/* disable uio/vfio intr/eventfd mapping */\n@@ -278,6 +279,13 @@ static int bnxt_init_chip(struct bnxt *bp)\n \t\t\tgoto err_out;\n \t\t}\n \n+\t\tfor (j = 0; j < bp->rx_nr_rings; j++) {\n+\t\t\trxq = bp->eth_dev->data->rx_queues[j];\n+\n+\t\t\tif (rxq->rx_deferred_start)\n+\t\t\t\trxq->vnic->fw_grp_ids[j] = INVALID_HW_RING_ID;\n+\t\t}\n+\n \t\trc = bnxt_vnic_rss_configure(bp, vnic);\n \t\tif (rc) {\n \t\t\tPMD_DRV_LOG(ERR,\ndiff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c\nindex 707ee62e0..64687a69b 100644\n--- a/drivers/net/bnxt/bnxt_hwrm.c\n+++ b/drivers/net/bnxt/bnxt_hwrm.c\n@@ -1817,8 +1817,7 @@ int bnxt_free_all_hwrm_ring_grps(struct bnxt *bp)\n \treturn rc;\n }\n \n-static void bnxt_free_cp_ring(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,\n-\t\t\t\tunsigned int idx __rte_unused)\n+static void bnxt_free_cp_ring(struct bnxt *bp, struct bnxt_cp_ring_info *cpr)\n {\n \tstruct bnxt_ring *cp_ring = cpr->cp_ring_struct;\n \n@@ -1830,17 +1829,52 @@ static void bnxt_free_cp_ring(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,\n \tcpr->cp_raw_cons = 0;\n }\n \n+void bnxt_free_hwrm_rx_ring(struct bnxt *bp, int queue_index)\n+{\n+\tstruct bnxt_rx_queue *rxq = bp->rx_queues[queue_index];\n+\tstruct bnxt_rx_ring_info *rxr = rxq->rx_ring;\n+\tstruct bnxt_ring *ring = rxr->rx_ring_struct;\n+\tstruct bnxt_cp_ring_info *cpr = rxq->cp_ring;\n+\n+\tif (ring->fw_ring_id != INVALID_HW_RING_ID) {\n+\t\tbnxt_hwrm_ring_free(bp, ring,\n+\t\t\t\t    HWRM_RING_FREE_INPUT_RING_TYPE_RX);\n+\t\tring->fw_ring_id = INVALID_HW_RING_ID;\n+\t\tbp->grp_info[queue_index].rx_fw_ring_id = INVALID_HW_RING_ID;\n+\t\tmemset(rxr->rx_desc_ring, 0,\n+\t\t       rxr->rx_ring_struct->ring_size *\n+\t\t       sizeof(*rxr->rx_desc_ring));\n+\t\tmemset(rxr->rx_buf_ring, 0,\n+\t\t       rxr->rx_ring_struct->ring_size *\n+\t\t       sizeof(*rxr->rx_buf_ring));\n+\t\trxr->rx_prod = 0;\n+\t}\n+\tring = rxr->ag_ring_struct;\n+\tif (ring->fw_ring_id != INVALID_HW_RING_ID) {\n+\t\tbnxt_hwrm_ring_free(bp, ring,\n+\t\t\t\t    HWRM_RING_FREE_INPUT_RING_TYPE_RX);\n+\t\tring->fw_ring_id = INVALID_HW_RING_ID;\n+\t\tmemset(rxr->ag_buf_ring, 0,\n+\t\t       rxr->ag_ring_struct->ring_size *\n+\t\t       sizeof(*rxr->ag_buf_ring));\n+\t\trxr->ag_prod = 0;\n+\t\tbp->grp_info[queue_index].ag_fw_ring_id = INVALID_HW_RING_ID;\n+\t}\n+\tif (cpr->cp_ring_struct->fw_ring_id != INVALID_HW_RING_ID)\n+\t\tbnxt_free_cp_ring(bp, cpr);\n+\n+\tbp->grp_info[queue_index].cp_fw_ring_id = INVALID_HW_RING_ID;\n+}\n+\n int bnxt_free_all_hwrm_rings(struct bnxt *bp)\n {\n \tunsigned int i;\n-\tint rc = 0;\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_tx_ring_info *txr = txq->tx_ring;\n \t\tstruct bnxt_ring *ring = txr->tx_ring_struct;\n \t\tstruct bnxt_cp_ring_info *cpr = txq->cp_ring;\n-\t\tunsigned int idx = bp->rx_cp_nr_rings + i;\n \n \t\tif (ring->fw_ring_id != INVALID_HW_RING_ID) {\n \t\t\tbnxt_hwrm_ring_free(bp, ring,\n@@ -1856,59 +1890,15 @@ int bnxt_free_all_hwrm_rings(struct bnxt *bp)\n \t\t\ttxr->tx_cons = 0;\n \t\t}\n \t\tif (cpr->cp_ring_struct->fw_ring_id != INVALID_HW_RING_ID) {\n-\t\t\tbnxt_free_cp_ring(bp, cpr, idx);\n+\t\t\tbnxt_free_cp_ring(bp, cpr);\n \t\t\tcpr->cp_ring_struct->fw_ring_id = INVALID_HW_RING_ID;\n \t\t}\n \t}\n \n-\tfor (i = 0; i < bp->rx_cp_nr_rings; i++) {\n-\t\tstruct bnxt_rx_queue *rxq = bp->rx_queues[i];\n-\t\tstruct bnxt_rx_ring_info *rxr = rxq->rx_ring;\n-\t\tstruct bnxt_ring *ring = rxr->rx_ring_struct;\n-\t\tstruct bnxt_cp_ring_info *cpr = rxq->cp_ring;\n+\tfor (i = 0; i < bp->rx_cp_nr_rings; i++)\n+\t\tbnxt_free_hwrm_rx_ring(bp, i);\n \n-\t\tif (ring->fw_ring_id != INVALID_HW_RING_ID) {\n-\t\t\tbnxt_hwrm_ring_free(bp, ring,\n-\t\t\t\t\tHWRM_RING_FREE_INPUT_RING_TYPE_RX);\n-\t\t\tring->fw_ring_id = INVALID_HW_RING_ID;\n-\t\t\tbp->grp_info[i].rx_fw_ring_id = INVALID_HW_RING_ID;\n-\t\t\tmemset(rxr->rx_desc_ring, 0,\n-\t\t\t\t\trxr->rx_ring_struct->ring_size *\n-\t\t\t\t\tsizeof(*rxr->rx_desc_ring));\n-\t\t\tmemset(rxr->rx_buf_ring, 0,\n-\t\t\t\t\trxr->rx_ring_struct->ring_size *\n-\t\t\t\t\tsizeof(*rxr->rx_buf_ring));\n-\t\t\trxr->rx_prod = 0;\n-\t\t}\n-\t\tring = rxr->ag_ring_struct;\n-\t\tif (ring->fw_ring_id != INVALID_HW_RING_ID) {\n-\t\t\tbnxt_hwrm_ring_free(bp, ring,\n-\t\t\t\t\t    HWRM_RING_FREE_INPUT_RING_TYPE_RX);\n-\t\t\tring->fw_ring_id = INVALID_HW_RING_ID;\n-\t\t\tmemset(rxr->ag_buf_ring, 0,\n-\t\t\t       rxr->ag_ring_struct->ring_size *\n-\t\t\t       sizeof(*rxr->ag_buf_ring));\n-\t\t\trxr->ag_prod = 0;\n-\t\t\tbp->grp_info[i].ag_fw_ring_id = INVALID_HW_RING_ID;\n-\t\t}\n-\t\tif (cpr->cp_ring_struct->fw_ring_id != INVALID_HW_RING_ID) {\n-\t\t\tbnxt_free_cp_ring(bp, cpr, i);\n-\t\t\tbp->grp_info[i].cp_fw_ring_id = INVALID_HW_RING_ID;\n-\t\t\tcpr->cp_ring_struct->fw_ring_id = INVALID_HW_RING_ID;\n-\t\t}\n-\t}\n-\n-\t/* Default completion ring */\n-\t{\n-\t\tstruct bnxt_cp_ring_info *cpr = bp->def_cp_ring;\n-\n-\t\tif (cpr->cp_ring_struct->fw_ring_id != INVALID_HW_RING_ID) {\n-\t\t\tbnxt_free_cp_ring(bp, cpr, 0);\n-\t\t\tcpr->cp_ring_struct->fw_ring_id = INVALID_HW_RING_ID;\n-\t\t}\n-\t}\n-\n-\treturn rc;\n+\treturn 0;\n }\n \n int bnxt_alloc_all_hwrm_ring_grps(struct bnxt *bp)\ndiff --git a/drivers/net/bnxt/bnxt_hwrm.h b/drivers/net/bnxt/bnxt_hwrm.h\nindex b83aab306..4a237c4b4 100644\n--- a/drivers/net/bnxt/bnxt_hwrm.h\n+++ b/drivers/net/bnxt/bnxt_hwrm.h\n@@ -107,6 +107,7 @@ int bnxt_set_hwrm_vnic_filters(struct bnxt *bp, struct bnxt_vnic_info *vnic);\n int bnxt_clear_hwrm_vnic_filters(struct bnxt *bp, struct bnxt_vnic_info *vnic);\n void bnxt_free_all_hwrm_resources(struct bnxt *bp);\n void bnxt_free_hwrm_resources(struct bnxt *bp);\n+void bnxt_free_hwrm_rx_ring(struct bnxt *bp, int queue_index);\n int bnxt_alloc_hwrm_resources(struct bnxt *bp);\n int bnxt_get_hwrm_link_config(struct bnxt *bp, struct rte_eth_link *link);\n int bnxt_set_hwrm_link_config(struct bnxt *bp, bool link_up);\ndiff --git a/drivers/net/bnxt/bnxt_ring.c b/drivers/net/bnxt/bnxt_ring.c\nindex 81eb89d74..fcbd6bc6e 100644\n--- a/drivers/net/bnxt/bnxt_ring.c\n+++ b/drivers/net/bnxt/bnxt_ring.c\n@@ -276,6 +276,98 @@ static void bnxt_init_dflt_coal(struct bnxt_coal *coal)\n \tcoal->cmpl_aggr_dma_tmr_during_int = BNXT_CMPL_AGGR_DMA_TMR_DURING_INT;\n }\n \n+int bnxt_alloc_hwrm_rx_ring(struct bnxt *bp, int queue_index)\n+{\n+\tstruct rte_pci_device *pci_dev = bp->pdev;\n+\tstruct bnxt_rx_queue *rxq = bp->rx_queues[queue_index];\n+\tstruct bnxt_cp_ring_info *cpr = rxq->cp_ring;\n+\tstruct bnxt_ring *cp_ring = cpr->cp_ring_struct;\n+\tstruct bnxt_rx_ring_info *rxr = rxq->rx_ring;\n+\tstruct bnxt_ring *ring = rxr->rx_ring_struct;\n+\tunsigned int map_idx = queue_index + bp->rx_cp_nr_rings;\n+\tint rc = 0;\n+\n+\tbp->grp_info[queue_index].fw_stats_ctx = cpr->hw_stats_ctx_id;\n+\n+\t/* Rx cmpl */\n+\trc = bnxt_hwrm_ring_alloc(bp, cp_ring,\n+\t\t\t\t  HWRM_RING_ALLOC_INPUT_RING_TYPE_L2_CMPL,\n+\t\t\t\t  queue_index, HWRM_NA_SIGNATURE,\n+\t\t\t\t  HWRM_NA_SIGNATURE);\n+\tif (rc)\n+\t\tgoto err_out;\n+\n+\tcpr->cp_doorbell = (char *)pci_dev->mem_resource[2].addr +\n+\t\tqueue_index * BNXT_DB_SIZE;\n+\tbp->grp_info[queue_index].cp_fw_ring_id = cp_ring->fw_ring_id;\n+\tB_CP_DIS_DB(cpr, cpr->cp_raw_cons);\n+\n+\tif (!queue_index) {\n+\t\t/*\n+\t\t * In order to save completion resources, use the first\n+\t\t * completion ring from PF or VF as the default completion ring\n+\t\t * for async event and HWRM forward response handling.\n+\t\t */\n+\t\tbp->def_cp_ring = cpr;\n+\t\trc = bnxt_hwrm_set_async_event_cr(bp);\n+\t\tif (rc)\n+\t\t\tgoto err_out;\n+\t}\n+\t/* Rx ring */\n+\trc = bnxt_hwrm_ring_alloc(bp, ring, HWRM_RING_ALLOC_INPUT_RING_TYPE_RX,\n+\t\t\t\t  queue_index, cpr->hw_stats_ctx_id,\n+\t\t\t\t  cp_ring->fw_ring_id);\n+\tif (rc)\n+\t\tgoto err_out;\n+\n+\trxr->rx_prod = 0;\n+\trxr->rx_doorbell = (char *)pci_dev->mem_resource[2].addr +\n+\t\tqueue_index * BNXT_DB_SIZE;\n+\tbp->grp_info[queue_index].rx_fw_ring_id = ring->fw_ring_id;\n+\tB_RX_DB(rxr->rx_doorbell, rxr->rx_prod);\n+\n+\tring = rxr->ag_ring_struct;\n+\t/* Agg ring */\n+\tif (!ring)\n+\t\tPMD_DRV_LOG(ERR, \"Alloc AGG Ring is NULL!\\n\");\n+\n+\trc = bnxt_hwrm_ring_alloc(bp, ring, HWRM_RING_ALLOC_INPUT_RING_TYPE_RX,\n+\t\t\t\t  map_idx, HWRM_NA_SIGNATURE,\n+\t\t\t\t  cp_ring->fw_ring_id);\n+\tif (rc)\n+\t\tgoto err_out;\n+\n+\tPMD_DRV_LOG(DEBUG, \"Alloc AGG Done!\\n\");\n+\trxr->ag_prod = 0;\n+\trxr->ag_doorbell = (char *)pci_dev->mem_resource[2].addr +\n+\t\tmap_idx * BNXT_DB_SIZE;\n+\tbp->grp_info[queue_index].ag_fw_ring_id = ring->fw_ring_id;\n+\tB_RX_DB(rxr->ag_doorbell, rxr->ag_prod);\n+\n+\trxq->rx_buf_use_size = BNXT_MAX_MTU + ETHER_HDR_LEN +\n+\t\tETHER_CRC_LEN + (2 * VLAN_TAG_SIZE);\n+\n+\tif (bp->eth_dev->data->rx_queue_state[queue_index] ==\n+\t    RTE_ETH_QUEUE_STATE_STARTED) {\n+\t\tif (bnxt_init_one_rx_ring(rxq)) {\n+\t\t\tRTE_LOG(ERR, PMD,\n+\t\t\t\t\"bnxt_init_one_rx_ring failed!\\n\");\n+\t\t\tbnxt_rx_queue_release_op(rxq);\n+\t\t\trc = -ENOMEM;\n+\t\t\tgoto err_out;\n+\t\t}\n+\t\tB_RX_DB(rxr->rx_doorbell, rxr->rx_prod);\n+\t\tB_RX_DB(rxr->ag_doorbell, rxr->ag_prod);\n+\t}\n+\trxq->index = queue_index;\n+\tPMD_DRV_LOG(INFO,\n+\t\t    \"queue %d, rx_deferred_start %d, state %d!\\n\",\n+\t\t    queue_index, rxq->rx_deferred_start,\n+\t\t    bp->eth_dev->data->rx_queue_state[queue_index]);\n+\n+err_out:\n+\treturn rc;\n+}\n /* ring_grp usage:\n  * [0] = default completion ring\n  * [1 -> +rx_cp_nr_rings] = rx_cp, rx rings\ndiff --git a/drivers/net/bnxt/bnxt_ring.h b/drivers/net/bnxt/bnxt_ring.h\nindex 65bf3e2f5..1446d784f 100644\n--- a/drivers/net/bnxt/bnxt_ring.h\n+++ b/drivers/net/bnxt/bnxt_ring.h\n@@ -70,6 +70,7 @@ int bnxt_alloc_rings(struct bnxt *bp, uint16_t qidx,\n \t\t\t    struct bnxt_rx_queue *rxq,\n \t\t\t    struct bnxt_cp_ring_info *cp_ring_info,\n \t\t\t    const char *suffix);\n+int bnxt_alloc_hwrm_rx_ring(struct bnxt *bp, int queue_index);\n int bnxt_alloc_hwrm_rings(struct bnxt *bp);\n \n #endif\ndiff --git a/drivers/net/bnxt/bnxt_rxq.c b/drivers/net/bnxt/bnxt_rxq.c\nindex c55ddec4b..f405e2575 100644\n--- a/drivers/net/bnxt/bnxt_rxq.c\n+++ b/drivers/net/bnxt/bnxt_rxq.c\n@@ -199,12 +199,14 @@ int bnxt_mq_rx_configure(struct bnxt *bp)\n \treturn rc;\n }\n \n-static void bnxt_rx_queue_release_mbufs(struct bnxt_rx_queue *rxq)\n+void bnxt_rx_queue_release_mbufs(struct bnxt_rx_queue *rxq)\n {\n \tstruct bnxt_sw_rx_bd *sw_ring;\n \tstruct bnxt_tpa_info *tpa_info;\n \tuint16_t i;\n \n+\trte_spinlock_lock(&rxq->lock);\n+\n \tif (rxq) {\n \t\tsw_ring = rxq->rx_ring->rx_buf_ring;\n \t\tif (sw_ring) {\n@@ -239,6 +241,8 @@ static void bnxt_rx_queue_release_mbufs(struct bnxt_rx_queue *rxq)\n \t\t\t}\n \t\t}\n \t}\n+\n+\trte_spinlock_unlock(&rxq->lock);\n }\n \n void bnxt_free_rx_mbufs(struct bnxt *bp)\n@@ -286,6 +290,7 @@ int bnxt_rx_queue_setup_op(struct rte_eth_dev *eth_dev,\n \tuint64_t rx_offloads = eth_dev->data->dev_conf.rxmode.offloads;\n \tstruct bnxt_rx_queue *rxq;\n \tint rc = 0;\n+\tuint8_t queue_state;\n \n \tif (queue_idx >= bp->max_rx_rings) {\n \t\tPMD_DRV_LOG(ERR,\n@@ -341,6 +346,11 @@ int bnxt_rx_queue_setup_op(struct rte_eth_dev *eth_dev,\n \t}\n \trte_atomic64_init(&rxq->rx_mbuf_alloc_fail);\n \n+\trxq->rx_deferred_start = rx_conf->rx_deferred_start;\n+\tqueue_state = rxq->rx_deferred_start ? RTE_ETH_QUEUE_STATE_STOPPED :\n+\t\t\t\t\t\tRTE_ETH_QUEUE_STATE_STARTED;\n+\teth_dev->data->rx_queue_state[queue_idx] = queue_state;\n+\trte_spinlock_init(&rxq->lock);\n out:\n \treturn rc;\n }\n@@ -389,6 +399,7 @@ int bnxt_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id)\n \tstruct rte_eth_conf *dev_conf = &bp->eth_dev->data->dev_conf;\n \tstruct bnxt_rx_queue *rxq = bp->rx_queues[rx_queue_id];\n \tstruct bnxt_vnic_info *vnic = NULL;\n+\tint rc = 0;\n \n \tif (rxq == NULL) {\n \t\tPMD_DRV_LOG(ERR, \"Invalid Rx queue %d\\n\", rx_queue_id);\n@@ -396,28 +407,47 @@ int bnxt_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id)\n \t}\n \n \tdev->data->rx_queue_state[rx_queue_id] = RTE_ETH_QUEUE_STATE_STARTED;\n-\trxq->rx_deferred_start = false;\n+\n+\tbnxt_free_hwrm_rx_ring(bp, rx_queue_id);\n+\tbnxt_alloc_hwrm_rx_ring(bp, rx_queue_id);\n \tPMD_DRV_LOG(INFO, \"Rx queue started %d\\n\", rx_queue_id);\n+\n \tif (dev_conf->rxmode.mq_mode & ETH_MQ_RX_RSS_FLAG) {\n \t\tvnic = rxq->vnic;\n+\n \t\tif (vnic->fw_grp_ids[rx_queue_id] != INVALID_HW_RING_ID)\n \t\t\treturn 0;\n-\t\tPMD_DRV_LOG(DEBUG, \"vnic = %p fw_grp_id = %d\\n\",\n-\t\t\tvnic, bp->grp_info[rx_queue_id + 1].fw_grp_id);\n+\n+\t\tPMD_DRV_LOG(DEBUG,\n+\t\t\t    \"vnic = %p fw_grp_id = %d\\n\",\n+\t\t\t    vnic, bp->grp_info[rx_queue_id].fw_grp_id);\n+\n \t\tvnic->fw_grp_ids[rx_queue_id] =\n-\t\t\t\t\tbp->grp_info[rx_queue_id + 1].fw_grp_id;\n-\t\treturn bnxt_vnic_rss_configure(bp, vnic);\n+\t\t\t\t\tbp->grp_info[rx_queue_id].fw_grp_id;\n+\t\trc = bnxt_vnic_rss_configure(bp, vnic);\n \t}\n \n-\treturn 0;\n+\tif (rc == 0)\n+\t\trxq->rx_deferred_start = false;\n+\n+\treturn rc;\n }\n \n int bnxt_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id)\n {\n \tstruct bnxt *bp = (struct bnxt *)dev->data->dev_private;\n \tstruct rte_eth_conf *dev_conf = &bp->eth_dev->data->dev_conf;\n-\tstruct bnxt_rx_queue *rxq = bp->rx_queues[rx_queue_id];\n \tstruct bnxt_vnic_info *vnic = NULL;\n+\tstruct bnxt_rx_queue *rxq = NULL;\n+\tint rc = 0;\n+\n+\t/* Rx CQ 0 also works as Default CQ for async notifications */\n+\tif (!rx_queue_id) {\n+\t\tPMD_DRV_LOG(ERR, \"Cannot stop Rx queue id %d\\n\", rx_queue_id);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\trxq = bp->rx_queues[rx_queue_id];\n \n \tif (rxq == NULL) {\n \t\tPMD_DRV_LOG(ERR, \"Invalid Rx queue %d\\n\", rx_queue_id);\n@@ -431,7 +461,11 @@ int bnxt_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id)\n \tif (dev_conf->rxmode.mq_mode & ETH_MQ_RX_RSS_FLAG) {\n \t\tvnic = rxq->vnic;\n \t\tvnic->fw_grp_ids[rx_queue_id] = INVALID_HW_RING_ID;\n-\t\treturn bnxt_vnic_rss_configure(bp, vnic);\n+\t\trc = bnxt_vnic_rss_configure(bp, vnic);\n \t}\n-\treturn 0;\n+\n+\tif (rc == 0)\n+\t\tbnxt_rx_queue_release_mbufs(rxq);\n+\n+\treturn rc;\n }\ndiff --git a/drivers/net/bnxt/bnxt_rxq.h b/drivers/net/bnxt/bnxt_rxq.h\nindex 8307f603c..e5d6001d3 100644\n--- a/drivers/net/bnxt/bnxt_rxq.h\n+++ b/drivers/net/bnxt/bnxt_rxq.h\n@@ -10,6 +10,9 @@ struct bnxt;\n struct bnxt_rx_ring_info;\n struct bnxt_cp_ring_info;\n struct bnxt_rx_queue {\n+\trte_spinlock_t\t\tlock;\t/* Synchronize between rx_queue_stop\n+\t\t\t\t\t * and fast path\n+\t\t\t\t\t */\n \tstruct rte_mempool\t*mb_pool; /* mbuf pool for RX ring */\n \tstruct rte_mbuf\t\t*pkt_first_seg; /* 1st seg of pkt */\n \tstruct rte_mbuf\t\t*pkt_last_seg; /* Last seg of pkt */\n@@ -54,4 +57,5 @@ int bnxt_rx_queue_start(struct rte_eth_dev *dev,\n \t\t\tuint16_t rx_queue_id);\n int bnxt_rx_queue_stop(struct rte_eth_dev *dev,\n \t\t       uint16_t rx_queue_id);\n+void bnxt_rx_queue_release_mbufs(struct bnxt_rx_queue *rxq);\n #endif\ndiff --git a/drivers/net/bnxt/bnxt_rxr.c b/drivers/net/bnxt/bnxt_rxr.c\nindex b6b72c553..c7bc88481 100644\n--- a/drivers/net/bnxt/bnxt_rxr.c\n+++ b/drivers/net/bnxt/bnxt_rxr.c\n@@ -541,7 +541,9 @@ uint16_t bnxt_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,\n \tbool evt = false;\n \n \t/* If Rx Q was stopped return. RxQ0 cannot be stopped. */\n-\tif (rxq->rx_deferred_start && rxq->queue_id)\n+\tif (unlikely(((rxq->rx_deferred_start ||\n+\t\t       !rte_spinlock_trylock(&rxq->lock)) &&\n+\t\t      rxq->queue_id)))\n \t\treturn 0;\n \n \t/* Handle RX burst request */\n@@ -583,7 +585,7 @@ uint16_t bnxt_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,\n \t\t * For PMD, there is no need to keep on pushing to REARM\n \t\t * the doorbell if there are no new completions\n \t\t */\n-\t\treturn nb_rx_pkts;\n+\t\tgoto done;\n \t}\n \n \tif (prod != rxr->rx_prod)\n@@ -618,16 +620,22 @@ uint16_t bnxt_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,\n \t\t}\n \t}\n \n+done:\n+\trte_spinlock_unlock(&rxq->lock);\n+\n \treturn nb_rx_pkts;\n }\n \n void bnxt_free_rx_rings(struct bnxt *bp)\n {\n \tint i;\n+\tstruct bnxt_rx_queue *rxq;\n \n-\tfor (i = 0; i < (int)bp->rx_nr_rings; i++) {\n-\t\tstruct bnxt_rx_queue *rxq = bp->rx_queues[i];\n+\tif (!bp->rx_queues)\n+\t\treturn;\n \n+\tfor (i = 0; i < (int)bp->rx_nr_rings; i++) {\n+\t\trxq = bp->rx_queues[i];\n \t\tif (!rxq)\n \t\t\tcontinue;\n \n",
    "prefixes": [
        "v2",
        "09/23"
    ]
}