aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/drivers/net/wireless/intel
diff options
context:
space:
mode:
authorSebastian Reichel <sebastian.reichel@collabora.com>2025-07-07 00:53:35 +0200
committerSebastian Reichel <sebastian.reichel@collabora.com>2025-07-07 00:53:35 +0200
commit61b8c39deb4b6d314f942a4a33565575c9b0c3d5 (patch)
treef25268cdd9485af13d9efa05db3d88754a82f82b /drivers/net/wireless/intel
parentMAINTAINERS: rectify file entry in QUALCOMM SMB CHARGER DRIVER (diff)
parentDocumentation: PM: *_autosuspend() functions update last busy time (diff)
downloadwireguard-linux-61b8c39deb4b6d314f942a4a33565575c9b0c3d5.tar.xz
wireguard-linux-61b8c39deb4b6d314f942a4a33565575c9b0c3d5.zip
Merge tag 'pm-runtime-6.17-rc1'
Runtime PM updates related to autosuspend for 6.17 Make several autosuspend functions mark last busy stamp and update the documentation accordingly (Sakari Ailus). Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Diffstat (limited to 'drivers/net/wireless/intel')
-rw-r--r--drivers/net/wireless/intel/iwlwifi/pcie/drv.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
index 656f8b06c27b..0a9e0dbb58fb 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
@@ -1501,11 +1501,27 @@ static int _iwl_pci_resume(struct device *device, bool restore)
* Scratch value was altered, this means the device was powered off, we
* need to reset it completely.
* Note: MAC (bits 0:7) will be cleared upon suspend even with wowlan,
- * so assume that any bits there mean that the device is usable.
+ * but not bits [15:8]. So if we have bits set in lower word, assume
+ * the device is alive.
+ * For older devices, just try silently to grab the NIC.
*/
- if (trans->mac_cfg->device_family >= IWL_DEVICE_FAMILY_BZ &&
- !iwl_read32(trans, CSR_FUNC_SCRATCH))
- device_was_powered_off = true;
+ if (trans->mac_cfg->device_family >= IWL_DEVICE_FAMILY_BZ) {
+ if (!(iwl_read32(trans, CSR_FUNC_SCRATCH) &
+ CSR_FUNC_SCRATCH_POWER_OFF_MASK))
+ device_was_powered_off = true;
+ } else {
+ /*
+ * bh are re-enabled by iwl_trans_pcie_release_nic_access,
+ * so re-enable them if _iwl_trans_pcie_grab_nic_access fails.
+ */
+ local_bh_disable();
+ if (_iwl_trans_pcie_grab_nic_access(trans, true)) {
+ iwl_trans_pcie_release_nic_access(trans);
+ } else {
+ device_was_powered_off = true;
+ local_bh_enable();
+ }
+ }
if (restore || device_was_powered_off) {
trans->state = IWL_TRANS_NO_FW;