get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 87491,
    "url": "https://patches.dpdk.org/api/patches/87491/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20210128152220.214485-11-pnalla@marvell.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": "<20210128152220.214485-11-pnalla@marvell.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210128152220.214485-11-pnalla@marvell.com",
    "date": "2021-01-28T15:22:19",
    "name": "[v5,10/11] net/octeontx_ep: receive data path function added",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "20f23eca427bfe59e35b7de40bfc95cbbb1c6926",
    "submitter": {
        "id": 2074,
        "url": "https://patches.dpdk.org/api/people/2074/?format=api",
        "name": "Pradeep Nalla",
        "email": "pnalla@marvell.com"
    },
    "delegate": {
        "id": 319,
        "url": "https://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20210128152220.214485-11-pnalla@marvell.com/mbox/",
    "series": [
        {
            "id": 15011,
            "url": "https://patches.dpdk.org/api/series/15011/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=15011",
            "date": "2021-01-28T15:22:19",
            "name": null,
            "version": 5,
            "mbox": "https://patches.dpdk.org/series/15011/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/87491/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/87491/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id E945BA09E4;\n\tThu, 28 Jan 2021 16:24:48 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 7BC20188A14;\n\tThu, 28 Jan 2021 16:23:45 +0100 (CET)",
            "from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com\n [67.231.156.173])\n by mails.dpdk.org (Postfix) with ESMTP id AE8871889E9\n for <dev@dpdk.org>; Thu, 28 Jan 2021 16:23:34 +0100 (CET)",
            "from pps.filterd (m0045851.ppops.net [127.0.0.1])\n by mx0b-0016f401.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id\n 10SFKZMZ026640 for <dev@dpdk.org>; Thu, 28 Jan 2021 07:23:33 -0800",
            "from dc5-exch01.marvell.com ([199.233.59.181])\n by mx0b-0016f401.pphosted.com with ESMTP id 36b1xpmtqa-3\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT)\n for <dev@dpdk.org>; Thu, 28 Jan 2021 07:23:33 -0800",
            "from SC-EXCH01.marvell.com (10.93.176.81) by DC5-EXCH01.marvell.com\n (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.2;\n Thu, 28 Jan 2021 07:23:32 -0800",
            "from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH01.marvell.com\n (10.93.176.81) with Microsoft SMTP Server (TLS) id 15.0.1497.2;\n Thu, 28 Jan 2021 07:23:31 -0800",
            "from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com\n (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend\n Transport; Thu, 28 Jan 2021 07:23:32 -0800",
            "from sburla-Super-Server.caveonetworks.com (unknown [10.106.27.196])\n by maili.marvell.com (Postfix) with ESMTP id AE2823F7041;\n Thu, 28 Jan 2021 07:23:31 -0800 (PST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com;\n h=from : to : cc :\n subject : date : message-id : in-reply-to : references : mime-version :\n content-type; s=pfpt0220; bh=Be/BpW9l8TrP56kdrn0rFch/May1EYgvicaNJ+uFMq0=;\n b=I/U2SEtBNeC2GI8+71eGhfIXDekWehb8hVUzB8jgAS9AIQyLrN7MSdxZZOiv3De2q+nf\n +aIGb9fLI30c6LRwzwsRUeR09LPhLFO42o6eMbBMMbUCeg9O4LZq5+vL5Jy+RiSOfEO6\n uy6rHhVa1xzifCG8zyZaa+SBBUiJFKL2U1hZ+LQZqoEX3GB8BzZ8KSLX8QYqxnKX23iN\n Lz8+MNbUZ4kJHNVknCq/NvTv/90S6IzA/zpwEcl2Ap2uKyFAlBcBs8M4iHmLQVYYtSFX\n uY5KzYn9LfvWRuChSHK/g8T/8Wx6gvnaJeTV9plRzUXRrykeO40OWFcP3XJ6RHku4vnQ LA==",
        "From": "Nalla Pradeep <pnalla@marvell.com>",
        "To": "Nalla Pradeep <pnalla@marvell.com>, Radha Mohan Chintakuntla\n <radhac@marvell.com>, Veerasenareddy Burru <vburru@marvell.com>",
        "CC": "<jerinj@marvell.com>, <sburla@marvell.com>, <dev@dpdk.org>",
        "Date": "Thu, 28 Jan 2021 07:22:19 -0800",
        "Message-ID": "<20210128152220.214485-11-pnalla@marvell.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20210118093602.5449-1-pnalla@marvell.com>",
        "References": "<20210118093602.5449-1-pnalla@marvell.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Proofpoint-Virus-Version": "vendor=fsecure engine=2.50.10434:6.0.343, 18.0.737\n definitions=2021-01-28_11:2021-01-28,\n 2021-01-28 signatures=0",
        "Subject": "[dpdk-dev] [PATCH v5 10/11] net/octeontx_ep: receive data path\n function added",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Function to deliver packets from DROQ to application is added. It also\nfills DROQ with receive buffers timely such that device can fill them\nwith incoming packets.\n\nSigned-off-by: Nalla Pradeep <pnalla@marvell.com>\n---\n drivers/net/octeontx_ep/otx_ep_common.h |   2 +\n drivers/net/octeontx_ep/otx_ep_ethdev.c |   3 +\n drivers/net/octeontx_ep/otx_ep_rxtx.c   | 286 +++++++++++++++++++++++-\n drivers/net/octeontx_ep/otx_ep_rxtx.h   |  12 +-\n 4 files changed, 301 insertions(+), 2 deletions(-)",
    "diff": "diff --git a/drivers/net/octeontx_ep/otx_ep_common.h b/drivers/net/octeontx_ep/otx_ep_common.h\nindex 8c07a13e8..039e3e064 100644\n--- a/drivers/net/octeontx_ep/otx_ep_common.h\n+++ b/drivers/net/octeontx_ep/otx_ep_common.h\n@@ -22,6 +22,8 @@\n #define OTX_EP_BUSY_LOOP_COUNT      (10000)\n #define OTX_EP_MAX_IOQS_PER_VF 8\n \n+#define OTX_CUST_DATA_LEN 0\n+\n #define otx_ep_info(fmt, args...)\t\t\t\t\\\n \tRTE_LOG(INFO, PMD, fmt \"\\n\", ## args)\n \ndiff --git a/drivers/net/octeontx_ep/otx_ep_ethdev.c b/drivers/net/octeontx_ep/otx_ep_ethdev.c\nindex ccf717b71..cee03a495 100644\n--- a/drivers/net/octeontx_ep/otx_ep_ethdev.c\n+++ b/drivers/net/octeontx_ep/otx_ep_ethdev.c\n@@ -136,6 +136,7 @@ otx_epdev_init(struct otx_ep_device *otx_epvf)\n \n \totx_epvf->fn_list.setup_device_regs(otx_epvf);\n \n+\totx_epvf->eth_dev->rx_pkt_burst = &otx_ep_recv_pkts;\n \tethdev_queues = (uint32_t)(otx_epvf->sriov_info.rings_per_vf);\n \totx_epvf->max_rx_queues = ethdev_queues;\n \totx_epvf->max_tx_queues = ethdev_queues;\n@@ -382,6 +383,8 @@ otx_ep_eth_dev_uninit(struct rte_eth_dev *eth_dev)\n \totx_epdev_exit(eth_dev);\n \n \teth_dev->dev_ops = NULL;\n+\teth_dev->rx_pkt_burst = NULL;\n+\teth_dev->tx_pkt_burst = NULL;\n \n \treturn 0;\n }\ndiff --git a/drivers/net/octeontx_ep/otx_ep_rxtx.c b/drivers/net/octeontx_ep/otx_ep_rxtx.c\nindex 492decebf..f29cbfa1f 100644\n--- a/drivers/net/octeontx_ep/otx_ep_rxtx.c\n+++ b/drivers/net/octeontx_ep/otx_ep_rxtx.c\n@@ -7,6 +7,8 @@\n #include <rte_eal.h>\n #include <rte_mempool.h>\n #include <rte_mbuf.h>\n+#include <rte_io.h>\n+#include <rte_net.h>\n #include <rte_ethdev_pci.h>\n \n #include \"otx_ep_common.h\"\n@@ -14,6 +16,10 @@\n #include \"otx2_ep_vf.h\"\n #include \"otx_ep_rxtx.h\"\n \n+/* SDP_LENGTH_S specifies packet length and is of 8-byte size */\n+#define INFO_SIZE 8\n+#define DROQ_REFILL_THRESHOLD 16\n+\n static void\n otx_ep_dmazone_free(const struct rte_memzone *mz)\n {\n@@ -240,7 +246,6 @@ otx_ep_droq_setup_ring_buffers(struct otx_ep_droq *droq)\n \t\tif (buf == NULL) {\n \t\t\totx_ep_err(\"OQ buffer alloc failed\\n\");\n \t\t\tdroq->stats.rx_alloc_failure++;\n-\t\t\t/* otx_ep_droq_destroy_ring_buffers(droq);*/\n \t\t\treturn -ENOMEM;\n \t\t}\n \n@@ -354,3 +359,282 @@ otx_ep_setup_oqs(struct otx_ep_device *otx_ep, int oq_no, int num_descs,\n \totx_ep_delete_oqs(otx_ep, oq_no);\n \treturn -ENOMEM;\n }\n+\n+static uint32_t\n+otx_ep_droq_refill(struct otx_ep_droq *droq)\n+{\n+\tstruct otx_ep_droq_desc *desc_ring;\n+\tstruct otx_ep_droq_info *info;\n+\tstruct rte_mbuf *buf = NULL;\n+\tuint32_t desc_refilled = 0;\n+\n+\tdesc_ring = droq->desc_ring;\n+\n+\twhile (droq->refill_count && (desc_refilled < droq->nb_desc)) {\n+\t\t/* If a valid buffer exists (happens if there is no dispatch),\n+\t\t * reuse the buffer, else allocate.\n+\t\t */\n+\t\tif (droq->recv_buf_list[droq->refill_idx] != NULL)\n+\t\t\tbreak;\n+\n+\t\tbuf = rte_pktmbuf_alloc(droq->mpool);\n+\t\t/* If a buffer could not be allocated, no point in\n+\t\t * continuing\n+\t\t */\n+\t\tif (buf == NULL) {\n+\t\t\tdroq->stats.rx_alloc_failure++;\n+\t\t\tbreak;\n+\t\t}\n+\t\tinfo = rte_pktmbuf_mtod(buf, struct otx_ep_droq_info *);\n+\t\tmemset(info, 0, sizeof(*info));\n+\n+\t\tdroq->recv_buf_list[droq->refill_idx] = buf;\n+\t\tdesc_ring[droq->refill_idx].buffer_ptr =\n+\t\t\t\t\trte_mbuf_data_iova_default(buf);\n+\n+\n+\t\tdroq->refill_idx = otx_ep_incr_index(droq->refill_idx, 1,\n+\t\t\t\tdroq->nb_desc);\n+\n+\t\tdesc_refilled++;\n+\t\tdroq->refill_count--;\n+\t}\n+\n+\treturn desc_refilled;\n+}\n+\n+static struct rte_mbuf *\n+otx_ep_droq_read_packet(struct otx_ep_device *otx_ep,\n+\t\t\tstruct otx_ep_droq *droq, int next_fetch)\n+{\n+\tvolatile struct otx_ep_droq_info *info;\n+\tstruct rte_mbuf *droq_pkt2 = NULL;\n+\tstruct rte_mbuf *droq_pkt = NULL;\n+\tstruct rte_net_hdr_lens hdr_lens;\n+\tstruct otx_ep_droq_info *info2;\n+\tuint64_t total_pkt_len;\n+\tuint32_t pkt_len = 0;\n+\tint next_idx;\n+\n+\tdroq_pkt  = droq->recv_buf_list[droq->read_idx];\n+\tdroq_pkt2  = droq->recv_buf_list[droq->read_idx];\n+\tinfo = rte_pktmbuf_mtod(droq_pkt, struct otx_ep_droq_info *);\n+\t/* make sure info is available */\n+\trte_rmb();\n+\tif (unlikely(!info->length)) {\n+\t\tint retry = OTX_EP_MAX_DELAYED_PKT_RETRIES;\n+\t\t/* otx_ep_dbg(\"OCTEON DROQ[%d]: read_idx: %d; Data not ready \"\n+\t\t * \"yet, Retry; pending=%lu\\n\", droq->q_no, droq->read_idx,\n+\t\t * droq->pkts_pending);\n+\t\t */\n+\t\tdroq->stats.pkts_delayed_data++;\n+\t\twhile (retry && !info->length)\n+\t\t\tretry--;\n+\t\tif (!retry && !info->length) {\n+\t\t\totx_ep_err(\"OCTEON DROQ[%d]: read_idx: %d; Retry failed !!\\n\",\n+\t\t\t\t   droq->q_no, droq->read_idx);\n+\t\t\t/* May be zero length packet; drop it */\n+\t\t\trte_pktmbuf_free(droq_pkt);\n+\t\t\tdroq->recv_buf_list[droq->read_idx] = NULL;\n+\t\t\tdroq->read_idx = otx_ep_incr_index(droq->read_idx, 1,\n+\t\t\t\t\t\t\t   droq->nb_desc);\n+\t\t\tdroq->stats.dropped_zlp++;\n+\t\t\tdroq->refill_count++;\n+\t\t\tgoto oq_read_fail;\n+\t\t}\n+\t}\n+\tif (next_fetch) {\n+\t\tnext_idx = otx_ep_incr_index(droq->read_idx, 1, droq->nb_desc);\n+\t\tdroq_pkt2  = droq->recv_buf_list[next_idx];\n+\t\tinfo2 = rte_pktmbuf_mtod(droq_pkt2, struct otx_ep_droq_info *);\n+\t\trte_prefetch_non_temporal((const void *)info2);\n+\t}\n+\n+\tinfo->length = rte_bswap64(info->length);\n+\t/* Deduce the actual data size */\n+\ttotal_pkt_len = info->length + INFO_SIZE;\n+\tif (total_pkt_len <= droq->buffer_size) {\n+\t\tinfo->length -=  OTX_EP_RH_SIZE;\n+\t\tdroq_pkt  = droq->recv_buf_list[droq->read_idx];\n+\t\tif (likely(droq_pkt != NULL)) {\n+\t\t\tdroq_pkt->data_off += OTX_EP_DROQ_INFO_SIZE;\n+\t\t\t/* otx_ep_dbg(\"OQ: pkt_len[%ld], buffer_size %d\\n\",\n+\t\t\t * (long)info->length, droq->buffer_size);\n+\t\t\t */\n+\t\t\tpkt_len = (uint32_t)info->length;\n+\t\t\tdroq_pkt->pkt_len  = pkt_len;\n+\t\t\tdroq_pkt->data_len  = pkt_len;\n+\t\t\tdroq_pkt->port = otx_ep->port_id;\n+\t\t\tdroq->recv_buf_list[droq->read_idx] = NULL;\n+\t\t\tdroq->read_idx = otx_ep_incr_index(droq->read_idx, 1,\n+\t\t\t\t\t\t\t   droq->nb_desc);\n+\t\t\tdroq->refill_count++;\n+\t\t}\n+\t} else {\n+\t\tstruct rte_mbuf *first_buf = NULL;\n+\t\tstruct rte_mbuf *last_buf = NULL;\n+\n+\t\twhile (pkt_len < total_pkt_len) {\n+\t\t\tint cpy_len = 0;\n+\n+\t\t\tcpy_len = ((pkt_len + droq->buffer_size) >\n+\t\t\t\t\ttotal_pkt_len)\n+\t\t\t\t\t? ((uint32_t)total_pkt_len -\n+\t\t\t\t\t\tpkt_len)\n+\t\t\t\t\t: droq->buffer_size;\n+\n+\t\t\tdroq_pkt = droq->recv_buf_list[droq->read_idx];\n+\t\t\tdroq->recv_buf_list[droq->read_idx] = NULL;\n+\n+\t\t\tif (likely(droq_pkt != NULL)) {\n+\t\t\t\t/* Note the first seg */\n+\t\t\t\tif (!pkt_len)\n+\t\t\t\t\tfirst_buf = droq_pkt;\n+\n+\t\t\t\tdroq_pkt->port = otx_ep->port_id;\n+\t\t\t\tif (!pkt_len) {\n+\t\t\t\t\tdroq_pkt->data_off +=\n+\t\t\t\t\t\tOTX_EP_DROQ_INFO_SIZE;\n+\t\t\t\t\tdroq_pkt->pkt_len =\n+\t\t\t\t\t\tcpy_len - OTX_EP_DROQ_INFO_SIZE;\n+\t\t\t\t\tdroq_pkt->data_len =\n+\t\t\t\t\t\tcpy_len - OTX_EP_DROQ_INFO_SIZE;\n+\t\t\t\t} else {\n+\t\t\t\t\tdroq_pkt->pkt_len = cpy_len;\n+\t\t\t\t\tdroq_pkt->data_len = cpy_len;\n+\t\t\t\t}\n+\n+\t\t\t\tif (pkt_len) {\n+\t\t\t\t\tfirst_buf->nb_segs++;\n+\t\t\t\t\tfirst_buf->pkt_len += droq_pkt->pkt_len;\n+\t\t\t\t}\n+\n+\t\t\t\tif (last_buf)\n+\t\t\t\t\tlast_buf->next = droq_pkt;\n+\n+\t\t\t\tlast_buf = droq_pkt;\n+\t\t\t} else {\n+\t\t\t\totx_ep_err(\"no buf\\n\");\n+\t\t\t}\n+\n+\t\t\tpkt_len += cpy_len;\n+\t\t\tdroq->read_idx = otx_ep_incr_index(droq->read_idx, 1,\n+\t\t\t\t\t\t\t   droq->nb_desc);\n+\t\t\tdroq->refill_count++;\n+\t\t}\n+\t\tdroq_pkt = first_buf;\n+\t}\n+\tdroq_pkt->packet_type = rte_net_get_ptype(droq_pkt, &hdr_lens,\n+\t\t\t\t\tRTE_PTYPE_ALL_MASK);\n+\tdroq_pkt->l2_len = hdr_lens.l2_len;\n+\tdroq_pkt->l3_len = hdr_lens.l3_len;\n+\tdroq_pkt->l4_len = hdr_lens.l4_len;\n+\n+\tif ((droq_pkt->pkt_len > (RTE_ETHER_MAX_LEN + OTX_CUST_DATA_LEN)) &&\n+\t    !(otx_ep->rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME)) {\n+\t\trte_pktmbuf_free(droq_pkt);\n+\t\tgoto oq_read_fail;\n+\t}\n+\n+\tif (droq_pkt->nb_segs > 1 &&\n+\t    !(otx_ep->rx_offloads & DEV_RX_OFFLOAD_SCATTER)) {\n+\t\trte_pktmbuf_free(droq_pkt);\n+\t\tgoto oq_read_fail;\n+\t}\n+\n+\treturn droq_pkt;\n+\n+oq_read_fail:\n+\treturn NULL;\n+}\n+\n+static inline uint32_t\n+otx_ep_check_droq_pkts(struct otx_ep_droq *droq)\n+{\n+\tvolatile uint64_t pkt_count;\n+\tuint32_t new_pkts;\n+\n+\t/* Latest available OQ packets */\n+\tpkt_count = rte_read32(droq->pkts_sent_reg);\n+\trte_write32(pkt_count, droq->pkts_sent_reg);\n+\tnew_pkts = pkt_count;\n+\tdroq->pkts_pending += new_pkts;\n+\treturn new_pkts;\n+}\n+\n+/* Check for response arrival from OCTEON TX2\n+ * returns number of requests completed\n+ */\n+uint16_t\n+otx_ep_recv_pkts(void *rx_queue,\n+\t\t  struct rte_mbuf **rx_pkts,\n+\t\t  uint16_t budget)\n+{\n+\tstruct otx_ep_droq *droq = rx_queue;\n+\tstruct otx_ep_device *otx_ep;\n+\tstruct rte_mbuf *oq_pkt;\n+\n+\tuint32_t pkts = 0;\n+\tuint32_t new_pkts = 0;\n+\tint next_fetch;\n+\n+\totx_ep = droq->otx_ep_dev;\n+\n+\tif (droq->pkts_pending > budget) {\n+\t\tnew_pkts = budget;\n+\t} else {\n+\t\tnew_pkts = droq->pkts_pending;\n+\t\tnew_pkts += otx_ep_check_droq_pkts(droq);\n+\t\tif (new_pkts > budget)\n+\t\t\tnew_pkts = budget;\n+\t}\n+\n+\tif (!new_pkts)\n+\t\tgoto update_credit; /* No pkts at this moment */\n+\n+\tfor (pkts = 0; pkts < new_pkts; pkts++) {\n+\t\t/* Push the received pkt to application */\n+\t\tnext_fetch = (pkts == new_pkts - 1) ? 0 : 1;\n+\t\toq_pkt = otx_ep_droq_read_packet(otx_ep, droq, next_fetch);\n+\t\tif (!oq_pkt) {\n+\t\t\totx_ep_err(\"DROQ read pkt failed pending %\" PRIu64\n+\t\t\t\t    \"last_pkt_count %\" PRIu64 \"new_pkts %d.\\n\",\n+\t\t\t\t    droq->pkts_pending, droq->last_pkt_count,\n+\t\t\t\t    new_pkts);\n+\t\t\tdroq->pkts_pending -= pkts;\n+\t\t\tdroq->stats.rx_err++;\n+\t\t\tgoto finish;\n+\t\t}\n+\t\trx_pkts[pkts] = oq_pkt;\n+\t\t/* Stats */\n+\t\tdroq->stats.pkts_received++;\n+\t\tdroq->stats.bytes_received += oq_pkt->pkt_len;\n+\t}\n+\tdroq->pkts_pending -= pkts;\n+\n+\t/* Refill DROQ buffers */\n+update_credit:\n+\tif (droq->refill_count >= DROQ_REFILL_THRESHOLD) {\n+\t\tint desc_refilled = otx_ep_droq_refill(droq);\n+\n+\t\t/* Flush the droq descriptor data to memory to be sure\n+\t\t * that when we update the credits the data in memory is\n+\t\t * accurate.\n+\t\t */\n+\t\trte_wmb();\n+\t\trte_write32(desc_refilled, droq->pkts_credit_reg);\n+\t} else {\n+\t\t/*\n+\t\t * SDP output goes into DROP state when output doorbell count\n+\t\t * goes below drop count. When door bell count is written with\n+\t\t * a value greater than drop count SDP output should come out\n+\t\t * of DROP state. Due to a race condition this is not happening.\n+\t\t * Writing doorbell register with 0 again may make SDP output\n+\t\t * come out of this state.\n+\t\t */\n+\n+\t\trte_write32(0, droq->pkts_credit_reg);\n+\t}\n+finish:\n+\treturn pkts;\n+}\ndiff --git a/drivers/net/octeontx_ep/otx_ep_rxtx.h b/drivers/net/octeontx_ep/otx_ep_rxtx.h\nindex 9779e96b6..d8b411459 100644\n--- a/drivers/net/octeontx_ep/otx_ep_rxtx.h\n+++ b/drivers/net/octeontx_ep/otx_ep_rxtx.h\n@@ -7,4 +7,14 @@\n \n #define OTX_EP_RXD_ALIGN 1\n #define OTX_EP_TXD_ALIGN 1\n-#endif\n+#define OTX_EP_MAX_DELAYED_PKT_RETRIES 10000\n+static inline uint32_t\n+otx_ep_incr_index(uint32_t index, uint32_t count, uint32_t max)\n+{\n+\treturn ((index + count) & (max - 1));\n+}\n+uint16_t\n+otx_ep_recv_pkts(void *rx_queue,\n+\t\t  struct rte_mbuf **rx_pkts,\n+\t\t  uint16_t budget);\n+#endif /* _OTX_EP_RXTX_H_ */\n",
    "prefixes": [
        "v5",
        "10/11"
    ]
}