static int bnxt_alloc_cp_rings(struct bnxt *bp)
 {
        bool sh = !!(bp->flags & BNXT_FLAG_SHARED_RINGS);
-       int i, rc, ulp_base_vec, ulp_msix;
+       int i, j, rc, ulp_base_vec, ulp_msix;
 
        ulp_msix = bnxt_get_ulp_msix_num(bp);
        ulp_base_vec = bnxt_get_ulp_msix_base(bp);
-       for (i = 0; i < bp->cp_nr_rings; i++) {
+       for (i = 0, j = 0; i < bp->cp_nr_rings; i++) {
                struct bnxt_napi *bnapi = bp->bnapi[i];
                struct bnxt_cp_ring_info *cpr, *cpr2;
                struct bnxt_ring_struct *ring;
                        if (rc)
                                return rc;
                        cpr2->bnapi = bnapi;
+                       bp->rx_ring[i].rx_cpr = cpr2;
                }
                if ((sh && i < bp->tx_nr_rings) ||
                    (!sh && i >= bp->rx_nr_rings)) {
                        if (rc)
                                return rc;
                        cpr2->bnapi = bnapi;
+                       bp->tx_ring[j++].tx_cpr = cpr2;
                }
        }
        return 0;
                                        BNXT_RMEM_RING_PTE_FLAG;
                                rxr->rx_agg_ring_struct.ring_mem.flags =
                                        BNXT_RMEM_RING_PTE_FLAG;
+                       } else {
+                               rxr->rx_cpr =  &bp->bnapi[i]->cp_ring;
                        }
                        rxr->bnapi = bp->bnapi[i];
                        bp->bnapi[i]->rx_ring = &bp->rx_ring[i];
                        if (bp->flags & BNXT_FLAG_CHIP_P5)
                                txr->tx_ring_struct.ring_mem.flags =
                                        BNXT_RMEM_RING_PTE_FLAG;
+                       else
+                               txr->tx_cpr =  &bp->bnapi[i]->cp_ring;
                        txr->bnapi = bp->bnapi[j];
                        bp->bnapi[j]->tx_ring = txr;
                        bp->tx_ring_map[i] = bp->tx_nr_rings_xdp + i;
 
 static u16 bnxt_cp_ring_for_rx(struct bnxt *bp, struct bnxt_rx_ring_info *rxr)
 {
-       if (bp->flags & BNXT_FLAG_CHIP_P5) {
-               struct bnxt_napi *bnapi = rxr->bnapi;
-               struct bnxt_cp_ring_info *cpr;
-
-               cpr = &bnapi->cp_ring.cp_ring_arr[BNXT_RX_HDL];
-               return cpr->cp_ring_struct.fw_ring_id;
-       } else {
+       if (bp->flags & BNXT_FLAG_CHIP_P5)
+               return rxr->rx_cpr->cp_ring_struct.fw_ring_id;
+       else
                return bnxt_cp_ring_from_grp(bp, &rxr->rx_ring_struct);
-       }
 }
 
 static u16 bnxt_cp_ring_for_tx(struct bnxt *bp, struct bnxt_tx_ring_info *txr)
 {
-       if (bp->flags & BNXT_FLAG_CHIP_P5) {
-               struct bnxt_napi *bnapi = txr->bnapi;
-               struct bnxt_cp_ring_info *cpr;
-
-               cpr = &bnapi->cp_ring.cp_ring_arr[BNXT_TX_HDL];
-               return cpr->cp_ring_struct.fw_ring_id;
-       } else {
+       if (bp->flags & BNXT_FLAG_CHIP_P5)
+               return txr->tx_cpr->cp_ring_struct.fw_ring_id;
+       else
                return bnxt_cp_ring_from_grp(bp, &txr->tx_ring_struct);
-       }
 }
 
 static int bnxt_alloc_rss_indir_tbl(struct bnxt *bp)
                u32 map_idx;
 
                if (bp->flags & BNXT_FLAG_CHIP_P5) {
+                       struct bnxt_cp_ring_info *cpr2 = txr->tx_cpr;
                        struct bnxt_napi *bnapi = txr->bnapi;
-                       struct bnxt_cp_ring_info *cpr, *cpr2;
                        u32 type2 = HWRM_RING_ALLOC_CMPL;
 
-                       cpr = &bnapi->cp_ring;
-                       cpr2 = &cpr->cp_ring_arr[BNXT_TX_HDL];
                        ring = &cpr2->cp_ring_struct;
                        ring->handle = BNXT_TX_HDL;
                        map_idx = bnapi->index;
                        bnxt_db_write(bp, &rxr->rx_db, rxr->rx_prod);
                bp->grp_info[map_idx].rx_fw_ring_id = ring->fw_ring_id;
                if (bp->flags & BNXT_FLAG_CHIP_P5) {
-                       struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
+                       struct bnxt_cp_ring_info *cpr2 = rxr->rx_cpr;
                        u32 type2 = HWRM_RING_ALLOC_CMPL;
-                       struct bnxt_cp_ring_info *cpr2;
 
-                       cpr2 = &cpr->cp_ring_arr[BNXT_RX_HDL];
                        ring = &cpr2->cp_ring_struct;
                        ring->handle = BNXT_RX_HDL;
                        rc = hwrm_ring_alloc_send_msg(bp, ring, type2, map_idx);