This fixes the handling of CPT CQ ring roll over case.

Fixes: a7d64a7740e0 ("net/cnxk: handle soft expiry")
Cc: [email protected]

Signed-off-by: Rahul Bhansali <[email protected]>
---
Changes in v2: Updated commit message.

 drivers/common/cnxk/roc_cpt.c             |  2 +-
 drivers/common/cnxk/roc_cpt.h             |  1 +
 drivers/common/cnxk/roc_nix_inl.c         |  1 +
 drivers/common/cnxk/roc_nix_inl_dev_irq.c | 18 ++++++++++++------
 4 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/drivers/common/cnxk/roc_cpt.c b/drivers/common/cnxk/roc_cpt.c
index 83e0c9896b..63419884ac 100644
--- a/drivers/common/cnxk/roc_cpt.c
+++ b/drivers/common/cnxk/roc_cpt.c
@@ -712,7 +712,7 @@ cpt_lf_cq_init(struct roc_cpt_lf *lf)

        lf_cq_base.s.addr = addr >> 7;
        plt_write64(lf_cq_base.u, lf->rbase + CPT_LF_CQ_BASE);
-       lf_cq_size.s.size = PLT_ALIGN(len, ROC_ALIGN);
+       lf_cq_size.s.size = lf->cq_size;
        plt_write64(lf_cq_size.u, lf->rbase + CPT_LF_CQ_SIZE);

        return 0;
diff --git a/drivers/common/cnxk/roc_cpt.h b/drivers/common/cnxk/roc_cpt.h
index 67956758be..7547d0b020 100644
--- a/drivers/common/cnxk/roc_cpt.h
+++ b/drivers/common/cnxk/roc_cpt.h
@@ -159,6 +159,7 @@ struct roc_cpt_lf {
        bool cpt_cq_ena;
        uint8_t cq_entry_size;
        uint32_t cq_size;
+       uint32_t cq_head;
        /* End of Input parameters */
        struct plt_pci_device *pci_dev;
        struct dev *dev;
diff --git a/drivers/common/cnxk/roc_nix_inl.c 
b/drivers/common/cnxk/roc_nix_inl.c
index 86d571c6e2..aad2631673 100644
--- a/drivers/common/cnxk/roc_nix_inl.c
+++ b/drivers/common/cnxk/roc_nix_inl.c
@@ -1580,6 +1580,7 @@ roc_nix_inl_outb_init(struct roc_nix *roc_nix)
                                lf->cq_entry_size = 0;
                                lf->cq_all = 0;
                                lf->cq_size = lf->nb_desc;
+                               lf->cq_head = 1;
                        }
                }

diff --git a/drivers/common/cnxk/roc_nix_inl_dev_irq.c 
b/drivers/common/cnxk/roc_nix_inl_dev_irq.c
index 1c4822925c..89155a1f7d 100644
--- a/drivers/common/cnxk/roc_nix_inl_dev_irq.c
+++ b/drivers/common/cnxk/roc_nix_inl_dev_irq.c
@@ -57,8 +57,8 @@ nix_inl_cpt_cq_cb(struct roc_cpt_lf *lf)
        union cpt_lf_cq_ptr cq_ptr;
        struct cpt_cq_s *cq_s;
        uint8_t fmt_msk = 0x3;
-       uint64_t nq_ptr;
-       uint32_t count;
+       uint32_t count, head;
+       uint32_t nq_ptr;
        uint64_t i;

        if (idev)
@@ -69,14 +69,15 @@ nix_inl_cpt_cq_cb(struct roc_cpt_lf *lf)
                return;
        }

+       head = lf->cq_head;
        cq_base.u = plt_read64(lf->rbase + CPT_LF_CQ_BASE);
        cq_ptr.u = plt_read64(lf->rbase + CPT_LF_CQ_PTR);
        count = cq_ptr.s.count;
-
-       nq_ptr = (((cq_base.s.addr << 7)) + ((cq_ptr.s.nq_ptr - count) << 5));
-       cq_s = (struct cpt_cq_s *)nq_ptr;
+       nq_ptr = cq_ptr.s.nq_ptr;

        for (i = 0; i < count; i++) {
+               cq_s = (struct cpt_cq_s *)(uintptr_t)(((cq_base.s.addr << 7)) + 
(head << 5));
+
                if (cq_s->w0.s.uc_compcode && cq_s->w0.s.compcode) {
                        switch (cq_s->w2.s.fmt & fmt_msk) {
                        case WQE_PTR_CPTR:
@@ -93,8 +94,13 @@ nix_inl_cpt_cq_cb(struct roc_cpt_lf *lf)
                        inl_dev->work_cb(&tmp, sa, NIX_INL_CPT_CQ, (void 
*)cq_s, port_id);
                }
 done:
-               cq_s = cq_s + 1;
+               head = (head + 1) % lf->cq_size;
        }
+
+       lf->cq_head = head;
+       if (unlikely(nq_ptr != head))
+               plt_err("CPT LF[%d] CQ head %d != NQ ptr %d", lf->lf_id, head, 
nq_ptr);
+
        /* Acknowledge the number of completed requests */
        plt_write64(count, lf->rbase + CPT_LF_DONE_ACK);
 }
--
2.34.1

Reply via email to