follow-on fixes could not be applied, so drop them all.
+++ /dev/null
-From 9c15e0c70d5937b492e7e0e5236dc20f24f7329e Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 23 Jun 2025 09:06:38 -0700
-Subject: bnxt: properly flush XDP redirect lists
-
-From: Yan Zhai <yan@cloudflare.com>
-
-[ Upstream commit 9caca6ac0e26cd20efd490d8b3b2ffb1c7c00f6f ]
-
-We encountered following crash when testing a XDP_REDIRECT feature
-in production:
-
-[56251.579676] list_add corruption. next->prev should be prev (ffff93120dd40f30), but was ffffb301ef3a6740. (next=ffff93120dd
-40f30).
-[56251.601413] ------------[ cut here ]------------
-[56251.611357] kernel BUG at lib/list_debug.c:29!
-[56251.621082] Oops: invalid opcode: 0000 [#1] PREEMPT SMP NOPTI
-[56251.632073] CPU: 111 UID: 0 PID: 0 Comm: swapper/111 Kdump: loaded Tainted: P O 6.12.33-cloudflare-2025.6.
-3 #1
-[56251.653155] Tainted: [P]=PROPRIETARY_MODULE, [O]=OOT_MODULE
-[56251.663877] Hardware name: MiTAC GC68B-B8032-G11P6-GPU/S8032GM-HE-CFR, BIOS V7.020.B10-sig 01/22/2025
-[56251.682626] RIP: 0010:__list_add_valid_or_report+0x4b/0xa0
-[56251.693203] Code: 0e 48 c7 c7 68 e7 d9 97 e8 42 16 fe ff 0f 0b 48 8b 52 08 48 39 c2 74 14 48 89 f1 48 c7 c7 90 e7 d9 97 48
- 89 c6 e8 25 16 fe ff <0f> 0b 4c 8b 02 49 39 f0 74 14 48 89 d1 48 c7 c7 e8 e7 d9 97 4c 89
-[56251.725811] RSP: 0018:ffff93120dd40b80 EFLAGS: 00010246
-[56251.736094] RAX: 0000000000000075 RBX: ffffb301e6bba9d8 RCX: 0000000000000000
-[56251.748260] RDX: 0000000000000000 RSI: ffff9149afda0b80 RDI: ffff9149afda0b80
-[56251.760349] RBP: ffff9131e49c8000 R08: 0000000000000000 R09: ffff93120dd40a18
-[56251.772382] R10: ffff9159cf2ce1a8 R11: 0000000000000003 R12: ffff911a80850000
-[56251.784364] R13: ffff93120fbc7000 R14: 0000000000000010 R15: ffff9139e7510e40
-[56251.796278] FS: 0000000000000000(0000) GS:ffff9149afd80000(0000) knlGS:0000000000000000
-[56251.809133] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
-[56251.819561] CR2: 00007f5e85e6f300 CR3: 00000038b85e2006 CR4: 0000000000770ef0
-[56251.831365] PKRU: 55555554
-[56251.838653] Call Trace:
-[56251.845560] <IRQ>
-[56251.851943] cpu_map_enqueue.cold+0x5/0xa
-[56251.860243] xdp_do_redirect+0x2d9/0x480
-[56251.868388] bnxt_rx_xdp+0x1d8/0x4c0 [bnxt_en]
-[56251.877028] bnxt_rx_pkt+0x5f7/0x19b0 [bnxt_en]
-[56251.885665] ? cpu_max_write+0x1e/0x100
-[56251.893510] ? srso_alias_return_thunk+0x5/0xfbef5
-[56251.902276] __bnxt_poll_work+0x190/0x340 [bnxt_en]
-[56251.911058] bnxt_poll+0xab/0x1b0 [bnxt_en]
-[56251.919041] ? srso_alias_return_thunk+0x5/0xfbef5
-[56251.927568] ? srso_alias_return_thunk+0x5/0xfbef5
-[56251.935958] ? srso_alias_return_thunk+0x5/0xfbef5
-[56251.944250] __napi_poll+0x2b/0x160
-[56251.951155] bpf_trampoline_6442548651+0x79/0x123
-[56251.959262] __napi_poll+0x5/0x160
-[56251.966037] net_rx_action+0x3d2/0x880
-[56251.973133] ? srso_alias_return_thunk+0x5/0xfbef5
-[56251.981265] ? srso_alias_return_thunk+0x5/0xfbef5
-[56251.989262] ? __hrtimer_run_queues+0x162/0x2a0
-[56251.996967] ? srso_alias_return_thunk+0x5/0xfbef5
-[56252.004875] ? srso_alias_return_thunk+0x5/0xfbef5
-[56252.012673] ? bnxt_msix+0x62/0x70 [bnxt_en]
-[56252.019903] handle_softirqs+0xcf/0x270
-[56252.026650] irq_exit_rcu+0x67/0x90
-[56252.032933] common_interrupt+0x85/0xa0
-[56252.039498] </IRQ>
-[56252.044246] <TASK>
-[56252.048935] asm_common_interrupt+0x26/0x40
-[56252.055727] RIP: 0010:cpuidle_enter_state+0xb8/0x420
-[56252.063305] Code: dc 01 00 00 e8 f9 79 3b ff e8 64 f7 ff ff 49 89 c5 0f 1f 44 00 00 31 ff e8 a5 32 3a ff 45 84 ff 0f 85 ae
- 01 00 00 fb 45 85 f6 <0f> 88 88 01 00 00 48 8b 04 24 49 63 ce 4c 89 ea 48 6b f1 68 48 29
-[56252.088911] RSP: 0018:ffff93120c97fe98 EFLAGS: 00000202
-[56252.096912] RAX: ffff9149afd80000 RBX: ffff9141d3a72800 RCX: 0000000000000000
-[56252.106844] RDX: 00003329176c6b98 RSI: ffffffe36db3fdc7 RDI: 0000000000000000
-[56252.116733] RBP: 0000000000000002 R08: 0000000000000002 R09: 000000000000004e
-[56252.126652] R10: ffff9149afdb30c4 R11: 071c71c71c71c71c R12: ffffffff985ff860
-[56252.136637] R13: 00003329176c6b98 R14: 0000000000000002 R15: 0000000000000000
-[56252.146667] ? cpuidle_enter_state+0xab/0x420
-[56252.153909] cpuidle_enter+0x2d/0x40
-[56252.160360] do_idle+0x176/0x1c0
-[56252.166456] cpu_startup_entry+0x29/0x30
-[56252.173248] start_secondary+0xf7/0x100
-[56252.179941] common_startup_64+0x13e/0x141
-[56252.186886] </TASK>
-
-From the crash dump, we found that the cpu_map_flush_list inside
-redirect info is partially corrupted: its list_head->next points to
-itself, but list_head->prev points to a valid list of unflushed bq
-entries.
-
-This turned out to be a result of missed XDP flush on redirect lists. By
-digging in the actual source code, we found that
-commit 7f0a168b0441 ("bnxt_en: Add completion ring pointer in TX and RX
-ring structures") incorrectly overwrites the event mask for XDP_REDIRECT
-in bnxt_rx_xdp. We can stably reproduce this crash by returning XDP_TX
-and XDP_REDIRECT randomly for incoming packets in a naive XDP program.
-Properly propagate the XDP_REDIRECT events back fixes the crash.
-
-Fixes: a7559bc8c17c ("bnxt: support transmit and free of aggregation buffers")
-Tested-by: Andrew Rzeznik <arzeznik@cloudflare.com>
-Signed-off-by: Yan Zhai <yan@cloudflare.com>
-Acked-by: Jesper Dangaard Brouer <hawk@kernel.org>
-Reviewed-by: Michael Chan <michael.chan@broadcom.com>
-Reviewed-by: Andy Gospodarek <gospo@broadcom.com>
-Link: https://patch.msgid.link/aFl7jpCNzscumuN2@debian.debian
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-index 2ada8345180dc..27328864d3053 100644
---- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-@@ -2509,6 +2509,7 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
- {
- struct bnxt_napi *bnapi = cpr->bnapi;
- u32 raw_cons = cpr->cp_raw_cons;
-+ bool flush_xdp = false;
- u32 cons;
- int rx_pkts = 0;
- u8 event = 0;
-@@ -2553,6 +2554,8 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
- else
- rc = bnxt_force_rx_discard(bp, cpr, &raw_cons,
- &event);
-+ if (event & BNXT_REDIRECT_EVENT)
-+ flush_xdp = true;
- if (likely(rc >= 0))
- rx_pkts += rc;
- /* Increment rx_pkts when rc is -ENOMEM to count towards
-@@ -2580,7 +2583,7 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
- }
- }
-
-- if (event & BNXT_REDIRECT_EVENT) {
-+ if (flush_xdp) {
- xdp_do_flush();
- event &= ~BNXT_REDIRECT_EVENT;
- }
---
-2.39.5
-
+++ /dev/null
-From 1f23f4cdbbb520fd63295d62eafaeb610ba48e70 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 13 Nov 2023 16:16:10 -0800
-Subject: bnxt_en: Add completion ring pointer in TX and RX ring structures
-
-From: Michael Chan <michael.chan@broadcom.com>
-
-[ Upstream commit 7f0a168b0441ef7fd6b46563efb2706c58ac2a4c ]
-
-From the TX or RX ring structure, we need to find the corresponding
-completion ring during initialization. On P5 chips, we use the MSIX/napi
-entry to locate the completion ring because there is only one RX/TX
-ring per MSIX. To allow multiple TX rings for each MSIX, we need
-to add a direct pointer from the TX ring and RX ring structures.
-This also simplifies the existing logic.
-
-Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
-Signed-off-by: Michael Chan <michael.chan@broadcom.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Stable-dep-of: 9caca6ac0e26 ("bnxt: properly flush XDP redirect lists")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 43 +++++++++++--------
- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 11 ++++-
- drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 12 +++---
- 3 files changed, 40 insertions(+), 26 deletions(-)
-
-diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-index 5b137747937ac..7e1f4b3adb2c9 100644
---- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-@@ -332,16 +332,16 @@ static void bnxt_sched_reset_rxr(struct bnxt *bp, struct bnxt_rx_ring_info *rxr)
- }
-
- void bnxt_sched_reset_txr(struct bnxt *bp, struct bnxt_tx_ring_info *txr,
-- int idx)
-+ u16 curr)
- {
- struct bnxt_napi *bnapi = txr->bnapi;
-
- if (bnapi->tx_fault)
- return;
-
-- netdev_err(bp->dev, "Invalid Tx completion (ring:%d tx_pkts:%d cons:%u prod:%u i:%d)",
-- txr->txq_index, bnapi->tx_pkts,
-- txr->tx_cons, txr->tx_prod, idx);
-+ netdev_err(bp->dev, "Invalid Tx completion (ring:%d tx_hw_cons:%u cons:%u prod:%u curr:%u)",
-+ txr->txq_index, txr->tx_hw_cons,
-+ txr->tx_cons, txr->tx_prod, curr);
- WARN_ON_ONCE(1);
- bnapi->tx_fault = 1;
- bnxt_queue_sp_work(bp, BNXT_RESET_TASK_SP_EVENT);
-@@ -691,13 +691,13 @@ static void bnxt_tx_int(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
- {
- struct bnxt_tx_ring_info *txr = bnapi->tx_ring;
- struct netdev_queue *txq = netdev_get_tx_queue(bp->dev, txr->txq_index);
-+ u16 hw_cons = txr->tx_hw_cons;
- u16 cons = txr->tx_cons;
- struct pci_dev *pdev = bp->pdev;
-- int nr_pkts = bnapi->tx_pkts;
-- int i;
- unsigned int tx_bytes = 0;
-+ int tx_pkts = 0;
-
-- for (i = 0; i < nr_pkts; i++) {
-+ while (cons != hw_cons) {
- struct bnxt_sw_tx_bd *tx_buf;
- struct sk_buff *skb;
- int j, last;
-@@ -708,10 +708,11 @@ static void bnxt_tx_int(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
- tx_buf->skb = NULL;
-
- if (unlikely(!skb)) {
-- bnxt_sched_reset_txr(bp, txr, i);
-+ bnxt_sched_reset_txr(bp, txr, cons);
- return;
- }
-
-+ tx_pkts++;
- tx_bytes += skb->len;
-
- if (tx_buf->is_push) {
-@@ -748,10 +749,10 @@ static void bnxt_tx_int(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
- dev_consume_skb_any(skb);
- }
-
-- bnapi->tx_pkts = 0;
-+ bnapi->events &= ~BNXT_TX_CMP_EVENT;
- WRITE_ONCE(txr->tx_cons, cons);
-
-- __netif_txq_completed_wake(txq, nr_pkts, tx_bytes,
-+ __netif_txq_completed_wake(txq, tx_pkts, tx_bytes,
- bnxt_tx_avail(bp, txr), bp->tx_wake_thresh,
- READ_ONCE(txr->dev_state) == BNXT_DEV_STATE_CLOSING);
- }
-@@ -2492,14 +2493,15 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
- {
- struct bnxt_napi *bnapi = cpr->bnapi;
- u32 raw_cons = cpr->cp_raw_cons;
-+ struct bnxt_tx_ring_info *txr;
- u32 cons;
-- int tx_pkts = 0;
- int rx_pkts = 0;
- u8 event = 0;
- struct tx_cmp *txcmp;
-
- cpr->has_more_work = 0;
- cpr->had_work_done = 1;
-+ txr = bnapi->tx_ring;
- while (1) {
- int rc;
-
-@@ -2514,9 +2516,15 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
- */
- dma_rmb();
- if (TX_CMP_TYPE(txcmp) == CMP_TYPE_TX_L2_CMP) {
-- tx_pkts++;
-+ u32 opaque = txcmp->tx_cmp_opaque;
-+ u16 tx_freed;
-+
-+ event |= BNXT_TX_CMP_EVENT;
-+ txr->tx_hw_cons = TX_OPAQUE_PROD(bp, opaque);
-+ tx_freed = (txr->tx_hw_cons - txr->tx_cons) &
-+ bp->tx_ring_mask;
- /* return full budget so NAPI will complete. */
-- if (unlikely(tx_pkts >= bp->tx_wake_thresh)) {
-+ if (unlikely(tx_freed >= bp->tx_wake_thresh)) {
- rx_pkts = budget;
- raw_cons = NEXT_RAW_CMP(raw_cons);
- if (budget)
-@@ -2570,7 +2578,6 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
- }
-
- cpr->cp_raw_cons = raw_cons;
-- bnapi->tx_pkts += tx_pkts;
- bnapi->events |= event;
- return rx_pkts;
- }
-@@ -2578,7 +2585,7 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
- static void __bnxt_poll_work_done(struct bnxt *bp, struct bnxt_napi *bnapi,
- int budget)
- {
-- if (bnapi->tx_pkts && !bnapi->tx_fault)
-+ if ((bnapi->events & BNXT_TX_CMP_EVENT) && !bnapi->tx_fault)
- bnapi->tx_int(bp, bnapi, budget);
-
- if ((bnapi->events & BNXT_RX_EVENT) && !(bnapi->in_reset)) {
-@@ -2591,7 +2598,7 @@ static void __bnxt_poll_work_done(struct bnxt *bp, struct bnxt_napi *bnapi,
-
- bnxt_db_write(bp, &rxr->rx_agg_db, rxr->rx_agg_prod);
- }
-- bnapi->events = 0;
-+ bnapi->events &= BNXT_TX_CMP_EVENT;
- }
-
- static int bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
-@@ -4421,6 +4428,7 @@ static void bnxt_clear_ring_indices(struct bnxt *bp)
- if (txr) {
- txr->tx_prod = 0;
- txr->tx_cons = 0;
-+ txr->tx_hw_cons = 0;
- }
-
- rxr = bnapi->rx_ring;
-@@ -4430,6 +4438,7 @@ static void bnxt_clear_ring_indices(struct bnxt *bp)
- rxr->rx_sw_agg_prod = 0;
- rxr->rx_next_cons = 0;
- }
-+ bnapi->events = 0;
- }
- }
-
-@@ -9434,8 +9443,6 @@ static void bnxt_enable_napi(struct bnxt *bp)
- cpr = &bnapi->cp_ring;
- bnapi->in_reset = false;
-
-- bnapi->tx_pkts = 0;
--
- if (bnapi->rx_ring) {
- INIT_WORK(&cpr->dim.work, bnxt_dim_work);
- cpr->dim.mode = DIM_CQ_PERIOD_MODE_START_FROM_EQE;
-diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
-index 39b09e49db9e3..fd2122d9ecc3d 100644
---- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
-+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
-@@ -68,6 +68,12 @@ struct tx_bd {
- #define SET_TX_OPAQUE(bp, idx, bds) \
- (((bds) << TX_OPAQUE_BDS_SHIFT) | ((idx) & (bp)->tx_ring_mask))
-
-+#define TX_OPAQUE_IDX(opq) ((opq) & TX_OPAQUE_IDX_MASK)
-+#define TX_OPAQUE_BDS(opq) (((opq) & TX_OPAQUE_BDS_MASK) >> \
-+ TX_OPAQUE_BDS_SHIFT)
-+#define TX_OPAQUE_PROD(bp, opq) ((TX_OPAQUE_IDX(opq) + TX_OPAQUE_BDS(opq)) &\
-+ (bp)->tx_ring_mask)
-+
- struct tx_bd_ext {
- __le32 tx_bd_hsize_lflags;
- #define TX_BD_FLAGS_TCP_UDP_CHKSUM (1 << 0)
-@@ -715,6 +721,7 @@ struct nqe_cn {
- #define BNXT_AGG_EVENT 2
- #define BNXT_TX_EVENT 4
- #define BNXT_REDIRECT_EVENT 8
-+#define BNXT_TX_CMP_EVENT 0x10
-
- struct bnxt_sw_tx_bd {
- union {
-@@ -807,6 +814,7 @@ struct bnxt_tx_ring_info {
- struct bnxt_napi *bnapi;
- u16 tx_prod;
- u16 tx_cons;
-+ u16 tx_hw_cons;
- u16 txq_index;
- u8 kick_pending;
- struct bnxt_db_info tx_db;
-@@ -1033,7 +1041,6 @@ struct bnxt_napi {
-
- void (*tx_int)(struct bnxt *, struct bnxt_napi *,
- int budget);
-- int tx_pkts;
- u8 events;
- u8 tx_fault:1;
-
-@@ -2360,7 +2367,7 @@ int bnxt_reserve_rings(struct bnxt *bp, bool irq_re_init);
- void bnxt_tx_disable(struct bnxt *bp);
- void bnxt_tx_enable(struct bnxt *bp);
- void bnxt_sched_reset_txr(struct bnxt *bp, struct bnxt_tx_ring_info *txr,
-- int idx);
-+ u16 curr);
- void bnxt_report_link(struct bnxt *bp);
- int bnxt_update_link(struct bnxt *bp, bool chng_link_state);
- int bnxt_hwrm_set_pause(struct bnxt *);
-diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
-index 37d155312f150..0c9dca6d9c352 100644
---- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
-+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
-@@ -122,17 +122,17 @@ void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
- {
- struct bnxt_tx_ring_info *txr = bnapi->tx_ring;
- struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
-+ u16 tx_hw_cons = txr->tx_hw_cons;
- bool rx_doorbell_needed = false;
-- int nr_pkts = bnapi->tx_pkts;
- struct bnxt_sw_tx_bd *tx_buf;
- u16 tx_cons = txr->tx_cons;
- u16 last_tx_cons = tx_cons;
-- int i, j, frags;
-+ int j, frags;
-
- if (!budget)
- return;
-
-- for (i = 0; i < nr_pkts; i++) {
-+ while (tx_cons != tx_hw_cons) {
- tx_buf = &txr->tx_buf_ring[tx_cons];
-
- if (tx_buf->action == XDP_REDIRECT) {
-@@ -157,13 +157,13 @@ void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
- page_pool_recycle_direct(rxr->page_pool, tx_buf->page);
- }
- } else {
-- bnxt_sched_reset_txr(bp, txr, i);
-+ bnxt_sched_reset_txr(bp, txr, tx_cons);
- return;
- }
- tx_cons = NEXT_TX(tx_cons);
- }
-
-- bnapi->tx_pkts = 0;
-+ bnapi->events &= ~BNXT_TX_CMP_EVENT;
- WRITE_ONCE(txr->tx_cons, tx_cons);
- if (rx_doorbell_needed) {
- tx_buf = &txr->tx_buf_ring[last_tx_cons];
-@@ -268,7 +268,7 @@ bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons,
- case XDP_TX:
- rx_buf = &rxr->rx_buf_ring[cons];
- mapping = rx_buf->mapping - bp->rx_dma_offset;
-- *event = 0;
-+ *event &= BNXT_TX_CMP_EVENT;
-
- if (unlikely(xdp_buff_has_frags(&xdp))) {
- struct skb_shared_info *sinfo = xdp_get_shared_info_from_buff(&xdp);
---
-2.39.5
-
+++ /dev/null
-From eb246d2a49015e74e4d760c5bfdc6276492a2848 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 28 Jun 2024 12:29:58 -0700
-Subject: bnxt_en: Allow some TX packets to be unprocessed in NAPI
-
-From: Michael Chan <michael.chan@broadcom.com>
-
-[ Upstream commit ba0155f1e9fca8e5c59c840cf5451101b8360fe6 ]
-
-The driver's current logic will always free all the TX SKBs up to
-txr->tx_hw_cons within NAPI. In the next patches, we'll be adding
-logic to handle TX timestamp completion and we may need to hold
-some remaining TX SKBs if we don't have the timestamp completions
-yet.
-
-Modify __bnxt_poll_work_done() to clear each event bit separately to
-allow bnapi->tx_int() to decide whether to clear BNXT_TX_CMP_EVENT or
-not. bnapi->tx_int() will not clear BNXT_TX_CMP_EVENT if some TX
-SKBs are held waiting for TX timestamps. Note that legacy chips will
-never hold any SKBs this way. The SKB is always deferred to the PTP
-worker slow path to retrieve the timestamp from firmware. On the new
-P7 chips, the timestamp is returned by the hardware directly and we
-can retrieve it directly from NAPI.
-
-Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
-Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
-Signed-off-by: Michael Chan <michael.chan@broadcom.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Stable-dep-of: 9caca6ac0e26 ("bnxt: properly flush XDP redirect lists")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 21 +++++++++++++++------
- 1 file changed, 15 insertions(+), 6 deletions(-)
-
-diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-index 143425e7a3029..2ada8345180dc 100644
---- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-@@ -687,7 +687,8 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
- return NETDEV_TX_OK;
- }
-
--static void __bnxt_tx_int(struct bnxt *bp, struct bnxt_tx_ring_info *txr,
-+/* Returns true if some remaining TX packets not processed. */
-+static bool __bnxt_tx_int(struct bnxt *bp, struct bnxt_tx_ring_info *txr,
- int budget)
- {
- struct netdev_queue *txq = netdev_get_tx_queue(bp->dev, txr->txq_index);
-@@ -709,7 +710,7 @@ static void __bnxt_tx_int(struct bnxt *bp, struct bnxt_tx_ring_info *txr,
-
- if (unlikely(!skb)) {
- bnxt_sched_reset_txr(bp, txr, cons);
-- return;
-+ return false;
- }
-
- tx_pkts++;
-@@ -754,18 +755,22 @@ static void __bnxt_tx_int(struct bnxt *bp, struct bnxt_tx_ring_info *txr,
- __netif_txq_completed_wake(txq, tx_pkts, tx_bytes,
- bnxt_tx_avail(bp, txr), bp->tx_wake_thresh,
- READ_ONCE(txr->dev_state) == BNXT_DEV_STATE_CLOSING);
-+
-+ return false;
- }
-
- static void bnxt_tx_int(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
- {
- struct bnxt_tx_ring_info *txr;
-+ bool more = false;
- int i;
-
- bnxt_for_each_napi_tx(i, bnapi, txr) {
- if (txr->tx_hw_cons != RING_TX(bp, txr->tx_cons))
-- __bnxt_tx_int(bp, txr, budget);
-+ more |= __bnxt_tx_int(bp, txr, budget);
- }
-- bnapi->events &= ~BNXT_TX_CMP_EVENT;
-+ if (!more)
-+ bnapi->events &= ~BNXT_TX_CMP_EVENT;
- }
-
- static struct page *__bnxt_alloc_rx_page(struct bnxt *bp, dma_addr_t *mapping,
-@@ -2575,8 +2580,10 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
- }
- }
-
-- if (event & BNXT_REDIRECT_EVENT)
-+ if (event & BNXT_REDIRECT_EVENT) {
- xdp_do_flush();
-+ event &= ~BNXT_REDIRECT_EVENT;
-+ }
-
- if (event & BNXT_TX_EVENT) {
- struct bnxt_tx_ring_info *txr = bnapi->tx_ring[0];
-@@ -2586,6 +2593,7 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
- wmb();
-
- bnxt_db_write_relaxed(bp, &txr->tx_db, prod);
-+ event &= ~BNXT_TX_EVENT;
- }
-
- cpr->cp_raw_cons = raw_cons;
-@@ -2603,13 +2611,14 @@ static void __bnxt_poll_work_done(struct bnxt *bp, struct bnxt_napi *bnapi,
- struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
-
- bnxt_db_write(bp, &rxr->rx_db, rxr->rx_prod);
-+ bnapi->events &= ~BNXT_RX_EVENT;
- }
- if (bnapi->events & BNXT_AGG_EVENT) {
- struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
-
- bnxt_db_write(bp, &rxr->rx_agg_db, rxr->rx_agg_prod);
-+ bnapi->events &= ~BNXT_AGG_EVENT;
- }
-- bnapi->events &= BNXT_TX_CMP_EVENT;
- }
-
- static int bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
---
-2.39.5
-
+++ /dev/null
-From 8343c0046958e92447b923f3bf464e047c6d39ac Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 11 Dec 2023 16:51:12 -0800
-Subject: bnxt_en: Fix TX ring indexing logic
-
-From: Michael Chan <michael.chan@broadcom.com>
-
-[ Upstream commit 18fe0a383cca78cfb183f83f947e75bebc7b3a20 ]
-
-Two spots were missed when modifying the TX ring indexing logic.
-The use of unmasked TX index in bnxt_tx_int() will cause unnecessary
-__bnxt_tx_int() calls. The same issue in bnxt_tx_int_xdp() can
-result in illegal array index.
-
-Fixes: 6d1add95536b ("bnxt_en: Modify TX ring indexing logic.")
-Signed-off-by: Michael Chan <michael.chan@broadcom.com>
-Link: https://lore.kernel.org/r/20231212005122.2401-4-michael.chan@broadcom.com
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Stable-dep-of: 9caca6ac0e26 ("bnxt: properly flush XDP redirect lists")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 +-
- drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-index 8ef8d51f4c709..143425e7a3029 100644
---- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-@@ -762,7 +762,7 @@ static void bnxt_tx_int(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
- int i;
-
- bnxt_for_each_napi_tx(i, bnapi, txr) {
-- if (txr->tx_hw_cons != txr->tx_cons)
-+ if (txr->tx_hw_cons != RING_TX(bp, txr->tx_cons))
- __bnxt_tx_int(bp, txr, budget);
- }
- bnapi->events &= ~BNXT_TX_CMP_EVENT;
-diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
-index 5e45fdd0d596f..20fb7cc2edd02 100644
---- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
-+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
-@@ -166,7 +166,7 @@ void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
- bnapi->events &= ~BNXT_TX_CMP_EVENT;
- WRITE_ONCE(txr->tx_cons, tx_cons);
- if (rx_doorbell_needed) {
-- tx_buf = &txr->tx_buf_ring[last_tx_cons];
-+ tx_buf = &txr->tx_buf_ring[RING_TX(bp, last_tx_cons)];
- bnxt_db_write(bp, &rxr->rx_db, tx_buf->rx_prod);
-
- }
---
-2.39.5
-
+++ /dev/null
-From f0ef6ad45c34505b1d670300db57d945b4bd4e4d Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 20 Nov 2023 15:44:02 -0800
-Subject: bnxt_en: Modify TX ring indexing logic.
-
-From: Michael Chan <michael.chan@broadcom.com>
-
-[ Upstream commit 6d1add95536bafe585c500ad8114af7ed4225a0f ]
-
-Change the TX ring logic so that the index increments unbounded and
-mask it only when needed.
-
-Modify the existing macros so that the index is not masked. Add a
-new macro RING_TX() to mask it only when needed to get the index of
-txr->tx_buf_ring[].
-
-Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
-Signed-off-by: Michael Chan <michael.chan@broadcom.com>
-Link: https://lore.kernel.org/r/20231120234405.194542-11-michael.chan@broadcom.com
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Stable-dep-of: 9caca6ac0e26 ("bnxt: properly flush XDP redirect lists")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 22 +++++++++----------
- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 5 +++--
- drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 14 ++++++------
- 3 files changed, 21 insertions(+), 20 deletions(-)
-
-diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-index 65cc301b0993b..8ef8d51f4c709 100644
---- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-@@ -431,9 +431,9 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
- len = skb_headlen(skb);
- last_frag = skb_shinfo(skb)->nr_frags;
-
-- txbd = &txr->tx_desc_ring[TX_RING(prod)][TX_IDX(prod)];
-+ txbd = &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)];
-
-- tx_buf = &txr->tx_buf_ring[prod];
-+ tx_buf = &txr->tx_buf_ring[RING_TX(bp, prod)];
- tx_buf->skb = skb;
- tx_buf->nr_frags = last_frag;
-
-@@ -521,7 +521,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
- txbd->tx_bd_opaque = SET_TX_OPAQUE(bp, txr, prod, 2);
- prod = NEXT_TX(prod);
- tx_push->tx_bd_opaque = txbd->tx_bd_opaque;
-- txbd = &txr->tx_desc_ring[TX_RING(prod)][TX_IDX(prod)];
-+ txbd = &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)];
- memcpy(txbd, tx_push1, sizeof(*txbd));
- prod = NEXT_TX(prod);
- tx_push->doorbell =
-@@ -567,7 +567,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
-
- prod = NEXT_TX(prod);
- txbd1 = (struct tx_bd_ext *)
-- &txr->tx_desc_ring[TX_RING(prod)][TX_IDX(prod)];
-+ &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)];
-
- txbd1->tx_bd_hsize_lflags = lflags;
- if (skb_is_gso(skb)) {
-@@ -607,7 +607,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
- skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
-
- prod = NEXT_TX(prod);
-- txbd = &txr->tx_desc_ring[TX_RING(prod)][TX_IDX(prod)];
-+ txbd = &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)];
-
- len = skb_frag_size(frag);
- mapping = skb_frag_dma_map(&pdev->dev, frag, 0, len,
-@@ -616,7 +616,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
- if (unlikely(dma_mapping_error(&pdev->dev, mapping)))
- goto tx_dma_error;
-
-- tx_buf = &txr->tx_buf_ring[prod];
-+ tx_buf = &txr->tx_buf_ring[RING_TX(bp, prod)];
- dma_unmap_addr_set(tx_buf, mapping, mapping);
-
- txbd->tx_bd_haddr = cpu_to_le64(mapping);
-@@ -661,7 +661,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
-
- /* start back at beginning and unmap skb */
- prod = txr->tx_prod;
-- tx_buf = &txr->tx_buf_ring[prod];
-+ tx_buf = &txr->tx_buf_ring[RING_TX(bp, prod)];
- dma_unmap_single(&pdev->dev, dma_unmap_addr(tx_buf, mapping),
- skb_headlen(skb), DMA_TO_DEVICE);
- prod = NEXT_TX(prod);
-@@ -669,7 +669,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
- /* unmap remaining mapped pages */
- for (i = 0; i < last_frag; i++) {
- prod = NEXT_TX(prod);
-- tx_buf = &txr->tx_buf_ring[prod];
-+ tx_buf = &txr->tx_buf_ring[RING_TX(bp, prod)];
- dma_unmap_page(&pdev->dev, dma_unmap_addr(tx_buf, mapping),
- skb_frag_size(&skb_shinfo(skb)->frags[i]),
- DMA_TO_DEVICE);
-@@ -697,12 +697,12 @@ static void __bnxt_tx_int(struct bnxt *bp, struct bnxt_tx_ring_info *txr,
- u16 cons = txr->tx_cons;
- int tx_pkts = 0;
-
-- while (cons != hw_cons) {
-+ while (RING_TX(bp, cons) != hw_cons) {
- struct bnxt_sw_tx_bd *tx_buf;
- struct sk_buff *skb;
- int j, last;
-
-- tx_buf = &txr->tx_buf_ring[cons];
-+ tx_buf = &txr->tx_buf_ring[RING_TX(bp, cons)];
- cons = NEXT_TX(cons);
- skb = tx_buf->skb;
- tx_buf->skb = NULL;
-@@ -726,7 +726,7 @@ static void __bnxt_tx_int(struct bnxt *bp, struct bnxt_tx_ring_info *txr,
-
- for (j = 0; j < last; j++) {
- cons = NEXT_TX(cons);
-- tx_buf = &txr->tx_buf_ring[cons];
-+ tx_buf = &txr->tx_buf_ring[RING_TX(bp, cons)];
- dma_unmap_page(
- &pdev->dev,
- dma_unmap_addr(tx_buf, mapping),
-diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
-index 0ebe51bcf8e6f..fe180e6095b32 100644
---- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
-+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
-@@ -682,7 +682,7 @@ struct nqe_cn {
- #define RX_RING(x) (((x) & ~(RX_DESC_CNT - 1)) >> (BNXT_PAGE_SHIFT - 4))
- #define RX_IDX(x) ((x) & (RX_DESC_CNT - 1))
-
--#define TX_RING(x) (((x) & ~(TX_DESC_CNT - 1)) >> (BNXT_PAGE_SHIFT - 4))
-+#define TX_RING(bp, x) (((x) & (bp)->tx_ring_mask) >> (BNXT_PAGE_SHIFT - 4))
- #define TX_IDX(x) ((x) & (TX_DESC_CNT - 1))
-
- #define CP_RING(x) (((x) & ~(CP_DESC_CNT - 1)) >> (BNXT_PAGE_SHIFT - 4))
-@@ -713,7 +713,8 @@ struct nqe_cn {
-
- #define NEXT_RX_AGG(idx) (((idx) + 1) & bp->rx_agg_ring_mask)
-
--#define NEXT_TX(idx) (((idx) + 1) & bp->tx_ring_mask)
-+#define RING_TX(bp, idx) ((idx) & (bp)->tx_ring_mask)
-+#define NEXT_TX(idx) ((idx) + 1)
-
- #define ADV_RAW_CMP(idx, n) ((idx) + (n))
- #define NEXT_RAW_CMP(idx) ADV_RAW_CMP(idx, 1)
-diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
-index c3fb7f9b081ed..5e45fdd0d596f 100644
---- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
-+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
-@@ -42,12 +42,12 @@ struct bnxt_sw_tx_bd *bnxt_xmit_bd(struct bnxt *bp,
-
- /* fill up the first buffer */
- prod = txr->tx_prod;
-- tx_buf = &txr->tx_buf_ring[prod];
-+ tx_buf = &txr->tx_buf_ring[RING_TX(bp, prod)];
- tx_buf->nr_frags = num_frags;
- if (xdp)
- tx_buf->page = virt_to_head_page(xdp->data);
-
-- txbd = &txr->tx_desc_ring[TX_RING(prod)][TX_IDX(prod)];
-+ txbd = &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)];
- flags = (len << TX_BD_LEN_SHIFT) |
- ((num_frags + 1) << TX_BD_FLAGS_BD_CNT_SHIFT) |
- bnxt_lhint_arr[len >> 9];
-@@ -66,10 +66,10 @@ struct bnxt_sw_tx_bd *bnxt_xmit_bd(struct bnxt *bp,
- WRITE_ONCE(txr->tx_prod, prod);
-
- /* first fill up the first buffer */
-- frag_tx_buf = &txr->tx_buf_ring[prod];
-+ frag_tx_buf = &txr->tx_buf_ring[RING_TX(bp, prod)];
- frag_tx_buf->page = skb_frag_page(frag);
-
-- txbd = &txr->tx_desc_ring[TX_RING(prod)][TX_IDX(prod)];
-+ txbd = &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)];
-
- frag_len = skb_frag_size(frag);
- flags = frag_len << TX_BD_LEN_SHIFT;
-@@ -132,8 +132,8 @@ void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
- if (!budget)
- return;
-
-- while (tx_cons != tx_hw_cons) {
-- tx_buf = &txr->tx_buf_ring[tx_cons];
-+ while (RING_TX(bp, tx_cons) != tx_hw_cons) {
-+ tx_buf = &txr->tx_buf_ring[RING_TX(bp, tx_cons)];
-
- if (tx_buf->action == XDP_REDIRECT) {
- struct pci_dev *pdev = bp->pdev;
-@@ -153,7 +153,7 @@ void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
- frags = tx_buf->nr_frags;
- for (j = 0; j < frags; j++) {
- tx_cons = NEXT_TX(tx_cons);
-- tx_buf = &txr->tx_buf_ring[tx_cons];
-+ tx_buf = &txr->tx_buf_ring[RING_TX(bp, tx_cons)];
- page_pool_recycle_direct(rxr->page_pool, tx_buf->page);
- }
- } else {
---
-2.39.5
-
+++ /dev/null
-From 37e7c3b9e44da10a14e35d3a72be465aaa557830 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 13 Nov 2023 16:16:15 -0800
-Subject: bnxt_en: New encoding for the TX opaque field
-
-From: Michael Chan <michael.chan@broadcom.com>
-
-[ Upstream commit 5a3c585fa83f9172848c19b1000c6ad3c8b36129 ]
-
-In order to support multiple TX rings on the same MSIX, we'll use the
-upper byte of the TX opaque field to store the ring index in the new
-tx_napi_idx field. This tx_napi_idx field is currently always 0 until
-more infrastructure is added in later patches.
-
-Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
-Signed-off-by: Michael Chan <michael.chan@broadcom.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Stable-dep-of: 9caca6ac0e26 ("bnxt: properly flush XDP redirect lists")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 4 ++--
- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 10 ++++++++--
- drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 2 +-
- 3 files changed, 11 insertions(+), 5 deletions(-)
-
-diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-index 056ca742ae1f7..b5ed6c0753f7a 100644
---- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-@@ -518,7 +518,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
-
- txbd->tx_bd_len_flags_type = tx_push->tx_bd_len_flags_type;
- txbd->tx_bd_haddr = txr->data_mapping;
-- txbd->tx_bd_opaque = SET_TX_OPAQUE(bp, prod, 2);
-+ txbd->tx_bd_opaque = SET_TX_OPAQUE(bp, txr, prod, 2);
- prod = NEXT_TX(prod);
- tx_push->tx_bd_opaque = txbd->tx_bd_opaque;
- txbd = &txr->tx_desc_ring[TX_RING(prod)][TX_IDX(prod)];
-@@ -563,7 +563,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
- ((last_frag + 2) << TX_BD_FLAGS_BD_CNT_SHIFT);
-
- txbd->tx_bd_haddr = cpu_to_le64(mapping);
-- txbd->tx_bd_opaque = SET_TX_OPAQUE(bp, prod, 2 + last_frag);
-+ txbd->tx_bd_opaque = SET_TX_OPAQUE(bp, txr, prod, 2 + last_frag);
-
- prod = NEXT_TX(prod);
- txbd1 = (struct tx_bd_ext *)
-diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
-index fd2122d9ecc3d..d6636af60d821 100644
---- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
-+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
-@@ -64,11 +64,16 @@ struct tx_bd {
- #define TX_OPAQUE_IDX_MASK 0x0000ffff
- #define TX_OPAQUE_BDS_MASK 0x00ff0000
- #define TX_OPAQUE_BDS_SHIFT 16
-+#define TX_OPAQUE_RING_MASK 0xff000000
-+#define TX_OPAQUE_RING_SHIFT 24
-
--#define SET_TX_OPAQUE(bp, idx, bds) \
-- (((bds) << TX_OPAQUE_BDS_SHIFT) | ((idx) & (bp)->tx_ring_mask))
-+#define SET_TX_OPAQUE(bp, txr, idx, bds) \
-+ (((txr)->tx_napi_idx << TX_OPAQUE_RING_SHIFT) | \
-+ ((bds) << TX_OPAQUE_BDS_SHIFT) | ((idx) & (bp)->tx_ring_mask))
-
- #define TX_OPAQUE_IDX(opq) ((opq) & TX_OPAQUE_IDX_MASK)
-+#define TX_OPAQUE_RING(opq) (((opq) & TX_OPAQUE_RING_MASK) >> \
-+ TX_OPAQUE_RING_SHIFT)
- #define TX_OPAQUE_BDS(opq) (((opq) & TX_OPAQUE_BDS_MASK) >> \
- TX_OPAQUE_BDS_SHIFT)
- #define TX_OPAQUE_PROD(bp, opq) ((TX_OPAQUE_IDX(opq) + TX_OPAQUE_BDS(opq)) &\
-@@ -816,6 +821,7 @@ struct bnxt_tx_ring_info {
- u16 tx_cons;
- u16 tx_hw_cons;
- u16 txq_index;
-+ u8 tx_napi_idx;
- u8 kick_pending;
- struct bnxt_db_info tx_db;
-
-diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
-index 0c9dca6d9c352..f9ed827efddd4 100644
---- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
-+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
-@@ -52,7 +52,7 @@ struct bnxt_sw_tx_bd *bnxt_xmit_bd(struct bnxt *bp,
- ((num_frags + 1) << TX_BD_FLAGS_BD_CNT_SHIFT) |
- bnxt_lhint_arr[len >> 9];
- txbd->tx_bd_len_flags_type = cpu_to_le32(flags);
-- txbd->tx_bd_opaque = SET_TX_OPAQUE(bp, prod, 1 + num_frags);
-+ txbd->tx_bd_opaque = SET_TX_OPAQUE(bp, txr, prod, 1 + num_frags);
- txbd->tx_bd_haddr = cpu_to_le64(mapping);
-
- /* now let us fill up the frags into the next buffers */
---
-2.39.5
-
+++ /dev/null
-From aa7e97245bba05960cc8473dab52e708fe946da5 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 13 Nov 2023 16:16:09 -0800
-Subject: bnxt_en: Put the TX producer information in the TX BD opaque field
-
-From: Michael Chan <michael.chan@broadcom.com>
-
-[ Upstream commit 34eec1f29a5998305578fcc3e55d491a1795b56d ]
-
-Currently, the opaque field in the TX BD is only used for debugging.
-The TX completion logic relies on getting one TX completion for each
-packet and they always complete in order.
-
-Improve this scheme by putting the producer information (ring index plus
-number of BDs for the packet) in the opaque field. This way, we can
-handle TX completion processing by looking at the last TX completion
-instead of counting the number of completions.
-
-Since we no longer need to count the exact number of completions, we can
-optimize xmit_more by disabling TX completion when the xmit_more
-condition is true. This will be done in later patches.
-
-This patch is only initializing the opaque field in the TX BD and is
-not changing the driver's TX completion logic yet.
-
-Reviewed-by: Andy Gospodarek <gospo@broadcom.com>
-Signed-off-by: Michael Chan <michael.chan@broadcom.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Stable-dep-of: 9caca6ac0e26 ("bnxt: properly flush XDP redirect lists")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 5 +++--
- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 7 +++++++
- drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 2 +-
- 3 files changed, 11 insertions(+), 3 deletions(-)
-
-diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-index 6bf4a21853858..5b137747937ac 100644
---- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-@@ -433,8 +433,6 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
-
- txbd = &txr->tx_desc_ring[TX_RING(prod)][TX_IDX(prod)];
-
-- txbd->tx_bd_opaque = prod;
--
- tx_buf = &txr->tx_buf_ring[prod];
- tx_buf->skb = skb;
- tx_buf->nr_frags = last_frag;
-@@ -520,7 +518,9 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
-
- txbd->tx_bd_len_flags_type = tx_push->tx_bd_len_flags_type;
- txbd->tx_bd_haddr = txr->data_mapping;
-+ txbd->tx_bd_opaque = SET_TX_OPAQUE(bp, prod, 2);
- prod = NEXT_TX(prod);
-+ tx_push->tx_bd_opaque = txbd->tx_bd_opaque;
- txbd = &txr->tx_desc_ring[TX_RING(prod)][TX_IDX(prod)];
- memcpy(txbd, tx_push1, sizeof(*txbd));
- prod = NEXT_TX(prod);
-@@ -563,6 +563,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
- ((last_frag + 2) << TX_BD_FLAGS_BD_CNT_SHIFT);
-
- txbd->tx_bd_haddr = cpu_to_le64(mapping);
-+ txbd->tx_bd_opaque = SET_TX_OPAQUE(bp, prod, 2 + last_frag);
-
- prod = NEXT_TX(prod);
- txbd1 = (struct tx_bd_ext *)
-diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
-index 0116f67593e3a..39b09e49db9e3 100644
---- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
-+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
-@@ -61,6 +61,13 @@ struct tx_bd {
- __le64 tx_bd_haddr;
- } __packed;
-
-+#define TX_OPAQUE_IDX_MASK 0x0000ffff
-+#define TX_OPAQUE_BDS_MASK 0x00ff0000
-+#define TX_OPAQUE_BDS_SHIFT 16
-+
-+#define SET_TX_OPAQUE(bp, idx, bds) \
-+ (((bds) << TX_OPAQUE_BDS_SHIFT) | ((idx) & (bp)->tx_ring_mask))
-+
- struct tx_bd_ext {
- __le32 tx_bd_hsize_lflags;
- #define TX_BD_FLAGS_TCP_UDP_CHKSUM (1 << 0)
-diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
-index 758f51366ef03..37d155312f150 100644
---- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
-+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
-@@ -52,7 +52,7 @@ struct bnxt_sw_tx_bd *bnxt_xmit_bd(struct bnxt *bp,
- ((num_frags + 1) << TX_BD_FLAGS_BD_CNT_SHIFT) |
- bnxt_lhint_arr[len >> 9];
- txbd->tx_bd_len_flags_type = cpu_to_le32(flags);
-- txbd->tx_bd_opaque = prod;
-+ txbd->tx_bd_opaque = SET_TX_OPAQUE(bp, prod, 1 + num_frags);
- txbd->tx_bd_haddr = cpu_to_le64(mapping);
-
- /* now let us fill up the frags into the next buffers */
---
-2.39.5
-
+++ /dev/null
-From 9243fccd2bad5a5748b13726548fbba28e3b9143 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 13 Nov 2023 16:16:16 -0800
-Subject: bnxt_en: Refactor bnxt_hwrm_set_coal()
-
-From: Michael Chan <michael.chan@broadcom.com>
-
-[ Upstream commit 877edb347323b669c5c9511cc9e097e1192dd31b ]
-
-Add 2 helper functions to set coalescing for each RX and TX rings. This
-will make it easier to expand the number of TX rings per MSIX in the
-next patches.
-
-Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
-Signed-off-by: Michael Chan <michael.chan@broadcom.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Stable-dep-of: 9caca6ac0e26 ("bnxt: properly flush XDP redirect lists")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 43 ++++++++++++++---------
- 1 file changed, 26 insertions(+), 17 deletions(-)
-
-diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-index b5ed6c0753f7a..85872fcff5c9f 100644
---- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-@@ -6810,10 +6810,29 @@ int bnxt_hwrm_set_ring_coal(struct bnxt *bp, struct bnxt_napi *bnapi)
- return hwrm_req_send(bp, req_rx);
- }
-
-+static int
-+bnxt_hwrm_set_rx_coal(struct bnxt *bp, struct bnxt_napi *bnapi,
-+ struct hwrm_ring_cmpl_ring_cfg_aggint_params_input *req)
-+{
-+ u16 ring_id = bnxt_cp_ring_for_rx(bp, bnapi->rx_ring);
-+
-+ req->ring_id = cpu_to_le16(ring_id);
-+ return hwrm_req_send(bp, req);
-+}
-+
-+static int
-+bnxt_hwrm_set_tx_coal(struct bnxt *bp, struct bnxt_napi *bnapi,
-+ struct hwrm_ring_cmpl_ring_cfg_aggint_params_input *req)
-+{
-+ u16 ring_id = bnxt_cp_ring_for_tx(bp, bnapi->tx_ring);
-+
-+ req->ring_id = cpu_to_le16(ring_id);
-+ return hwrm_req_send(bp, req);
-+}
-+
- int bnxt_hwrm_set_coal(struct bnxt *bp)
- {
-- struct hwrm_ring_cmpl_ring_cfg_aggint_params_input *req_rx, *req_tx,
-- *req;
-+ struct hwrm_ring_cmpl_ring_cfg_aggint_params_input *req_rx, *req_tx;
- int i, rc;
-
- rc = hwrm_req_init(bp, req_rx, HWRM_RING_CMPL_RING_CFG_AGGINT_PARAMS);
-@@ -6834,18 +6853,11 @@ int bnxt_hwrm_set_coal(struct bnxt *bp)
- for (i = 0; i < bp->cp_nr_rings; i++) {
- struct bnxt_napi *bnapi = bp->bnapi[i];
- struct bnxt_coal *hw_coal;
-- u16 ring_id;
-
-- req = req_rx;
-- if (!bnapi->rx_ring) {
-- ring_id = bnxt_cp_ring_for_tx(bp, bnapi->tx_ring);
-- req = req_tx;
-- } else {
-- ring_id = bnxt_cp_ring_for_rx(bp, bnapi->rx_ring);
-- }
-- req->ring_id = cpu_to_le16(ring_id);
--
-- rc = hwrm_req_send(bp, req);
-+ if (!bnapi->rx_ring)
-+ rc = bnxt_hwrm_set_tx_coal(bp, bnapi, req_tx);
-+ else
-+ rc = bnxt_hwrm_set_rx_coal(bp, bnapi, req_rx);
- if (rc)
- break;
-
-@@ -6853,10 +6865,7 @@ int bnxt_hwrm_set_coal(struct bnxt *bp)
- continue;
-
- if (bnapi->rx_ring && bnapi->tx_ring) {
-- req = req_tx;
-- ring_id = bnxt_cp_ring_for_tx(bp, bnapi->tx_ring);
-- req->ring_id = cpu_to_le16(ring_id);
-- rc = hwrm_req_send(bp, req);
-+ rc = bnxt_hwrm_set_tx_coal(bp, bnapi, req_tx);
- if (rc)
- break;
- }
---
-2.39.5
-
+++ /dev/null
-From f0836d14a6d42d57fb167d65a785fa3845f79c1c Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 13 Nov 2023 16:16:14 -0800
-Subject: bnxt_en: Refactor bnxt_tx_int()
-
-From: Michael Chan <michael.chan@broadcom.com>
-
-[ Upstream commit ebf72319cef6e1c038e13bd4c9e3f0ad857e57ff ]
-
-bnxt_tx_int() processes the only one TX ring from the bnxt_napi pointer.
-To prepare for more TX rings associated with the bnxt_napi structure,
-add a new __bnxt_tx_int() function that takes the bnxt_tx_ring_info
-pointer to process that one TX ring. No functional change.
-
-Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
-Signed-off-by: Michael Chan <michael.chan@broadcom.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Stable-dep-of: 9caca6ac0e26 ("bnxt: properly flush XDP redirect lists")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 17 ++++++++++++-----
- 1 file changed, 12 insertions(+), 5 deletions(-)
-
-diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-index 7e1f4b3adb2c9..056ca742ae1f7 100644
---- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-@@ -687,14 +687,14 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
- return NETDEV_TX_OK;
- }
-
--static void bnxt_tx_int(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
-+static void __bnxt_tx_int(struct bnxt *bp, struct bnxt_tx_ring_info *txr,
-+ int budget)
- {
-- struct bnxt_tx_ring_info *txr = bnapi->tx_ring;
- struct netdev_queue *txq = netdev_get_tx_queue(bp->dev, txr->txq_index);
-- u16 hw_cons = txr->tx_hw_cons;
-- u16 cons = txr->tx_cons;
- struct pci_dev *pdev = bp->pdev;
-+ u16 hw_cons = txr->tx_hw_cons;
- unsigned int tx_bytes = 0;
-+ u16 cons = txr->tx_cons;
- int tx_pkts = 0;
-
- while (cons != hw_cons) {
-@@ -749,7 +749,6 @@ static void bnxt_tx_int(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
- dev_consume_skb_any(skb);
- }
-
-- bnapi->events &= ~BNXT_TX_CMP_EVENT;
- WRITE_ONCE(txr->tx_cons, cons);
-
- __netif_txq_completed_wake(txq, tx_pkts, tx_bytes,
-@@ -757,6 +756,14 @@ static void bnxt_tx_int(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
- READ_ONCE(txr->dev_state) == BNXT_DEV_STATE_CLOSING);
- }
-
-+static void bnxt_tx_int(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
-+{
-+ struct bnxt_tx_ring_info *txr = bnapi->tx_ring;
-+
-+ __bnxt_tx_int(bp, txr, budget);
-+ bnapi->events &= ~BNXT_TX_CMP_EVENT;
-+}
-+
- static struct page *__bnxt_alloc_rx_page(struct bnxt *bp, dma_addr_t *mapping,
- struct bnxt_rx_ring_info *rxr,
- unsigned int *offset,
---
-2.39.5
-
+++ /dev/null
-From c0dcbfb47f056112690ed3c42168123234d2e345 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 13 Nov 2023 16:16:17 -0800
-Subject: bnxt_en: Support up to 8 TX rings per MSIX
-
-From: Michael Chan <michael.chan@broadcom.com>
-
-[ Upstream commit 0589a1ed4d334c156110f7f42ad7c39a02761438 ]
-
-For each mqprio TC, we allocate a set of TX rings to map to the new
-hardware CoS queue. Expand the tx_ring pointer in struct bnxt_napi
-to an array of 8 to support up to 8 TX rings, one for each TC.
-Only array entry 0 is used at this time. The rest of the array
-entries will be used in later patches.
-
-Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
-Signed-off-by: Michael Chan <michael.chan@broadcom.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Stable-dep-of: 9caca6ac0e26 ("bnxt: properly flush XDP redirect lists")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 78 +++++++++++--------
- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 12 ++-
- drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 4 +-
- 3 files changed, 55 insertions(+), 39 deletions(-)
-
-diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-index 85872fcff5c9f..65cc301b0993b 100644
---- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
-@@ -758,9 +758,13 @@ static void __bnxt_tx_int(struct bnxt *bp, struct bnxt_tx_ring_info *txr,
-
- static void bnxt_tx_int(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
- {
-- struct bnxt_tx_ring_info *txr = bnapi->tx_ring;
-+ struct bnxt_tx_ring_info *txr;
-+ int i;
-
-- __bnxt_tx_int(bp, txr, budget);
-+ bnxt_for_each_napi_tx(i, bnapi, txr) {
-+ if (txr->tx_hw_cons != txr->tx_cons)
-+ __bnxt_tx_int(bp, txr, budget);
-+ }
- bnapi->events &= ~BNXT_TX_CMP_EVENT;
- }
-
-@@ -2500,7 +2504,6 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
- {
- struct bnxt_napi *bnapi = cpr->bnapi;
- u32 raw_cons = cpr->cp_raw_cons;
-- struct bnxt_tx_ring_info *txr;
- u32 cons;
- int rx_pkts = 0;
- u8 event = 0;
-@@ -2508,7 +2511,6 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
-
- cpr->has_more_work = 0;
- cpr->had_work_done = 1;
-- txr = bnapi->tx_ring;
- while (1) {
- int rc;
-
-@@ -2524,8 +2526,10 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
- dma_rmb();
- if (TX_CMP_TYPE(txcmp) == CMP_TYPE_TX_L2_CMP) {
- u32 opaque = txcmp->tx_cmp_opaque;
-+ struct bnxt_tx_ring_info *txr;
- u16 tx_freed;
-
-+ txr = bnapi->tx_ring[TX_OPAQUE_RING(opaque)];
- event |= BNXT_TX_CMP_EVENT;
- txr->tx_hw_cons = TX_OPAQUE_PROD(bp, opaque);
- tx_freed = (txr->tx_hw_cons - txr->tx_cons) &
-@@ -2575,7 +2579,7 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
- xdp_do_flush();
-
- if (event & BNXT_TX_EVENT) {
-- struct bnxt_tx_ring_info *txr = bnapi->tx_ring;
-+ struct bnxt_tx_ring_info *txr = bnapi->tx_ring[0];
- u16 prod = txr->tx_prod;
-
- /* Sync BD data before updating doorbell */
-@@ -3558,7 +3562,7 @@ static int bnxt_alloc_cp_rings(struct bnxt *bp)
-
- static void bnxt_init_ring_struct(struct bnxt *bp)
- {
-- int i;
-+ int i, j;
-
- for (i = 0; i < bp->cp_nr_rings; i++) {
- struct bnxt_napi *bnapi = bp->bnapi[i];
-@@ -3603,18 +3607,16 @@ static void bnxt_init_ring_struct(struct bnxt *bp)
- rmem->vmem = (void **)&rxr->rx_agg_ring;
-
- skip_rx:
-- txr = bnapi->tx_ring;
-- if (!txr)
-- continue;
--
-- ring = &txr->tx_ring_struct;
-- rmem = &ring->ring_mem;
-- rmem->nr_pages = bp->tx_nr_pages;
-- rmem->page_size = HW_RXBD_RING_SIZE;
-- rmem->pg_arr = (void **)txr->tx_desc_ring;
-- rmem->dma_arr = txr->tx_desc_mapping;
-- rmem->vmem_size = SW_TXBD_RING_SIZE * bp->tx_nr_pages;
-- rmem->vmem = (void **)&txr->tx_buf_ring;
-+ bnxt_for_each_napi_tx(j, bnapi, txr) {
-+ ring = &txr->tx_ring_struct;
-+ rmem = &ring->ring_mem;
-+ rmem->nr_pages = bp->tx_nr_pages;
-+ rmem->page_size = HW_TXBD_RING_SIZE;
-+ rmem->pg_arr = (void **)txr->tx_desc_ring;
-+ rmem->dma_arr = txr->tx_desc_mapping;
-+ rmem->vmem_size = SW_TXBD_RING_SIZE * bp->tx_nr_pages;
-+ rmem->vmem = (void **)&txr->tx_buf_ring;
-+ }
- }
- }
-
-@@ -4414,7 +4416,7 @@ static int bnxt_alloc_stats(struct bnxt *bp)
-
- static void bnxt_clear_ring_indices(struct bnxt *bp)
- {
-- int i;
-+ int i, j;
-
- if (!bp->bnapi)
- return;
-@@ -4431,8 +4433,7 @@ static void bnxt_clear_ring_indices(struct bnxt *bp)
- cpr = &bnapi->cp_ring;
- cpr->cp_raw_cons = 0;
-
-- txr = bnapi->tx_ring;
-- if (txr) {
-+ bnxt_for_each_napi_tx(j, bnapi, txr) {
- txr->tx_prod = 0;
- txr->tx_cons = 0;
- txr->tx_hw_cons = 0;
-@@ -4601,7 +4602,7 @@ static int bnxt_alloc_mem(struct bnxt *bp, bool irq_re_init)
- txr->tx_ring_struct.ring_mem.flags =
- BNXT_RMEM_RING_PTE_FLAG;
- txr->bnapi = bp->bnapi[j];
-- bp->bnapi[j]->tx_ring = txr;
-+ bp->bnapi[j]->tx_ring[0] = txr;
- bp->tx_ring_map[i] = bp->tx_nr_rings_xdp + i;
- if (i >= bp->tx_nr_rings_xdp) {
- txr->txq_index = i - bp->tx_nr_rings_xdp;
-@@ -6824,10 +6825,21 @@ static int
- bnxt_hwrm_set_tx_coal(struct bnxt *bp, struct bnxt_napi *bnapi,
- struct hwrm_ring_cmpl_ring_cfg_aggint_params_input *req)
- {
-- u16 ring_id = bnxt_cp_ring_for_tx(bp, bnapi->tx_ring);
-+ struct bnxt_tx_ring_info *txr;
-+ int i, rc;
-
-- req->ring_id = cpu_to_le16(ring_id);
-- return hwrm_req_send(bp, req);
-+ bnxt_for_each_napi_tx(i, bnapi, txr) {
-+ u16 ring_id;
-+
-+ ring_id = bnxt_cp_ring_for_tx(bp, txr);
-+ req->ring_id = cpu_to_le16(ring_id);
-+ rc = hwrm_req_send(bp, req);
-+ if (rc)
-+ return rc;
-+ if (!(bp->flags & BNXT_FLAG_CHIP_P5))
-+ return 0;
-+ }
-+ return 0;
- }
-
- int bnxt_hwrm_set_coal(struct bnxt *bp)
-@@ -6864,7 +6876,7 @@ int bnxt_hwrm_set_coal(struct bnxt *bp)
- if (!(bp->flags & BNXT_FLAG_CHIP_P5))
- continue;
-
-- if (bnapi->rx_ring && bnapi->tx_ring) {
-+ if (bnapi->rx_ring && bnapi->tx_ring[0]) {
- rc = bnxt_hwrm_set_tx_coal(bp, bnapi, req_tx);
- if (rc)
- break;
-@@ -11569,15 +11581,13 @@ static int bnxt_dbg_hwrm_ring_info_get(struct bnxt *bp, u8 ring_type,
-
- static void bnxt_dump_tx_sw_state(struct bnxt_napi *bnapi)
- {
-- struct bnxt_tx_ring_info *txr = bnapi->tx_ring;
-- int i = bnapi->index;
--
-- if (!txr)
-- return;
-+ struct bnxt_tx_ring_info *txr;
-+ int i = bnapi->index, j;
-
-- netdev_info(bnapi->bp->dev, "[%d]: tx{fw_ring: %d prod: %x cons: %x}\n",
-- i, txr->tx_ring_struct.fw_ring_id, txr->tx_prod,
-- txr->tx_cons);
-+ bnxt_for_each_napi_tx(j, bnapi, txr)
-+ netdev_info(bnapi->bp->dev, "[%d.%d]: tx{fw_ring: %d prod: %x cons: %x}\n",
-+ i, j, txr->tx_ring_struct.fw_ring_id, txr->tx_prod,
-+ txr->tx_cons);
- }
-
- static void bnxt_dump_rx_sw_state(struct bnxt_napi *bnapi)
-diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
-index d6636af60d821..0ebe51bcf8e6f 100644
---- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
-+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
-@@ -1036,6 +1036,14 @@ struct bnxt_cp_ring_info {
- #define BNXT_TX_HDL 1
- };
-
-+#define BNXT_MAX_QUEUE 8
-+#define BNXT_MAX_TXR_PER_NAPI BNXT_MAX_QUEUE
-+
-+#define bnxt_for_each_napi_tx(iter, bnapi, txr) \
-+ for (iter = 0, txr = (bnapi)->tx_ring[0]; txr; \
-+ txr = (iter < BNXT_MAX_TXR_PER_NAPI - 1) ? \
-+ (bnapi)->tx_ring[++iter] : NULL)
-+
- struct bnxt_napi {
- struct napi_struct napi;
- struct bnxt *bp;
-@@ -1043,7 +1051,7 @@ struct bnxt_napi {
- int index;
- struct bnxt_cp_ring_info cp_ring;
- struct bnxt_rx_ring_info *rx_ring;
-- struct bnxt_tx_ring_info *tx_ring;
-+ struct bnxt_tx_ring_info *tx_ring[BNXT_MAX_TXR_PER_NAPI];
-
- void (*tx_int)(struct bnxt *, struct bnxt_napi *,
- int budget);
-@@ -1380,8 +1388,6 @@ struct bnxt_link_info {
- (PORT_PHY_CFG_REQ_FLAGS_FEC_CLAUSE74_DISABLE | \
- BNXT_FEC_RS_OFF(link_info))
-
--#define BNXT_MAX_QUEUE 8
--
- struct bnxt_queue_info {
- u8 queue_id;
- u8 queue_profile;
-diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
-index f9ed827efddd4..c3fb7f9b081ed 100644
---- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
-+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
-@@ -120,7 +120,7 @@ static void __bnxt_xmit_xdp_redirect(struct bnxt *bp,
-
- void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
- {
-- struct bnxt_tx_ring_info *txr = bnapi->tx_ring;
-+ struct bnxt_tx_ring_info *txr = bnapi->tx_ring[0];
- struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
- u16 tx_hw_cons = txr->tx_hw_cons;
- bool rx_doorbell_needed = false;
-@@ -242,7 +242,7 @@ bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons,
- pdev = bp->pdev;
- offset = bp->rx_offset;
-
-- txr = rxr->bnapi->tx_ring;
-+ txr = rxr->bnapi->tx_ring[0];
- /* BNXT_RX_PAGE_MODE(bp) when XDP enabled */
- orig_data = xdp.data;
-
---
-2.39.5
-
wifi-mac80211-fix-beacon-interval-calculation-overfl.patch
af_unix-don-t-set-econnreset-for-consumed-oob-skb.patch
vsock-uapi-fix-linux-vm_sockets.h-userspace-compilat.patch
-bnxt_en-put-the-tx-producer-information-in-the-tx-bd.patch
-bnxt_en-add-completion-ring-pointer-in-tx-and-rx-rin.patch
-bnxt_en-refactor-bnxt_tx_int.patch
-bnxt_en-new-encoding-for-the-tx-opaque-field.patch
-bnxt_en-refactor-bnxt_hwrm_set_coal.patch
-bnxt_en-support-up-to-8-tx-rings-per-msix.patch
-bnxt_en-modify-tx-ring-indexing-logic.patch
-bnxt_en-fix-tx-ring-indexing-logic.patch
-bnxt_en-allow-some-tx-packets-to-be-unprocessed-in-n.patch
-bnxt-properly-flush-xdp-redirect-lists.patch
um-ubd-add-missing-error-check-in-start_io_thread.patch
libbpf-fix-possible-use-after-free-for-externs.patch
net-enetc-correct-endianness-handling-in-_enetc_rd_r.patch