Add dequeue datapath for zsda.<br /> <br />Signed-off-by: Hanxiao Li <li.hanxiao@zte.com.cn> <br />---<br /> drivers/common/zsda/zsda_qp.c | 56 +++++++++++++++++++++++++++++++++++<br /> drivers/common/zsda/zsda_qp.h |  1 +<br /> 2 files changed, 57 insertions(+)<br /> <br />diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c<br />index b884352eab..9a7d347a20 100644<br />--- a/drivers/common/zsda/zsda_qp.c<br />+++ b/drivers/common/zsda/zsda_qp.c<br />@@ -782,6 +782,62 @@ zsda_enqueue_op_burst(struct zsda_qp *qp, void **ops, uint16_t nb_ops)<br />     return nb_send;<br /> }<br />  <br />+static void<br />+zsda_dequeue(struct qp_srv *srv, void **ops, const uint16_t nb_ops, uint16_t *nb)<br />+{<br />+    uint16_t head;<br />+    struct zsda_cqe *cqe;<br />+    struct zsda_queue *queue = &srv->rx_q;<br />+    struct zsda_op_cookie *cookie;<br />+    head = queue->head;<br />+<br />+    while (*nb < nb_ops) {<br />+        cqe = (struct zsda_cqe *)(<br />+            (uint8_t *)queue->base_addr + head * queue->msg_size);<br />+<br />+        if (!CQE_VALID(cqe->err1))<br />+            break;<br />+        cookie = srv->op_cookies[cqe->sid];<br />+<br />+        ops[*nb] = cookie->op;<br />+        if (srv->rx_cb(cookie, cqe) == ZSDA_SUCCESS)<br />+            srv->stats.dequeued_count++;<br />+        else {<br />+            ZSDA_LOG(ERR,<br />+                 "ERR! Cqe, opcode 0x%x, sid 0x%x, " <br />+                 "tx_real_length 0x%x, err0 0x%x, err1 0x%x",<br />+                 cqe->op_code, cqe->sid, cqe->tx_real_length,<br />+                 cqe->err0, cqe->err1);<br />+            srv->stats.dequeue_err_count++;<br />+        }<br />+        (*nb)++;<br />+        cookie->used = false;<br />+<br />+        head = zsda_modulo_16(head + 1, queue->modulo_mask);<br />+        queue->head = head;<br />+        WRITE_CSR_CQ_HEAD(queue->io_addr, queue->hw_queue_number, head);<br />+        memset(cqe, 0x0, sizeof(struct zsda_cqe));<br />+    }<br />+}<br />+<br />+uint16_t<br />+zsda_dequeue_op_burst(struct zsda_qp *qp, void **ops, const uint16_t nb_ops)<br />+{<br />+    uint16_t nb = 0;<br />+    uint32_t type = 0;<br />+    struct qp_srv *srv;<br />+<br />+    for (type = 0; type < ZSDA_SERVICE_INVALID; type++) {<br />+        if (!qp->srv[type].used)<br />+            continue;<br />+        srv = &qp->srv[type];<br />+        zsda_dequeue(srv, ops, nb_ops, &nb);<br />+        if (nb >= nb_ops)<br />+            return nb_ops;<br />+    }<br />+    return nb;<br />+}<br />+<br /> int<br /> zsda_common_setup_qp(uint32_t zsda_dev_id, struct zsda_qp **qp_addr,<br />         const uint16_t queue_pair_id, const struct zsda_qp_config *conf)<br />diff --git a/drivers/common/zsda/zsda_qp.h b/drivers/common/zsda/zsda_qp.h<br />index f9efff0e5a..7c61a7b486 100644<br />--- a/drivers/common/zsda/zsda_qp.h<br />+++ b/drivers/common/zsda/zsda_qp.h<br />@@ -136,6 +136,7 @@ int zsda_get_queue_cfg(struct zsda_pci_device *zsda_pci_dev);<br /> int zsda_queue_pair_release(struct zsda_qp **qp_addr);<br />  <br /> uint16_t zsda_enqueue_op_burst(struct zsda_qp *qp, void **ops, const uint16_t nb_ops);<br />+uint16_t zsda_dequeue_op_burst(struct zsda_qp *qp, void **ops, const uint16_t nb_ops);<br />  <br /> int zsda_common_setup_qp(uint32_t dev_id, struct zsda_qp **qp_addr,<br />             const uint16_t queue_pair_id,<br />--  <br />2.27.0<br />