get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 16626,
    "url": "https://patches.dpdk.org/api/patches/16626/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1476562089-21823-16-git-send-email-rasesh.mody@qlogic.com/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1476562089-21823-16-git-send-email-rasesh.mody@qlogic.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1476562089-21823-16-git-send-email-rasesh.mody@qlogic.com",
    "date": "2016-10-15T20:07:52",
    "name": "[dpdk-dev,v3,15/32] qede: enable support for unequal number of RX/TX queues",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "c8514f6055b1562d1a64c122f3e40447e62ee675",
    "submitter": {
        "id": 325,
        "url": "https://patches.dpdk.org/api/people/325/?format=api",
        "name": "Rasesh Mody",
        "email": "rasesh.mody@qlogic.com"
    },
    "delegate": {
        "id": 10,
        "url": "https://patches.dpdk.org/api/users/10/?format=api",
        "username": "bruce",
        "first_name": "Bruce",
        "last_name": "Richardson",
        "email": "bruce.richardson@intel.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1476562089-21823-16-git-send-email-rasesh.mody@qlogic.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/16626/comments/",
    "check": "pending",
    "checks": "https://patches.dpdk.org/api/patches/16626/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 [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id B5BD57EF0;\n\tSat, 15 Oct 2016 22:09:39 +0200 (CEST)",
            "from mx0b-0016ce01.pphosted.com (mx0a-0016ce01.pphosted.com\n\t[67.231.148.157]) by dpdk.org (Postfix) with ESMTP id 7280C7EF0\n\tfor <dev@dpdk.org>; Sat, 15 Oct 2016 22:09:37 +0200 (CEST)",
            "from pps.filterd (m0095336.ppops.net [127.0.0.1])\n\tby mx0a-0016ce01.pphosted.com (8.16.0.17/8.16.0.17) with SMTP id\n\tu9FK62EV014065; Sat, 15 Oct 2016 13:09:36 -0700",
            "from avcashub1.qlogic.com ([198.186.0.116])\n\tby mx0a-0016ce01.pphosted.com with ESMTP id 263jj4gfsj-1\n\t(version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NOT);\n\tSat, 15 Oct 2016 13:09:36 -0700",
            "from avluser05.qlc.com (10.1.113.115) by qlc.com (10.1.4.191) with\n\tMicrosoft SMTP Server id 14.3.235.1;\n\tSat, 15 Oct 2016 13:09:35 -0700",
            "(from rmody@localhost)\tby avluser05.qlc.com (8.14.4/8.14.4/Submit)\n\tid u9FK9ZUi022009;\tSat, 15 Oct 2016 13:09:35 -0700"
        ],
        "X-Authentication-Warning": "avluser05.qlc.com: rmody set sender to\n\trasesh.mody@qlogic.com using -f",
        "From": "Rasesh Mody <rasesh.mody@qlogic.com>",
        "To": "<ferruh.yigit@intel.com>, <thomas.monjalon@6wind.com>,\n\t<bruce.richardson@intel.com>",
        "CC": "<dev@dpdk.org>, <Dept-EngDPDKDev@qlogic.com>, Sony Chacko\n\t<sony.chacko@qlogic.com>",
        "Date": "Sat, 15 Oct 2016 13:07:52 -0700",
        "Message-ID": "<1476562089-21823-16-git-send-email-rasesh.mody@qlogic.com>",
        "X-Mailer": "git-send-email 1.7.10.3",
        "In-Reply-To": "<1476562089-21823-1-git-send-email-rasesh.mody@qlogic.com>",
        "References": "<1476562089-21823-1-git-send-email-rasesh.mody@qlogic.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "disclaimer": "bypass",
        "X-Proofpoint-Virus-Version": "vendor=nai engine=5800 definitions=8319\n\tsignatures=670719",
        "X-Proofpoint-Spam-Details": "rule=notspam policy=default score=0\n\tpriorityscore=1501 malwarescore=0\n\tsuspectscore=2 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015\n\tlowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam\n\tadjust=0\n\treason=mlx scancount=1 engine=8.0.1-1609300000\n\tdefinitions=main-1610150355",
        "Subject": "[dpdk-dev] [PATCH v3 15/32] qede: enable support for unequal number\n\tof RX/TX queues",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "patches and discussions about DPDK <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Sony Chacko <sony.chacko@qlogic.com>\n\nPrevious release of the qede PMD had a limitation that the\ndriver expects the number of tx and rx queues to be the same.\nThis patch fixes this issue by making appropriate changes in\ncontrol and data path.\n\nFixes: 2ea6f76 (\"qede: add core driver\")\n\nSigned-off-by: Sony Chacko <sony.chacko@qlogic.com>\n---\n doc/guides/nics/qede.rst       |   3 +-\n drivers/net/qede/qede_ethdev.c |  23 +--\n drivers/net/qede/qede_ethdev.h |  16 +-\n drivers/net/qede/qede_rxtx.c   | 376 ++++++++++++++++++++---------------------\n drivers/net/qede/qede_rxtx.h   |   7 +-\n 5 files changed, 212 insertions(+), 213 deletions(-)",
    "diff": "diff --git a/doc/guides/nics/qede.rst b/doc/guides/nics/qede.rst\nindex df6fecc..5b921cc 100644\n--- a/doc/guides/nics/qede.rst\n+++ b/doc/guides/nics/qede.rst\n@@ -50,7 +50,7 @@ Supported Features\n - Jumbo frames (using single buffer)\n - VLAN offload - Filtering and stripping\n - Stateless checksum offloads (IPv4/TCP/UDP)\n-- Multiple Rx/Tx queues (queue-pairs)\n+- Multiple Rx/Tx queues\n - RSS (with user configurable table/key)\n - TSS\n - Multiple MAC address\n@@ -63,7 +63,6 @@ Non-supported Features\n ----------------------\n \n - Scatter-Gather Rx/Tx frames\n-- Unequal number of Rx/Tx queues\n - SR-IOV PF\n - Tunneling offloads\n - Reload of the PMD after a non-graceful termination\ndiff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c\nindex 3b2d8ea..93cad91 100644\n--- a/drivers/net/qede/qede_ethdev.c\n+++ b/drivers/net/qede/qede_ethdev.c\n@@ -496,31 +496,26 @@ static int qede_dev_configure(struct rte_eth_dev *eth_dev)\n \n \tPMD_INIT_FUNC_TRACE(edev);\n \n-\tif (eth_dev->data->nb_rx_queues != eth_dev->data->nb_tx_queues) {\n-\t\tDP_NOTICE(edev, false,\n-\t\t\t  \"Unequal number of rx/tx queues \"\n-\t\t\t  \"is not supported RX=%u TX=%u\\n\",\n-\t\t\t  eth_dev->data->nb_rx_queues,\n-\t\t\t  eth_dev->data->nb_tx_queues);\n-\t\treturn -EINVAL;\n-\t}\n-\n \t/* Check requirements for 100G mode */\n \tif (edev->num_hwfns > 1) {\n-\t\tif (eth_dev->data->nb_rx_queues < 2) {\n+\t\tif (eth_dev->data->nb_rx_queues < 2 ||\n+\t\t    eth_dev->data->nb_tx_queues < 2) {\n \t\t\tDP_NOTICE(edev, false,\n-\t\t\t\t  \"100G mode requires minimum two queues\\n\");\n+\t\t\t\t  \"100G mode needs min. 2 RX/TX queues\\n\");\n \t\t\treturn -EINVAL;\n \t\t}\n \n-\t\tif ((eth_dev->data->nb_rx_queues % 2) != 0) {\n+\t\tif ((eth_dev->data->nb_rx_queues % 2 != 0) ||\n+\t\t    (eth_dev->data->nb_tx_queues % 2 != 0)) {\n \t\t\tDP_NOTICE(edev, false,\n-\t\t\t\t  \"100G mode requires even number of queues\\n\");\n+\t\t\t\t  \"100G mode needs even no. of RX/TX queues\\n\");\n \t\t\treturn -EINVAL;\n \t\t}\n \t}\n \n-\tqdev->num_rss = eth_dev->data->nb_rx_queues;\n+\tqdev->fp_num_tx = eth_dev->data->nb_tx_queues;\n+\tqdev->fp_num_rx = eth_dev->data->nb_rx_queues;\n+\tqdev->num_queues = qdev->fp_num_tx + qdev->fp_num_rx;\n \n \t/* Initial state */\n \tqdev->state = QEDE_CLOSE;\ndiff --git a/drivers/net/qede/qede_ethdev.h b/drivers/net/qede/qede_ethdev.h\nindex abb33af..1f62283 100644\n--- a/drivers/net/qede/qede_ethdev.h\n+++ b/drivers/net/qede/qede_ethdev.h\n@@ -62,8 +62,8 @@\n #define QEDE_MAX_TSS_CNT(edev)  ((edev)->dev_info.num_queues * \\\n \t\t\t\t\t(edev)->dev_info.num_tc)\n \n-#define QEDE_RSS_CNT(edev)\t((edev)->num_rss)\n-#define QEDE_TSS_CNT(edev)\t((edev)->num_rss * (edev)->num_tc)\n+#define QEDE_RSS_CNT(edev)\t((edev)->fp_num_rx)\n+#define QEDE_TSS_CNT(edev)\t((edev)->fp_num_rx * (edev)->num_tc)\n \n #define QEDE_DUPLEX_FULL\t1\n #define QEDE_DUPLEX_HALF\t2\n@@ -76,6 +76,12 @@\n \n #define QEDE_INIT_EDEV(adapter) (&((struct qede_dev *)adapter)->edev)\n \n+#define QEDE_QUEUE_CNT(qdev) ((qdev)->num_queues)\n+#define QEDE_RSS_COUNT(qdev) ((qdev)->num_queues - (qdev)->fp_num_tx)\n+#define QEDE_TSS_COUNT(qdev) (((qdev)->num_queues - (qdev)->fp_num_rx) * \\\n+\t\t(qdev)->num_tc)\n+#define QEDE_TC_IDX(qdev, txqidx) ((txqidx) / QEDE_TSS_COUNT(qdev))\n+\n #define QEDE_INIT(eth_dev) {\t\t\t\t\t\\\n \tstruct qede_dev *qdev = eth_dev->data->dev_private;\t\\\n \tstruct ecore_dev *edev = &qdev->edev;\t\t\t\\\n@@ -138,8 +144,10 @@ struct qede_dev {\n \tstruct qed_update_vport_rss_params rss_params;\n \tuint32_t flags;\n \tbool gro_disable;\n-\tstruct qede_rx_queue **rx_queues;\n-\tstruct qede_tx_queue **tx_queues;\n+\tuint16_t num_queues;\n+\tuint8_t fp_num_tx;\n+\tuint8_t fp_num_rx;\n+\n \tenum dev_state state;\n \n \t/* Vlans */\ndiff --git a/drivers/net/qede/qede_rxtx.c b/drivers/net/qede/qede_rxtx.c\nindex b5a40fe..00584a9 100644\n--- a/drivers/net/qede/qede_rxtx.c\n+++ b/drivers/net/qede/qede_rxtx.c\n@@ -10,6 +10,9 @@\n \n static bool gro_disable = 1;\t/* mod_param */\n \n+#define QEDE_FASTPATH_TX        (1 << 0)\n+#define QEDE_FASTPATH_RX        (1 << 1)\n+\n static inline int qede_alloc_rx_buffer(struct qede_rx_queue *rxq)\n {\n \tstruct rte_mbuf *new_mb = NULL;\n@@ -65,6 +68,22 @@ void qede_rx_queue_release(void *rx_queue)\n \t}\n }\n \n+static void qede_tx_queue_release_mbufs(struct qede_tx_queue *txq)\n+{\n+\tunsigned int i;\n+\n+\tPMD_TX_LOG(DEBUG, txq, \"releasing %u mbufs\\n\", txq->nb_tx_desc);\n+\n+\tif (txq->sw_tx_ring) {\n+\t\tfor (i = 0; i < txq->nb_tx_desc; i++) {\n+\t\t\tif (txq->sw_tx_ring[i].mbuf) {\n+\t\t\t\trte_pktmbuf_free(txq->sw_tx_ring[i].mbuf);\n+\t\t\t\ttxq->sw_tx_ring[i].mbuf = NULL;\n+\t\t\t}\n+\t\t}\n+\t}\n+}\n+\n int\n qede_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,\n \t\t    uint16_t nb_desc, unsigned int socket_id,\n@@ -116,15 +135,8 @@ qede_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,\n \tdata_size = (uint16_t)rte_pktmbuf_data_room_size(mp) -\n \t\t\t\tRTE_PKTMBUF_HEADROOM;\n \n-\tif (pkt_len > data_size) {\n-\t\tDP_ERR(edev, \"MTU %u should not exceed dataroom %u\\n\",\n-\t\t       pkt_len, data_size);\n-\t\trte_free(rxq);\n-\t\treturn -EINVAL;\n-\t}\n-\n \tqdev->mtu = pkt_len;\n-\trxq->rx_buf_size = pkt_len + QEDE_ETH_OVERHEAD;\n+\trxq->rx_buf_size = data_size;\n \n \tDP_INFO(edev, \"MTU = %u ; RX buffer = %u\\n\",\n \t\tqdev->mtu, rxq->rx_buf_size);\n@@ -166,6 +178,7 @@ qede_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,\n \t\trxq->sw_rx_ring = NULL;\n \t\trte_free(rxq);\n \t\trxq = NULL;\n+\t\treturn -ENOMEM;\n \t}\n \n \t/* Allocate FW completion ring */\n@@ -185,6 +198,7 @@ qede_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,\n \t\trte_free(rxq->sw_rx_ring);\n \t\trxq->sw_rx_ring = NULL;\n \t\trte_free(rxq);\n+\t\treturn -ENOMEM;\n \t}\n \n \t/* Allocate buffers for the Rx ring */\n@@ -198,8 +212,6 @@ qede_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,\n \t}\n \n \tdev->data->rx_queues[queue_idx] = rxq;\n-\tif (!qdev->rx_queues)\n-\t\tqdev->rx_queues = (struct qede_rx_queue **)dev->data->rx_queues;\n \n \tDP_INFO(edev, \"rxq %d num_desc %u rx_buf_size=%u socket %u\\n\",\n \t\t  queue_idx, nb_desc, qdev->mtu, socket_id);\n@@ -210,22 +222,6 @@ err4:\n \treturn -ENOMEM;\n }\n \n-static void qede_tx_queue_release_mbufs(struct qede_tx_queue *txq)\n-{\n-\tunsigned int i;\n-\n-\tPMD_TX_LOG(DEBUG, txq, \"releasing %u mbufs\\n\", txq->nb_tx_desc);\n-\n-\tif (txq->sw_tx_ring != NULL) {\n-\t\tfor (i = 0; i < txq->nb_tx_desc; i++) {\n-\t\t\tif (txq->sw_tx_ring[i].mbuf != NULL) {\n-\t\t\t\trte_pktmbuf_free(txq->sw_tx_ring[i].mbuf);\n-\t\t\t\ttxq->sw_tx_ring[i].mbuf = NULL;\n-\t\t\t}\n-\t\t}\n-\t}\n-}\n-\n void qede_tx_queue_release(void *tx_queue)\n {\n \tstruct qede_tx_queue *txq = tx_queue;\n@@ -319,10 +315,6 @@ qede_tx_queue_setup(struct rte_eth_dev *dev,\n \t    (txq->nb_tx_desc - QEDE_DEFAULT_TX_FREE_THRESH);\n \n \tdev->data->tx_queues[queue_idx] = txq;\n-\tif (!qdev->tx_queues)\n-\t\tqdev->tx_queues = (struct qede_tx_queue **)dev->data->tx_queues;\n-\n-\ttxq->txq_counter = 0;\n \n \tDP_INFO(edev,\n \t\t  \"txq %u num_desc %u tx_free_thresh %u socket %u\\n\",\n@@ -332,35 +324,50 @@ qede_tx_queue_setup(struct rte_eth_dev *dev,\n }\n \n /* This function inits fp content and resets the SB, RXQ and TXQ arrays */\n-static void qede_init_fp(struct qede_dev *qdev)\n+static void qede_init_fp(struct rte_eth_dev *eth_dev)\n {\n \tstruct qede_fastpath *fp;\n-\tint rss_id, txq_index, tc;\n+\tuint8_t i, rss_id, index, tc;\n+\tstruct qede_dev *qdev = eth_dev->data->dev_private;\n+\tint fp_rx = qdev->fp_num_rx, rxq = 0, txq = 0;\n \n-\tmemset((void *)qdev->fp_array, 0, (QEDE_RSS_CNT(qdev) *\n+\tmemset((void *)qdev->fp_array, 0, (QEDE_QUEUE_CNT(qdev) *\n \t\t\t\t\t   sizeof(*qdev->fp_array)));\n-\tmemset((void *)qdev->sb_array, 0, (QEDE_RSS_CNT(qdev) *\n+\tmemset((void *)qdev->sb_array, 0, (QEDE_QUEUE_CNT(qdev) *\n \t\t\t\t\t   sizeof(*qdev->sb_array)));\n-\tfor_each_rss(rss_id) {\n-\t\tfp = &qdev->fp_array[rss_id];\n+\tfor_each_queue(i) {\n+\t\tfp = &qdev->fp_array[i];\n+\t\tif (fp_rx) {\n+\t\t\tfp->type = QEDE_FASTPATH_RX;\n+\t\t\tfp_rx--;\n+\t\t} else{\n+\t\t\tfp->type = QEDE_FASTPATH_TX;\n+\t\t}\n+\t}\n \n+\tfor_each_queue(i) {\n+\t\tfp = &qdev->fp_array[i];\n \t\tfp->qdev = qdev;\n-\t\tfp->rss_id = rss_id;\n+\t\tfp->id = i;\n \n \t\t/* Point rxq to generic rte queues that was created\n \t\t * as part of queue creation.\n \t\t */\n-\t\tfp->rxq = qdev->rx_queues[rss_id];\n-\t\tfp->sb_info = &qdev->sb_array[rss_id];\n+\t\tif (fp->type & QEDE_FASTPATH_RX) {\n+\t\t\tfp->rxq = eth_dev->data->rx_queues[i];\n+\t\t\tfp->rxq->queue_id = rxq++;\n+\t\t}\n+\t\tfp->sb_info = &qdev->sb_array[i];\n \n-\t\tfor (tc = 0; tc < qdev->num_tc; tc++) {\n-\t\t\ttxq_index = tc * QEDE_RSS_CNT(qdev) + rss_id;\n-\t\t\tfp->txqs[tc] = qdev->tx_queues[txq_index];\n-\t\t\tfp->txqs[tc]->queue_id = txq_index;\n-\t\t\t/* Updating it to main structure */\n-\t\t\tsnprintf(fp->name, sizeof(fp->name), \"%s-fp-%d\",\n-\t\t\t\t \"qdev\", rss_id);\n+\t\tif (fp->type & QEDE_FASTPATH_TX) {\n+\t\t\tfor (tc = 0; tc < qdev->num_tc; tc++) {\n+\t\t\t\tindex = tc * QEDE_TSS_CNT(qdev) + txq;\n+\t\t\t\tfp->txqs[tc] = eth_dev->data->tx_queues[index];\n+\t\t\t\tfp->txqs[tc]->queue_id = index;\n+\t\t\t}\n+\t\t\ttxq++;\n \t\t}\n+\t\tsnprintf(fp->name, sizeof(fp->name), \"%s-fp-%d\", \"qdev\", i);\n \t}\n \n \tqdev->gro_disable = gro_disable;\n@@ -386,7 +393,7 @@ int qede_alloc_fp_array(struct qede_dev *qdev)\n \tstruct ecore_dev *edev = &qdev->edev;\n \tint i;\n \n-\tqdev->fp_array = rte_calloc(\"fp\", QEDE_RSS_CNT(qdev),\n+\tqdev->fp_array = rte_calloc(\"fp\", QEDE_QUEUE_CNT(qdev),\n \t\t\t\t    sizeof(*qdev->fp_array),\n \t\t\t\t    RTE_CACHE_LINE_SIZE);\n \n@@ -395,7 +402,7 @@ int qede_alloc_fp_array(struct qede_dev *qdev)\n \t\treturn -ENOMEM;\n \t}\n \n-\tqdev->sb_array = rte_calloc(\"sb\", QEDE_RSS_CNT(qdev),\n+\tqdev->sb_array = rte_calloc(\"sb\", QEDE_QUEUE_CNT(qdev),\n \t\t\t\t    sizeof(*qdev->sb_array),\n \t\t\t\t    RTE_CACHE_LINE_SIZE);\n \n@@ -437,50 +444,6 @@ qede_alloc_mem_sb(struct qede_dev *qdev, struct ecore_sb_info *sb_info,\n \treturn 0;\n }\n \n-static int qede_alloc_mem_fp(struct qede_dev *qdev, struct qede_fastpath *fp)\n-{\n-\treturn qede_alloc_mem_sb(qdev, fp->sb_info, fp->rss_id);\n-}\n-\n-static void qede_shrink_txq(struct qede_dev *qdev, uint16_t num_rss)\n-{\n-\t/* @@@TBD - this should also re-set the qed interrupts */\n-}\n-\n-/* This function allocates all qede memory at NIC load. */\n-static int qede_alloc_mem_load(struct qede_dev *qdev)\n-{\n-\tint rc = 0, rss_id;\n-\tstruct ecore_dev *edev = &qdev->edev;\n-\n-\tfor (rss_id = 0; rss_id < QEDE_RSS_CNT(qdev); rss_id++) {\n-\t\tstruct qede_fastpath *fp = &qdev->fp_array[rss_id];\n-\n-\t\trc = qede_alloc_mem_fp(qdev, fp);\n-\t\tif (rc)\n-\t\t\tbreak;\n-\t}\n-\n-\tif (rss_id != QEDE_RSS_CNT(qdev)) {\n-\t\t/* Failed allocating memory for all the queues */\n-\t\tif (!rss_id) {\n-\t\t\tDP_ERR(edev,\n-\t\t\t       \"Failed to alloc memory for leading queue\\n\");\n-\t\t\trc = -ENOMEM;\n-\t\t} else {\n-\t\t\tDP_NOTICE(edev, false,\n-\t\t\t\t  \"Failed to allocate memory for all of \"\n-\t\t\t\t  \"RSS queues\\n\"\n-\t\t\t\t  \"Desired: %d queues, allocated: %d queues\\n\",\n-\t\t\t\t  QEDE_RSS_CNT(qdev), rss_id);\n-\t\t\tqede_shrink_txq(qdev, rss_id);\n-\t\t}\n-\t\tqdev->num_rss = rss_id;\n-\t}\n-\n-\treturn 0;\n-}\n-\n static inline void\n qede_update_rx_prod(struct qede_dev *edev, struct qede_rx_queue *rxq)\n {\n@@ -605,7 +568,7 @@ static int qede_start_queues(struct rte_eth_dev *eth_dev, bool clear_stats)\n \tint vlan_removal_en = 1;\n \tint rc, tc, i;\n \n-\tif (!qdev->num_rss) {\n+\tif (!qdev->fp_num_rx) {\n \t\tDP_ERR(edev,\n \t\t       \"Cannot update V-VPORT as active as \"\n \t\t       \"there are no Rx queues\\n\");\n@@ -630,44 +593,51 @@ static int qede_start_queues(struct rte_eth_dev *eth_dev, bool clear_stats)\n \t\t\" MTU = %d, vlan_removal_en = %d\\n\",\n \t\tstart.vport_id, qdev->mtu, vlan_removal_en);\n \n-\tfor_each_rss(i) {\n+\tfor_each_queue(i) {\n \t\tstruct qede_fastpath *fp = &qdev->fp_array[i];\n-\t\tdma_addr_t p_phys_table;\n-\t\tuint16_t page_cnt;\n+\t\tdma_addr_t tbl;\n+\t\tuint16_t cnt;\n \n-\t\tp_phys_table = ecore_chain_get_pbl_phys(&fp->rxq->rx_comp_ring);\n-\t\tpage_cnt = ecore_chain_get_page_cnt(&fp->rxq->rx_comp_ring);\n+\t\tif (fp->type & QEDE_FASTPATH_RX) {\n+\t\t\ttbl = ecore_chain_get_pbl_phys(&fp->rxq->rx_comp_ring);\n+\t\t\tcnt = ecore_chain_get_page_cnt(&fp->rxq->rx_comp_ring);\n \n-\t\tecore_sb_ack(fp->sb_info, IGU_INT_DISABLE, 0);\t/* @DPDK */\n+\t\t\tecore_sb_ack(fp->sb_info, IGU_INT_DISABLE, 0);\n \n-\t\trc = qdev->ops->q_rx_start(edev, i, i, 0,\n+\t\t\trc = qdev->ops->q_rx_start(edev, i, fp->rxq->queue_id,\n+\t\t\t\t\t   0,\n \t\t\t\t\t   fp->sb_info->igu_sb_id,\n \t\t\t\t\t   RX_PI,\n \t\t\t\t\t   fp->rxq->rx_buf_size,\n \t\t\t\t\t   fp->rxq->rx_bd_ring.p_phys_addr,\n-\t\t\t\t\t   p_phys_table,\n-\t\t\t\t\t   page_cnt,\n-\t\t\t\t\t   &fp->rxq->hw_rxq_prod_addr);\n-\t\tif (rc) {\n-\t\t\tDP_ERR(edev, \"Start RXQ #%d failed %d\\n\", i, rc);\n+\t\t\t\t\t   tbl,\n+\t\t\t\t\t   cnt,\n+\t\t\t&fp->rxq->hw_rxq_prod_addr);\n+\t\t\tif (rc) {\n+\t\t\t\tDP_ERR(edev,\n+\t\t\t\t       \"Start rxq #%d failed %d\\n\",\n+\t\t\t\t       fp->rxq->queue_id, rc);\n \t\t\treturn rc;\n \t\t}\n \n \t\tfp->rxq->hw_cons_ptr = &fp->sb_info->sb_virt->pi_array[RX_PI];\n \n-\t\tqede_update_rx_prod(qdev, fp->rxq);\n+\t\t\tqede_update_rx_prod(qdev, fp->rxq);\n+\t\t}\n \n+\t\tif (!(fp->type & QEDE_FASTPATH_TX))\n+\t\t\tcontinue;\n \t\tfor (tc = 0; tc < qdev->num_tc; tc++) {\n \t\t\tstruct qede_tx_queue *txq = fp->txqs[tc];\n \t\t\tint txq_index = tc * QEDE_RSS_CNT(qdev) + i;\n \n-\t\t\tp_phys_table = ecore_chain_get_pbl_phys(&txq->tx_pbl);\n-\t\t\tpage_cnt = ecore_chain_get_page_cnt(&txq->tx_pbl);\n-\t\t\trc = qdev->ops->q_tx_start(edev, i, txq_index,\n+\t\t\ttbl = ecore_chain_get_pbl_phys(&txq->tx_pbl);\n+\t\t\tcnt = ecore_chain_get_page_cnt(&txq->tx_pbl);\n+\t\t\trc = qdev->ops->q_tx_start(edev, i, txq->queue_id,\n \t\t\t\t\t\t   0,\n \t\t\t\t\t\t   fp->sb_info->igu_sb_id,\n \t\t\t\t\t\t   TX_PI(tc),\n-\t\t\t\t\t\t   p_phys_table, page_cnt,\n+\t\t\t\t\t\t   tbl, cnt,\n \t\t\t\t\t\t   &txq->doorbell_addr);\n \t\t\tif (rc) {\n \t\t\t\tDP_ERR(edev, \"Start txq %u failed %d\\n\",\n@@ -893,7 +863,7 @@ qede_recv_pkts(void *p_rxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)\n \t\tif (unlikely(cqe_type == ETH_RX_CQE_TYPE_SLOW_PATH)) {\n \t\t\tPMD_RX_LOG(DEBUG, rxq, \"Got a slowath CQE\\n\");\n \n-\t\t\tqdev->ops->eth_cqe_completion(edev, fp->rss_id,\n+\t\t\tqdev->ops->eth_cqe_completion(edev, fp->id,\n \t\t\t\t(struct eth_slow_path_rx_cqe *)cqe);\n \t\t\tgoto next_cqe;\n \t\t}\n@@ -1065,7 +1035,7 @@ qede_xmit_pkts(void *p_txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)\n \tstruct qede_tx_queue *txq = p_txq;\n \tstruct qede_dev *qdev = txq->qdev;\n \tstruct ecore_dev *edev = &qdev->edev;\n-\tstruct qede_fastpath *fp = &qdev->fp_array[txq->queue_id];\n+\tstruct qede_fastpath *fp;\n \tstruct eth_tx_1st_bd *first_bd;\n \tuint16_t nb_tx_pkts;\n \tuint16_t nb_pkt_sent = 0;\n@@ -1073,6 +1043,8 @@ qede_xmit_pkts(void *p_txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)\n \tuint16_t idx;\n \tuint16_t tx_count;\n \n+\tfp = &qdev->fp_array[QEDE_RSS_COUNT(qdev) + txq->queue_id];\n+\n \tif (unlikely(txq->nb_tx_avail < txq->tx_free_thresh)) {\n \t\tPMD_TX_LOG(DEBUG, txq, \"send=%u avail=%u free_thresh=%u\\n\",\n \t\t\t   nb_pkts, txq->nb_tx_avail, txq->tx_free_thresh);\n@@ -1149,51 +1121,51 @@ int qede_dev_start(struct rte_eth_dev *eth_dev)\n \tstruct qede_dev *qdev = eth_dev->data->dev_private;\n \tstruct ecore_dev *edev = &qdev->edev;\n \tstruct qed_link_output link_output;\n-\tint rc;\n+\tstruct qede_fastpath *fp;\n+\tint rc, i;\n \n-\tDP_INFO(edev, \"port %u\\n\", eth_dev->data->port_id);\n+\tDP_INFO(edev, \"Device state is %d\\n\", qdev->state);\n \n-\tif (qdev->state == QEDE_START) {\n-\t\tDP_INFO(edev, \"device already started\\n\");\n+\tswitch (qdev->state) {\n+\tcase QEDE_START:\n+\t\tDP_INFO(edev, \"Device already started\\n\");\n \t\treturn 0;\n-\t}\n-\n-\tif (qdev->state == QEDE_CLOSE) {\n-\t\trc = qede_alloc_fp_array(qdev);\n-\t\tqede_init_fp(qdev);\n-\t\trc = qede_alloc_mem_load(qdev);\n-\t\tDP_INFO(edev, \"Allocated %d RSS queues on %d TC/s\\n\",\n-\t\t\tQEDE_RSS_CNT(qdev), qdev->num_tc);\n-\t} else if (qdev->state == QEDE_STOP) {\n-\t\tDP_INFO(edev, \"restarting port %u\\n\", eth_dev->data->port_id);\n-\t} else {\n-\t\tDP_INFO(edev, \"unknown state port %u\\n\",\n+\tcase QEDE_CLOSE:\n+\t\tif (qede_alloc_fp_array(qdev))\n+\t\t\treturn -ENOMEM;\n+\t\tqede_init_fp(eth_dev);\n+\t\t/* Fall-thru */\n+\tcase QEDE_STOP:\n+\t\tfor (i = 0; i < QEDE_QUEUE_CNT(qdev); i++) {\n+\t\t\tfp = &qdev->fp_array[i];\n+\t\t\tif (qede_alloc_mem_sb(qdev, fp->sb_info, i))\n+\t\t\t\treturn -ENOMEM;\n+\t\t}\n+\t\tbreak;\n+\tdefault:\n+\t\tDP_INFO(edev, \"Unknown state for port %u\\n\",\n \t\t\teth_dev->data->port_id);\n \t\treturn -EINVAL;\n \t}\n \n \trc = qede_start_queues(eth_dev, true);\n-\n \tif (rc) {\n \t\tDP_ERR(edev, \"Failed to start queues\\n\");\n \t\t/* TBD: free */\n \t\treturn rc;\n \t}\n+\tDP_INFO(edev, \"Allocated %d RSS queues on %d TC/s\\n\",\n+\t\tQEDE_RSS_CNT(qdev), qdev->num_tc);\n \n-\tDP_INFO(edev, \"Start VPORT, RXQ and TXQ succeeded\\n\");\n-\n+\t/* Bring-up the link */\n \tqede_dev_set_link_state(eth_dev, true);\n-\n-\t/* Query whether link is already-up */\n-\tmemset(&link_output, 0, sizeof(link_output));\n-\tqdev->ops->common->get_link(edev, &link_output);\n-\tDP_NOTICE(edev, false, \"link status: %s\\n\",\n-\t\t  link_output.link_up ? \"up\" : \"down\");\n-\n \tqdev->state = QEDE_START;\n-\n \tqede_config_rx_mode(eth_dev);\n \n+\t/* Init the queues */\n+\tif (qede_reset_fp_rings(qdev))\n+\t\treturn -ENOMEM;\n+\n \tDP_INFO(edev, \"dev_state is QEDE_START\\n\");\n \n \treturn 0;\n@@ -1261,48 +1233,58 @@ static int qede_stop_queues(struct qede_dev *qdev)\n \tDP_INFO(edev, \"Flushing tx queues\\n\");\n \n \t/* Flush Tx queues. If needed, request drain from MCP */\n-\tfor_each_rss(i) {\n+\tfor_each_queue(i) {\n \t\tstruct qede_fastpath *fp = &qdev->fp_array[i];\n-\t\tfor (tc = 0; tc < qdev->num_tc; tc++) {\n-\t\t\tstruct qede_tx_queue *txq = fp->txqs[tc];\n-\t\t\trc = qede_drain_txq(qdev, txq, true);\n-\t\t\tif (rc)\n-\t\t\t\treturn rc;\n+\n+\t\tif (fp->type & QEDE_FASTPATH_TX) {\n+\t\t\tfor (tc = 0; tc < qdev->num_tc; tc++) {\n+\t\t\t\tstruct qede_tx_queue *txq = fp->txqs[tc];\n+\n+\t\t\t\trc = qede_drain_txq(qdev, txq, true);\n+\t\t\t\tif (rc)\n+\t\t\t\t\treturn rc;\n+\t\t\t}\n \t\t}\n \t}\n \n \t/* Stop all Queues in reverse order */\n-\tfor (i = QEDE_RSS_CNT(qdev) - 1; i >= 0; i--) {\n+\tfor (i = QEDE_QUEUE_CNT(qdev) - 1; i >= 0; i--) {\n \t\tstruct qed_stop_rxq_params rx_params;\n \n \t\t/* Stop the Tx Queue(s) */\n-\t\tfor (tc = 0; tc < qdev->num_tc; tc++) {\n-\t\t\tstruct qed_stop_txq_params tx_params;\n-\n-\t\t\ttx_params.rss_id = i;\n-\t\t\ttx_params.tx_queue_id = tc * QEDE_RSS_CNT(qdev) + i;\n-\n-\t\t\tDP_INFO(edev, \"Stopping tx queues\\n\");\n-\t\t\trc = qdev->ops->q_tx_stop(edev, &tx_params);\n-\t\t\tif (rc) {\n-\t\t\t\tDP_ERR(edev, \"Failed to stop TXQ #%d\\n\",\n-\t\t\t\t       tx_params.tx_queue_id);\n-\t\t\t\treturn rc;\n+\t\tif (qdev->fp_array[i].type & QEDE_FASTPATH_TX) {\n+\t\t\tfor (tc = 0; tc < qdev->num_tc; tc++) {\n+\t\t\t\tstruct qed_stop_txq_params tx_params;\n+\t\t\t\tu8 val;\n+\n+\t\t\t\ttx_params.rss_id = i;\n+\t\t\t\tval = qdev->fp_array[i].txqs[tc]->queue_id;\n+\t\t\t\ttx_params.tx_queue_id = val;\n+\n+\t\t\t\tDP_INFO(edev, \"Stopping tx queues\\n\");\n+\t\t\t\trc = qdev->ops->q_tx_stop(edev, &tx_params);\n+\t\t\t\tif (rc) {\n+\t\t\t\t\tDP_ERR(edev, \"Failed to stop TXQ #%d\\n\",\n+\t\t\t\t\t       tx_params.tx_queue_id);\n+\t\t\t\t\treturn rc;\n+\t\t\t\t}\n \t\t\t}\n \t\t}\n \n \t\t/* Stop the Rx Queue */\n-\t\tmemset(&rx_params, 0, sizeof(rx_params));\n-\t\trx_params.rss_id = i;\n-\t\trx_params.rx_queue_id = i;\n-\t\trx_params.eq_completion_only = 1;\n+\t\tif (qdev->fp_array[i].type & QEDE_FASTPATH_RX) {\n+\t\t\tmemset(&rx_params, 0, sizeof(rx_params));\n+\t\t\trx_params.rss_id = i;\n+\t\t\trx_params.rx_queue_id = qdev->fp_array[i].rxq->queue_id;\n+\t\t\trx_params.eq_completion_only = 1;\n \n-\t\tDP_INFO(edev, \"Stopping rx queues\\n\");\n+\t\t\tDP_INFO(edev, \"Stopping rx queues\\n\");\n \n-\t\trc = qdev->ops->q_rx_stop(edev, &rx_params);\n-\t\tif (rc) {\n-\t\t\tDP_ERR(edev, \"Failed to stop RXQ #%d\\n\", i);\n-\t\t\treturn rc;\n+\t\t\trc = qdev->ops->q_rx_stop(edev, &rx_params);\n+\t\t\tif (rc) {\n+\t\t\t\tDP_ERR(edev, \"Failed to stop RXQ #%d\\n\", i);\n+\t\t\t\treturn rc;\n+\t\t\t}\n \t\t}\n \t}\n \n@@ -1316,21 +1298,42 @@ static int qede_stop_queues(struct qede_dev *qdev)\n \treturn rc;\n }\n \n-void qede_reset_fp_rings(struct qede_dev *qdev)\n+int qede_reset_fp_rings(struct qede_dev *qdev)\n {\n-\tuint16_t rss_id;\n+\tstruct qede_fastpath *fp;\n+\tstruct qede_tx_queue *txq;\n \tuint8_t tc;\n-\n-\tfor_each_rss(rss_id) {\n-\t\tDP_INFO(&qdev->edev, \"reset fp chain for rss %u\\n\", rss_id);\n-\t\tstruct qede_fastpath *fp = &qdev->fp_array[rss_id];\n-\t\tecore_chain_reset(&fp->rxq->rx_bd_ring);\n-\t\tecore_chain_reset(&fp->rxq->rx_comp_ring);\n-\t\tfor (tc = 0; tc < qdev->num_tc; tc++) {\n-\t\t\tstruct qede_tx_queue *txq = fp->txqs[tc];\n-\t\t\tecore_chain_reset(&txq->tx_pbl);\n+\tuint16_t id, i;\n+\n+\tfor_each_queue(id) {\n+\t\tDP_INFO(&qdev->edev, \"Reset FP chain for RSS %u\\n\", id);\n+\t\tfp = &qdev->fp_array[id];\n+\n+\t\tif (fp->type & QEDE_FASTPATH_RX) {\n+\t\t\tqede_rx_queue_release_mbufs(fp->rxq);\n+\t\t\tecore_chain_reset(&fp->rxq->rx_bd_ring);\n+\t\t\tecore_chain_reset(&fp->rxq->rx_comp_ring);\n+\t\t\tfp->rxq->sw_rx_prod = 0;\n+\t\t\tfp->rxq->sw_rx_cons = 0;\n+\t\t\tfor (i = 0; i < fp->rxq->nb_rx_desc; i++) {\n+\t\t\t\tif (qede_alloc_rx_buffer(fp->rxq)) {\n+\t\t\t\t\tDP_ERR(&qdev->edev,\n+\t\t\t\t\t       \"RX buffer allocation failed\\n\");\n+\t\t\t\t\treturn -ENOMEM;\n+\t\t\t\t}\n+\t\t\t}\n+\t\t}\n+\t\tif (fp->type & QEDE_FASTPATH_TX) {\n+\t\t\tfor (tc = 0; tc < qdev->num_tc; tc++) {\n+\t\t\t\ttxq = fp->txqs[tc];\n+\t\t\t\tecore_chain_reset(&txq->tx_pbl);\n+\t\t\t\ttxq->sw_tx_cons = 0;\n+\t\t\t\ttxq->sw_tx_prod = 0;\n+\t\t\t}\n \t\t}\n \t}\n+\n+\treturn 0;\n }\n \n /* This function frees all memory of a single fp */\n@@ -1347,41 +1350,34 @@ void qede_free_mem_load(struct qede_dev *qdev)\n {\n \tuint8_t rss_id;\n \n-\tfor_each_rss(rss_id) {\n+\tfor_each_queue(rss_id) {\n \t\tstruct qede_fastpath *fp = &qdev->fp_array[rss_id];\n \t\tqede_free_mem_fp(qdev, fp);\n \t}\n \t/* qdev->num_rss = 0; */\n }\n \n-/*\n- * Stop an Ethernet device. The device can be restarted with a call to\n- * rte_eth_dev_start().\n- * Do not change link state and do not release sw structures.\n- */\n void qede_dev_stop(struct rte_eth_dev *eth_dev)\n {\n \tstruct qede_dev *qdev = eth_dev->data->dev_private;\n \tstruct ecore_dev *edev = &qdev->edev;\n-\tint rc;\n \n \tDP_INFO(edev, \"port %u\\n\", eth_dev->data->port_id);\n \n \tif (qdev->state != QEDE_START) {\n-\t\tDP_INFO(edev, \"device not yet started\\n\");\n+\t\tDP_INFO(edev, \"Device not yet started\\n\");\n \t\treturn;\n \t}\n \n-\trc = qede_stop_queues(qdev);\n-\n-\tif (rc)\n+\tif (qede_stop_queues(qdev))\n \t\tDP_ERR(edev, \"Didn't succeed to close queues\\n\");\n \n \tDP_INFO(edev, \"Stopped queues\\n\");\n \n \tqdev->ops->fastpath_stop(edev);\n \n-\tqede_reset_fp_rings(qdev);\n+\t/* Bring the link down */\n+\tqede_dev_set_link_state(eth_dev, false);\n \n \tqdev->state = QEDE_STOP;\n \ndiff --git a/drivers/net/qede/qede_rxtx.h b/drivers/net/qede/qede_rxtx.h\nindex 90da603..a8520ed 100644\n--- a/drivers/net/qede/qede_rxtx.h\n+++ b/drivers/net/qede/qede_rxtx.h\n@@ -75,7 +75,7 @@\n \n #define MAX_NUM_TC\t\t8\n \n-#define for_each_rss(i) for (i = 0; i < qdev->num_rss; i++)\n+#define for_each_queue(i) for (i = 0; i < qdev->num_queues; i++)\n \n /*\n  * RX BD descriptor ring\n@@ -139,7 +139,8 @@ struct qede_tx_queue {\n \n struct qede_fastpath {\n \tstruct qede_dev *qdev;\n-\tuint8_t rss_id;\n+\tu8 type;\n+\tuint8_t id;\n \tstruct ecore_sb_info *sb_info;\n \tstruct qede_rx_queue *rxq;\n \tstruct qede_tx_queue *txqs[MAX_NUM_TC];\n@@ -168,7 +169,7 @@ int qede_dev_start(struct rte_eth_dev *eth_dev);\n \n void qede_dev_stop(struct rte_eth_dev *eth_dev);\n \n-void qede_reset_fp_rings(struct qede_dev *qdev);\n+int qede_reset_fp_rings(struct qede_dev *qdev);\n \n void qede_free_fp_arrays(struct qede_dev *qdev);\n \n",
    "prefixes": [
        "dpdk-dev",
        "v3",
        "15/32"
    ]
}