|
@@ -1004,10 +1004,18 @@ int __iwl_mvm_mac_start(struct iwl_mvm *mvm)
|
|
|
|
|
|
lockdep_assert_held(&mvm->mutex);
|
|
|
|
|
|
- /* Clean up some internal and mac80211 state on restart */
|
|
|
- if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status))
|
|
|
+ if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) {
|
|
|
+ /* Clean up some internal and mac80211 state on restart */
|
|
|
iwl_mvm_restart_cleanup(mvm);
|
|
|
-
|
|
|
+ } else {
|
|
|
+ /* Hold the reference to prevent runtime suspend while
|
|
|
+ * the start procedure runs. It's a bit confusing
|
|
|
+ * that the UCODE_DOWN reference is taken, but it just
|
|
|
+ * means "UCODE is not UP yet". ( TODO: rename this
|
|
|
+ * reference).
|
|
|
+ */
|
|
|
+ iwl_mvm_ref(mvm, IWL_MVM_REF_UCODE_DOWN);
|
|
|
+ }
|
|
|
ret = iwl_mvm_up(mvm);
|
|
|
|
|
|
if (ret && test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) {
|
|
@@ -1110,14 +1118,6 @@ void __iwl_mvm_mac_stop(struct iwl_mvm *mvm)
|
|
|
*/
|
|
|
memset(&mvm->accu_radio_stats, 0, sizeof(mvm->accu_radio_stats));
|
|
|
|
|
|
- /*
|
|
|
- * Disallow low power states when the FW is down by taking
|
|
|
- * the UCODE_DOWN ref. in case of ongoing hw restart the
|
|
|
- * ref is already taken, so don't take it again.
|
|
|
- */
|
|
|
- if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status))
|
|
|
- iwl_mvm_ref(mvm, IWL_MVM_REF_UCODE_DOWN);
|
|
|
-
|
|
|
/* async_handlers_wk is now blocked */
|
|
|
|
|
|
/*
|