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;