51 lines
2.1 KiB
Diff
51 lines
2.1 KiB
Diff
From 81c23adad48324b73fe0993f332407c5be050bb5 Mon Sep 17 00:00:00 2001
|
|
From: Johannes Berg <johannes.berg@intel.com>
|
|
Date: Thu, 3 Apr 2025 11:04:37 +0000
|
|
Subject: wifi: iwlwifi: pcie: set state to no-FW before reset handshake
|
|
|
|
The reset handshake attempts to kill the firmware, and it'll go
|
|
into a pretty much dead state once we do that. However, if it
|
|
times out, then we'll attempt to dump the firmware to be able
|
|
to see why it didn't respond. During this dump, we cannot treat
|
|
it as if it was still running, since we just tried to kill it,
|
|
otherwise dumping will attempt to send a DBGC stop command. As
|
|
this command will time out, we'll go into a reset loop.
|
|
|
|
For now, fix this by setting the trans->state to say firmware
|
|
isn't running before doing the reset handshake. In the longer
|
|
term, we should clean up the way this state is handled.
|
|
|
|
It's not entirely clear but it seems likely that this issue was
|
|
introduced by my rework of the error handling, prior to that it
|
|
would've been synchronous at that point and (I think) not have
|
|
attempted to reset since it was already doing down.
|
|
|
|
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=219967
|
|
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=219968
|
|
Closes: https://gitlab.archlinux.org/archlinux/packaging/packages/linux/-/issues/128
|
|
Fixes: 7391b2a4f7db ("wifi: iwlwifi: rework firmware error handling")
|
|
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|
Signed-off-by: Oleksandr Natalenko <oleksandr@natalenko.name>
|
|
---
|
|
drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c | 8 +++++++-
|
|
1 file changed, 7 insertions(+), 1 deletion(-)
|
|
|
|
--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c
|
|
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c
|
|
@@ -147,8 +147,14 @@ static void _iwl_trans_pcie_gen2_stop_de
|
|
return;
|
|
|
|
if (trans->state >= IWL_TRANS_FW_STARTED &&
|
|
- trans_pcie->fw_reset_handshake)
|
|
+ trans_pcie->fw_reset_handshake) {
|
|
+ /*
|
|
+ * Reset handshake can dump firmware on timeout, but that
|
|
+ * should assume that the firmware is already dead.
|
|
+ */
|
|
+ trans->state = IWL_TRANS_NO_FW;
|
|
iwl_trans_pcie_fw_reset_handshake(trans);
|
|
+ }
|
|
|
|
trans_pcie->is_down = true;
|
|
|