Commit 9966904e authored by Ilan Peer's avatar Ilan Peer Committed by Luca Coelho

iwlwifi: mvm: Passively scan non PSC channels only when requested so

Non PSC channels should generally be scanned based on information about
collocated APs obtained during scan on legacy bands, and otherwise
should not be scanned unless specifically requested so (as there are
relatively many non PSC channels, scanning them passively is time consuming
and interferes with regular data traffic).

Thus, modify the scan logic to avoid passively scanning PSC channels
if there is no information about collocated APs and the scan is not
a passive scan.
Signed-off-by: default avatarIlan Peer <ilan.peer@intel.com>
Signed-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20220204122220.457da4cc95eb.Ic98472bab5f5475f1e102547644caaae89ce4c4a@changeidSigned-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
parent 127ee0d7
...@@ -1728,27 +1728,37 @@ iwl_mvm_umac_scan_fill_6g_chan_list(struct iwl_mvm *mvm, ...@@ -1728,27 +1728,37 @@ iwl_mvm_umac_scan_fill_6g_chan_list(struct iwl_mvm *mvm,
} }
/* TODO: this function can be merged with iwl_mvm_scan_umac_fill_ch_p_v6 */ /* TODO: this function can be merged with iwl_mvm_scan_umac_fill_ch_p_v6 */
static void static u32
iwl_mvm_umac_scan_cfg_channels_v6_6g(struct iwl_mvm_scan_params *params, iwl_mvm_umac_scan_cfg_channels_v6_6g(struct iwl_mvm *mvm,
struct iwl_mvm_scan_params *params,
u32 n_channels, u32 n_channels,
struct iwl_scan_probe_params_v4 *pp, struct iwl_scan_probe_params_v4 *pp,
struct iwl_scan_channel_params_v6 *cp, struct iwl_scan_channel_params_v6 *cp,
enum nl80211_iftype vif_type) enum nl80211_iftype vif_type)
{ {
struct iwl_scan_channel_cfg_umac *channel_cfg = cp->channel_config;
int i; int i;
struct cfg80211_scan_6ghz_params *scan_6ghz_params = struct cfg80211_scan_6ghz_params *scan_6ghz_params =
params->scan_6ghz_params; params->scan_6ghz_params;
u32 ch_cnt;
for (i = 0; i < params->n_channels; i++) { for (i = 0, ch_cnt = 0; i < params->n_channels; i++) {
struct iwl_scan_channel_cfg_umac *cfg = struct iwl_scan_channel_cfg_umac *cfg =
&cp->channel_config[i]; &cp->channel_config[ch_cnt];
u32 s_ssid_bitmap = 0, bssid_bitmap = 0, flags = 0; u32 s_ssid_bitmap = 0, bssid_bitmap = 0, flags = 0;
u8 j, k, s_max = 0, b_max = 0, n_used_bssid_entries; u8 j, k, s_max = 0, b_max = 0, n_used_bssid_entries;
bool force_passive, found = false, allow_passive = true, bool force_passive, found = false, allow_passive = true,
unsolicited_probe_on_chan = false, psc_no_listen = false; unsolicited_probe_on_chan = false, psc_no_listen = false;
/*
* Avoid performing passive scan on non PSC channels unless the
* scan is specifically a passive scan, i.e., no SSIDs
* configured in the scan command.
*/
if (!cfg80211_channel_is_psc(params->channels[i]) &&
!params->n_6ghz_params && params->n_ssids)
continue;
cfg->v1.channel_num = params->channels[i]->hw_value; cfg->v1.channel_num = params->channels[i]->hw_value;
cfg->v2.band = 2; cfg->v2.band = 2;
cfg->v2.iter_count = 1; cfg->v2.iter_count = 1;
...@@ -1868,8 +1878,16 @@ iwl_mvm_umac_scan_cfg_channels_v6_6g(struct iwl_mvm_scan_params *params, ...@@ -1868,8 +1878,16 @@ iwl_mvm_umac_scan_cfg_channels_v6_6g(struct iwl_mvm_scan_params *params,
else else
flags |= bssid_bitmap | (s_ssid_bitmap << 16); flags |= bssid_bitmap | (s_ssid_bitmap << 16);
channel_cfg[i].flags |= cpu_to_le32(flags); cfg->flags |= cpu_to_le32(flags);
ch_cnt++;
} }
if (params->n_channels > ch_cnt)
IWL_DEBUG_SCAN(mvm,
"6GHz: reducing number channels: (%u->%u)\n",
params->n_channels, ch_cnt);
return ch_cnt;
} }
static u8 iwl_mvm_scan_umac_chan_flags_v2(struct iwl_mvm *mvm, static u8 iwl_mvm_scan_umac_chan_flags_v2(struct iwl_mvm *mvm,
...@@ -2415,10 +2433,14 @@ static int iwl_mvm_scan_umac_v14_and_above(struct iwl_mvm *mvm, ...@@ -2415,10 +2433,14 @@ static int iwl_mvm_scan_umac_v14_and_above(struct iwl_mvm *mvm,
iwl_mvm_umac_scan_fill_6g_chan_list(mvm, params, pb); iwl_mvm_umac_scan_fill_6g_chan_list(mvm, params, pb);
iwl_mvm_umac_scan_cfg_channels_v6_6g(params, cp->count = iwl_mvm_umac_scan_cfg_channels_v6_6g(mvm, params,
params->n_channels, params->n_channels,
pb, cp, vif->type); pb, cp, vif->type);
cp->count = params->n_channels; if (!cp->count) {
mvm->scan_uid_status[uid] = 0;
return -EINVAL;
}
if (!params->n_ssids || if (!params->n_ssids ||
(params->n_ssids == 1 && !params->ssids[0].ssid_len)) (params->n_ssids == 1 && !params->ssids[0].ssid_len))
cp->flags |= IWL_SCAN_CHANNEL_FLAG_6G_PSC_NO_FILTER; cp->flags |= IWL_SCAN_CHANNEL_FLAG_6G_PSC_NO_FILTER;
......
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