From: Jerin Jacob <jerin.ja...@caviumnetworks.com>

Signed-off-by: Jerin Jacob <jerin.ja...@caviumnetworks.com>
Co-authored-by: Santosh Shukla <santosh.shu...@caviumnetworks.com>
Signed-off-by: Santosh Shukla <santosh.shu...@caviumnetworks.com>
---
 drivers/net/octeontx/octeontx_rxtx.c | 38 ++++++++++++++++++++++++++++++++++++
 drivers/net/octeontx/octeontx_rxtx.h |  2 ++
 2 files changed, 40 insertions(+)

diff --git a/drivers/net/octeontx/octeontx_rxtx.c 
b/drivers/net/octeontx/octeontx_rxtx.c
index 32f46ae49..05f003649 100644
--- a/drivers/net/octeontx/octeontx_rxtx.c
+++ b/drivers/net/octeontx/octeontx_rxtx.c
@@ -102,3 +102,41 @@ octeontx_xmit_pkts(void *tx_queue, struct rte_mbuf 
**tx_pkts, uint16_t nb_pkts)
 
        return count; /* return number of pkts transmitted */
 }
+
+uint16_t __hot
+octeontx_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
+{
+       struct rte_mbuf *mbuf;
+       struct octeontx_rxq *rxq;
+       struct rte_event ev;
+       octtx_wqe_t *wqe;
+       size_t count;
+       uint16_t valid_event;
+
+       rxq = rx_queue;
+       count = 0;
+       while (count < nb_pkts) {
+               valid_event = rte_event_dequeue_burst(rxq->evdev,
+                                                       rxq->ev_ports, &ev,
+                                                       1, 0);
+               if (!valid_event)
+                       break;
+
+               wqe = (octtx_wqe_t *)(uintptr_t)ev.u64;
+               rte_prefetch_non_temporal(wqe);
+
+               /* Get mbuf from wqe */
+               mbuf = (struct rte_mbuf *)((uintptr_t)wqe -
+                                               OCTTX_PACKET_WQE_SKIP);
+               mbuf->data_off = RTE_PTR_DIFF(wqe->s.w3.addr, mbuf->buf_addr);
+               mbuf->pkt_len = wqe->s.w1.len;
+               mbuf->data_len = mbuf->pkt_len;
+               mbuf->nb_segs = 1;
+               mbuf->ol_flags = 0;
+               mbuf->port = rxq->port_id;
+               rte_mbuf_refcnt_set(mbuf, 1);
+               rx_pkts[count++] = mbuf;
+       }
+
+       return count; /* return number of pkts received */
+}
diff --git a/drivers/net/octeontx/octeontx_rxtx.h 
b/drivers/net/octeontx/octeontx_rxtx.h
index 4a49fc159..1f9153272 100644
--- a/drivers/net/octeontx/octeontx_rxtx.h
+++ b/drivers/net/octeontx/octeontx_rxtx.h
@@ -42,5 +42,7 @@
 uint16_t
 octeontx_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t 
nb_pkts);
 
+uint16_t
+octeontx_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t 
nb_pkts);
 
 #endif /* __OCTEONTX_RXTX_H__ */
-- 
2.14.1

Reply via email to