|
Thomas Bogendoerfer |
03bb08 |
From: =?UTF-8?q?=C3=8D=C3=B1igo=20Huguet?= <ihuguet@redhat.com>
|
|
Thomas Bogendoerfer |
03bb08 |
Date: Wed, 14 Sep 2022 12:36:48 +0200
|
|
Thomas Bogendoerfer |
03bb08 |
Subject: sfc: fix TX channel offset when using legacy interrupts
|
|
Thomas Bogendoerfer |
03bb08 |
MIME-Version: 1.0
|
|
Thomas Bogendoerfer |
03bb08 |
Content-Type: text/plain; charset=UTF-8
|
|
Thomas Bogendoerfer |
03bb08 |
Content-Transfer-Encoding: 8bit
|
|
Thomas Bogendoerfer |
03bb08 |
Patch-mainline: v6.0-rc7
|
|
Thomas Bogendoerfer |
03bb08 |
Git-commit: f232af4295653afa4ade3230462b3be15ad16419
|
|
Thomas Bogendoerfer |
03bb08 |
References: git-fixes
|
|
Thomas Bogendoerfer |
03bb08 |
|
|
Thomas Bogendoerfer |
03bb08 |
In legacy interrupt mode the tx_channel_offset was hardcoded to 1, but
|
|
Thomas Bogendoerfer |
03bb08 |
that's not correct if efx_sepparate_tx_channels is false. In that case,
|
|
Thomas Bogendoerfer |
03bb08 |
the offset is 0 because the tx queues are in the single existing channel
|
|
Thomas Bogendoerfer |
03bb08 |
at index 0, together with the rx queue.
|
|
Thomas Bogendoerfer |
03bb08 |
|
|
Thomas Bogendoerfer |
03bb08 |
Without this fix, as soon as you try to send any traffic, it tries to
|
|
Thomas Bogendoerfer |
03bb08 |
get the tx queues from an uninitialized channel getting these errors:
|
|
Thomas Bogendoerfer |
03bb08 |
WARNING: CPU: 1 PID: 0 at drivers/net/ethernet/sfc/tx.c:540 efx_hard_start_xmit+0x12e/0x170 [sfc]
|
|
Thomas Bogendoerfer |
03bb08 |
[...]
|
|
Thomas Bogendoerfer |
03bb08 |
RIP: 0010:efx_hard_start_xmit+0x12e/0x170 [sfc]
|
|
Thomas Bogendoerfer |
03bb08 |
[...]
|
|
Thomas Bogendoerfer |
03bb08 |
Call Trace:
|
|
Thomas Bogendoerfer |
03bb08 |
<IRQ>
|
|
Thomas Bogendoerfer |
03bb08 |
dev_hard_start_xmit+0xd7/0x230
|
|
Thomas Bogendoerfer |
03bb08 |
sch_direct_xmit+0x9f/0x360
|
|
Thomas Bogendoerfer |
03bb08 |
__dev_queue_xmit+0x890/0xa40
|
|
Thomas Bogendoerfer |
03bb08 |
[...]
|
|
Thomas Bogendoerfer |
03bb08 |
BUG: unable to handle kernel NULL pointer dereference at 0000000000000020
|
|
Thomas Bogendoerfer |
03bb08 |
[...]
|
|
Thomas Bogendoerfer |
03bb08 |
RIP: 0010:efx_hard_start_xmit+0x153/0x170 [sfc]
|
|
Thomas Bogendoerfer |
03bb08 |
[...]
|
|
Thomas Bogendoerfer |
03bb08 |
Call Trace:
|
|
Thomas Bogendoerfer |
03bb08 |
<IRQ>
|
|
Thomas Bogendoerfer |
03bb08 |
dev_hard_start_xmit+0xd7/0x230
|
|
Thomas Bogendoerfer |
03bb08 |
sch_direct_xmit+0x9f/0x360
|
|
Thomas Bogendoerfer |
03bb08 |
__dev_queue_xmit+0x890/0xa40
|
|
Thomas Bogendoerfer |
03bb08 |
[...]
|
|
Thomas Bogendoerfer |
03bb08 |
|
|
Thomas Bogendoerfer |
03bb08 |
Fixes: c308dfd1b43e ("sfc: fix wrong tx channel offset with efx_separate_tx_channels")
|
|
Thomas Bogendoerfer |
03bb08 |
Reported-by: Tianhao Zhao <tizhao@redhat.com>
|
|
Thomas Bogendoerfer |
03bb08 |
Signed-off-by: Íñigo Huguet <ihuguet@redhat.com>
|
|
Thomas Bogendoerfer |
03bb08 |
Acked-by: Edward Cree <ecree.xilinx@gmail.com>
|
|
Thomas Bogendoerfer |
03bb08 |
Link: https://lore.kernel.org/r/20220914103648.16902-1-ihuguet@redhat.com
|
|
Thomas Bogendoerfer |
03bb08 |
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|
Thomas Bogendoerfer |
03bb08 |
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
|
|
Thomas Bogendoerfer |
03bb08 |
---
|
|
Thomas Bogendoerfer |
03bb08 |
drivers/net/ethernet/sfc/efx_channels.c | 2 +-
|
|
Thomas Bogendoerfer |
03bb08 |
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
Thomas Bogendoerfer |
03bb08 |
|
|
Thomas Bogendoerfer |
03bb08 |
--- a/drivers/net/ethernet/sfc/efx_channels.c
|
|
Thomas Bogendoerfer |
03bb08 |
+++ b/drivers/net/ethernet/sfc/efx_channels.c
|
|
Thomas Bogendoerfer |
03bb08 |
@@ -329,7 +329,7 @@ int efx_probe_interrupts(struct efx_nic
|
|
Thomas Bogendoerfer |
03bb08 |
efx->n_channels = 1 + (efx_separate_tx_channels ? 1 : 0);
|
|
Thomas Bogendoerfer |
03bb08 |
efx->n_rx_channels = 1;
|
|
Thomas Bogendoerfer |
03bb08 |
efx->n_tx_channels = 1;
|
|
Thomas Bogendoerfer |
03bb08 |
- efx->tx_channel_offset = 1;
|
|
Thomas Bogendoerfer |
03bb08 |
+ efx->tx_channel_offset = efx_separate_tx_channels ? 1 : 0;
|
|
Thomas Bogendoerfer |
03bb08 |
efx->n_xdp_channels = 0;
|
|
Thomas Bogendoerfer |
03bb08 |
efx->xdp_channel_offset = efx->n_channels;
|
|
Thomas Bogendoerfer |
03bb08 |
efx->legacy_irq = efx->pci_dev->irq;
|