]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: iwlwifi: if scratch is ~0U, consider it a failure
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Thu, 28 Aug 2025 06:55:26 +0000 (09:55 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 9 Sep 2025 17:02:20 +0000 (19:02 +0200)
[ Upstream commit 224476613c8499f00ce4de975dd65749c5ca498c ]

We want to see bits being set in the scratch register upon resume, but
if all the bits are set, it means that we were kicked out of the PCI bus
and that clearly doesn't mean we can assume the firmware is still alive
after the suspend / resume cycle.

Fixes: cb347bd29d0d ("wifi: iwlwifi: mvm: fix hibernation")
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20250828095500.0f203e559242.I59eff718cb5fda575db41081a1a389f7af488717@changeid
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/intel/iwlwifi/pcie/drv.c

index 0a9e0dbb58fbf7826bc2599afe8b9efa51c7ac51..e4e06bf9161c379db2dc37c510f195ddfcf37c25 100644 (file)
@@ -1503,11 +1503,15 @@ static int _iwl_pci_resume(struct device *device, bool restore)
         * Note: MAC (bits 0:7) will be cleared upon suspend even with wowlan,
         * but not bits [15:8]. So if we have bits set in lower word, assume
         * the device is alive.
+        * Alternatively, if the scratch value is 0xFFFFFFFF, then we no longer
+        * have access to the device and consider it powered off.
         * For older devices, just try silently to grab the NIC.
         */
        if (trans->mac_cfg->device_family >= IWL_DEVICE_FAMILY_BZ) {
-               if (!(iwl_read32(trans, CSR_FUNC_SCRATCH) &
-                     CSR_FUNC_SCRATCH_POWER_OFF_MASK))
+               u32 scratch = iwl_read32(trans, CSR_FUNC_SCRATCH);
+
+               if (!(scratch & CSR_FUNC_SCRATCH_POWER_OFF_MASK) ||
+                   scratch == ~0U)
                        device_was_powered_off = true;
        } else {
                /*