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

bnxt_en: Keep track of reserved IRQs.

The new 57500 chips use 1 NQ per MSIX vector, whereas legacy chips use
1 CP ring per MSIX vector.  To better unify this, add a resv_irqs
field to struct bnxt_hw_resc.  On legacy chips, we initialize resv_irqs
with resv_cp_rings.  On new chips, we initialize it with the allocated
MSIX resources.
Signed-off-by: default avatarMichael Chan <michael.chan@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 804fba4e
...@@ -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;
...@@ -7055,7 +7056,9 @@ int bnxt_get_avail_msix(struct bnxt *bp, int num) ...@@ -7055,7 +7056,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;
...@@ -7801,6 +7804,7 @@ static int bnxt_hwrm_if_change(struct bnxt *bp, bool up) ...@@ -7801,6 +7804,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;
......
...@@ -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