Commit c0b8cda0 authored by Michael Chan's avatar Michael Chan Committed by David S. Miller

bnxt_en: Fix NQ/CP rings accounting on the new 57500 chips.

The new 57500 chips have introduced the NQ structure in addition to
the existing CP rings in all chips.  We need to introduce a new
bnxt_nq_rings_in_use().  On legacy chips, the 2 functions are the
same and one will just call the other.  On the new chips, they
refer to the 2 separate ring structures.  The new function is now
called to determine the resource (NQ or CP rings) associated with
MSIX that are in use.

On 57500 chips, the RDMA driver does not use the CP rings so
we don't need to do the subtraction adjustment.

Fixes: 41e8d798 ("bnxt_en: Modify the ring reservation functions for 57500 series chips.")
Signed-off-by: default avatarMichael Chan <michael.chan@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 75720e63
...@@ -5354,7 +5354,7 @@ static int bnxt_hwrm_reserve_rings(struct bnxt *bp, int tx, int rx, int grp, ...@@ -5354,7 +5354,7 @@ static int bnxt_hwrm_reserve_rings(struct bnxt *bp, int tx, int rx, int grp,
return bnxt_hwrm_reserve_vf_rings(bp, tx, rx, grp, cp, vnic); return bnxt_hwrm_reserve_vf_rings(bp, tx, rx, grp, cp, vnic);
} }
static int bnxt_cp_rings_in_use(struct bnxt *bp) static int bnxt_nq_rings_in_use(struct bnxt *bp)
{ {
int cp = bp->cp_nr_rings; int cp = bp->cp_nr_rings;
int ulp_msix, ulp_base; int ulp_msix, ulp_base;
...@@ -5369,10 +5369,22 @@ static int bnxt_cp_rings_in_use(struct bnxt *bp) ...@@ -5369,10 +5369,22 @@ static int bnxt_cp_rings_in_use(struct bnxt *bp)
return cp; return cp;
} }
static int bnxt_cp_rings_in_use(struct bnxt *bp)
{
int cp;
if (!(bp->flags & BNXT_FLAG_CHIP_P5))
return bnxt_nq_rings_in_use(bp);
cp = bp->tx_nr_rings + bp->rx_nr_rings;
return cp;
}
static bool bnxt_need_reserve_rings(struct bnxt *bp) static bool bnxt_need_reserve_rings(struct bnxt *bp)
{ {
struct bnxt_hw_resc *hw_resc = &bp->hw_resc; struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
int cp = bnxt_cp_rings_in_use(bp); int cp = bnxt_cp_rings_in_use(bp);
int nq = bnxt_nq_rings_in_use(bp);
int rx = bp->rx_nr_rings; int rx = bp->rx_nr_rings;
int vnic = 1, grp = rx; int vnic = 1, grp = rx;
...@@ -5388,7 +5400,7 @@ static bool bnxt_need_reserve_rings(struct bnxt *bp) ...@@ -5388,7 +5400,7 @@ static bool bnxt_need_reserve_rings(struct bnxt *bp)
rx <<= 1; rx <<= 1;
if (BNXT_NEW_RM(bp) && if (BNXT_NEW_RM(bp) &&
(hw_resc->resv_rx_rings != rx || hw_resc->resv_cp_rings != cp || (hw_resc->resv_rx_rings != rx || hw_resc->resv_cp_rings != cp ||
hw_resc->resv_vnics != vnic || hw_resc->resv_irqs < nq || hw_resc->resv_vnics != vnic ||
(hw_resc->resv_hw_ring_grps != grp && (hw_resc->resv_hw_ring_grps != grp &&
!(bp->flags & BNXT_FLAG_CHIP_P5)))) !(bp->flags & BNXT_FLAG_CHIP_P5))))
return true; return true;
...@@ -5398,7 +5410,7 @@ static bool bnxt_need_reserve_rings(struct bnxt *bp) ...@@ -5398,7 +5410,7 @@ static bool bnxt_need_reserve_rings(struct bnxt *bp)
static int __bnxt_reserve_rings(struct bnxt *bp) static int __bnxt_reserve_rings(struct bnxt *bp)
{ {
struct bnxt_hw_resc *hw_resc = &bp->hw_resc; struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
int cp = bnxt_cp_rings_in_use(bp); int cp = bnxt_nq_rings_in_use(bp);
int tx = bp->tx_nr_rings; int tx = bp->tx_nr_rings;
int rx = bp->rx_nr_rings; int rx = bp->rx_nr_rings;
int grp, rx_rings, rc; int grp, rx_rings, rc;
...@@ -5423,7 +5435,7 @@ static int __bnxt_reserve_rings(struct bnxt *bp) ...@@ -5423,7 +5435,7 @@ static int __bnxt_reserve_rings(struct bnxt *bp)
tx = hw_resc->resv_tx_rings; tx = hw_resc->resv_tx_rings;
if (BNXT_NEW_RM(bp)) { if (BNXT_NEW_RM(bp)) {
rx = hw_resc->resv_rx_rings; rx = hw_resc->resv_rx_rings;
cp = hw_resc->resv_cp_rings; cp = hw_resc->resv_irqs;
grp = hw_resc->resv_hw_ring_grps; grp = hw_resc->resv_hw_ring_grps;
vnic = hw_resc->resv_vnics; vnic = hw_resc->resv_vnics;
} }
...@@ -7034,7 +7046,12 @@ unsigned int bnxt_get_max_func_cp_rings(struct bnxt *bp) ...@@ -7034,7 +7046,12 @@ unsigned int bnxt_get_max_func_cp_rings(struct bnxt *bp)
unsigned int bnxt_get_max_func_cp_rings_for_en(struct bnxt *bp) unsigned int bnxt_get_max_func_cp_rings_for_en(struct bnxt *bp)
{ {
return bp->hw_resc.max_cp_rings - bnxt_get_ulp_msix_num(bp); unsigned int cp = bp->hw_resc.max_cp_rings;
if (!(bp->flags & BNXT_FLAG_CHIP_P5))
cp -= bnxt_get_ulp_msix_num(bp);
return cp;
} }
static unsigned int bnxt_get_max_func_irqs(struct bnxt *bp) static unsigned int bnxt_get_max_func_irqs(struct bnxt *bp)
...@@ -7076,7 +7093,7 @@ static int bnxt_get_num_msix(struct bnxt *bp) ...@@ -7076,7 +7093,7 @@ static int bnxt_get_num_msix(struct bnxt *bp)
if (!BNXT_NEW_RM(bp)) if (!BNXT_NEW_RM(bp))
return bnxt_get_max_func_irqs(bp); return bnxt_get_max_func_irqs(bp);
return bnxt_cp_rings_in_use(bp); return bnxt_nq_rings_in_use(bp);
} }
static int bnxt_init_msix(struct bnxt *bp) static int bnxt_init_msix(struct bnxt *bp)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment