]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bnxt_en: Adjust MSIX and ring groups for 57500 series chips.
authorMichael Chan <michael.chan@broadcom.com>
Sun, 14 Oct 2018 11:02:47 +0000 (07:02 -0400)
committerDavid S. Miller <davem@davemloft.net>
Tue, 16 Oct 2018 05:44:32 +0000 (22:44 -0700)
Store the maximum MSIX capability in PCIe config. space earlier.  When
we call firmware to query capability, we need to compare the PCIe
MSIX max count with the firmware count and use the smaller one as
the MSIX count for 57500 (P5) chips.

The new chips don't use ring groups.  But previous chips do and
the existing logic limits the available rings based on resource
calculations including ring groups.  Setting the max ring groups to
the max rx rings will work on the new chips without changing the
existing logic.

Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnxt/bnxt.c

index 56439a44bd214b14703b57bb9e3f9123f02acc7d..427eb827d4338757833e094eff6f73addd14bda0 100644 (file)
@@ -5677,6 +5677,13 @@ int bnxt_hwrm_func_resc_qcaps(struct bnxt *bp, bool all)
        hw_resc->min_stat_ctxs = le16_to_cpu(resp->min_stat_ctx);
        hw_resc->max_stat_ctxs = le16_to_cpu(resp->max_stat_ctx);
 
+       if (bp->flags & BNXT_FLAG_CHIP_P5) {
+               u16 max_msix = le16_to_cpu(resp->max_msix);
+
+               hw_resc->max_irqs = min_t(u16, hw_resc->max_irqs, max_msix);
+               hw_resc->max_hw_ring_grps = hw_resc->max_rx_rings;
+       }
+
        if (BNXT_PF(bp)) {
                struct bnxt_pf_info *pf = &bp->pf;
 
@@ -9382,6 +9389,7 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                return -ENOMEM;
 
        bp = netdev_priv(dev);
+       bnxt_set_max_func_irqs(bp, max_irqs);
 
        if (bnxt_vf_pciid(ent->driver_data))
                bp->flags |= BNXT_FLAG_VF;
@@ -9513,7 +9521,6 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        bnxt_set_rx_skb_mode(bp, false);
        bnxt_set_tpa_flags(bp);
        bnxt_set_ring_params(bp);
-       bnxt_set_max_func_irqs(bp, max_irqs);
        rc = bnxt_set_dflt_rings(bp, true);
        if (rc) {
                netdev_err(bp->dev, "Not enough rings available.\n");