bnxt_en: Use firmware provided maximum filter counts.
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>
This commit is contained in:
parent
f51470c5c4
commit
f42822f22b
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user