|
@@ -1124,6 +1124,12 @@ int iwl_mvm_scan_offload_stop(struct iwl_mvm *mvm, bool notify)
|
|
|
return iwl_umac_scan_stop(mvm, IWL_UMAC_SCAN_UID_SCHED_SCAN,
|
|
|
notify);
|
|
|
|
|
|
+ if (mvm->scan_status == IWL_MVM_SCAN_NONE)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ if (iwl_mvm_is_radio_killed(mvm))
|
|
|
+ goto out;
|
|
|
+
|
|
|
if (mvm->scan_status != IWL_MVM_SCAN_SCHED &&
|
|
|
(!(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN) ||
|
|
|
mvm->scan_status != IWL_MVM_SCAN_OS)) {
|
|
@@ -1160,6 +1166,7 @@ int iwl_mvm_scan_offload_stop(struct iwl_mvm *mvm, bool notify)
|
|
|
if (mvm->scan_status == IWL_MVM_SCAN_OS)
|
|
|
iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN);
|
|
|
|
|
|
+out:
|
|
|
mvm->scan_status = IWL_MVM_SCAN_NONE;
|
|
|
|
|
|
if (notify) {
|
|
@@ -1316,22 +1323,6 @@ iwl_mvm_build_generic_unified_scan_cmd(struct iwl_mvm *mvm,
|
|
|
cmd->scan_prio = cpu_to_le32(IWL_SCAN_PRIORITY_HIGH);
|
|
|
cmd->iter_num = cpu_to_le32(1);
|
|
|
|
|
|
- if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_EBS_SUPPORT &&
|
|
|
- mvm->last_ebs_successful) {
|
|
|
- cmd->channel_opt[0].flags =
|
|
|
- cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS |
|
|
|
- IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE |
|
|
|
- IWL_SCAN_CHANNEL_FLAG_CACHE_ADD);
|
|
|
- cmd->channel_opt[0].non_ebs_ratio =
|
|
|
- cpu_to_le16(IWL_DENSE_EBS_SCAN_RATIO);
|
|
|
- cmd->channel_opt[1].flags =
|
|
|
- cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS |
|
|
|
- IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE |
|
|
|
- IWL_SCAN_CHANNEL_FLAG_CACHE_ADD);
|
|
|
- cmd->channel_opt[1].non_ebs_ratio =
|
|
|
- cpu_to_le16(IWL_SPARSE_EBS_SCAN_RATIO);
|
|
|
- }
|
|
|
-
|
|
|
if (iwl_mvm_rrm_scan_needed(mvm))
|
|
|
cmd->scan_flags |=
|
|
|
cpu_to_le32(IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED);
|
|
@@ -1406,6 +1397,22 @@ int iwl_mvm_unified_scan_lmac(struct iwl_mvm *mvm,
|
|
|
cmd->schedule[1].iterations = 0;
|
|
|
cmd->schedule[1].full_scan_mul = 0;
|
|
|
|
|
|
+ if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_SINGLE_SCAN_EBS &&
|
|
|
+ mvm->last_ebs_successful) {
|
|
|
+ cmd->channel_opt[0].flags =
|
|
|
+ cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS |
|
|
|
+ IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE |
|
|
|
+ IWL_SCAN_CHANNEL_FLAG_CACHE_ADD);
|
|
|
+ cmd->channel_opt[0].non_ebs_ratio =
|
|
|
+ cpu_to_le16(IWL_DENSE_EBS_SCAN_RATIO);
|
|
|
+ cmd->channel_opt[1].flags =
|
|
|
+ cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS |
|
|
|
+ IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE |
|
|
|
+ IWL_SCAN_CHANNEL_FLAG_CACHE_ADD);
|
|
|
+ cmd->channel_opt[1].non_ebs_ratio =
|
|
|
+ cpu_to_le16(IWL_SPARSE_EBS_SCAN_RATIO);
|
|
|
+ }
|
|
|
+
|
|
|
for (i = 1; i <= req->req.n_ssids; i++)
|
|
|
ssid_bitmap |= BIT(i);
|
|
|
|
|
@@ -1478,6 +1485,8 @@ int iwl_mvm_unified_sched_scan_lmac(struct iwl_mvm *mvm,
|
|
|
|
|
|
if (iwl_mvm_scan_pass_all(mvm, req))
|
|
|
flags |= IWL_MVM_LMAC_SCAN_FLAG_PASS_ALL;
|
|
|
+ else
|
|
|
+ flags |= IWL_MVM_LMAC_SCAN_FLAG_MATCH;
|
|
|
|
|
|
if (req->n_ssids == 1 && req->ssids[0].ssid_len != 0)
|
|
|
flags |= IWL_MVM_LMAC_SCAN_FLAG_PRE_CONNECTION;
|
|
@@ -1509,6 +1518,22 @@ int iwl_mvm_unified_sched_scan_lmac(struct iwl_mvm *mvm,
|
|
|
cmd->schedule[1].iterations = 0xff;
|
|
|
cmd->schedule[1].full_scan_mul = IWL_FULL_SCAN_MULTIPLIER;
|
|
|
|
|
|
+ if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_EBS_SUPPORT &&
|
|
|
+ mvm->last_ebs_successful) {
|
|
|
+ cmd->channel_opt[0].flags =
|
|
|
+ cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS |
|
|
|
+ IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE |
|
|
|
+ IWL_SCAN_CHANNEL_FLAG_CACHE_ADD);
|
|
|
+ cmd->channel_opt[0].non_ebs_ratio =
|
|
|
+ cpu_to_le16(IWL_DENSE_EBS_SCAN_RATIO);
|
|
|
+ cmd->channel_opt[1].flags =
|
|
|
+ cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS |
|
|
|
+ IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE |
|
|
|
+ IWL_SCAN_CHANNEL_FLAG_CACHE_ADD);
|
|
|
+ cmd->channel_opt[1].non_ebs_ratio =
|
|
|
+ cpu_to_le16(IWL_SPARSE_EBS_SCAN_RATIO);
|
|
|
+ }
|
|
|
+
|
|
|
iwl_mvm_lmac_scan_cfg_channels(mvm, req->channels, req->n_channels,
|
|
|
ssid_bitmap, cmd);
|
|
|
|