From: Michael Chan <michael.chan@broadcom.com>
To: davem@davemloft.net
Cc: netdev@vger.kernel.org, edumazet@google.com, kuba@kernel.org,
pabeni@redhat.com, andrew+netdev@lunn.ch,
pavan.chebbi@broadcom.com, andrew.gospodarek@broadcom.com
Subject: [PATCH net-next v3 6/7] bnxt_en: Remove support for the old NITRO A0 chip
Date: Mon, 12 Oct 2026 15:08:26 -0700 [thread overview]
Message-ID: <20261012220827.340998-7-michael.chan@broadcom.com> (raw)
In-Reply-To: <20261012220827.340998-1-michael.chan@broadcom.com>
Nitro A0 was a very old pre-production chip that requires significant
workarounds. For example, it requires an extra (hidden) RX ring and CP
ring to work, adding a lot of complexity. The workaround code is very
buggy and breaks in many cases, including ethtool ring changes
initiated by the user.
Remove all Nitro A0 workaround code completely. Print an error and
abort if the chip is detected. This will simplify the next patch that
fixes ring accounting bugs.
Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
---
drivers/net/ethernet/broadcom/bnxt/bnxt.c | 185 ++----------------
drivers/net/ethernet/broadcom/bnxt/bnxt.h | 11 +-
.../net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 12 +-
3 files changed, 19 insertions(+), 189 deletions(-)
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 2ada2bb8fd57..ed3f67dea030 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -3209,82 +3209,6 @@ static int bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
return rx_pkts;
}
-static int bnxt_poll_nitroa0(struct napi_struct *napi, int budget)
-{
- struct bnxt_napi *bnapi = container_of(napi, struct bnxt_napi, napi);
- struct bnxt *bp = bnapi->bp;
- struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
- struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
- struct tx_cmp *txcmp;
- struct rx_cmp_ext *rxcmp1;
- u32 cp_cons, tmp_raw_cons;
- u32 raw_cons = cpr->cp_raw_cons;
- bool flush_xdp = false;
- u32 rx_pkts = 0;
- u8 event = 0;
-
- while (1) {
- int rc;
-
- cp_cons = RING_CMP(raw_cons);
- txcmp = &cpr->cp_desc_ring[CP_RING(cp_cons)][CP_IDX(cp_cons)];
-
- if (!TX_CMP_VALID(txcmp, raw_cons))
- break;
-
- /* The valid test of the entry must be done first before
- * reading any further.
- */
- dma_rmb();
- if ((TX_CMP_TYPE(txcmp) & 0x30) == 0x10) {
- tmp_raw_cons = NEXT_RAW_CMP(raw_cons);
- cp_cons = RING_CMP(tmp_raw_cons);
- rxcmp1 = (struct rx_cmp_ext *)
- &cpr->cp_desc_ring[CP_RING(cp_cons)][CP_IDX(cp_cons)];
-
- if (!RX_CMP_VALID(rxcmp1, tmp_raw_cons))
- break;
-
- /* force an error to recycle the buffer */
- rxcmp1->rx_cmp_cfa_code_errors_v2 |=
- cpu_to_le32(RX_CMPL_ERRORS_CRC_ERROR);
-
- rc = bnxt_rx_pkt(bp, cpr, &raw_cons, &event);
- if (likely(rc == -EIO) && budget)
- rx_pkts++;
- else if (rc == -EBUSY) /* partial completion */
- break;
- if (event & BNXT_REDIRECT_EVENT)
- flush_xdp = true;
- } else if (unlikely(TX_CMP_TYPE(txcmp) ==
- CMPL_BASE_TYPE_HWRM_DONE)) {
- bnxt_hwrm_handler(bp, txcmp);
- } else {
- netdev_err(bp->dev,
- "Invalid completion received on special ring\n");
- }
- raw_cons = NEXT_RAW_CMP(raw_cons);
-
- if (rx_pkts == budget)
- break;
- }
-
- cpr->cp_raw_cons = raw_cons;
- BNXT_DB_CQ(&cpr->cp_db, cpr->cp_raw_cons);
- bnxt_db_write(bp, &rxr->rx_db, rxr->rx_prod);
-
- if (event & BNXT_AGG_EVENT)
- bnxt_db_write(bp, &rxr->rx_agg_db, rxr->rx_agg_prod);
- if (flush_xdp)
- xdp_do_flush();
-
- if (!bnxt_has_work(bp, cpr) && rx_pkts < budget) {
- napi_complete_done(napi, rx_pkts);
- BNXT_DB_CQ_ARM(&cpr->cp_db, cpr->cp_raw_cons);
- }
- return rx_pkts;
-}
-
static int bnxt_poll(struct napi_struct *napi, int budget)
{
struct bnxt_napi *bnapi = container_of(napi, struct bnxt_napi, napi);
@@ -4791,9 +4715,6 @@ static int bnxt_alloc_vnics(struct bnxt *bp)
}
#endif
- if (BNXT_CHIP_TYPE_NITRO_A0(bp))
- num_vnics++;
-
bp->vnic_info = kzalloc_objs(struct bnxt_vnic_info, num_vnics);
if (!bp->vnic_info)
return -ENOMEM;
@@ -6327,11 +6248,8 @@ int bnxt_hwrm_l2_filter_alloc(struct bnxt *bp, struct bnxt_l2_filter *fltr)
return rc;
req->target_id = cpu_to_le16(target_id);
- req->flags = cpu_to_le32(CFA_L2_FILTER_ALLOC_REQ_FLAGS_PATH_RX);
-
- if (!BNXT_CHIP_TYPE_NITRO_A0(bp))
- req->flags |=
- cpu_to_le32(CFA_L2_FILTER_ALLOC_REQ_FLAGS_OUTERMOST);
+ req->flags = cpu_to_le32(CFA_L2_FILTER_ALLOC_REQ_FLAGS_PATH_RX |
+ CFA_L2_FILTER_ALLOC_REQ_FLAGS_OUTERMOST);
req->dst_id = cpu_to_le16(fltr->base.fw_vnic_id);
req->enables =
cpu_to_le32(CFA_L2_FILTER_ALLOC_REQ_ENABLES_L2_ADDR |
@@ -6688,10 +6606,7 @@ void bnxt_set_dflt_rss_indir_tbl(struct bnxt *bp,
if (!bp->rx_nr_rings)
return;
- if (BNXT_CHIP_TYPE_NITRO_A0(bp))
- max_rings = bp->rx_nr_rings - 1;
- else
- max_rings = bp->rx_nr_rings;
+ max_rings = bp->rx_nr_rings;
max_entries = bnxt_get_rxfh_indir_size(bp->dev);
if (rss_ctx)
@@ -6731,8 +6646,6 @@ int bnxt_get_nr_rss_ctxs(struct bnxt *bp, int rx_rings)
return bnxt_calc_nr_ring_pages(rx_rings - 1,
BNXT_RSS_TABLE_ENTRIES_P5);
}
- if (BNXT_CHIP_TYPE_NITRO_A0(bp))
- return 2;
return 1;
}
@@ -6757,8 +6670,6 @@ static void bnxt_fill_hw_rss_tbl(struct bnxt *bp, struct bnxt_vnic_info *vnic)
vnic->default_rx_ring = min_j;
else if (vnic->flags & BNXT_VNIC_RFS_FLAG)
vnic->default_rx_ring = vnic->vnic_id - 1;
- else if ((vnic->vnic_id == 1) && BNXT_CHIP_TYPE_NITRO_A0(bp))
- vnic->default_rx_ring = bp->rx_nr_rings - 1;
else
vnic->default_rx_ring = 0;
}
@@ -7013,13 +6924,7 @@ int bnxt_hwrm_vnic_cfg(struct bnxt *bp, struct bnxt_vnic_info *vnic)
req->rss_rule = cpu_to_le16(0xffff);
}
- if (BNXT_CHIP_TYPE_NITRO_A0(bp) &&
- (vnic->fw_rss_cos_lb_ctx[0] != INVALID_HW_RING_ID)) {
- req->cos_rule = cpu_to_le16(vnic->fw_rss_cos_lb_ctx[1]);
- req->enables |= cpu_to_le32(VNIC_CFG_REQ_ENABLES_COS_RULE);
- } else {
- req->cos_rule = cpu_to_le16(0xffff);
- }
+ req->cos_rule = cpu_to_le16(0xffff);
ring = vnic->default_rx_ring;
grp_idx = bp->rx_ring[ring].bnapi->index;
@@ -8617,9 +8522,6 @@ static void bnxt_hwrm_stat_ctx_free(struct bnxt *bp)
if (!bp->bnapi)
return;
- if (BNXT_CHIP_TYPE_NITRO_A0(bp))
- return;
-
if (hwrm_req_init(bp, req, HWRM_STAT_CTX_FREE))
return;
if (BNXT_FW_MAJ(bp) <= 20) {
@@ -8656,9 +8558,6 @@ static int bnxt_hwrm_stat_ctx_alloc(struct bnxt *bp)
struct hwrm_stat_ctx_alloc_input *req;
int rc, i;
- if (BNXT_CHIP_TYPE_NITRO_A0(bp))
- return 0;
-
rc = hwrm_req_init(bp, req, HWRM_STAT_CTX_ALLOC);
if (rc)
return rc;
@@ -10489,9 +10388,6 @@ static int bnxt_hwrm_ver_get(struct bnxt *bp)
bp->chip_num = le16_to_cpu(resp->chip_num);
bp->chip_rev = resp->chip_rev;
- if (bp->chip_num == CHIP_NUM_58700 && !resp->chip_rev &&
- !resp->chip_metal)
- bp->flags |= BNXT_FLAG_CHIP_NITRO_A0;
dev_caps_cfg = le32_to_cpu(resp->dev_caps_cfg);
if ((dev_caps_cfg & VER_GET_RESP_DEV_CAPS_CFG_SHORT_CMD_SUPPORTED) &&
@@ -10906,16 +10802,6 @@ static int __bnxt_setup_vnic(struct bnxt *bp, struct bnxt_vnic_info *vnic)
}
bp->rsscos_nr_ctxs++;
- if (BNXT_CHIP_TYPE_NITRO_A0(bp)) {
- rc = bnxt_hwrm_vnic_ctx_alloc(bp, vnic, 1);
- if (rc) {
- netdev_err(bp->dev, "hwrm vnic %d cos ctx alloc failure rc: %x\n",
- vnic->vnic_id, rc);
- goto vnic_setup_err;
- }
- bp->rsscos_nr_ctxs++;
- }
-
skip_rss_ctx:
bnxt_fill_hw_rss_tbl(bp, vnic);
/* configure default vnic, ring grp */
@@ -11216,30 +11102,6 @@ static bool bnxt_promisc_ok(struct bnxt *bp)
return true;
}
-static int bnxt_setup_nitroa0_vnic(struct bnxt *bp)
-{
- struct bnxt_vnic_info *vnic = &bp->vnic_info[1];
- unsigned int rc = 0;
-
- rc = bnxt_hwrm_vnic_alloc(bp, vnic, bp->rx_nr_rings - 1, 1);
- if (rc) {
- netdev_err(bp->dev, "Cannot allocate special vnic for NS2 A0: %x\n",
- rc);
- return rc;
- }
-
- /* Setup the proper default RX ring */
- bnxt_fill_hw_rss_tbl(bp, vnic);
-
- rc = bnxt_hwrm_vnic_cfg(bp, vnic);
- if (rc) {
- netdev_err(bp->dev, "Cannot allocate special vnic for NS2 A0: %x\n",
- rc);
- return rc;
- }
- return rc;
-}
-
static int bnxt_cfg_rx_mode(struct bnxt *, struct netdev_hw_addr_list *, bool);
static bool bnxt_mc_list_updated(struct bnxt *, u32 *,
const struct netdev_hw_addr_list *);
@@ -11248,7 +11110,6 @@ static int bnxt_init_chip(struct bnxt *bp, bool irq_re_init)
{
struct bnxt_vnic_info *vnic = &bp->vnic_info[BNXT_VNIC_DEFAULT];
int rc = 0;
- unsigned int rx_nr_rings = bp->rx_nr_rings;
if (irq_re_init) {
rc = bnxt_hwrm_stat_ctx_alloc(bp);
@@ -11271,11 +11132,8 @@ static int bnxt_init_chip(struct bnxt *bp, bool irq_re_init)
goto err_out;
}
- if (BNXT_CHIP_TYPE_NITRO_A0(bp))
- rx_nr_rings--;
-
/* default vnic 0 */
- rc = bnxt_hwrm_vnic_alloc(bp, vnic, 0, rx_nr_rings);
+ rc = bnxt_hwrm_vnic_alloc(bp, vnic, 0, bp->rx_nr_rings);
if (rc) {
netdev_err(bp->dev, "hwrm vnic alloc failure rc: %x\n", rc);
goto err_out;
@@ -11350,13 +11208,6 @@ static int bnxt_init_chip(struct bnxt *bp, bool irq_re_init)
netdev_warn(bp->dev, "HWRM set coalescing failure rc: %x\n",
rc);
- if (BNXT_CHIP_TYPE_NITRO_A0(bp)) {
- rc = bnxt_setup_nitroa0_vnic(bp);
- if (rc)
- netdev_err(bp->dev, "Special vnic setup failure for NS2 A0 rc: %x\n",
- rc);
- }
-
if (BNXT_VF(bp)) {
bnxt_hwrm_func_qcfg(bp);
netdev_update_features(bp->dev);
@@ -12108,26 +11959,19 @@ static void bnxt_del_napi(struct bnxt *bp)
static void bnxt_init_napi(struct bnxt *bp)
{
int (*poll_fn)(struct napi_struct *, int) = bnxt_poll;
- unsigned int cp_nr_rings = bp->cp_nr_rings;
struct bnxt_napi *bnapi;
int i;
if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
poll_fn = bnxt_poll_p5;
- else if (BNXT_CHIP_TYPE_NITRO_A0(bp))
- cp_nr_rings--;
set_bit(BNXT_STATE_NAPI_DISABLED, &bp->state);
- for (i = 0; i < cp_nr_rings; i++) {
+ for (i = 0; i < bp->cp_nr_rings; i++) {
bnapi = bp->bnapi[i];
netif_napi_add_config_locked(bp->dev, &bnapi->napi, poll_fn,
bnapi->index);
}
- if (BNXT_CHIP_TYPE_NITRO_A0(bp)) {
- bnapi = bp->bnapi[cp_nr_rings];
- netif_napi_add_locked(bp->dev, &bnapi->napi, bnxt_poll_nitroa0);
- }
}
static void bnxt_disable_napi(struct bnxt *bp)
@@ -14001,7 +13845,7 @@ static bool bnxt_rfs_supported(struct bnxt *bp)
/* 212 firmware is broken for aRFS */
if (BNXT_FW_MAJ(bp) == 212)
return false;
- if (BNXT_PF(bp) && !BNXT_CHIP_TYPE_NITRO_A0(bp))
+ if (BNXT_PF(bp))
return true;
if (bp->rss_cap & BNXT_RSS_CAP_NEW_RSS_CAP)
return true;
@@ -16824,10 +16668,6 @@ static void _bnxt_get_max_rings(struct bnxt *bp, int *max_rx, int *max_tx,
if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS))
*max_cp = min_t(int, *max_cp, max_irq);
max_ring_grps = hw_resc->max_hw_ring_grps;
- if (BNXT_CHIP_TYPE_NITRO_A0(bp) && BNXT_PF(bp)) {
- *max_cp -= 1;
- *max_rx -= 2;
- }
if (bp->flags & BNXT_FLAG_AGG_RINGS)
*max_rx >>= 1;
if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
@@ -16977,10 +16817,6 @@ static int bnxt_set_dflt_rings(struct bnxt *bp, bool sh)
netdev_warn(bp->dev, "2nd rings reservation failed.\n");
bnxt_adj_tx_rings(bp);
}
- if (BNXT_CHIP_TYPE_NITRO_A0(bp)) {
- bp->rx_nr_rings++;
- bp->cp_nr_rings++;
- }
if (rc) {
bp->tx_nr_rings = 0;
bp->rx_nr_rings = 0;
@@ -17251,6 +17087,13 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
if (rc)
goto init_err_pci_clean;
+ if (bp->chip_num == CHIP_NUM_58700 && !bp->chip_rev &&
+ !bp->ver_resp.chip_metal) {
+ dev_err(&pdev->dev, "58700 A0 unsupported, aborting\n");
+ rc = -ENODEV;
+ goto init_err_pci_clean;
+ }
+
if (BNXT_PF(bp))
bnxt_vpd_read_info(bp);
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
index 75428a585577..51a269d06c49 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
@@ -2295,7 +2295,6 @@ struct bnxt {
#define BNXT_FLAG_DSN_VALID 0x200000
#define BNXT_FLAG_DOUBLE_DB 0x400000
#define BNXT_FLAG_UDP_GSO_CAP 0x800000
- #define BNXT_FLAG_CHIP_NITRO_A0 0x1000000
#define BNXT_FLAG_DIM 0x2000000
#define BNXT_FLAG_ROCE_MIRROR_CAP 0x4000000
#define BNXT_FLAG_TX_COAL_CMPL 0x8000000
@@ -2323,10 +2322,8 @@ struct bnxt {
#define BNXT_PHY_CFG_ABLE(bp) ((BNXT_SINGLE_PF(bp) || \
BNXT_SH_PORT_CFG_OK(bp)) && \
(bp)->link_info.phy_state == BNXT_PHY_STATE_ENABLED)
-#define BNXT_CHIP_TYPE_NITRO_A0(bp) ((bp)->flags & BNXT_FLAG_CHIP_NITRO_A0)
#define BNXT_RX_PAGE_MODE(bp) ((bp)->flags & BNXT_FLAG_RX_PAGE_MODE)
-#define BNXT_SUPPORTS_TPA(bp) (!BNXT_CHIP_TYPE_NITRO_A0(bp) && \
- (!((bp)->flags & BNXT_FLAG_CHIP_P5_PLUS) ||\
+#define BNXT_SUPPORTS_TPA(bp) ((!((bp)->flags & BNXT_FLAG_CHIP_P5_PLUS) ||\
(bp)->max_tpa_v2) && !is_kdump_kernel())
#define BNXT_RX_JUMBO_MODE(bp) ((bp)->flags & BNXT_FLAG_JUMBO)
@@ -2347,13 +2344,11 @@ struct bnxt {
(BNXT_CHIP_NUM_57X1X((bp)->chip_num) || \
BNXT_CHIP_NUM_5745X((bp)->chip_num) || \
BNXT_CHIP_NUM_588XX((bp)->chip_num) || \
- (BNXT_CHIP_NUM_58700((bp)->chip_num) && \
- !BNXT_CHIP_TYPE_NITRO_A0(bp)))
+ BNXT_CHIP_NUM_58700((bp)->chip_num))
/* Chip class phase 3.x */
#define BNXT_CHIP_P3(bp) \
- (BNXT_CHIP_NUM_57X0X((bp)->chip_num) || \
- BNXT_CHIP_TYPE_NITRO_A0(bp))
+ (BNXT_CHIP_NUM_57X0X((bp)->chip_num))
#define BNXT_CHIP_P4_PLUS(bp) \
(BNXT_CHIP_P4(bp) || BNXT_CHIP_P5_PLUS(bp))
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
index 5c9e770960e6..62f894021fd1 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
@@ -949,13 +949,9 @@ static void bnxt_get_channels(struct net_device *dev,
channel->max_other = 0;
if (bp->flags & BNXT_FLAG_SHARED_RINGS) {
channel->combined_count = bp->rx_nr_rings;
- if (BNXT_CHIP_TYPE_NITRO_A0(bp))
- channel->combined_count--;
} else {
- if (!BNXT_CHIP_TYPE_NITRO_A0(bp)) {
- channel->rx_count = bp->rx_nr_rings;
- channel->tx_count = bp->tx_nr_rings_per_tc;
- }
+ channel->rx_count = bp->rx_nr_rings;
+ channel->tx_count = bp->tx_nr_rings_per_tc;
}
}
@@ -980,10 +976,6 @@ static int bnxt_set_channels(struct net_device *dev,
(channel->rx_count || channel->tx_count))
return -EINVAL;
- if (BNXT_CHIP_TYPE_NITRO_A0(bp) && (channel->rx_count ||
- channel->tx_count))
- return -EINVAL;
-
if (channel->combined_count)
sh = true;
--
2.51.0
next prev parent reply other threads:[~2026-10-12 22:09 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-12 22:08 [PATCH net-next v3 0/7] bnxt_en: Ring accounting fixes Michael Chan
2026-10-12 22:08 ` [PATCH net-next v3 1/7] bnxt_en: Clear bp->total_irqs in bnxt_init_int_mode() during error Michael Chan
2026-10-12 22:08 ` [PATCH net-next v3 2/7] bnxt_en: Fix bnxt_reinit_features() when irq_re_init is true Michael Chan
2026-10-12 22:08 ` [PATCH net-next v3 3/7] bnxt_en: Refactor RSS table check logic Michael Chan
2026-10-13 0:23 ` Joe Damato
2026-10-12 22:08 ` [PATCH net-next v3 4/7] bnxt_en: Refactor IRQs required logic Michael Chan
2026-10-13 0:25 ` Joe Damato
2026-10-12 22:08 ` [PATCH net-next v3 5/7] bnxt_en: Reinit IRQ when configuring LRO/GRO/HDS Michael Chan
2026-10-12 22:08 ` Michael Chan [this message]
2026-10-13 0:35 ` [PATCH net-next v3 6/7] bnxt_en: Remove support for the old NITRO A0 chip Joe Damato
2026-10-12 22:08 ` [PATCH net-next v3 7/7] bnxt_en: Fix ring accounting and validation when rings are constrained Michael Chan
2026-10-12 22:15 ` [PATCH net-next v3 0/7] bnxt_en: Ring accounting fixes netdev-bot+sinfo
2026-10-12 22:52 ` Michael Chan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261012220827.340998-7-michael.chan@broadcom.com \
--to=michael.chan@broadcom.com \
--cc=andrew+netdev@lunn.ch \
--cc=andrew.gospodarek@broadcom.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=kuba@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=pavan.chebbi@broadcom.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox