Commit d4b60e94 authored by David S. Miller's avatar David S. Miller

Merge branch 'bnxt_en-Bug-fixes'

Michael Chan says:

====================
bnxt_en: Bug fixes.

The first patch fixes a regression on CoS queue setup, introduced
recently by the 57500 new chip support patches.  The rest are
fixes related to ring and resource accounting on the new 57500 chips.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents bd5122cd e30fbc33
...@@ -5162,6 +5162,7 @@ static int bnxt_hwrm_get_rings(struct bnxt *bp) ...@@ -5162,6 +5162,7 @@ static int bnxt_hwrm_get_rings(struct bnxt *bp)
cp = le16_to_cpu(resp->alloc_cmpl_rings); cp = le16_to_cpu(resp->alloc_cmpl_rings);
stats = le16_to_cpu(resp->alloc_stat_ctx); stats = le16_to_cpu(resp->alloc_stat_ctx);
cp = min_t(u16, cp, stats); cp = min_t(u16, cp, stats);
hw_resc->resv_irqs = cp;
if (bp->flags & BNXT_FLAG_CHIP_P5) { if (bp->flags & BNXT_FLAG_CHIP_P5) {
int rx = hw_resc->resv_rx_rings; int rx = hw_resc->resv_rx_rings;
int tx = hw_resc->resv_tx_rings; int tx = hw_resc->resv_tx_rings;
...@@ -5175,7 +5176,7 @@ static int bnxt_hwrm_get_rings(struct bnxt *bp) ...@@ -5175,7 +5176,7 @@ static int bnxt_hwrm_get_rings(struct bnxt *bp)
hw_resc->resv_rx_rings = rx; hw_resc->resv_rx_rings = rx;
hw_resc->resv_tx_rings = tx; hw_resc->resv_tx_rings = tx;
} }
cp = le16_to_cpu(resp->alloc_msix); hw_resc->resv_irqs = le16_to_cpu(resp->alloc_msix);
hw_resc->resv_hw_ring_grps = rx; hw_resc->resv_hw_ring_grps = rx;
} }
hw_resc->resv_cp_rings = cp; hw_resc->resv_cp_rings = cp;
...@@ -5353,7 +5354,7 @@ static int bnxt_hwrm_reserve_rings(struct bnxt *bp, int tx, int rx, int grp, ...@@ -5353,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;
...@@ -5368,10 +5369,22 @@ static int bnxt_cp_rings_in_use(struct bnxt *bp) ...@@ -5368,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;
...@@ -5387,7 +5400,7 @@ static bool bnxt_need_reserve_rings(struct bnxt *bp) ...@@ -5387,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;
...@@ -5397,7 +5410,7 @@ static bool bnxt_need_reserve_rings(struct bnxt *bp) ...@@ -5397,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;
...@@ -5422,7 +5435,7 @@ static int __bnxt_reserve_rings(struct bnxt *bp) ...@@ -5422,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;
} }
...@@ -6292,6 +6305,8 @@ static int __bnxt_hwrm_func_qcaps(struct bnxt *bp) ...@@ -6292,6 +6305,8 @@ static int __bnxt_hwrm_func_qcaps(struct bnxt *bp)
return rc; return rc;
} }
static int bnxt_hwrm_queue_qportcfg(struct bnxt *bp);
static int bnxt_hwrm_func_qcaps(struct bnxt *bp) static int bnxt_hwrm_func_qcaps(struct bnxt *bp)
{ {
int rc; int rc;
...@@ -6299,6 +6314,11 @@ static int bnxt_hwrm_func_qcaps(struct bnxt *bp) ...@@ -6299,6 +6314,11 @@ static int bnxt_hwrm_func_qcaps(struct bnxt *bp)
rc = __bnxt_hwrm_func_qcaps(bp); rc = __bnxt_hwrm_func_qcaps(bp);
if (rc) if (rc)
return rc; return rc;
rc = bnxt_hwrm_queue_qportcfg(bp);
if (rc) {
netdev_err(bp->dev, "hwrm query qportcfg failure rc: %d\n", rc);
return rc;
}
if (bp->hwrm_spec_code >= 0x10803) { if (bp->hwrm_spec_code >= 0x10803) {
rc = bnxt_alloc_ctx_mem(bp); rc = bnxt_alloc_ctx_mem(bp);
if (rc) if (rc)
...@@ -7026,7 +7046,12 @@ unsigned int bnxt_get_max_func_cp_rings(struct bnxt *bp) ...@@ -7026,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)
...@@ -7048,7 +7073,9 @@ int bnxt_get_avail_msix(struct bnxt *bp, int num) ...@@ -7048,7 +7073,9 @@ int bnxt_get_avail_msix(struct bnxt *bp, int num)
int total_req = bp->cp_nr_rings + num; int total_req = bp->cp_nr_rings + num;
int max_idx, avail_msix; int max_idx, avail_msix;
max_idx = min_t(int, bp->total_irqs, max_cp); max_idx = bp->total_irqs;
if (!(bp->flags & BNXT_FLAG_CHIP_P5))
max_idx = min_t(int, bp->total_irqs, max_cp);
avail_msix = max_idx - bp->cp_nr_rings; avail_msix = max_idx - bp->cp_nr_rings;
if (!BNXT_NEW_RM(bp) || avail_msix >= num) if (!BNXT_NEW_RM(bp) || avail_msix >= num)
return avail_msix; return avail_msix;
...@@ -7066,7 +7093,7 @@ static int bnxt_get_num_msix(struct bnxt *bp) ...@@ -7066,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)
...@@ -7794,6 +7821,7 @@ static int bnxt_hwrm_if_change(struct bnxt *bp, bool up) ...@@ -7794,6 +7821,7 @@ static int bnxt_hwrm_if_change(struct bnxt *bp, bool up)
rc = bnxt_hwrm_func_resc_qcaps(bp, true); rc = bnxt_hwrm_func_resc_qcaps(bp, true);
hw_resc->resv_cp_rings = 0; hw_resc->resv_cp_rings = 0;
hw_resc->resv_irqs = 0;
hw_resc->resv_tx_rings = 0; hw_resc->resv_tx_rings = 0;
hw_resc->resv_rx_rings = 0; hw_resc->resv_rx_rings = 0;
hw_resc->resv_hw_ring_grps = 0; hw_resc->resv_hw_ring_grps = 0;
...@@ -9799,13 +9827,16 @@ static void _bnxt_get_max_rings(struct bnxt *bp, int *max_rx, int *max_tx, ...@@ -9799,13 +9827,16 @@ static void _bnxt_get_max_rings(struct bnxt *bp, int *max_rx, int *max_tx,
int *max_cp) int *max_cp)
{ {
struct bnxt_hw_resc *hw_resc = &bp->hw_resc; struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
int max_ring_grps = 0; int max_ring_grps = 0, max_irq;
*max_tx = hw_resc->max_tx_rings; *max_tx = hw_resc->max_tx_rings;
*max_rx = hw_resc->max_rx_rings; *max_rx = hw_resc->max_rx_rings;
*max_cp = min_t(int, bnxt_get_max_func_cp_rings_for_en(bp), *max_cp = bnxt_get_max_func_cp_rings_for_en(bp);
hw_resc->max_irqs - bnxt_get_ulp_msix_num(bp)); max_irq = min_t(int, bnxt_get_max_func_irqs(bp) -
*max_cp = min_t(int, *max_cp, hw_resc->max_stat_ctxs); bnxt_get_ulp_msix_num(bp),
bnxt_get_max_func_stat_ctxs(bp));
if (!(bp->flags & BNXT_FLAG_CHIP_P5))
*max_cp = min_t(int, *max_cp, max_irq);
max_ring_grps = hw_resc->max_hw_ring_grps; max_ring_grps = hw_resc->max_hw_ring_grps;
if (BNXT_CHIP_TYPE_NITRO_A0(bp) && BNXT_PF(bp)) { if (BNXT_CHIP_TYPE_NITRO_A0(bp) && BNXT_PF(bp)) {
*max_cp -= 1; *max_cp -= 1;
...@@ -9813,6 +9844,11 @@ static void _bnxt_get_max_rings(struct bnxt *bp, int *max_rx, int *max_tx, ...@@ -9813,6 +9844,11 @@ static void _bnxt_get_max_rings(struct bnxt *bp, int *max_rx, int *max_tx,
} }
if (bp->flags & BNXT_FLAG_AGG_RINGS) if (bp->flags & BNXT_FLAG_AGG_RINGS)
*max_rx >>= 1; *max_rx >>= 1;
if (bp->flags & BNXT_FLAG_CHIP_P5) {
bnxt_trim_rings(bp, max_rx, max_tx, *max_cp, false);
/* On P5 chips, max_cp output param should be available NQs */
*max_cp = max_irq;
}
*max_rx = min_t(int, *max_rx, max_ring_grps); *max_rx = min_t(int, *max_rx, max_ring_grps);
} }
......
...@@ -928,6 +928,7 @@ struct bnxt_hw_resc { ...@@ -928,6 +928,7 @@ struct bnxt_hw_resc {
u16 min_stat_ctxs; u16 min_stat_ctxs;
u16 max_stat_ctxs; u16 max_stat_ctxs;
u16 max_irqs; u16 max_irqs;
u16 resv_irqs;
}; };
#if defined(CONFIG_BNXT_SRIOV) #if defined(CONFIG_BNXT_SRIOV)
......
...@@ -168,7 +168,7 @@ static int bnxt_req_msix_vecs(struct bnxt_en_dev *edev, int ulp_id, ...@@ -168,7 +168,7 @@ static int bnxt_req_msix_vecs(struct bnxt_en_dev *edev, int ulp_id,
if (BNXT_NEW_RM(bp)) { if (BNXT_NEW_RM(bp)) {
struct bnxt_hw_resc *hw_resc = &bp->hw_resc; struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
avail_msix = hw_resc->resv_cp_rings - bp->cp_nr_rings; avail_msix = hw_resc->resv_irqs - bp->cp_nr_rings;
edev->ulp_tbl[ulp_id].msix_requested = avail_msix; edev->ulp_tbl[ulp_id].msix_requested = avail_msix;
} }
bnxt_fill_msix_vecs(bp, ent); bnxt_fill_msix_vecs(bp, ent);
......
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