get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 87384,
    "url": "https://patches.dpdk.org/api/patches/87384/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20210126214000.57909-10-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": "<20210126214000.57909-10-pnalla@marvell.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210126214000.57909-10-pnalla@marvell.com",
    "date": "2021-01-26T21:39:59",
    "name": "[v4,10/11] net/octeontx_ep: Receive data path function added",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "47232b693c77cdaa2ceaf865d1078333d2e7e64b",
    "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/20210126214000.57909-10-pnalla@marvell.com/mbox/",
    "series": [
        {
            "id": 14964,
            "url": "https://patches.dpdk.org/api/series/14964/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=14964",
            "date": "2021-01-26T21:39:51",
            "name": "[v4,01/11] net/octeontx_ep: add build and doc infrastructure",
            "version": 4,
            "mbox": "https://patches.dpdk.org/series/14964/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/87384/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/87384/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 03964A052A;\n\tTue, 26 Jan 2021 22:41:57 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 6FAD0140D0B;\n\tTue, 26 Jan 2021 22:41:25 +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 16F41140D0A\n for <dev@dpdk.org>; Tue, 26 Jan 2021 22:41:14 +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 10QLdsQ1030258 for <dev@dpdk.org>; Tue, 26 Jan 2021 13:41:13 -0800",
            "from dc5-exch01.marvell.com ([199.233.59.181])\n by mx0b-0016f401.pphosted.com with ESMTP id 368m6uhem7-1\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT)\n for <dev@dpdk.org>; Tue, 26 Jan 2021 13:41:13 -0800",
            "from SC-EXCH04.marvell.com (10.93.176.84) by DC5-EXCH01.marvell.com\n (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.2;\n Tue, 26 Jan 2021 13:41:11 -0800",
            "from DC5-EXCH01.marvell.com (10.69.176.38) by SC-EXCH04.marvell.com\n (10.93.176.84) with Microsoft SMTP Server (TLS) id 15.0.1497.2;\n Tue, 26 Jan 2021 13:41:10 -0800",
            "from maili.marvell.com (10.69.176.80) by DC5-EXCH01.marvell.com\n (10.69.176.38) with Microsoft SMTP Server id 15.0.1497.2 via Frontend\n Transport; Tue, 26 Jan 2021 13:41:10 -0800",
            "from sburla-Super-Server.caveonetworks.com (unknown [10.106.27.196])\n by maili.marvell.com (Postfix) with ESMTP id DA65C3F703F;\n Tue, 26 Jan 2021 13:41:10 -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=O83NcGvimBhPz5kdh2Vp24G8zg6eIKB+5aholKpnRUc=;\n b=VCs76i19WYFnKdNcDidIV/P83gVMrQD3EmZh7pXDzfiTlNqdFw3KBlGQQkMQezsF2sBJ\n i1DwG/TNFqkgx5vhdKRod57mECFhWjfkoh/hd9YR7SKzZnTWpl5RyTdgH9KyO1f8mn75\n csatlq06WzBVnE3dQAbgKfvNpbZnbBjqizAm4pUoBuVI/SS/7742XeaSALPxk/H4f6Oy\n CCXvyK9s5/qqmm0zp0JFW46v2ezt2QHotcsTT/CwZzEnht86xQduSQCn20vvzTOYVXPo\n yUshWYwW4vd9M7m1fVnx8yusofeViHZlScxMYHIFbq8rSg1EQe22H2XM/Pm2iqat2P4r aQ==",
        "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": "Tue, 26 Jan 2021 13:39:59 -0800",
        "Message-ID": "<20210126214000.57909-10-pnalla@marvell.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20210126214000.57909-1-pnalla@marvell.com>",
        "References": "<20210126214000.57909-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-26_11:2021-01-26,\n 2021-01-26 signatures=0",
        "Subject": "[dpdk-dev] [PATCH v4 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   | 297 +++++++++++++++++++++++-\n drivers/net/octeontx_ep/otx_ep_rxtx.h   |  12 +-\n 4 files changed, 312 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 51a6750c6..d87333539 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 5fa315e71..79572425a 100644\n--- a/drivers/net/octeontx_ep/otx_ep_ethdev.c\n+++ b/drivers/net/octeontx_ep/otx_ep_ethdev.c\n@@ -151,6 +151,7 @@ otx_epdev_init(struct otx_ep_device *otx_epvf)\n \t\tgoto setup_fail;\n \t}\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@@ -411,6 +412,8 @@ otx_ep_eth_dev_uninit(struct rte_eth_dev *eth_dev)\n \t\trte_free(eth_dev->data->mac_addrs);\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 666411e7c..7b65e3ffe 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@@ -327,7 +333,8 @@ otx_ep_init_droq(struct otx_ep_device *otx_ep, uint32_t q_no,\n /* OQ configuration and setup */\n int\n otx_ep_setup_oqs(struct otx_ep_device *otx_ep, int oq_no, int num_descs,\n-\t       int desc_size, struct rte_mempool *mpool, unsigned int socket_id)\n+\t\t int desc_size, struct rte_mempool *mpool,\n+\t\t unsigned int socket_id)\n {\n \tstruct otx_ep_droq *droq;\n \n@@ -355,3 +362,291 @@ 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+\t/* otx_ep_dbg(\"Recvd [%d] new OQ pkts\\n\", new_pkts); */\n+\tdroq->pkts_pending += new_pkts;\n+\treturn new_pkts;\n+}\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+\tif (!new_pkts) {\n+\t\t/* otx_ep_dbg(\"Zero new_pkts:%d\\n\", new_pkts); */\n+\t\tgoto update_credit; /* No pkts at this moment */\n+\t}\n+\n+\t/* otx_ep_dbg(\"Received new_pkts = %d\\n\", new_pkts); */\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 %lu last_pkt_count %lu 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\t/* rte_pktmbuf_dump(stdout, oq_pkt,\n+\t\t * rte_pktmbuf_pkt_len(oq_pkt));\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+\t/* otx_ep_dbg(\"DROQ pkts[%d] pushed to application\\n\", 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\t/* otx_ep_dbg(\"Refilled count = %d\\n\", desc_refilled); */\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": [
        "v4",
        "10/11"
    ]
}