Fix issues in mode where soft expiry is disabled in RoC.
When soft expiry support is not enabled in inline device,
memory is not allocated for the ring base array and should
not be accessed.

Fixes: bea5d990a93b ("net/cnxk: support outbound soft expiry notification")
Signed-off-by: Nithin Dabilpuram <ndabilpu...@marvell.com>
---
 drivers/common/cnxk/roc_nix_inl.c      | 9 +++++----
 drivers/common/cnxk/roc_nix_inl_dev.c  | 5 +++--
 drivers/common/cnxk/roc_nix_inl_priv.h | 1 +
 3 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/drivers/common/cnxk/roc_nix_inl.c 
b/drivers/common/cnxk/roc_nix_inl.c
index d68615a..4573529 100644
--- a/drivers/common/cnxk/roc_nix_inl.c
+++ b/drivers/common/cnxk/roc_nix_inl.c
@@ -210,7 +210,7 @@ roc_nix_inl_inb_sa_sz(struct roc_nix *roc_nix, bool 
inl_dev_sa)
 uintptr_t
 roc_nix_inl_inb_sa_get(struct roc_nix *roc_nix, bool inb_inl_dev, uint32_t spi)
 {
-       uint32_t max_spi, min_spi, mask;
+       uint32_t max_spi = 0, min_spi = 0, mask;
        uintptr_t sa_base;
        uint64_t sz;
 
@@ -463,7 +463,7 @@ roc_nix_inl_outb_init(struct roc_nix *roc_nix)
        nix->outb_se_ring_base =
                roc_nix->port_id * ROC_NIX_SOFT_EXP_PER_PORT_MAX_RINGS;
 
-       if (inl_dev == NULL) {
+       if (inl_dev == NULL || !inl_dev->set_soft_exp_poll) {
                nix->outb_se_ring_cnt = 0;
                return 0;
        }
@@ -539,11 +539,12 @@ roc_nix_inl_outb_fini(struct roc_nix *roc_nix)
        plt_free(nix->outb_sa_base);
        nix->outb_sa_base = NULL;
 
-       if (idev && idev->nix_inl_dev) {
+       if (idev && idev->nix_inl_dev && nix->outb_se_ring_cnt) {
                inl_dev = idev->nix_inl_dev;
                ring_base = inl_dev->sa_soft_exp_ring;
+               ring_base += nix->outb_se_ring_base;
 
-               for (i = 0; i < ROC_NIX_INL_MAX_SOFT_EXP_RNGS; i++) {
+               for (i = 0; i < nix->outb_se_ring_cnt; i++) {
                        if (ring_base[i])
                                plt_free(PLT_PTR_CAST(ring_base[i]));
                }
diff --git a/drivers/common/cnxk/roc_nix_inl_dev.c 
b/drivers/common/cnxk/roc_nix_inl_dev.c
index 51f1f68..5e61a42 100644
--- a/drivers/common/cnxk/roc_nix_inl_dev.c
+++ b/drivers/common/cnxk/roc_nix_inl_dev.c
@@ -814,6 +814,7 @@ roc_nix_inl_dev_init(struct roc_nix_inl_dev *roc_inl_dev)
        inl_dev->wqe_skip = roc_inl_dev->wqe_skip;
        inl_dev->spb_drop_pc = NIX_AURA_DROP_PC_DFLT;
        inl_dev->lpb_drop_pc = NIX_AURA_DROP_PC_DFLT;
+       inl_dev->set_soft_exp_poll = roc_inl_dev->set_soft_exp_poll;
 
        if (roc_inl_dev->spb_drop_pc)
                inl_dev->spb_drop_pc = roc_inl_dev->spb_drop_pc;
@@ -849,7 +850,7 @@ roc_nix_inl_dev_init(struct roc_nix_inl_dev *roc_inl_dev)
        if (rc)
                goto sso_release;
 
-       if (roc_inl_dev->set_soft_exp_poll) {
+       if (inl_dev->set_soft_exp_poll) {
                rc = nix_inl_outb_poll_thread_setup(inl_dev);
                if (rc)
                        goto cpt_release;
@@ -898,7 +899,7 @@ roc_nix_inl_dev_fini(struct roc_nix_inl_dev *roc_inl_dev)
        inl_dev = idev->nix_inl_dev;
        pci_dev = inl_dev->pci_dev;
 
-       if (roc_inl_dev->set_soft_exp_poll) {
+       if (inl_dev->set_soft_exp_poll) {
                soft_exp_poll_thread_exit = true;
                pthread_join(inl_dev->soft_exp_poll_thread, NULL);
                plt_bitmap_free(inl_dev->soft_exp_ring_bmap);
diff --git a/drivers/common/cnxk/roc_nix_inl_priv.h 
b/drivers/common/cnxk/roc_nix_inl_priv.h
index f9646a3..1ab8470 100644
--- a/drivers/common/cnxk/roc_nix_inl_priv.h
+++ b/drivers/common/cnxk/roc_nix_inl_priv.h
@@ -59,6 +59,7 @@ struct nix_inl_dev {
        pthread_t soft_exp_poll_thread;
        uint32_t soft_exp_poll_freq;
        uint64_t *sa_soft_exp_ring;
+       bool set_soft_exp_poll;
 
        /* Soft expiry ring bitmap */
        struct plt_bitmap *soft_exp_ring_bmap;
-- 
2.8.4

Reply via email to