[PATCH wireless 1/2] wifi: iwlwifi: pcie: arm the product reset at probe
From: Navon John Lukose
Date: Sat Aug 29 2026 - 05:55:47 EST
The driver already implements the platform-level device reset (PLDR):
iwl_trans_pcie_call_reset() walks _PRR and evaluates _RST, and
iwl_trans_pcie_set_product_reset() arms it over the vendor _DSM. But it
is armed too late to ever help.
set_product_reset() is only called from iwl_trans_pcie_removal_wk(),
i.e. once the device is already being torn down. On these platforms the
_DSM dispatch is gated on the firmware reading the device's PCI ID back
out of config space:
Method (WIST) { Switch (ToInteger (VDID)) { Case (0x272B8086) {...} } }
If the device has lost power VDID reads 0xffffffff, WIST() returns 0,
the _DSM never reaches the vendor functions and acpi_check_dsm() fails:
scheduling reset (mode=6)
ACPI _DSM not available (-19), cannot do product reset
So the reset stays disarmed, _RST falls back to a plain function-level
reset and the device is unrecoverable in exactly the case PLDR exists
for. Observed on Intel BE200 (8086:272b) on Meteor Lake laptops, where a
D3cold transition removes the M.2 module's power rail and the card does
not restart when the rail and PERST# are restored.
Arm it during probe instead, while the device still answers. The mode is
sticky in the platform's namespace, so it is still set when the device
later disappears. _RST is only evaluated when the driver actually asks
for a reset, and a subsequent non-product reset re-runs the existing
disarm path as before. On platforms with no such _DSM this is a no-op.
Link: https://bugzilla.kernel.org/show_bug.cgi?id=221695
Fixes: 9673c35486d4 ("wifi: iwlwifi: implement product reset for TOP errors")
Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: Navon John Lukose <navonjohnlukose@xxxxxxxxx>
---
--- a/drivers/net/wireless/intel/iwlwifi/pcie/gen1_2/trans.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/gen1_2/trans.c
@@ -4252,6 +4252,11 @@
iwl_trans_pcie_check_product_reset_status(pdev);
iwl_trans_pcie_check_product_reset_mode(pdev);
+ /* must be armed while the device still answers: the _DSM is gated on
+ * reading its PCI ID out of config space
+ */
+ iwl_trans_pcie_set_product_reset(pdev, true, mac_cfg->integrated);
+
/* set the things we know so far for the grab NIC access */
iwl_trans_set_info(iwl_trans, &info);