iwlwifi: mvm: clear firmware running bit earlier
authorJohannes Berg <johannes.berg@intel.com>
Wed, 22 Mar 2017 21:26:03 +0000 (22:26 +0100)
committerLuca Coelho <luciano.coelho@intel.com>
Mon, 5 Jun 2017 20:34:27 +0000 (23:34 +0300)
Clear the firmware running bit before flushing the FW (error) dump
work, because otherwise debugfs isn't blocked (previous patch) and
can cause a new work to be scheduled, which will then run after we
actually shut down the device, wreaking havoc. Clearing it ensures
that debugfs can't interfere anymore, and we can safely cancel or
flush the work struct.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c

index 9e0c0f0e5999bdadd246c74dad0957dd97b61154..08f86e77eba5ff33424baa0cd7fcca18b320735c 100644 (file)
@@ -1244,6 +1244,17 @@ static void iwl_mvm_mac_stop(struct ieee80211_hw *hw)
        flush_work(&mvm->d0i3_exit_work);
        flush_work(&mvm->async_handlers_wk);
        flush_work(&mvm->add_stream_wk);
+
+       /*
+        * Lock and clear the firmware running bit here already, so that
+        * new commands coming in elsewhere, e.g. from debugfs, will not
+        * be able to proceed. This is important here because one of those
+        * debugfs files causes the fw_dump_wk to be triggered, and if we
+        * don't stop debugfs accesses before canceling that it could be
+        * retriggered after we flush it but before we've cleared the bit.
+        */
+       clear_bit(IWL_MVM_STATUS_FIRMWARE_RUNNING, &mvm->status);
+
        cancel_delayed_work_sync(&mvm->fw_dump_wk);
        cancel_delayed_work_sync(&mvm->cs_tx_unblock_dwork);
        cancel_delayed_work_sync(&mvm->scan_timeout_dwork);