/* adaptive dwell max budget time [TU] for full scan */ #define IWL_SCAN_ADWELL_MAX_BUDGET_FULL_SCAN 300 /* adaptive dwell max budget time [TU] for directed scan */ #define IWL_SCAN_ADWELL_MAX_BUDGET_DIRECTED_SCAN 100 /* adaptive dwell default high band APs number */ #define IWL_SCAN_ADWELL_DEFAULT_HB_N_APS 8 /* adaptive dwell default low band APs number */ #define IWL_SCAN_ADWELL_DEFAULT_LB_N_APS 2 /* adaptive dwell default APs number in social channels (1, 6, 11) */ #define IWL_SCAN_ADWELL_DEFAULT_N_APS_SOCIAL 10 /* number of scan channels */ #define IWL_SCAN_NUM_CHANNELS 112 /* adaptive dwell number of APs override mask for p2p friendly GO */ #define IWL_SCAN_ADWELL_N_APS_GO_FRIENDLY_BIT BIT(20) /* adaptive dwell number of APs override mask for social channels */ #define IWL_SCAN_ADWELL_N_APS_SOCIAL_CHS_BIT BIT(21) /* adaptive dwell number of APs override for p2p friendly GO channels */ #define IWL_SCAN_ADWELL_N_APS_GO_FRIENDLY 10 /* adaptive dwell number of APs override for social channels */ #define IWL_SCAN_ADWELL_N_APS_SOCIAL_CHS 2
/* minimal number of 2GHz and 5GHz channels in the regular scan request */ #define IWL_MVM_6GHZ_PASSIVE_SCAN_MIN_CHANS 4
/* Number of iterations on the channel for mei filtered scan */ #define IWL_MEI_SCAN_NUM_ITER 5U
/* * A scanning AP interface probably wants to generate a survey to do * ACS (automatic channel selection). * Force a non-fragmented scan in that case.
*/ if (vif && ieee80211_vif_type_p2p(vif) == NL80211_IFTYPE_AP) return IWL_SCAN_TYPE_WILD;
if (!data.global_cnt) return IWL_SCAN_TYPE_UNASSOC;
if (fw_has_api(&mvm->fw->ucode_capa,
IWL_UCODE_TLV_API_FRAGMENTED_SCAN)) { if ((load == IWL_MVM_TRAFFIC_HIGH || low_latency) &&
(!vif || vif->type != NL80211_IFTYPE_P2P_DEVICE)) return IWL_SCAN_TYPE_FRAGMENTED;
/* * in case of DCM with P2P GO set all scan requests as * fast-balance scan
*/ if (vif && vif->type == NL80211_IFTYPE_STATION &&
data.is_dcm_with_p2p_go) return IWL_SCAN_TYPE_FAST_BALANCE;
}
if (load >= IWL_MVM_TRAFFIC_MEDIUM || low_latency) return IWL_SCAN_TYPE_MILD;
staticinlinebool iwl_mvm_rrm_scan_needed(struct iwl_mvm *mvm)
{ /* require rrm scan whenever the fw supports it */ return fw_has_capa(&mvm->fw->ucode_capa,
IWL_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT);
}
staticint iwl_mvm_max_scan_ie_fw_cmd_room(struct iwl_mvm *mvm)
{ int max_probe_len;
max_probe_len = SCAN_OFFLOAD_PROBE_REQ_SIZE;
/* we create the 802.11 header SSID element and WFA TPC element */
max_probe_len -= 24 + 2 + WFA_TPC_IE_LEN;
/* DS parameter set element is added on 2.4GHZ band if required */ if (iwl_mvm_rrm_scan_needed(mvm))
max_probe_len -= 3;
return max_probe_len;
}
int iwl_mvm_max_scan_ie_len(struct iwl_mvm *mvm)
{ int max_ie_len = iwl_mvm_max_scan_ie_fw_cmd_room(mvm);
/* TODO: [BUG] This function should return the maximum allowed size of * scan IEs, however the LMAC scan api contains both 2GHZ and 5GHZ IEs * in the same command. So the correct implementation of this function * is just iwl_mvm_max_scan_ie_fw_cmd_room() / 2. Currently the scan * command has only 512 bytes and it would leave us with about 240 * bytes for scan IEs, which is clearly not enough. So meanwhile * we will report an incorrect value. This may result in a failure to * issue a scan in unified_scan_lmac and unified_sched_scan_lmac * functions with -ENOBUFS, if a large enough probe will be provided.
*/ return max_ie_len;
}
/* If this happens, the firmware has mistakenly sent an LMAC * notification during UMAC scans -- warn and ignore it.
*/ if (WARN_ON_ONCE(fw_has_capa(&mvm->fw->ucode_capa,
IWL_UCODE_TLV_CAPA_UMAC_SCAN))) return;
/* scan status must be locked for proper checking */
lockdep_assert_held(&mvm->mutex);
/* We first check if we were stopping a scan, in which case we * just clear the stopping flag. Then we check if it was a * firmware initiated stop, in which case we need to inform * mac80211. * Note that we can have a stopping and a running scan * simultaneously, but we can't have two different types of * scans stopping or running at the same time (since LMAC * doesn't support it).
*/
if (mvm->scan_status & IWL_MVM_SCAN_STOPPING_SCHED) {
WARN_ON_ONCE(mvm->scan_status & IWL_MVM_SCAN_STOPPING_REGULAR);
IWL_DEBUG_SCAN(mvm, "Scheduled scan %s, EBS status %s\n",
aborted ? "aborted" : "completed",
iwl_mvm_ebs_status_str(scan_notif->ebs_status));
IWL_DEBUG_SCAN(mvm, "Last line %d, Last iteration %d, Time after last iteration %d\n",
scan_notif->last_schedule_line,
scan_notif->last_schedule_iteration,
__le32_to_cpu(scan_notif->time_after_last_iter));
IWL_DEBUG_SCAN(mvm, "Scheduled scan %s, EBS status %s\n",
aborted ? "aborted" : "completed",
iwl_mvm_ebs_status_str(scan_notif->ebs_status));
IWL_DEBUG_SCAN(mvm, "Last line %d, Last iteration %d, Time after last iteration %d (FW)\n",
scan_notif->last_schedule_line,
scan_notif->last_schedule_iteration,
__le32_to_cpu(scan_notif->time_after_last_iter));
for (i = 0; i < PROBE_OPTION_MAX; i++) { if (!ssid_list[i].len) break; if (ssid_list[i].len == ssid_len &&
!memcmp(ssid_list[i].ssid, ssid, ssid_len)) return i;
} return -1;
}
/* We insert the SSIDs in an inverted order, because the FW will * invert it back.
*/ staticvoid iwl_scan_build_ssids(struct iwl_mvm_scan_params *params, struct iwl_ssid_ie *ssids,
u32 *ssid_bitmap)
{ int i, j; int index;
u32 tmp_bitmap = 0;
/* * copy SSIDs from match list. * iwl_config_sched_scan_profiles() uses the order of these ssids to * config match list.
*/ for (i = 0, j = params->n_match_sets - 1;
j >= 0 && i < PROBE_OPTION_MAX;
i++, j--) { /* skip empty SSID matchsets */ if (!params->match_sets[j].ssid.ssid_len) continue;
ssids[i].id = WLAN_EID_SSID;
ssids[i].len = params->match_sets[j].ssid.ssid_len;
memcpy(ssids[i].ssid, params->match_sets[j].ssid.ssid,
ssids[i].len);
}
/* add SSIDs from scan SSID list */ for (j = params->n_ssids - 1;
j >= 0 && i < PROBE_OPTION_MAX;
i++, j--) {
index = iwl_ssid_exist(params->ssids[j].ssid,
params->ssids[j].ssid_len,
ssids); if (index < 0) {
ssids[i].id = WLAN_EID_SSID;
ssids[i].len = params->ssids[j].ssid_len;
memcpy(ssids[i].ssid, params->ssids[j].ssid,
ssids[i].len);
tmp_bitmap |= BIT(i);
} else {
tmp_bitmap |= BIT(index);
}
} if (ssid_bitmap)
*ssid_bitmap = tmp_bitmap;
}
/* if max_profile is MAX_PROFILES_V2, we have the new API */ if (max_profiles == IWL_SCAN_MAX_PROFILES_V2) { struct iwl_scan_offload_profile_cfg *profile_cfg =
(struct iwl_scan_offload_profile_cfg *)profile_cfg_v1;
data = &profile_cfg->data;
} else {
data = &profile_cfg_v1->data;
}
staticint iwl_mvm_lmac_scan_abort(struct iwl_mvm *mvm)
{ int ret; struct iwl_host_cmd cmd = {
.id = SCAN_OFFLOAD_ABORT_CMD,
};
u32 status = CAN_ABORT_STATUS;
ret = iwl_mvm_send_cmd_status(mvm, &cmd, &status); if (ret) return ret;
if (status != CAN_ABORT_STATUS) { /* * The scan abort will return 1 for success or * 2 for "failure". A failure condition can be * due to simply not being in an active scan which * can occur if we send the scan abort before the * microcode has notified us that a scan is completed.
*/
IWL_DEBUG_SCAN(mvm, "SCAN OFFLOAD ABORT ret %d.\n", status);
ret = -ENOENT;
}
/* * Unfortunately, right now the offload scan doesn't support randomising * within the firmware, so until the firmware API is ready we implement * it in the driver. This means that the scan iterations won't really be * random, only when it's restarted, but at least that helps a bit.
*/ if (mac_addr)
get_random_mask_addr(frame->sa, mac_addr,
params->mac_addr_mask); else
memcpy(frame->sa, vif->addr, ETH_ALEN);
if (iwl_mvm_is_cdb_supported(mvm))
low_latency = iwl_mvm_low_latency_band(mvm, NL80211_BAND_5GHZ); else
low_latency = iwl_mvm_low_latency(mvm);
/* We can only use EBS if: * 1. the feature is supported; * 2. the last EBS was successful; * 3. if only single scan, the single scan EBS API is supported; * 4. it's not a p2p find operation. * 5. we are not in low latency mode, * or if fragmented ebs is supported by the FW * 6. the VIF is not an AP interface (scan wants survey results)
*/ return ((capa->flags & IWL_UCODE_TLV_FLAGS_EBS_SUPPORT) &&
mvm->last_ebs_successful && IWL_MVM_ENABLE_EBS &&
vif->type != NL80211_IFTYPE_P2P_DEVICE &&
(!low_latency || iwl_mvm_is_frag_ebs_supported(mvm)) &&
ieee80211_vif_type_p2p(vif) != NL80211_IFTYPE_AP);
}
/* * If the number of iterations of the last scan plan is set to * zero, it should run infinitely. However, this is not always the case. * For example, when regular scan is requested the driver sets one scan * plan with one iteration.
*/ if (!cmd->schedule[i - 1].iterations)
cmd->schedule[i - 1].iterations = 0xff;
band = &mvm->nvm_data->bands[NL80211_BAND_2GHZ]; for (i = 0; i < band->n_bitrates; i++)
rates |= rate_to_scan_rate_flag(band->bitrates[i].hw_value);
band = &mvm->nvm_data->bands[NL80211_BAND_5GHZ]; for (i = 0; i < band->n_bitrates; i++)
rates |= rate_to_scan_rate_flag(band->bitrates[i].hw_value);
/* Set both basic rates and supported rates */
rates |= SCAN_CONFIG_SUPPORTED_RATE(rates);
staticvoid iwl_mvm_fill_channels(struct iwl_mvm *mvm, u8 *channels,
u32 max_channels)
{ struct ieee80211_supported_band *band; int i, j = 0;
band = &mvm->nvm_data->bands[NL80211_BAND_2GHZ]; for (i = 0; i < band->n_channels && j < max_channels; i++, j++)
channels[j] = band->channels[i].hw_value;
band = &mvm->nvm_data->bands[NL80211_BAND_5GHZ]; for (i = 0; i < band->n_channels && j < max_channels; i++, j++)
channels[j] = band->channels[i].hw_value;
}
if (vif_type != NL80211_IFTYPE_P2P_DEVICE) goto out;
for (i = 0; i < ARRAY_SIZE(p2p_go_friendly_chs); i++) { if (p2p_go_friendly_chs[i] == ch_id) {
flags |= IWL_SCAN_ADWELL_N_APS_GO_FRIENDLY_BIT; break;
}
}
if (flags) goto out;
for (i = 0; i < ARRAY_SIZE(social_chs); i++) { if (social_chs[i] == ch_id) {
flags |= IWL_SCAN_ADWELL_N_APS_SOCIAL_CHS_BIT; break;
}
}
out: return flags;
}
staticvoid
iwl_mvm_umac_scan_cfg_channels(struct iwl_mvm *mvm, struct ieee80211_channel **channels, int n_channels, u32 flags, struct iwl_scan_channel_cfg_umac *channel_cfg)
{ int i;
for (i = 0; i < n_channels; i++) {
channel_cfg[i].flags = cpu_to_le32(flags);
channel_cfg[i].channel_num = channels[i]->hw_value; if (iwl_mvm_is_scan_ext_chan_supported(mvm)) { enum nl80211_band band = channels[i]->band;
if (band == NL80211_BAND_6GHZ) { /* 6 GHz channels should only appear in a scan request * that has scan_6ghz set. The only exception is MLO * scan, which has to be passive.
*/
WARN_ON_ONCE(cfg->flags != 0);
cfg->flags =
cpu_to_le32(IWL_UHB_CHAN_CFG_FLAG_FORCE_PASSIVE);
}
/* * Populate the arrays of the short SSIDs and the BSSIDs using the 6GHz * collocated parameters. This might not be optimal, as this processing * does not (yet) correspond to the actual channels, so it is possible * that some entries would be left out. * * TODO: improve this logic.
*/ for (j = 0; j < params->n_6ghz_params; j++) { int k;
/* First, try to place the short SSID */ if (scan_6ghz_params[j].short_ssid_valid) { for (k = 0; k < idex_s; k++) { if (pp->short_ssid[k] ==
cpu_to_le32(scan_6ghz_params[j].short_ssid)) break;
}
/* try to place BSSID for the same entry */ for (k = 0; k < idex_b; k++) { if (!memcmp(&pp->bssid_array[k],
scan_6ghz_params[j].bssid, ETH_ALEN)) break;
}
if (k == idex_b && idex_b < SCAN_BSSID_MAX_SIZE &&
!WARN_ONCE(!is_valid_ether_addr(scan_6ghz_params[j].bssid), "scan: invalid BSSID at index %u, index_b=%u\n",
j, idex_b)) {
memcpy(&pp->bssid_array[idex_b++],
scan_6ghz_params[j].bssid, ETH_ALEN);
}
}
/* * 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;
/* Use the highest PSD value allowed as advertised by * APs for this channel
*/
tmp_psd_20 = scan_6ghz_params[j].psd_20; if (tmp_psd_20 !=
IEEE80211_RNR_TBTT_PARAMS_PSD_RESERVED &&
(psd_20 ==
IEEE80211_RNR_TBTT_PARAMS_PSD_RESERVED ||
psd_20 < tmp_psd_20))
psd_20 = tmp_psd_20;
/* * In the following cases apply passive scan: * 1. Non fragmented scan: * - PSC channel with NO_LISTEN_FLAG on should be treated * like non PSC channel * - Non PSC channel with more than 3 short SSIDs or more * than 9 BSSIDs. * - Non PSC Channel with unsolicited probe response and * more than 2 short SSIDs or more than 6 BSSIDs. * - PSC channel with more than 2 short SSIDs or more than * 6 BSSIDs. * 3. Fragmented scan: * - PSC channel with more than 1 SSID or 3 BSSIDs. * - Non PSC channel with more than 2 SSIDs or 6 BSSIDs. * - Non PSC channel with unsolicited probe response and * more than 1 SSID or more than 3 BSSIDs.
*/ if (!iwl_mvm_is_scan_fragmented(params->type)) { if (!cfg80211_channel_is_psc(params->channels[i]) ||
psc_no_listen) { if (unsolicited_probe_on_chan) {
max_s_ssids = 2;
max_bssids = 6;
} else {
max_s_ssids = 3;
max_bssids = 9;
}
} else {
max_s_ssids = 2;
max_bssids = 6;
}
} elseif (cfg80211_channel_is_psc(params->channels[i])) {
max_s_ssids = 1;
max_bssids = 3;
} else { if (unsolicited_probe_on_chan) {
max_s_ssids = 1;
max_bssids = 3;
} else {
max_s_ssids = 2;
max_bssids = 6;
}
}
/* * The optimize the scan time, i.e., reduce the scan dwell time * on each channel, the below logic tries to set 3 direct BSSID * probe requests for each broadcast probe request with a short * SSID. * TODO: improve this logic
*/ for (u32 j = 0; j < params->n_6ghz_params; j++) { if (!(scan_6ghz_params[j].channel_idx == i)) continue;
found = false;
for (k = 0;
k < pp->short_ssid_num && n_s_ssids < max_s_ssids;
k++) { if (!scan_6ghz_params[j].unsolicited_probe &&
le32_to_cpu(pp->short_ssid[k]) ==
scan_6ghz_params[j].short_ssid) { /* Relevant short SSID bit set */ if (s_ssid_bitmap & BIT(k)) {
found = true; break;
}
/* * Prefer creating BSSID entries unless * the short SSID probe can be done in * the same channel dwell iteration. * * We also need to create a short SSID * entry for any hidden AP.
*/ if (3 * n_s_ssids > n_bssids &&
!pp->direct_scan[k].len) break;
/* Hidden AP, cannot do passive scan */ if (pp->direct_scan[k].len)
allow_passive = false;
s_ssid_bitmap |= BIT(k);
n_s_ssids++;
found = true; break;
}
}
if (found) continue;
for (k = 0; k < pp->bssid_num; k++) { if (!memcmp(&pp->bssid_array[k],
scan_6ghz_params[j].bssid,
ETH_ALEN)) { if (!(bssid_bitmap & BIT(k))) { if (n_bssids < max_bssids) {
bssid_bitmap |= BIT(k);
n_bssids++;
} else {
force_passive = TRUE;
}
} break;
}
}
}
if (cfg80211_channel_is_psc(params->channels[i]) &&
psc_no_listen)
flags |= IWL_UHB_CHAN_CFG_FLAG_PSC_CHAN_NO_LISTEN;
if (unsolicited_probe_on_chan)
flags |= IWL_UHB_CHAN_CFG_FLAG_UNSOLICITED_PROBE_RES;
if (iwl_mvm_scan_use_ebs(mvm, vif))
flags |= IWL_SCAN_CHANNEL_FLAG_EBS |
IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE |
IWL_SCAN_CHANNEL_FLAG_CACHE_ADD;
/* set fragmented ebs for fragmented scan on HB channels */ if ((!iwl_mvm_is_cdb_supported(mvm) &&
iwl_mvm_is_scan_fragmented(params->type)) ||
(iwl_mvm_is_cdb_supported(mvm) &&
iwl_mvm_is_scan_fragmented(params->hb_type)))
flags |= IWL_SCAN_CHANNEL_FLAG_EBS_FRAG;
/* * force EBS in case the scan is a fragmented and there is a need to take P2P * GO operation into consideration during scan operation.
*/ if ((!iwl_mvm_is_cdb_supported(mvm) &&
iwl_mvm_is_scan_fragmented(params->type) && params->respect_p2p_go) ||
(iwl_mvm_is_cdb_supported(mvm) &&
iwl_mvm_is_scan_fragmented(params->hb_type) &&
params->respect_p2p_go_hb)) {
IWL_DEBUG_SCAN(mvm, "Respect P2P GO. Force EBS\n");
flags |= IWL_SCAN_CHANNEL_FLAG_FORCE_EBS;
}
if (!fw_has_capa(&mvm->fw->ucode_capa,
IWL_UCODE_TLV_CAPA_PASSIVE_6GHZ_SCAN)) {
IWL_DEBUG_SCAN(mvm, "6GHz passive scan: Not supported by FW\n"); return;
}
/* 6GHz passive scan allowed only on station interface */ if (vif->type != NL80211_IFTYPE_STATION) {
IWL_DEBUG_SCAN(mvm, "6GHz passive scan: not station interface\n"); return;
}
/* * 6GHz passive scan is allowed in a defined time interval following HW * reset or resume flow, or while not associated and a large interval * has passed since the last 6GHz passive scan.
*/ if ((vif->cfg.assoc ||
time_after(mvm->last_6ghz_passive_scan_jiffies +
(IWL_MVM_6GHZ_PASSIVE_SCAN_TIMEOUT * HZ), jiffies)) &&
(time_before(mvm->last_reset_or_resume_time_jiffies +
(IWL_MVM_6GHZ_PASSIVE_SCAN_ASSOC_TIMEOUT * HZ),
jiffies))) {
IWL_DEBUG_SCAN(mvm, "6GHz passive scan: %s\n",
vif->cfg.assoc ? "associated" : "timeout did not expire"); return;
}
/* not enough channels in the regular scan request */ if (params->n_channels < IWL_MVM_6GHZ_PASSIVE_SCAN_MIN_CHANS) {
IWL_DEBUG_SCAN(mvm, "6GHz passive scan: not enough channels\n"); return;
}
for (i = 0; i < params->n_ssids; i++) { if (!params->ssids[i].ssid_len) break;
}
/* not a wildcard scan, so cannot enable passive 6GHz scan */ if (i == params->n_ssids) {
IWL_DEBUG_SCAN(mvm, "6GHz passive scan: no wildcard SSID\n"); return;
}
if (!sband || !sband->n_channels) {
IWL_DEBUG_SCAN(mvm, "6GHz passive scan: no 6GHz channels\n"); return;
}
for (i = 0, n_disabled = 0; i < sband->n_channels; i++) { if (sband->channels[i].flags & (IEEE80211_CHAN_DISABLED))
n_disabled++;
}
/* * Not all the 6GHz channels are disabled, so no need for 6GHz passive * scan
*/ if (n_disabled != sband->n_channels) {
IWL_DEBUG_SCAN(mvm, "6GHz passive scan: 6GHz channels enabled\n"); return;
}
/* all conditions to enable 6ghz passive scan are satisfied */
IWL_DEBUG_SCAN(mvm, "6GHz passive scan: can be enabled\n");
params->enable_6ghz_passive = true;
}
/* * If no direct SSIDs are provided perform a passive scan. Otherwise, * if there is a single SSID which is not the broadcast SSID, assume * that the scan is intended for roaming purposes and thus enable Rx on * all chains to improve chances of hearing the beacons/probe responses.
*/ if (params->n_ssids == 0)
flags |= IWL_UMAC_SCAN_GEN_FLAGS_V2_FORCE_PASSIVE; elseif (params->n_ssids == 1 && params->ssids[0].ssid_len)
flags |= IWL_UMAC_SCAN_GEN_FLAGS_V2_USE_ALL_RX_CHAINS;
if (iwl_mvm_is_scan_fragmented(params->type))
flags |= IWL_UMAC_SCAN_GEN_FLAGS_V2_FRAGMENTED_LMAC1;
if (iwl_mvm_is_scan_fragmented(params->hb_type))
flags |= IWL_UMAC_SCAN_GEN_FLAGS_V2_FRAGMENTED_LMAC2;
if (params->pass_all)
flags |= IWL_UMAC_SCAN_GEN_FLAGS_V2_PASS_ALL; else
flags |= IWL_UMAC_SCAN_GEN_FLAGS_V2_MATCH;
if (!iwl_mvm_is_regular_scan(params))
flags |= IWL_UMAC_SCAN_GEN_FLAGS_V2_PERIODIC;
if (params->iter_notif ||
mvm->sched_scan_pass_all == SCHED_SCAN_PASS_ALL_ENABLED)
flags |= IWL_UMAC_SCAN_GEN_FLAGS_V2_NTFY_ITER_COMPLETE;
if (IWL_MVM_ADWELL_ENABLE)
flags |= IWL_UMAC_SCAN_GEN_FLAGS_V2_ADAPTIVE_DWELL;
if (type == IWL_MVM_SCAN_SCHED || type == IWL_MVM_SCAN_NETDETECT)
flags |= IWL_UMAC_SCAN_GEN_FLAGS_V2_PREEMPTIVE;
if ((type == IWL_MVM_SCAN_SCHED || type == IWL_MVM_SCAN_NETDETECT) &&
params->flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ)
flags |= IWL_UMAC_SCAN_GEN_FLAGS_V2_TRIGGER_UHB_SCAN;
if (params->enable_6ghz_passive)
flags |= IWL_UMAC_SCAN_GEN_FLAGS_V2_6GHZ_PASSIVE_SCAN;
if (iwl_mvm_is_scan_fragmented(params->type))
flags |= IWL_UMAC_SCAN_GEN_FLAGS_FRAGMENTED;
if (iwl_mvm_is_cdb_supported(mvm) &&
iwl_mvm_is_scan_fragmented(params->hb_type))
flags |= IWL_UMAC_SCAN_GEN_FLAGS_LMAC2_FRAGMENTED;
if (iwl_mvm_rrm_scan_needed(mvm) &&
fw_has_capa(&mvm->fw->ucode_capa,
IWL_UCODE_TLV_CAPA_WFA_TPC_REP_IE_SUPPORT))
flags |= IWL_UMAC_SCAN_GEN_FLAGS_RRM_ENABLED;
if (params->pass_all)
flags |= IWL_UMAC_SCAN_GEN_FLAGS_PASS_ALL; else
flags |= IWL_UMAC_SCAN_GEN_FLAGS_MATCH;
if (!iwl_mvm_is_regular_scan(params))
flags |= IWL_UMAC_SCAN_GEN_FLAGS_PERIODIC;
if (params->iter_notif)
flags |= IWL_UMAC_SCAN_GEN_FLAGS_ITER_COMPLETE;
#ifdef CONFIG_IWLWIFI_DEBUGFS if (mvm->scan_iter_notif_enabled)
flags |= IWL_UMAC_SCAN_GEN_FLAGS_ITER_COMPLETE; #endif
if (mvm->sched_scan_pass_all == SCHED_SCAN_PASS_ALL_ENABLED)
flags |= IWL_UMAC_SCAN_GEN_FLAGS_ITER_COMPLETE;
if (iwl_mvm_is_adaptive_dwell_supported(mvm) && IWL_MVM_ADWELL_ENABLE)
flags |= IWL_UMAC_SCAN_GEN_FLAGS_ADAPTIVE_DWELL;
/* * Extended dwell is relevant only for low band to start with, as it is * being used for social channles only (1, 6, 11), so we can check * only scan type on low band also for CDB.
*/ if (iwl_mvm_is_regular_scan(params) &&
vif->type != NL80211_IFTYPE_P2P_DEVICE &&
!iwl_mvm_is_scan_fragmented(params->type) &&
!iwl_mvm_is_adaptive_dwell_supported(mvm) &&
!iwl_mvm_is_oce_supported(mvm))
flags |= IWL_UMAC_SCAN_GEN_FLAGS_EXTENDED_DWELL;
--> --------------------
--> maximum size reached
--> --------------------
Messung V0.5
¤ Dauer der Verarbeitung: 0.22 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.