]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
bnxt_en: Use firmware provided maximum filter counts.
authorMichael Chan <michael.chan@broadcom.com>
Mon, 5 Feb 2024 22:31:50 +0000 (14:31 -0800)
committerJakub Kicinski <kuba@kernel.org>
Fri, 9 Feb 2024 20:37:40 +0000 (12:37 -0800)
While individual filter structures are allocated as needed, there is an
array to keep track of the software filter IDs that we allocate ahead
of time.  Rather than relying on a fixed maximum filter count to
allocate this array, get the maximum from the firmware when available.

Move these filter related maximum counts queried from the firmware to the
bnxt_hw_resc struct.  If the firmware is not providing these maximum
counts, fall back to the hard-coded constant.

Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Reviewed-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
Link: https://lore.kernel.org/r/20240205223202.25341-2-michael.chan@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

index 8fe8a73ffa7ed6efd9530408a5b4403217e837d5..aa3a7dccd202b513a85b20c80071f9485c9640e9 100644 (file)
@@ -4840,7 +4840,7 @@ static int bnxt_alloc_ntp_fltrs(struct bnxt *bp)
                INIT_HLIST_HEAD(&bp->ntp_fltr_hash_tbl[i]);
 
        bp->ntp_fltr_count = 0;
-       bp->ntp_fltr_bmap = bitmap_zalloc(BNXT_MAX_FLTR, GFP_KERNEL);
+       bp->ntp_fltr_bmap = bitmap_zalloc(bp->max_fltr, GFP_KERNEL);
 
        if (!bp->ntp_fltr_bmap)
                rc = -ENOMEM;
@@ -5480,7 +5480,7 @@ static int bnxt_init_l2_filter(struct bnxt *bp, struct bnxt_l2_filter *fltr,
                int bit_id;
 
                bit_id = bitmap_find_free_region(bp->ntp_fltr_bmap,
-                                                BNXT_MAX_FLTR, 0);
+                                                bp->max_fltr, 0);
                if (bit_id < 0)
                        return -ENOMEM;
                fltr->base.sw_id = (u16)bit_id;
@@ -8709,6 +8709,13 @@ static int __bnxt_hwrm_func_qcaps(struct bnxt *bp)
        hw_resc->max_vnics = le16_to_cpu(resp->max_vnics);
        hw_resc->max_stat_ctxs = le16_to_cpu(resp->max_stat_ctx);
 
+       hw_resc->max_encap_records = le32_to_cpu(resp->max_encap_records);
+       hw_resc->max_decap_records = le32_to_cpu(resp->max_decap_records);
+       hw_resc->max_tx_em_flows = le32_to_cpu(resp->max_tx_em_flows);
+       hw_resc->max_tx_wm_flows = le32_to_cpu(resp->max_tx_wm_flows);
+       hw_resc->max_rx_em_flows = le32_to_cpu(resp->max_rx_em_flows);
+       hw_resc->max_rx_wm_flows = le32_to_cpu(resp->max_rx_wm_flows);
+
        if (BNXT_PF(bp)) {
                struct bnxt_pf_info *pf = &bp->pf;
 
@@ -8717,12 +8724,6 @@ static int __bnxt_hwrm_func_qcaps(struct bnxt *bp)
                memcpy(pf->mac_addr, resp->mac_address, ETH_ALEN);
                pf->first_vf_id = le16_to_cpu(resp->first_vf_id);
                pf->max_vfs = le16_to_cpu(resp->max_vfs);
-               pf->max_encap_records = le32_to_cpu(resp->max_encap_records);
-               pf->max_decap_records = le32_to_cpu(resp->max_decap_records);
-               pf->max_tx_em_flows = le32_to_cpu(resp->max_tx_em_flows);
-               pf->max_tx_wm_flows = le32_to_cpu(resp->max_tx_wm_flows);
-               pf->max_rx_em_flows = le32_to_cpu(resp->max_rx_em_flows);
-               pf->max_rx_wm_flows = le32_to_cpu(resp->max_rx_wm_flows);
                bp->flags &= ~BNXT_FLAG_WOL_CAP;
                if (flags & FUNC_QCAPS_RESP_FLAGS_WOL_MAGICPKT_SUPPORTED)
                        bp->flags |= BNXT_FLAG_WOL_CAP;
@@ -13900,7 +13901,7 @@ int bnxt_insert_ntp_filter(struct bnxt *bp, struct bnxt_ntuple_filter *fltr,
        int bit_id;
 
        spin_lock_bh(&bp->ntp_fltr_lock);
-       bit_id = bitmap_find_free_region(bp->ntp_fltr_bmap, BNXT_MAX_FLTR, 0);
+       bit_id = bitmap_find_free_region(bp->ntp_fltr_bmap, bp->max_fltr, 0);
        if (bit_id < 0) {
                spin_unlock_bh(&bp->ntp_fltr_lock);
                return -ENOMEM;
@@ -14670,6 +14671,7 @@ void bnxt_print_device_info(struct bnxt *bp)
 
 static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
+       struct bnxt_hw_resc *hw_resc;
        struct net_device *dev;
        struct bnxt *bp;
        int rc, max_irqs;
@@ -14828,6 +14830,12 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        if (rc)
                goto init_err_pci_clean;
 
+       hw_resc = &bp->hw_resc;
+       bp->max_fltr = hw_resc->max_rx_em_flows + hw_resc->max_rx_wm_flows +
+                      BNXT_L2_FLTR_MAX_FLTR;
+       /* Older firmware may not report these filters properly */
+       if (bp->max_fltr < BNXT_MAX_FLTR)
+               bp->max_fltr = BNXT_MAX_FLTR;
        bnxt_init_l2_fltr_tbl(bp);
        bnxt_set_rx_skb_mode(bp, false);
        bnxt_set_tpa_flags(bp);
index b2cb3e77559dcd6a2e87a02d575a4262f45ebd5b..4bd1cf01d99e4189d7ea5ef2f7cb9213ff3555a0 100644 (file)
@@ -1281,6 +1281,12 @@ struct bnxt_hw_resc {
        u16     max_nqs;
        u16     max_irqs;
        u16     resv_irqs;
+       u32     max_encap_records;
+       u32     max_decap_records;
+       u32     max_tx_em_flows;
+       u32     max_tx_wm_flows;
+       u32     max_rx_em_flows;
+       u32     max_rx_wm_flows;
 };
 
 #if defined(CONFIG_BNXT_SRIOV)
@@ -1315,12 +1321,6 @@ struct bnxt_pf_info {
        u16     active_vfs;
        u16     registered_vfs;
        u16     max_vfs;
-       u32     max_encap_records;
-       u32     max_decap_records;
-       u32     max_tx_em_flows;
-       u32     max_tx_wm_flows;
-       u32     max_rx_em_flows;
-       u32     max_rx_wm_flows;
        unsigned long   *vf_event_bmap;
        u16     hwrm_cmd_req_pages;
        u8      vf_resv_strategy;
@@ -2428,6 +2428,7 @@ struct bnxt {
 
        unsigned long           *ntp_fltr_bmap;
        int                     ntp_fltr_count;
+       int                     max_fltr;
 
 #define BNXT_L2_FLTR_MAX_FLTR  1024
 #define BNXT_L2_FLTR_HASH_SIZE 32
index 482ce88b1563410a268a7f6f5d6ecacfbae95654..0effa87187ee7037fd400100bb4699c12f7c6841 100644 (file)
@@ -1077,7 +1077,7 @@ static int bnxt_grxclsrule(struct bnxt *bp, struct ethtool_rxnfc *cmd)
        struct flow_keys *fkeys;
        int rc = -EINVAL;
 
-       if (fs->location >= BNXT_NTP_FLTR_MAX_FLTR)
+       if (fs->location >= bp->max_fltr)
                return rc;
 
        rcu_read_lock();
@@ -1521,7 +1521,7 @@ static int bnxt_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd,
 
        case ETHTOOL_GRXCLSRLCNT:
                cmd->rule_cnt = bp->ntp_fltr_count;
-               cmd->data = BNXT_NTP_FLTR_MAX_FLTR | RX_CLS_LOC_SPECIAL;
+               cmd->data = bp->max_fltr | RX_CLS_LOC_SPECIAL;
                break;
 
        case ETHTOOL_GRXCLSRLALL: