Commit 5a3e9f7f authored by Emmanuel Grumbach's avatar Emmanuel Grumbach Committed by Johannes Berg

iwlwifi: mvm: call ieee80211_scan_completed when needed

When RFKill cuts short a scan, mac80211 cancels the scan.
This is done by sending a host command to the firmware, but
this command was dropped because of RFKill. Flag this
command as "SEND_IN_RFKILL" to make sure it is sent to the
firmware. The firmware will send SCAN_COMPLETE_NOTIFICATION
which will trigger a call to ieee80211_scan_completed.

If the scan cannot be aborted, it is because the firmware
already finished the scan but we hadn't notified mac80211
at the time mac80211 decided to cancel the scan. By the time
we see the scan could not be aborted, mac80211 has been
notified already.

This patch fixes situations in which we didn't notify
mac80211 upon completion of the scan that was cut short
by RFkill.

Cc: stable@vger.kernel.org [3.10+]
Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 08a5dd38
...@@ -394,6 +394,11 @@ static bool iwl_mvm_scan_abort_notif(struct iwl_notif_wait_data *notif_wait, ...@@ -394,6 +394,11 @@ static bool iwl_mvm_scan_abort_notif(struct iwl_notif_wait_data *notif_wait,
return false; return false;
} }
/*
* If scan cannot be aborted, it means that we had a
* SCAN_COMPLETE_NOTIFICATION in the pipe and it called
* ieee80211_scan_completed already.
*/
IWL_DEBUG_SCAN(mvm, "Scan cannot be aborted, exit now: %d\n", IWL_DEBUG_SCAN(mvm, "Scan cannot be aborted, exit now: %d\n",
*resp); *resp);
return true; return true;
...@@ -417,14 +422,19 @@ void iwl_mvm_cancel_scan(struct iwl_mvm *mvm) ...@@ -417,14 +422,19 @@ void iwl_mvm_cancel_scan(struct iwl_mvm *mvm)
SCAN_COMPLETE_NOTIFICATION }; SCAN_COMPLETE_NOTIFICATION };
int ret; int ret;
if (mvm->scan_status == IWL_MVM_SCAN_NONE)
return;
iwl_init_notification_wait(&mvm->notif_wait, &wait_scan_abort, iwl_init_notification_wait(&mvm->notif_wait, &wait_scan_abort,
scan_abort_notif, scan_abort_notif,
ARRAY_SIZE(scan_abort_notif), ARRAY_SIZE(scan_abort_notif),
iwl_mvm_scan_abort_notif, NULL); iwl_mvm_scan_abort_notif, NULL);
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 | CMD_SEND_IN_RFKILL, 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 */
goto out_remove_notif; goto out_remove_notif;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment