diff options
-rw-r--r-- | queue-6.6/bnxt-properly-flush-xdp-redirect-lists.patch | 139 | ||||
-rw-r--r-- | queue-6.6/bnxt_en-add-completion-ring-pointer-in-tx-and-rx-rin.patch | 284 | ||||
-rw-r--r-- | queue-6.6/bnxt_en-allow-some-tx-packets-to-be-unprocessed-in-n.patch | 121 | ||||
-rw-r--r-- | queue-6.6/bnxt_en-fix-tx-ring-indexing-logic.patch | 54 | ||||
-rw-r--r-- | queue-6.6/bnxt_en-modify-tx-ring-indexing-logic.patch | 200 | ||||
-rw-r--r-- | queue-6.6/bnxt_en-new-encoding-for-the-tx-opaque-field.patch | 94 | ||||
-rw-r--r-- | queue-6.6/bnxt_en-put-the-tx-producer-information-in-the-tx-bd.patch | 101 | ||||
-rw-r--r-- | queue-6.6/bnxt_en-refactor-bnxt_hwrm_set_coal.patch | 96 | ||||
-rw-r--r-- | queue-6.6/bnxt_en-refactor-bnxt_tx_int.patch | 72 | ||||
-rw-r--r-- | queue-6.6/bnxt_en-support-up-to-8-tx-rings-per-msix.patch | 266 | ||||
-rw-r--r-- | queue-6.6/series | 10 |
11 files changed, 0 insertions, 1437 deletions
diff --git a/queue-6.6/bnxt-properly-flush-xdp-redirect-lists.patch b/queue-6.6/bnxt-properly-flush-xdp-redirect-lists.patch deleted file mode 100644 index ea0427a9cf..0000000000 --- a/queue-6.6/bnxt-properly-flush-xdp-redirect-lists.patch +++ /dev/null @@ -1,139 +0,0 @@ -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 - diff --git a/queue-6.6/bnxt_en-add-completion-ring-pointer-in-tx-and-rx-rin.patch b/queue-6.6/bnxt_en-add-completion-ring-pointer-in-tx-and-rx-rin.patch deleted file mode 100644 index 6ee72990e1..0000000000 --- a/queue-6.6/bnxt_en-add-completion-ring-pointer-in-tx-and-rx-rin.patch +++ /dev/null @@ -1,284 +0,0 @@ -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 - diff --git a/queue-6.6/bnxt_en-allow-some-tx-packets-to-be-unprocessed-in-n.patch b/queue-6.6/bnxt_en-allow-some-tx-packets-to-be-unprocessed-in-n.patch deleted file mode 100644 index 9069db9061..0000000000 --- a/queue-6.6/bnxt_en-allow-some-tx-packets-to-be-unprocessed-in-n.patch +++ /dev/null @@ -1,121 +0,0 @@ -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 - diff --git a/queue-6.6/bnxt_en-fix-tx-ring-indexing-logic.patch b/queue-6.6/bnxt_en-fix-tx-ring-indexing-logic.patch deleted file mode 100644 index e62ea18c16..0000000000 --- a/queue-6.6/bnxt_en-fix-tx-ring-indexing-logic.patch +++ /dev/null @@ -1,54 +0,0 @@ -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 - diff --git a/queue-6.6/bnxt_en-modify-tx-ring-indexing-logic.patch b/queue-6.6/bnxt_en-modify-tx-ring-indexing-logic.patch deleted file mode 100644 index c30eb6fea4..0000000000 --- a/queue-6.6/bnxt_en-modify-tx-ring-indexing-logic.patch +++ /dev/null @@ -1,200 +0,0 @@ -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 - diff --git a/queue-6.6/bnxt_en-new-encoding-for-the-tx-opaque-field.patch b/queue-6.6/bnxt_en-new-encoding-for-the-tx-opaque-field.patch deleted file mode 100644 index 74a9a4cc9e..0000000000 --- a/queue-6.6/bnxt_en-new-encoding-for-the-tx-opaque-field.patch +++ /dev/null @@ -1,94 +0,0 @@ -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 - diff --git a/queue-6.6/bnxt_en-put-the-tx-producer-information-in-the-tx-bd.patch b/queue-6.6/bnxt_en-put-the-tx-producer-information-in-the-tx-bd.patch deleted file mode 100644 index 9f4dc84ba1..0000000000 --- a/queue-6.6/bnxt_en-put-the-tx-producer-information-in-the-tx-bd.patch +++ /dev/null @@ -1,101 +0,0 @@ -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 - diff --git a/queue-6.6/bnxt_en-refactor-bnxt_hwrm_set_coal.patch b/queue-6.6/bnxt_en-refactor-bnxt_hwrm_set_coal.patch deleted file mode 100644 index 0859bc3ccd..0000000000 --- a/queue-6.6/bnxt_en-refactor-bnxt_hwrm_set_coal.patch +++ /dev/null @@ -1,96 +0,0 @@ -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 - diff --git a/queue-6.6/bnxt_en-refactor-bnxt_tx_int.patch b/queue-6.6/bnxt_en-refactor-bnxt_tx_int.patch deleted file mode 100644 index d089a5e694..0000000000 --- a/queue-6.6/bnxt_en-refactor-bnxt_tx_int.patch +++ /dev/null @@ -1,72 +0,0 @@ -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 - diff --git a/queue-6.6/bnxt_en-support-up-to-8-tx-rings-per-msix.patch b/queue-6.6/bnxt_en-support-up-to-8-tx-rings-per-msix.patch deleted file mode 100644 index 443d0abeac..0000000000 --- a/queue-6.6/bnxt_en-support-up-to-8-tx-rings-per-msix.patch +++ /dev/null @@ -1,266 +0,0 @@ -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 - diff --git a/queue-6.6/series b/queue-6.6/series index 2e7383bc55..70da8ead90 100644 --- a/queue-6.6/series +++ b/queue-6.6/series @@ -82,16 +82,6 @@ libbpf-fix-null-pointer-dereference-in-btf_dump__fre.patch 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 |