mirror of https://gitee.com/openkylin/linux.git
iwlwifi: mvm: don't try to stop scans that are not running anymore
In certain conditions, mac80211 may ask us to stop a scan (scheduled or normal) that is not running anymore. This can also happen when we are doing a different type of scan, for instance, mac80211 can ask us to stop a scheduled scan when we are running a normal scan, due to some race conditions. In this case, we would stop the wrong type of scan and leave everything everything in a wrong state. To fix this, simply ignore scan stop requests for scans types that are not running. Signed-off-by: Luciano Coelho <luciano.coelho@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
57bff14850
commit
e7d3abab81
|
@ -2215,7 +2215,19 @@ static void iwl_mvm_mac_cancel_hw_scan(struct ieee80211_hw *hw,
|
||||||
|
|
||||||
mutex_lock(&mvm->mutex);
|
mutex_lock(&mvm->mutex);
|
||||||
|
|
||||||
iwl_mvm_cancel_scan(mvm);
|
/* Due to a race condition, it's possible that mac80211 asks
|
||||||
|
* us to stop a hw_scan when it's already stopped. This can
|
||||||
|
* happen, for instance, if we stopped the scan ourselves,
|
||||||
|
* called ieee80211_scan_completed() and the userspace called
|
||||||
|
* cancel scan scan before ieee80211_scan_work() could run.
|
||||||
|
* To handle that, simply return if the scan is not running.
|
||||||
|
*/
|
||||||
|
/* FIXME: for now, we ignore this race for UMAC scans, since
|
||||||
|
* they don't set the scan_status.
|
||||||
|
*/
|
||||||
|
if ((mvm->scan_status == IWL_MVM_SCAN_OS) ||
|
||||||
|
(mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN))
|
||||||
|
iwl_mvm_cancel_scan(mvm);
|
||||||
|
|
||||||
mutex_unlock(&mvm->mutex);
|
mutex_unlock(&mvm->mutex);
|
||||||
}
|
}
|
||||||
|
@ -2559,12 +2571,29 @@ static int iwl_mvm_mac_sched_scan_stop(struct ieee80211_hw *hw,
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
mutex_lock(&mvm->mutex);
|
mutex_lock(&mvm->mutex);
|
||||||
|
|
||||||
|
/* Due to a race condition, it's possible that mac80211 asks
|
||||||
|
* us to stop a sched_scan when it's already stopped. This
|
||||||
|
* can happen, for instance, if we stopped the scan ourselves,
|
||||||
|
* called ieee80211_sched_scan_stopped() and the userspace called
|
||||||
|
* stop sched scan scan before ieee80211_sched_scan_stopped_work()
|
||||||
|
* could run. To handle this, simply return if the scan is
|
||||||
|
* not running.
|
||||||
|
*/
|
||||||
|
/* FIXME: for now, we ignore this race for UMAC scans, since
|
||||||
|
* they don't set the scan_status.
|
||||||
|
*/
|
||||||
|
if (mvm->scan_status != IWL_MVM_SCAN_SCHED &&
|
||||||
|
!(mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN)) {
|
||||||
|
mutex_unlock(&mvm->mutex);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
ret = iwl_mvm_scan_offload_stop(mvm, false);
|
ret = iwl_mvm_scan_offload_stop(mvm, false);
|
||||||
mutex_unlock(&mvm->mutex);
|
mutex_unlock(&mvm->mutex);
|
||||||
iwl_mvm_wait_for_async_handlers(mvm);
|
iwl_mvm_wait_for_async_handlers(mvm);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int iwl_mvm_mac_set_key(struct ieee80211_hw *hw,
|
static int iwl_mvm_mac_set_key(struct ieee80211_hw *hw,
|
||||||
|
|
Loading…
Reference in New Issue