iwlwifi: mvm: notify scan completed even if no fw_restart
Notify scan completed if fw_restart flow isn't going to be run. Otherwise, the scan will stay stack forever and mac80211 will not be able to remove the interface. Signed-off-by: David Spinadel <david.spinadel@intel.com> Reviewed-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
This commit is contained in:
parent
df8fe3aed0
commit
992f81fcd9
2 changed files with 24 additions and 21 deletions
|
@ -713,6 +713,29 @@ static void iwl_mvm_nic_restart(struct iwl_mvm *mvm)
|
||||||
{
|
{
|
||||||
iwl_abort_notification_waits(&mvm->notif_wait);
|
iwl_abort_notification_waits(&mvm->notif_wait);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is a bit racy, but worst case we tell mac80211 about
|
||||||
|
* a stopped/aborted scan when that was already done which
|
||||||
|
* is not a problem. It is necessary to abort any os scan
|
||||||
|
* here because mac80211 requires having the scan cleared
|
||||||
|
* before restarting.
|
||||||
|
* We'll reset the scan_status to NONE in restart cleanup in
|
||||||
|
* the next start() call from mac80211. If restart isn't called
|
||||||
|
* (no fw restart) scan status will stay busy.
|
||||||
|
*/
|
||||||
|
switch (mvm->scan_status) {
|
||||||
|
case IWL_MVM_SCAN_NONE:
|
||||||
|
break;
|
||||||
|
case IWL_MVM_SCAN_OS:
|
||||||
|
ieee80211_scan_completed(mvm->hw, true);
|
||||||
|
break;
|
||||||
|
case IWL_MVM_SCAN_SCHED:
|
||||||
|
/* Sched scan will be restarted by mac80211 in restart_hw. */
|
||||||
|
if (!mvm->restart_fw)
|
||||||
|
ieee80211_sched_scan_stopped(mvm->hw);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we're restarting already, don't cycle restarts.
|
* If we're restarting already, don't cycle restarts.
|
||||||
* If INIT fw asserted, it will likely fail again.
|
* If INIT fw asserted, it will likely fail again.
|
||||||
|
@ -744,26 +767,6 @@ static void iwl_mvm_nic_restart(struct iwl_mvm *mvm)
|
||||||
INIT_WORK(&reprobe->work, iwl_mvm_reprobe_wk);
|
INIT_WORK(&reprobe->work, iwl_mvm_reprobe_wk);
|
||||||
schedule_work(&reprobe->work);
|
schedule_work(&reprobe->work);
|
||||||
} else if (mvm->cur_ucode == IWL_UCODE_REGULAR && mvm->restart_fw) {
|
} else if (mvm->cur_ucode == IWL_UCODE_REGULAR && mvm->restart_fw) {
|
||||||
/*
|
|
||||||
* This is a bit racy, but worst case we tell mac80211 about
|
|
||||||
* a stopped/aborted (sched) scan when that was already done
|
|
||||||
* which is not a problem. It is necessary to abort any scan
|
|
||||||
* here because mac80211 requires having the scan cleared
|
|
||||||
* before restarting.
|
|
||||||
* We'll reset the scan_status to NONE in restart cleanup in
|
|
||||||
* the next start() call from mac80211.
|
|
||||||
*/
|
|
||||||
switch (mvm->scan_status) {
|
|
||||||
case IWL_MVM_SCAN_NONE:
|
|
||||||
break;
|
|
||||||
case IWL_MVM_SCAN_OS:
|
|
||||||
ieee80211_scan_completed(mvm->hw, true);
|
|
||||||
break;
|
|
||||||
case IWL_MVM_SCAN_SCHED:
|
|
||||||
/* Sched scan will be restarted by mac80211. */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mvm->restart_fw > 0)
|
if (mvm->restart_fw > 0)
|
||||||
mvm->restart_fw--;
|
mvm->restart_fw--;
|
||||||
ieee80211_restart_hw(mvm->hw);
|
ieee80211_restart_hw(mvm->hw);
|
||||||
|
|
|
@ -487,7 +487,7 @@ void iwl_mvm_cancel_scan(struct iwl_mvm *mvm)
|
||||||
ret = iwl_mvm_send_cmd_pdu(mvm, SCAN_ABORT_CMD, CMD_SYNC, 0, NULL);
|
ret = iwl_mvm_send_cmd_pdu(mvm, SCAN_ABORT_CMD, CMD_SYNC, 0, NULL);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
IWL_ERR(mvm, "Couldn't send SCAN_ABORT_CMD: %d\n", ret);
|
IWL_ERR(mvm, "Couldn't send SCAN_ABORT_CMD: %d\n", ret);
|
||||||
/* mac80211's state will be cleaned in the fw_restart flow */
|
/* mac80211's state will be cleaned in the nic_restart flow */
|
||||||
goto out_remove_notif;
|
goto out_remove_notif;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue