wifi: iwlwifi: mvm: tell iwlmei when we finished suspending
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Mon, 28 Oct 2024 11:54:54 +0000 (13:54 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 7 Nov 2024 13:42:29 +0000 (14:42 +0100)
Since we no longer shut down the device in suspend, we also no longer
call iwl_mvm_mei_device_state() and this is a problem because iwlmei
expects this to be called when it runs its own suspend sequence. It
checks mei->device_down in iwl_mei_remove() which is called upon
suspend.

Fix this by telling iwlmei when we're done accessing the device.
When we'll wake up, the device should be untouched if CSME didn't use it
during the suspend time. If CSME used it, we'll notice it through the
CSR_FUNC_SCRATCH register.

Fixes: e8bb19c1d590 ("wifi: iwlwifi: support fast resume")
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20241028135215.525287b90af2.Ibf183824471ea5580d9276d104444e53191e6900@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c

index 4616a5b394c0ecc8f7bfc37491d7533d9611f7bd..23ccbe7b74c030d0d1291610a8516b19b3e91882 100644 (file)
@@ -1237,6 +1237,7 @@ int __iwl_mvm_mac_start(struct iwl_mvm *mvm)
        fast_resume = mvm->fast_resume;
 
        if (fast_resume) {
+               iwl_mvm_mei_device_state(mvm, true);
                ret = iwl_mvm_fast_resume(mvm);
                if (ret) {
                        iwl_mvm_stop_device(mvm);
@@ -1371,10 +1372,13 @@ void __iwl_mvm_mac_stop(struct iwl_mvm *mvm, bool suspend)
                iwl_mvm_rm_aux_sta(mvm);
 
        if (suspend &&
-           mvm->trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_22000)
+           mvm->trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_22000) {
                iwl_mvm_fast_suspend(mvm);
-       else
+               /* From this point on, we won't touch the device */
+               iwl_mvm_mei_device_state(mvm, false);
+       } else {
                iwl_mvm_stop_device(mvm);
+       }
 
        iwl_mvm_async_handlers_purge(mvm);
        /* async_handlers_list is empty and will stay empty: HW is stopped */