get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 85922,
    "url": "http://patches.dpdk.org/api/patches/85922/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20201231072247.5719-11-pnalla@marvell.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": "<20201231072247.5719-11-pnalla@marvell.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20201231072247.5719-11-pnalla@marvell.com",
    "date": "2020-12-31T07:22:42",
    "name": "[10/15] net/octeontx_ep: Receive data path function added",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "76e3e8be34dbde586b057d50b6f87b63699a05f0",
    "submitter": {
        "id": 2074,
        "url": "http://patches.dpdk.org/api/people/2074/?format=api",
        "name": "Pradeep Nalla",
        "email": "pnalla@marvell.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/20201231072247.5719-11-pnalla@marvell.com/mbox/",
    "series": [
        {
            "id": 14507,
            "url": "http://patches.dpdk.org/api/series/14507/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=14507",
            "date": "2020-12-31T07:22:32",
            "name": "Octeon Tx/Tx2 Endpoint pmd",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/14507/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/85922/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/85922/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 (xvm-189-124.dc0.ghst.net [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 2E87DA0A00;\n\tThu, 31 Dec 2020 08:24:31 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id A240F140D25;\n\tThu, 31 Dec 2020 08:23:10 +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 DAA67140CEE\n for <dev@dpdk.org>; Thu, 31 Dec 2020 08:23:00 +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 0BV7LGmR010253 for <dev@dpdk.org>; Wed, 30 Dec 2020 23:23:00 -0800",
            "from dc5-exch02.marvell.com ([199.233.59.182])\n by mx0b-0016f401.pphosted.com with ESMTP id 35s80806ff-2\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT)\n for <dev@dpdk.org>; Wed, 30 Dec 2020 23:23:00 -0800",
            "from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH02.marvell.com\n (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.2;\n Wed, 30 Dec 2020 23:22:58 -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; Wed, 30 Dec 2020 23:22:58 -0800",
            "from localhost.localdomain (unknown [10.111.145.157])\n by maili.marvell.com (Postfix) with ESMTP id 9B9EC3F7040;\n Wed, 30 Dec 2020 23:22:57 -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=qHlBAdG+JhjQei+ysUY7qqkIpMP5B8th63BoCo+RkYI=;\n b=YLWpfwXUJX84KqcahcLH5zZ0sNvsVRk/V1BfaXEKx0YIPUMih+ZUO1VNM1RZ8tRcX7EX\n DBioHb2e+fAMVhagHwsN2rwxYTKKoOiJkKCeZOAUaJhLW411yxYVSRs7mU9lFRb+TwWB\n ExXqZI7I5Bp2eRip+f536JgRxEI0vFhAFirSl096hsVoN0GhUU/j+1sC01bMH2Qh1/PK\n 1WAh4P5HkUflzdItKZmkDYvncj1fhlttYWsZj+l2SkgfSSRvEPV0suEVTrFwNWbt8r/9\n jLfb/GbvLFpIHUu+TO49CW1ys0nulZ6g4S2ww0L5zy07Sv+dxgnsS1UIYdlWSoftImQc fA==",
        "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, 31 Dec 2020 07:22:42 +0000",
        "Message-ID": "<20201231072247.5719-11-pnalla@marvell.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20201231072247.5719-1-pnalla@marvell.com>",
        "References": "<20201231072247.5719-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=2020-12-31_02:2020-12-30,\n 2020-12-31 signatures=0",
        "Subject": "[dpdk-dev] [PATCH 10/15] 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": "From: \"Nalla Pradeep\" <pnalla@marvell.com>\n\nFunction 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 |   5 +\n drivers/net/octeontx_ep/otx_ep_ethdev.c |   3 +\n drivers/net/octeontx_ep/otx_ep_rxtx.c   | 292 ++++++++++++++++++++++++\n drivers/net/octeontx_ep/otx_ep_rxtx.h   |  17 +-\n 4 files changed, 316 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/drivers/net/octeontx_ep/otx_ep_common.h b/drivers/net/octeontx_ep/otx_ep_common.h\nindex 50c9e2daa3..e3819213dd 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,11 @@\n #define OTX_EP_BUSY_LOOP_COUNT      (10000)\n \n #define OTX_EP_MAX_IOQS_PER_VF 8\n+\n+#define OTX_CUST_META_DATA\t64\n+#define OTX_CUST_PRIV_TAG\t2\n+#define OTX_CUST_DATA_LEN (OTX_CUST_META_DATA + OTX_CUST_PRIV_TAG)\n+\n #define otx_ep_printf(level, fmt, args...)\t\t\\\n \trte_log(RTE_LOG_ ## level, RTE_LOGTYPE_PMD,\t\t\\\n \t\t fmt, ##args)\ndiff --git a/drivers/net/octeontx_ep/otx_ep_ethdev.c b/drivers/net/octeontx_ep/otx_ep_ethdev.c\nindex f782c90ad7..9ec8bc52c9 100644\n--- a/drivers/net/octeontx_ep/otx_ep_ethdev.c\n+++ b/drivers/net/octeontx_ep/otx_ep_ethdev.c\n@@ -147,6 +147,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@@ -404,6 +405,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 a13c180c99..3e77d579c2 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,8 @@\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 static void\n otx_ep_dmazone_free(const struct rte_memzone *mz)\n {\n@@ -355,3 +359,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+\tuint32_t desc_refilled = 0;\n+\tstruct rte_mbuf *buf = NULL;\n+\tstruct otx_ep_droq_info *info;\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+\tstruct rte_net_hdr_lens hdr_lens;\n+\tvolatile struct otx_ep_droq_info *info;\n+\tstruct otx_ep_droq_info *info2;\n+\tuint32_t pkt_len = 0;\n+\tuint64_t total_pkt_len;\n+\tstruct rte_mbuf *droq_pkt = NULL;\n+\tstruct rte_mbuf *droq_pkt2 = NULL;\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+\tuint32_t new_pkts;\n+\tvolatile uint64_t pkt_count;\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 rte_mbuf *oq_pkt;\n+\tstruct otx_ep_device *otx_ep;\n+\tstruct otx_ep_droq *droq = rx_queue;\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 >= 16 /* 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 819204a763..602534cf0b 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,19 @@\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+\tif ((index + count) >= max)\n+\t\tindex = index + count - max;\n+\telse\n+\t\tindex += count;\n+\n+\treturn index;\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": [
        "10/15"
    ]
}