Lines Matching +full:in +full:- +full:band +full:- +full:status

1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
3 * Copyright (C) 2012-2014, 2018-2023 Intel Corporation
4 * Copyright (C) 2013-2015 Intel Mobile Communications GmbH
5 * Copyright (C) 2016-2017 Intel Deutschland GmbH
13 #include "iwl-io.h"
28 /* adaptive dwell default high band APs number */
30 /* adaptive dwell default low band APs number */
32 /* adaptive dwell default APs number in social channels (1, 6, 11) */
45 /* minimal number of 2GHz and 5GHz channels in the regular scan request */
80 /* For CDB this is low band scan type, for non-CDB - type. */
110 struct iwl_scan_req_umac *cmd = mvm->scan_cmd; in iwl_mvm_get_scan_req_umac_data()
113 return (void *)&cmd->v8.data; in iwl_mvm_get_scan_req_umac_data()
116 return (void *)&cmd->v7.data; in iwl_mvm_get_scan_req_umac_data()
119 return (void *)&cmd->v6.data; in iwl_mvm_get_scan_req_umac_data()
121 return (void *)&cmd->v1.data; in iwl_mvm_get_scan_req_umac_data()
127 struct iwl_scan_req_umac *cmd = mvm->scan_cmd; in iwl_mvm_get_scan_req_umac_channel()
130 return &cmd->v8.channel; in iwl_mvm_get_scan_req_umac_channel()
133 return &cmd->v7.channel; in iwl_mvm_get_scan_req_umac_channel()
136 return &cmd->v6.channel; in iwl_mvm_get_scan_req_umac_channel()
138 return &cmd->v1.channel; in iwl_mvm_get_scan_req_umac_channel()
143 if (mvm->scan_rx_ant != ANT_NONE) in iwl_mvm_scan_rx_ant()
144 return mvm->scan_rx_ant; in iwl_mvm_scan_rx_ant()
162 iwl_mvm_scan_rate_n_flags(struct iwl_mvm *mvm, enum nl80211_band band, in iwl_mvm_scan_rate_n_flags() argument
167 iwl_mvm_toggle_tx_ant(mvm, &mvm->scan_last_antenna_idx); in iwl_mvm_scan_rate_n_flags()
168 tx_ant = BIT(mvm->scan_last_antenna_idx) << RATE_MCS_ANT_POS; in iwl_mvm_scan_rate_n_flags()
170 if (band == NL80211_BAND_2GHZ && !no_cck) in iwl_mvm_scan_rate_n_flags()
179 return mvm->tcm.result.global_load; in iwl_mvm_get_traffic_load()
183 iwl_mvm_get_traffic_load_band(struct iwl_mvm *mvm, enum nl80211_band band) in iwl_mvm_get_traffic_load_band() argument
185 return mvm->tcm.result.band_load[band]; in iwl_mvm_get_traffic_load_band()
201 if (vif->type != NL80211_IFTYPE_P2P_DEVICE && in iwl_mvm_scan_iterator()
202 mvmvif->deflink.phy_ctxt && in iwl_mvm_scan_iterator()
203 mvmvif->deflink.phy_ctxt->id < NUM_PHY_CTX) in iwl_mvm_scan_iterator()
204 data->global_cnt += 1; in iwl_mvm_scan_iterator()
206 if (!data->current_vif || vif == data->current_vif) in iwl_mvm_scan_iterator()
209 curr_mvmvif = iwl_mvm_vif_from_mac80211(data->current_vif); in iwl_mvm_scan_iterator()
211 if (vif->type == NL80211_IFTYPE_AP && vif->p2p && in iwl_mvm_scan_iterator()
212 mvmvif->deflink.phy_ctxt && curr_mvmvif->deflink.phy_ctxt && in iwl_mvm_scan_iterator()
213 mvmvif->deflink.phy_ctxt->id != curr_mvmvif->deflink.phy_ctxt->id) in iwl_mvm_scan_iterator()
214 data->is_dcm_with_p2p_go = true; in iwl_mvm_scan_iterator()
229 ieee80211_iterate_active_interfaces_atomic(mvm->hw, in _iwl_mvm_get_scan_type()
237 if (fw_has_api(&mvm->fw->ucode_capa, in _iwl_mvm_get_scan_type()
240 (!vif || vif->type != NL80211_IFTYPE_P2P_DEVICE)) in _iwl_mvm_get_scan_type()
244 * in case of DCM with GO where BSS DTIM interval < 220msec in _iwl_mvm_get_scan_type()
245 * set all scan requests as fast-balance scan in _iwl_mvm_get_scan_type()
247 if (vif && vif->type == NL80211_IFTYPE_STATION && in _iwl_mvm_get_scan_type()
249 ((vif->bss_conf.beacon_int * in _iwl_mvm_get_scan_type()
250 vif->bss_conf.dtim_period) < 220)) in _iwl_mvm_get_scan_type()
276 enum nl80211_band band) in iwl_mvm_get_scan_type_band() argument
281 load = iwl_mvm_get_traffic_load_band(mvm, band); in iwl_mvm_get_scan_type_band()
282 low_latency = iwl_mvm_low_latency_band(mvm, band); in iwl_mvm_get_scan_type_band()
290 return fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_rrm_scan_needed()
301 max_probe_len -= 24 + 2; in iwl_mvm_max_scan_ie_fw_cmd_room()
303 /* DS parameter set element is added on 2.4GHZ band if required */ in iwl_mvm_max_scan_ie_fw_cmd_room()
305 max_probe_len -= 3; in iwl_mvm_max_scan_ie_fw_cmd_room()
316 * in the same command. So the correct implementation of this function in iwl_mvm_max_scan_ie_len()
320 * we will report an incorrect value. This may result in a failure to in iwl_mvm_max_scan_ie_len()
321 * issue a scan in unified_scan_lmac and unified_sched_scan_lmac in iwl_mvm_max_scan_ie_len()
322 * functions with -ENOBUFS, if a large enough probe will be provided. in iwl_mvm_max_scan_ie_len()
331 struct iwl_lmac_scan_complete_notif *notif = (void *)pkt->data; in iwl_mvm_rx_lmac_scan_iter_complete_notif()
334 "Scan offload iteration complete: status=0x%x scanned channels=%d\n", in iwl_mvm_rx_lmac_scan_iter_complete_notif()
335 notif->status, notif->scanned_channels); in iwl_mvm_rx_lmac_scan_iter_complete_notif()
337 if (mvm->sched_scan_pass_all == SCHED_SCAN_PASS_ALL_FOUND) { in iwl_mvm_rx_lmac_scan_iter_complete_notif()
339 ieee80211_sched_scan_results(mvm->hw); in iwl_mvm_rx_lmac_scan_iter_complete_notif()
340 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_ENABLED; in iwl_mvm_rx_lmac_scan_iter_complete_notif()
348 ieee80211_sched_scan_results(mvm->hw); in iwl_mvm_rx_scan_match_found()
351 static const char *iwl_mvm_ebs_status_str(enum iwl_scan_ebs_status status) in iwl_mvm_ebs_status_str() argument
353 switch (status) { in iwl_mvm_ebs_status_str()
369 struct iwl_periodic_scan_complete *scan_notif = (void *)pkt->data; in iwl_mvm_rx_lmac_scan_complete_notif()
370 bool aborted = (scan_notif->status == IWL_SCAN_OFFLOAD_ABORTED); in iwl_mvm_rx_lmac_scan_complete_notif()
373 * notification during UMAC scans -- warn and ignore it. in iwl_mvm_rx_lmac_scan_complete_notif()
375 if (WARN_ON_ONCE(fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_rx_lmac_scan_complete_notif()
379 /* scan status must be locked for proper checking */ in iwl_mvm_rx_lmac_scan_complete_notif()
380 lockdep_assert_held(&mvm->mutex); in iwl_mvm_rx_lmac_scan_complete_notif()
382 /* We first check if we were stopping a scan, in which case we in iwl_mvm_rx_lmac_scan_complete_notif()
384 * firmware initiated stop, in which case we need to inform in iwl_mvm_rx_lmac_scan_complete_notif()
392 if (mvm->scan_status & IWL_MVM_SCAN_STOPPING_SCHED) { in iwl_mvm_rx_lmac_scan_complete_notif()
393 WARN_ON_ONCE(mvm->scan_status & IWL_MVM_SCAN_STOPPING_REGULAR); in iwl_mvm_rx_lmac_scan_complete_notif()
395 IWL_DEBUG_SCAN(mvm, "Scheduled scan %s, EBS status %s\n", in iwl_mvm_rx_lmac_scan_complete_notif()
397 iwl_mvm_ebs_status_str(scan_notif->ebs_status)); in iwl_mvm_rx_lmac_scan_complete_notif()
400 scan_notif->last_schedule_line, in iwl_mvm_rx_lmac_scan_complete_notif()
401 scan_notif->last_schedule_iteration, in iwl_mvm_rx_lmac_scan_complete_notif()
402 __le32_to_cpu(scan_notif->time_after_last_iter)); in iwl_mvm_rx_lmac_scan_complete_notif()
404 mvm->scan_status &= ~IWL_MVM_SCAN_STOPPING_SCHED; in iwl_mvm_rx_lmac_scan_complete_notif()
405 } else if (mvm->scan_status & IWL_MVM_SCAN_STOPPING_REGULAR) { in iwl_mvm_rx_lmac_scan_complete_notif()
406 IWL_DEBUG_SCAN(mvm, "Regular scan %s, EBS status %s\n", in iwl_mvm_rx_lmac_scan_complete_notif()
408 iwl_mvm_ebs_status_str(scan_notif->ebs_status)); in iwl_mvm_rx_lmac_scan_complete_notif()
410 mvm->scan_status &= ~IWL_MVM_SCAN_STOPPING_REGULAR; in iwl_mvm_rx_lmac_scan_complete_notif()
411 } else if (mvm->scan_status & IWL_MVM_SCAN_SCHED) { in iwl_mvm_rx_lmac_scan_complete_notif()
412 WARN_ON_ONCE(mvm->scan_status & IWL_MVM_SCAN_REGULAR); in iwl_mvm_rx_lmac_scan_complete_notif()
414 IWL_DEBUG_SCAN(mvm, "Scheduled scan %s, EBS status %s\n", in iwl_mvm_rx_lmac_scan_complete_notif()
416 iwl_mvm_ebs_status_str(scan_notif->ebs_status)); in iwl_mvm_rx_lmac_scan_complete_notif()
419 scan_notif->last_schedule_line, in iwl_mvm_rx_lmac_scan_complete_notif()
420 scan_notif->last_schedule_iteration, in iwl_mvm_rx_lmac_scan_complete_notif()
421 __le32_to_cpu(scan_notif->time_after_last_iter)); in iwl_mvm_rx_lmac_scan_complete_notif()
423 mvm->scan_status &= ~IWL_MVM_SCAN_SCHED; in iwl_mvm_rx_lmac_scan_complete_notif()
424 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_rx_lmac_scan_complete_notif()
425 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_DISABLED; in iwl_mvm_rx_lmac_scan_complete_notif()
426 } else if (mvm->scan_status & IWL_MVM_SCAN_REGULAR) { in iwl_mvm_rx_lmac_scan_complete_notif()
431 IWL_DEBUG_SCAN(mvm, "Regular scan %s, EBS status %s (FW)\n", in iwl_mvm_rx_lmac_scan_complete_notif()
433 iwl_mvm_ebs_status_str(scan_notif->ebs_status)); in iwl_mvm_rx_lmac_scan_complete_notif()
435 mvm->scan_status &= ~IWL_MVM_SCAN_REGULAR; in iwl_mvm_rx_lmac_scan_complete_notif()
436 ieee80211_scan_completed(mvm->hw, &info); in iwl_mvm_rx_lmac_scan_complete_notif()
437 cancel_delayed_work(&mvm->scan_timeout_dwork); in iwl_mvm_rx_lmac_scan_complete_notif()
444 mvm->last_ebs_successful = in iwl_mvm_rx_lmac_scan_complete_notif()
445 scan_notif->ebs_status == IWL_SCAN_EBS_SUCCESS || in iwl_mvm_rx_lmac_scan_complete_notif()
446 scan_notif->ebs_status == IWL_SCAN_EBS_INACTIVE; in iwl_mvm_rx_lmac_scan_complete_notif()
457 !memcmp(ssid_list->ssid, ssid, ssid_len)) in iwl_ssid_exist()
460 return -1; in iwl_ssid_exist()
463 /* We insert the SSIDs in an inverted order, because the FW will
479 for (i = 0, j = params->n_match_sets - 1; in iwl_scan_build_ssids()
481 i++, j--) { in iwl_scan_build_ssids()
483 if (!params->match_sets[j].ssid.ssid_len) in iwl_scan_build_ssids()
486 ssids[i].len = params->match_sets[j].ssid.ssid_len; in iwl_scan_build_ssids()
487 memcpy(ssids[i].ssid, params->match_sets[j].ssid.ssid, in iwl_scan_build_ssids()
492 for (j = params->n_ssids - 1; in iwl_scan_build_ssids()
494 i++, j--) { in iwl_scan_build_ssids()
495 index = iwl_ssid_exist(params->ssids[j].ssid, in iwl_scan_build_ssids()
496 params->ssids[j].ssid_len, in iwl_scan_build_ssids()
500 ssids[i].len = params->ssids[j].ssid_len; in iwl_scan_build_ssids()
501 memcpy(ssids[i].ssid, params->ssids[j].ssid, in iwl_scan_build_ssids()
520 int max_profiles = iwl_umac_scan_get_max_profiles(mvm->fw); in iwl_mvm_config_sched_scan_profiles()
533 if (WARN_ON(req->n_match_sets > max_profiles)) in iwl_mvm_config_sched_scan_profiles()
534 return -EIO; in iwl_mvm_config_sched_scan_profiles()
536 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_SHORT_BL) in iwl_mvm_config_sched_scan_profiles()
543 return -ENOMEM; in iwl_mvm_config_sched_scan_profiles()
547 ret = -ENOMEM; in iwl_mvm_config_sched_scan_profiles()
560 data = &profile_cfg->data; in iwl_mvm_config_sched_scan_profiles()
562 data = &profile_cfg_v1->data; in iwl_mvm_config_sched_scan_profiles()
566 data->num_profiles = req->n_match_sets; in iwl_mvm_config_sched_scan_profiles()
567 data->active_clients = SCAN_CLIENT_SCHED_SCAN; in iwl_mvm_config_sched_scan_profiles()
568 data->pass_match = SCAN_CLIENT_SCHED_SCAN; in iwl_mvm_config_sched_scan_profiles()
569 data->match_notify = SCAN_CLIENT_SCHED_SCAN; in iwl_mvm_config_sched_scan_profiles()
571 if (!req->n_match_sets || !req->match_sets[0].ssid.ssid_len) in iwl_mvm_config_sched_scan_profiles()
572 data->any_beacon_notify = SCAN_CLIENT_SCHED_SCAN; in iwl_mvm_config_sched_scan_profiles()
574 for (i = 0; i < req->n_match_sets; i++) { in iwl_mvm_config_sched_scan_profiles()
575 profile = &profile_cfg_v1->profiles[i]; in iwl_mvm_config_sched_scan_profiles()
576 profile->ssid_index = i; in iwl_mvm_config_sched_scan_profiles()
578 profile->unicast_cipher = 0xff; in iwl_mvm_config_sched_scan_profiles()
579 profile->auth_alg = IWL_AUTH_ALGO_UNSUPPORTED | in iwl_mvm_config_sched_scan_profiles()
582 profile->network_type = IWL_NETWORK_TYPE_ANY; in iwl_mvm_config_sched_scan_profiles()
583 profile->band_selection = IWL_SCAN_OFFLOAD_SELECT_ANY; in iwl_mvm_config_sched_scan_profiles()
584 profile->client_bitmap = SCAN_CLIENT_SCHED_SCAN; in iwl_mvm_config_sched_scan_profiles()
600 if (req->n_match_sets && req->match_sets[0].ssid.ssid_len) { in iwl_mvm_scan_pass_all()
603 req->n_match_sets); in iwl_mvm_scan_pass_all()
604 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_DISABLED; in iwl_mvm_scan_pass_all()
610 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_ENABLED; in iwl_mvm_scan_pass_all()
620 u32 status = CAN_ABORT_STATUS; in iwl_mvm_lmac_scan_abort() local
622 ret = iwl_mvm_send_cmd_status(mvm, &cmd, &status); in iwl_mvm_lmac_scan_abort()
626 if (status != CAN_ABORT_STATUS) { in iwl_mvm_lmac_scan_abort()
630 * due to simply not being in an active scan which in iwl_mvm_lmac_scan_abort()
634 IWL_DEBUG_SCAN(mvm, "SCAN OFFLOAD ABORT ret %d.\n", status); in iwl_mvm_lmac_scan_abort()
635 ret = -ENOENT; in iwl_mvm_lmac_scan_abort()
651 if (!iwl_mvm_has_new_station_api(mvm->fw)) { in iwl_mvm_scan_fill_tx_cmd()
652 tx_cmd[0].sta_id = mvm->aux_sta.sta_id; in iwl_mvm_scan_fill_tx_cmd()
653 tx_cmd[1].sta_id = mvm->aux_sta.sta_id; in iwl_mvm_scan_fill_tx_cmd()
678 struct iwl_scan_channel_cfg_lmac *channel_cfg = (void *)&cmd->data; in iwl_mvm_lmac_scan_cfg_channels()
683 cpu_to_le16(channels[i]->hw_value); in iwl_mvm_lmac_scan_cfg_channels()
722 memcpy(newpos, ies + offs, len - offs); in iwl_mvm_copy_and_insert_ds_elem()
723 newpos += len - offs; in iwl_mvm_copy_and_insert_ds_elem()
733 pos[1] = WFA_TPC_IE_LEN - 2; in iwl_mvm_add_tpc_report_ie()
739 /* pos[7] - tx power will be inserted by the FW */ in iwl_mvm_add_tpc_report_ie()
749 struct ieee80211_mgmt *frame = (void *)params->preq.buf; in iwl_mvm_build_scan_probe()
751 const u8 *mac_addr = params->flags & NL80211_SCAN_FLAG_RANDOM_ADDR ? in iwl_mvm_build_scan_probe()
752 params->mac_addr : NULL; in iwl_mvm_build_scan_probe()
757 * it in the driver. This means that the scan iterations won't really be in iwl_mvm_build_scan_probe()
761 get_random_mask_addr(frame->sa, mac_addr, in iwl_mvm_build_scan_probe()
762 params->mac_addr_mask); in iwl_mvm_build_scan_probe()
764 memcpy(frame->sa, vif->addr, ETH_ALEN); in iwl_mvm_build_scan_probe()
766 frame->frame_control = cpu_to_le16(IEEE80211_STYPE_PROBE_REQ); in iwl_mvm_build_scan_probe()
767 eth_broadcast_addr(frame->da); in iwl_mvm_build_scan_probe()
768 ether_addr_copy(frame->bssid, params->bssid); in iwl_mvm_build_scan_probe()
769 frame->seq_ctrl = 0; in iwl_mvm_build_scan_probe()
771 pos = frame->u.probe_req.variable; in iwl_mvm_build_scan_probe()
775 params->preq.mac_header.offset = 0; in iwl_mvm_build_scan_probe()
776 params->preq.mac_header.len = cpu_to_le16(24 + 2); in iwl_mvm_build_scan_probe()
778 /* Insert ds parameter set element on 2.4 GHz band */ in iwl_mvm_build_scan_probe()
780 ies->ies[NL80211_BAND_2GHZ], in iwl_mvm_build_scan_probe()
781 ies->len[NL80211_BAND_2GHZ], in iwl_mvm_build_scan_probe()
783 params->preq.band_data[0].offset = cpu_to_le16(pos - params->preq.buf); in iwl_mvm_build_scan_probe()
784 params->preq.band_data[0].len = cpu_to_le16(newpos - pos); in iwl_mvm_build_scan_probe()
787 memcpy(pos, ies->ies[NL80211_BAND_5GHZ], in iwl_mvm_build_scan_probe()
788 ies->len[NL80211_BAND_5GHZ]); in iwl_mvm_build_scan_probe()
789 params->preq.band_data[1].offset = cpu_to_le16(pos - params->preq.buf); in iwl_mvm_build_scan_probe()
790 params->preq.band_data[1].len = in iwl_mvm_build_scan_probe()
791 cpu_to_le16(ies->len[NL80211_BAND_5GHZ]); in iwl_mvm_build_scan_probe()
792 pos += ies->len[NL80211_BAND_5GHZ]; in iwl_mvm_build_scan_probe()
794 memcpy(pos, ies->ies[NL80211_BAND_6GHZ], in iwl_mvm_build_scan_probe()
795 ies->len[NL80211_BAND_6GHZ]); in iwl_mvm_build_scan_probe()
796 params->preq.band_data[2].offset = cpu_to_le16(pos - params->preq.buf); in iwl_mvm_build_scan_probe()
797 params->preq.band_data[2].len = in iwl_mvm_build_scan_probe()
798 cpu_to_le16(ies->len[NL80211_BAND_6GHZ]); in iwl_mvm_build_scan_probe()
799 pos += ies->len[NL80211_BAND_6GHZ]; in iwl_mvm_build_scan_probe()
800 memcpy(pos, ies->common_ies, ies->common_ie_len); in iwl_mvm_build_scan_probe()
801 params->preq.common_data.offset = cpu_to_le16(pos - params->preq.buf); in iwl_mvm_build_scan_probe()
804 !fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_build_scan_probe()
806 iwl_mvm_add_tpc_report_ie(pos + ies->common_ie_len); in iwl_mvm_build_scan_probe()
807 params->preq.common_data.len = cpu_to_le16(ies->common_ie_len + in iwl_mvm_build_scan_probe()
810 params->preq.common_data.len = cpu_to_le16(ies->common_ie_len); in iwl_mvm_build_scan_probe()
818 cmd->active_dwell = IWL_SCAN_DWELL_ACTIVE; in iwl_mvm_scan_lmac_dwell()
819 cmd->passive_dwell = IWL_SCAN_DWELL_PASSIVE; in iwl_mvm_scan_lmac_dwell()
820 cmd->fragmented_dwell = IWL_SCAN_DWELL_FRAGMENTED; in iwl_mvm_scan_lmac_dwell()
821 cmd->extended_dwell = IWL_SCAN_DWELL_EXTENDED; in iwl_mvm_scan_lmac_dwell()
822 cmd->max_out_time = cpu_to_le32(scan_timing[params->type].max_out_time); in iwl_mvm_scan_lmac_dwell()
823 cmd->suspend_time = cpu_to_le32(scan_timing[params->type].suspend_time); in iwl_mvm_scan_lmac_dwell()
824 cmd->scan_prio = cpu_to_le32(IWL_SCAN_PRIORITY_EXT_6); in iwl_mvm_scan_lmac_dwell()
832 (n_channels <= mvm->fw->ucode_capa.n_scan_channels) & in iwl_mvm_scan_fits()
833 (ies->common_ie_len + in iwl_mvm_scan_fits()
834 ies->len[NL80211_BAND_2GHZ] + in iwl_mvm_scan_fits()
835 ies->len[NL80211_BAND_5GHZ] <= in iwl_mvm_scan_fits()
842 const struct iwl_ucode_capabilities *capa = &mvm->fw->ucode_capa; in iwl_mvm_scan_use_ebs()
855 * 5. we are not in low latency mode, in iwl_mvm_scan_use_ebs()
858 return ((capa->flags & IWL_UCODE_TLV_FLAGS_EBS_SUPPORT) && in iwl_mvm_scan_use_ebs()
859 mvm->last_ebs_successful && IWL_MVM_ENABLE_EBS && in iwl_mvm_scan_use_ebs()
860 vif->type != NL80211_IFTYPE_P2P_DEVICE && in iwl_mvm_scan_use_ebs()
866 return params->n_scan_plans == 1 && in iwl_mvm_is_regular_scan()
867 params->scan_plans[0].iterations == 1; in iwl_mvm_is_regular_scan()
882 if (params->n_ssids == 0) in iwl_mvm_scan_lmac_flags()
885 if (params->n_ssids == 1 && params->ssids[0].ssid_len != 0) in iwl_mvm_scan_lmac_flags()
888 if (iwl_mvm_is_scan_fragmented(params->type)) in iwl_mvm_scan_lmac_flags()
892 fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_scan_lmac_flags()
896 if (params->pass_all) in iwl_mvm_scan_lmac_flags()
902 if (mvm->scan_iter_notif_enabled) in iwl_mvm_scan_lmac_flags()
906 if (mvm->sched_scan_pass_all == SCHED_SCAN_PASS_ALL_ENABLED) in iwl_mvm_scan_lmac_flags()
910 vif->type != NL80211_IFTYPE_P2P_DEVICE && in iwl_mvm_scan_lmac_flags()
911 !iwl_mvm_is_scan_fragmented(params->type)) in iwl_mvm_scan_lmac_flags()
923 p_req->mac_header = src_p_req->mac_header; in iwl_mvm_scan_set_legacy_probe_req()
925 p_req->band_data[i] = src_p_req->band_data[i]; in iwl_mvm_scan_set_legacy_probe_req()
926 p_req->common_data = src_p_req->common_data; in iwl_mvm_scan_set_legacy_probe_req()
927 memcpy(p_req->buf, src_p_req->buf, sizeof(p_req->buf)); in iwl_mvm_scan_set_legacy_probe_req()
933 struct iwl_scan_req_lmac *cmd = mvm->scan_cmd; in iwl_mvm_scan_lmac()
935 (void *)(cmd->data + sizeof(struct iwl_scan_channel_cfg_lmac) * in iwl_mvm_scan_lmac()
936 mvm->fw->ucode_capa.n_scan_channels); in iwl_mvm_scan_lmac()
939 u8 band; in iwl_mvm_scan_lmac() local
941 if (WARN_ON(params->n_scan_plans > IWL_MAX_SCHED_SCAN_PLANS)) in iwl_mvm_scan_lmac()
942 return -EINVAL; in iwl_mvm_scan_lmac()
946 cmd->rx_chain_select = iwl_mvm_scan_rx_chain(mvm); in iwl_mvm_scan_lmac()
947 cmd->iter_num = cpu_to_le32(1); in iwl_mvm_scan_lmac()
948 cmd->n_channels = (u8)params->n_channels; in iwl_mvm_scan_lmac()
950 cmd->delay = cpu_to_le32(params->delay); in iwl_mvm_scan_lmac()
952 cmd->scan_flags = cpu_to_le32(iwl_mvm_scan_lmac_flags(mvm, params, in iwl_mvm_scan_lmac()
955 band = iwl_mvm_phy_band_from_nl80211(params->channels[0]->band); in iwl_mvm_scan_lmac()
956 cmd->flags = cpu_to_le32(band); in iwl_mvm_scan_lmac()
957 cmd->filter_flags = cpu_to_le32(MAC_FILTER_ACCEPT_GRP | in iwl_mvm_scan_lmac()
959 iwl_mvm_scan_fill_tx_cmd(mvm, cmd->tx_cmd, params->no_cck); in iwl_mvm_scan_lmac()
960 iwl_scan_build_ssids(params, cmd->direct_scan, &ssid_bitmap); in iwl_mvm_scan_lmac()
962 /* this API uses bits 1-20 instead of 0-19 */ in iwl_mvm_scan_lmac()
965 for (i = 0; i < params->n_scan_plans; i++) { in iwl_mvm_scan_lmac()
967 &params->scan_plans[i]; in iwl_mvm_scan_lmac()
969 cmd->schedule[i].delay = in iwl_mvm_scan_lmac()
970 cpu_to_le16(scan_plan->interval); in iwl_mvm_scan_lmac()
971 cmd->schedule[i].iterations = scan_plan->iterations; in iwl_mvm_scan_lmac()
972 cmd->schedule[i].full_scan_mul = 1; in iwl_mvm_scan_lmac()
981 if (!cmd->schedule[i - 1].iterations) in iwl_mvm_scan_lmac()
982 cmd->schedule[i - 1].iterations = 0xff; in iwl_mvm_scan_lmac()
985 cmd->channel_opt[0].flags = in iwl_mvm_scan_lmac()
989 cmd->channel_opt[0].non_ebs_ratio = in iwl_mvm_scan_lmac()
991 cmd->channel_opt[1].flags = in iwl_mvm_scan_lmac()
995 cmd->channel_opt[1].non_ebs_ratio = in iwl_mvm_scan_lmac()
999 iwl_mvm_lmac_scan_cfg_channels(mvm, params->channels, in iwl_mvm_scan_lmac()
1000 params->n_channels, ssid_bitmap, cmd); in iwl_mvm_scan_lmac()
1002 iwl_mvm_scan_set_legacy_probe_req(preq, &params->preq); in iwl_mvm_scan_lmac()
1029 struct ieee80211_supported_band *band; in iwl_mvm_scan_config_rates() local
1033 band = &mvm->nvm_data->bands[NL80211_BAND_2GHZ]; in iwl_mvm_scan_config_rates()
1034 for (i = 0; i < band->n_bitrates; i++) in iwl_mvm_scan_config_rates()
1035 rates |= rate_to_scan_rate_flag(band->bitrates[i].hw_value); in iwl_mvm_scan_config_rates()
1036 band = &mvm->nvm_data->bands[NL80211_BAND_5GHZ]; in iwl_mvm_scan_config_rates()
1037 for (i = 0; i < band->n_bitrates; i++) in iwl_mvm_scan_config_rates()
1038 rates |= rate_to_scan_rate_flag(band->bitrates[i].hw_value); in iwl_mvm_scan_config_rates()
1049 dwell->active = IWL_SCAN_DWELL_ACTIVE; in iwl_mvm_fill_scan_dwell()
1050 dwell->passive = IWL_SCAN_DWELL_PASSIVE; in iwl_mvm_fill_scan_dwell()
1051 dwell->fragmented = IWL_SCAN_DWELL_FRAGMENTED; in iwl_mvm_fill_scan_dwell()
1052 dwell->extended = IWL_SCAN_DWELL_EXTENDED; in iwl_mvm_fill_scan_dwell()
1058 struct ieee80211_supported_band *band; in iwl_mvm_fill_channels() local
1061 band = &mvm->nvm_data->bands[NL80211_BAND_2GHZ]; in iwl_mvm_fill_channels()
1062 for (i = 0; i < band->n_channels && j < max_channels; i++, j++) in iwl_mvm_fill_channels()
1063 channels[j] = band->channels[i].hw_value; in iwl_mvm_fill_channels()
1064 band = &mvm->nvm_data->bands[NL80211_BAND_5GHZ]; in iwl_mvm_fill_channels()
1065 for (i = 0; i < band->n_channels && j < max_channels; i++, j++) in iwl_mvm_fill_channels()
1066 channels[j] = band->channels[i].hw_value; in iwl_mvm_fill_channels()
1076 cfg->flags = cpu_to_le32(flags); in iwl_mvm_fill_scan_config_v1()
1077 cfg->tx_chains = cpu_to_le32(iwl_mvm_get_valid_tx_ant(mvm)); in iwl_mvm_fill_scan_config_v1()
1078 cfg->rx_chains = cpu_to_le32(iwl_mvm_scan_rx_ant(mvm)); in iwl_mvm_fill_scan_config_v1()
1079 cfg->legacy_rates = iwl_mvm_scan_config_rates(mvm); in iwl_mvm_fill_scan_config_v1()
1080 cfg->out_of_channel_time = cpu_to_le32(scan_timing[type].max_out_time); in iwl_mvm_fill_scan_config_v1()
1081 cfg->suspend_time = cpu_to_le32(scan_timing[type].suspend_time); in iwl_mvm_fill_scan_config_v1()
1083 iwl_mvm_fill_scan_dwell(mvm, &cfg->dwell); in iwl_mvm_fill_scan_config_v1()
1085 memcpy(&cfg->mac_addr, &mvm->addresses[0].addr, ETH_ALEN); in iwl_mvm_fill_scan_config_v1()
1088 WARN_ON_ONCE(iwl_mvm_has_new_station_api(mvm->fw)); in iwl_mvm_fill_scan_config_v1()
1090 cfg->bcast_sta_id = mvm->aux_sta.sta_id; in iwl_mvm_fill_scan_config_v1()
1091 cfg->channel_flags = channel_flags; in iwl_mvm_fill_scan_config_v1()
1093 iwl_mvm_fill_channels(mvm, cfg->channel_array, max_channels); in iwl_mvm_fill_scan_config_v1()
1102 cfg->flags = cpu_to_le32(flags); in iwl_mvm_fill_scan_config_v2()
1103 cfg->tx_chains = cpu_to_le32(iwl_mvm_get_valid_tx_ant(mvm)); in iwl_mvm_fill_scan_config_v2()
1104 cfg->rx_chains = cpu_to_le32(iwl_mvm_scan_rx_ant(mvm)); in iwl_mvm_fill_scan_config_v2()
1105 cfg->legacy_rates = iwl_mvm_scan_config_rates(mvm); in iwl_mvm_fill_scan_config_v2()
1115 cfg->out_of_channel_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_fill_scan_config_v2()
1117 cfg->suspend_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_fill_scan_config_v2()
1120 cfg->out_of_channel_time[SCAN_HB_LMAC_IDX] = in iwl_mvm_fill_scan_config_v2()
1122 cfg->suspend_time[SCAN_HB_LMAC_IDX] = in iwl_mvm_fill_scan_config_v2()
1128 cfg->out_of_channel_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_fill_scan_config_v2()
1130 cfg->suspend_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_fill_scan_config_v2()
1134 iwl_mvm_fill_scan_dwell(mvm, &cfg->dwell); in iwl_mvm_fill_scan_config_v2()
1136 memcpy(&cfg->mac_addr, &mvm->addresses[0].addr, ETH_ALEN); in iwl_mvm_fill_scan_config_v2()
1139 WARN_ON_ONCE(iwl_mvm_has_new_station_api(mvm->fw)); in iwl_mvm_fill_scan_config_v2()
1141 cfg->bcast_sta_id = mvm->aux_sta.sta_id; in iwl_mvm_fill_scan_config_v2()
1142 cfg->channel_flags = channel_flags; in iwl_mvm_fill_scan_config_v2()
1144 iwl_mvm_fill_channels(mvm, cfg->channel_array, max_channels); in iwl_mvm_fill_scan_config_v2()
1157 mvm->nvm_data->bands[NL80211_BAND_2GHZ].n_channels + in iwl_mvm_legacy_config_scan()
1158 mvm->nvm_data->bands[NL80211_BAND_5GHZ].n_channels; in iwl_mvm_legacy_config_scan()
1162 if (WARN_ON(num_channels > mvm->fw->ucode_capa.n_scan_channels)) in iwl_mvm_legacy_config_scan()
1163 num_channels = mvm->fw->ucode_capa.n_scan_channels; in iwl_mvm_legacy_config_scan()
1170 if (type == mvm->scan_type && hb_type == mvm->hb_scan_type) in iwl_mvm_legacy_config_scan()
1174 if (type == mvm->scan_type) in iwl_mvm_legacy_config_scan()
1182 cmd_size += mvm->fw->ucode_capa.n_scan_channels; in iwl_mvm_legacy_config_scan()
1186 return -ENOMEM; in iwl_mvm_legacy_config_scan()
1208 * Check for fragmented scan on LMAC2 - high band. in iwl_mvm_legacy_config_scan()
1209 * LMAC1 - low band is checked above. in iwl_mvm_legacy_config_scan()
1231 mvm->scan_type = type; in iwl_mvm_legacy_config_scan()
1232 mvm->hb_scan_type = hb_type; in iwl_mvm_legacy_config_scan()
1254 if (!iwl_mvm_has_new_station_api(mvm->fw)) { in iwl_mvm_config_scan()
1255 cfg.bcast_sta_id = mvm->aux_sta.sta_id; in iwl_mvm_config_scan()
1256 } else if (iwl_fw_lookup_cmd_ver(mvm->fw, SCAN_CFG_CMD, 0) < 5) { in iwl_mvm_config_scan()
1272 static int iwl_mvm_scan_uid_by_status(struct iwl_mvm *mvm, int status) in iwl_mvm_scan_uid_by_status() argument
1276 for (i = 0; i < mvm->max_scans; i++) in iwl_mvm_scan_uid_by_status()
1277 if (mvm->scan_uid_status[i] == status) in iwl_mvm_scan_uid_by_status()
1280 return -ENOENT; in iwl_mvm_scan_uid_by_status()
1290 timing = &scan_timing[params->type]; in iwl_mvm_scan_umac_dwell()
1295 cmd->v7.adwell_default_n_aps_social = in iwl_mvm_scan_umac_dwell()
1297 cmd->v7.adwell_default_n_aps = in iwl_mvm_scan_umac_dwell()
1301 cmd->v9.adwell_default_hb_n_aps = in iwl_mvm_scan_umac_dwell()
1306 cmd->v7.adwell_max_budget = in iwl_mvm_scan_umac_dwell()
1308 else if (params->ssids && params->ssids[0].ssid_len) in iwl_mvm_scan_umac_dwell()
1309 cmd->v7.adwell_max_budget = in iwl_mvm_scan_umac_dwell()
1312 cmd->v7.adwell_max_budget = in iwl_mvm_scan_umac_dwell()
1315 cmd->v7.scan_priority = cpu_to_le32(IWL_SCAN_PRIORITY_EXT_6); in iwl_mvm_scan_umac_dwell()
1316 cmd->v7.max_out_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1317 cpu_to_le32(timing->max_out_time); in iwl_mvm_scan_umac_dwell()
1318 cmd->v7.suspend_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1319 cpu_to_le32(timing->suspend_time); in iwl_mvm_scan_umac_dwell()
1322 hb_timing = &scan_timing[params->hb_type]; in iwl_mvm_scan_umac_dwell()
1324 cmd->v7.max_out_time[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1325 cpu_to_le32(hb_timing->max_out_time); in iwl_mvm_scan_umac_dwell()
1326 cmd->v7.suspend_time[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1327 cpu_to_le32(hb_timing->suspend_time); in iwl_mvm_scan_umac_dwell()
1331 cmd->v7.active_dwell = active_dwell; in iwl_mvm_scan_umac_dwell()
1332 cmd->v7.passive_dwell = passive_dwell; in iwl_mvm_scan_umac_dwell()
1333 cmd->v7.fragmented_dwell = IWL_SCAN_DWELL_FRAGMENTED; in iwl_mvm_scan_umac_dwell()
1335 cmd->v8.active_dwell[SCAN_LB_LMAC_IDX] = active_dwell; in iwl_mvm_scan_umac_dwell()
1336 cmd->v8.passive_dwell[SCAN_LB_LMAC_IDX] = passive_dwell; in iwl_mvm_scan_umac_dwell()
1338 cmd->v8.active_dwell[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1340 cmd->v8.passive_dwell[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1345 cmd->v1.extended_dwell = IWL_SCAN_DWELL_EXTENDED; in iwl_mvm_scan_umac_dwell()
1346 cmd->v1.active_dwell = active_dwell; in iwl_mvm_scan_umac_dwell()
1347 cmd->v1.passive_dwell = passive_dwell; in iwl_mvm_scan_umac_dwell()
1348 cmd->v1.fragmented_dwell = IWL_SCAN_DWELL_FRAGMENTED; in iwl_mvm_scan_umac_dwell()
1351 hb_timing = &scan_timing[params->hb_type]; in iwl_mvm_scan_umac_dwell()
1353 cmd->v6.max_out_time[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1354 cpu_to_le32(hb_timing->max_out_time); in iwl_mvm_scan_umac_dwell()
1355 cmd->v6.suspend_time[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1356 cpu_to_le32(hb_timing->suspend_time); in iwl_mvm_scan_umac_dwell()
1360 cmd->v6.scan_priority = in iwl_mvm_scan_umac_dwell()
1362 cmd->v6.max_out_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1363 cpu_to_le32(timing->max_out_time); in iwl_mvm_scan_umac_dwell()
1364 cmd->v6.suspend_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1365 cpu_to_le32(timing->suspend_time); in iwl_mvm_scan_umac_dwell()
1367 cmd->v1.scan_priority = in iwl_mvm_scan_umac_dwell()
1369 cmd->v1.max_out_time = in iwl_mvm_scan_umac_dwell()
1370 cpu_to_le32(timing->max_out_time); in iwl_mvm_scan_umac_dwell()
1371 cmd->v1.suspend_time = in iwl_mvm_scan_umac_dwell()
1372 cpu_to_le32(timing->suspend_time); in iwl_mvm_scan_umac_dwell()
1377 cmd->ooc_priority = cpu_to_le32(IWL_SCAN_PRIORITY_EXT_6); in iwl_mvm_scan_umac_dwell()
1379 cmd->ooc_priority = cpu_to_le32(IWL_SCAN_PRIORITY_EXT_2); in iwl_mvm_scan_umac_dwell()
1397 timing = &scan_timing[params->type]; in iwl_mvm_scan_umac_dwell_v11()
1401 general_params->adwell_default_social_chn = in iwl_mvm_scan_umac_dwell_v11()
1403 general_params->adwell_default_2g = IWL_SCAN_ADWELL_DEFAULT_LB_N_APS; in iwl_mvm_scan_umac_dwell_v11()
1404 general_params->adwell_default_5g = IWL_SCAN_ADWELL_DEFAULT_HB_N_APS; in iwl_mvm_scan_umac_dwell_v11()
1408 general_params->adwell_max_budget = in iwl_mvm_scan_umac_dwell_v11()
1410 else if (params->ssids && params->ssids[0].ssid_len) in iwl_mvm_scan_umac_dwell_v11()
1411 general_params->adwell_max_budget = in iwl_mvm_scan_umac_dwell_v11()
1414 general_params->adwell_max_budget = in iwl_mvm_scan_umac_dwell_v11()
1417 general_params->scan_priority = cpu_to_le32(IWL_SCAN_PRIORITY_EXT_6); in iwl_mvm_scan_umac_dwell_v11()
1418 general_params->max_out_of_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell_v11()
1419 cpu_to_le32(timing->max_out_time); in iwl_mvm_scan_umac_dwell_v11()
1420 general_params->suspend_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell_v11()
1421 cpu_to_le32(timing->suspend_time); in iwl_mvm_scan_umac_dwell_v11()
1423 hb_timing = &scan_timing[params->hb_type]; in iwl_mvm_scan_umac_dwell_v11()
1425 general_params->max_out_of_time[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell_v11()
1426 cpu_to_le32(hb_timing->max_out_time); in iwl_mvm_scan_umac_dwell_v11()
1427 general_params->suspend_time[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell_v11()
1428 cpu_to_le32(hb_timing->suspend_time); in iwl_mvm_scan_umac_dwell_v11()
1430 general_params->active_dwell[SCAN_LB_LMAC_IDX] = active_dwell; in iwl_mvm_scan_umac_dwell_v11()
1431 general_params->passive_dwell[SCAN_LB_LMAC_IDX] = passive_dwell; in iwl_mvm_scan_umac_dwell_v11()
1432 general_params->active_dwell[SCAN_HB_LMAC_IDX] = active_dwell; in iwl_mvm_scan_umac_dwell_v11()
1433 general_params->passive_dwell[SCAN_HB_LMAC_IDX] = passive_dwell; in iwl_mvm_scan_umac_dwell_v11()
1442 u8 band; member
1452 .band = PHY_BAND_24
1460 .band = PHY_BAND_5
1468 .band = PHY_BAND_5
1476 .band = PHY_BAND_6
1480 static int iwl_mvm_scan_ch_and_band_to_idx(u8 channel_id, u8 band) in iwl_mvm_scan_ch_and_band_to_idx() argument
1485 return -EINVAL; in iwl_mvm_scan_ch_and_band_to_idx()
1492 if (ch_segment->band != band || in iwl_mvm_scan_ch_and_band_to_idx()
1493 ch_segment->first_channel_id > channel_id || in iwl_mvm_scan_ch_and_band_to_idx()
1494 ch_segment->last_channel_id < channel_id) in iwl_mvm_scan_ch_and_band_to_idx()
1497 ch_offset = (channel_id - ch_segment->first_channel_id) >> in iwl_mvm_scan_ch_and_band_to_idx()
1498 ch_segment->channel_spacing_shift; in iwl_mvm_scan_ch_and_band_to_idx()
1507 return -EINVAL; in iwl_mvm_scan_ch_and_band_to_idx()
1519 u8 ch_id, u8 band, u8 *ch_bitmap, in iwl_mvm_scan_ch_add_n_aps_override() argument
1531 ch_idx = iwl_mvm_scan_ch_and_band_to_idx(ch_id, band); in iwl_mvm_scan_ch_add_n_aps_override()
1586 channel_cfg[i].v1.channel_num = channels[i]->hw_value; in iwl_mvm_umac_scan_cfg_channels()
1588 enum nl80211_band band = channels[i]->band; in iwl_mvm_umac_scan_cfg_channels() local
1590 channel_cfg[i].v2.band = in iwl_mvm_umac_scan_cfg_channels()
1591 iwl_mvm_phy_band_from_nl80211(band); in iwl_mvm_umac_scan_cfg_channels()
1608 u8 *bitmap = cp->adwell_ch_override_bitmap; in iwl_mvm_umac_scan_cfg_channels_v4()
1609 size_t bitmap_n_entries = ARRAY_SIZE(cp->adwell_ch_override_bitmap); in iwl_mvm_umac_scan_cfg_channels_v4()
1613 enum nl80211_band band = channels[i]->band; in iwl_mvm_umac_scan_cfg_channels_v4() local
1615 &cp->channel_config[i]; in iwl_mvm_umac_scan_cfg_channels_v4()
1617 cfg->flags = cpu_to_le32(flags); in iwl_mvm_umac_scan_cfg_channels_v4()
1618 cfg->v2.channel_num = channels[i]->hw_value; in iwl_mvm_umac_scan_cfg_channels_v4()
1619 cfg->v2.band = iwl_mvm_phy_band_from_nl80211(band); in iwl_mvm_umac_scan_cfg_channels_v4()
1620 cfg->v2.iter_count = 1; in iwl_mvm_umac_scan_cfg_channels_v4()
1621 cfg->v2.iter_interval = 0; in iwl_mvm_umac_scan_cfg_channels_v4()
1624 cfg->v2.channel_num, in iwl_mvm_umac_scan_cfg_channels_v4()
1625 cfg->v2.band, bitmap, in iwl_mvm_umac_scan_cfg_channels_v4()
1640 enum nl80211_band band = channels[i]->band; in iwl_mvm_umac_scan_cfg_channels_v7() local
1641 struct iwl_scan_channel_cfg_umac *cfg = &cp->channel_config[i]; in iwl_mvm_umac_scan_cfg_channels_v7()
1644 channels[i]->hw_value); in iwl_mvm_umac_scan_cfg_channels_v7()
1645 u8 iwl_band = iwl_mvm_phy_band_from_nl80211(band); in iwl_mvm_umac_scan_cfg_channels_v7()
1647 cfg->flags = cpu_to_le32(flags | n_aps_flag); in iwl_mvm_umac_scan_cfg_channels_v7()
1648 cfg->v2.channel_num = channels[i]->hw_value; in iwl_mvm_umac_scan_cfg_channels_v7()
1650 cfg->flags = 0; in iwl_mvm_umac_scan_cfg_channels_v7()
1651 cfg->v2.iter_count = 1; in iwl_mvm_umac_scan_cfg_channels_v7()
1652 cfg->v2.iter_interval = 0; in iwl_mvm_umac_scan_cfg_channels_v7()
1654 cfg->v2.band = iwl_band; in iwl_mvm_umac_scan_cfg_channels_v7()
1656 cfg->flags |= cpu_to_le32((iwl_band << in iwl_mvm_umac_scan_cfg_channels_v7()
1668 params->scan_6ghz_params; in iwl_mvm_umac_scan_fill_6g_chan_list()
1669 bool hidden_supported = fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_umac_scan_fill_6g_chan_list()
1672 for (j = 0; j < params->n_ssids && idex_s < SCAN_SHORT_SSID_MAX_SIZE; in iwl_mvm_umac_scan_fill_6g_chan_list()
1674 if (!params->ssids[j].ssid_len) in iwl_mvm_umac_scan_fill_6g_chan_list()
1677 pp->short_ssid[idex_s] = in iwl_mvm_umac_scan_fill_6g_chan_list()
1678 cpu_to_le32(~crc32_le(~0, params->ssids[j].ssid, in iwl_mvm_umac_scan_fill_6g_chan_list()
1679 params->ssids[j].ssid_len)); in iwl_mvm_umac_scan_fill_6g_chan_list()
1682 pp->direct_scan[idex_s].id = WLAN_EID_SSID; in iwl_mvm_umac_scan_fill_6g_chan_list()
1683 pp->direct_scan[idex_s].len = params->ssids[j].ssid_len; in iwl_mvm_umac_scan_fill_6g_chan_list()
1684 memcpy(pp->direct_scan[idex_s].ssid, params->ssids[j].ssid, in iwl_mvm_umac_scan_fill_6g_chan_list()
1685 params->ssids[j].ssid_len); in iwl_mvm_umac_scan_fill_6g_chan_list()
1698 for (j = 0; j < params->n_6ghz_params; j++) { in iwl_mvm_umac_scan_fill_6g_chan_list()
1704 if (pp->short_ssid[k] == in iwl_mvm_umac_scan_fill_6g_chan_list()
1710 pp->short_ssid[idex_s++] = in iwl_mvm_umac_scan_fill_6g_chan_list()
1717 if (!memcmp(&pp->bssid_array[k], in iwl_mvm_umac_scan_fill_6g_chan_list()
1723 memcpy(&pp->bssid_array[idex_b++], in iwl_mvm_umac_scan_fill_6g_chan_list()
1728 pp->short_ssid_num = idex_s; in iwl_mvm_umac_scan_fill_6g_chan_list()
1729 pp->bssid_num = idex_b; in iwl_mvm_umac_scan_fill_6g_chan_list()
1744 params->scan_6ghz_params; in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1747 for (i = 0, ch_cnt = 0; i < params->n_channels; i++) { in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1749 &cp->channel_config[ch_cnt]; in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1760 * configured in the scan command. in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1762 if (!cfg80211_channel_is_psc(params->channels[i]) && in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1763 !params->n_6ghz_params && params->n_ssids) in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1766 cfg->v1.channel_num = params->channels[i]->hw_value; in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1768 cfg->v2.band = PHY_BAND_6; in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1770 cfg->flags |= cpu_to_le32(PHY_BAND_6 << in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1773 cfg->v5.iter_count = 1; in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1774 cfg->v5.iter_interval = 0; in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1784 for (j = 0; j < params->n_6ghz_params; j++) { in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1806 for (k = 0; k < pp->short_ssid_num; k++) { in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1808 le32_to_cpu(pp->short_ssid[k]) == in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1818 * iteration during channel dwell or in in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1826 n_used_bssid_entries -= 3; in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1829 } else if (pp->direct_scan[k].len) { in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1842 for (k = 0; k < pp->bssid_num; k++) { in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1843 if (!memcmp(&pp->bssid_array[k], in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1856 if (cfg80211_channel_is_psc(params->channels[i]) && in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1864 * In the following cases apply passive scan: in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1866 * - PSC channel with NO_LISTEN_FLAG on should be treated in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1868 * - Non PSC channel with more than 3 short SSIDs or more in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1870 * - Non PSC Channel with unsolicited probe response and in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1872 * - PSC channel with more than 2 short SSIDs or more than in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1875 * - PSC channel with more than 1 SSID or 3 BSSIDs. in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1876 * - Non PSC channel with more than 2 SSIDs or 6 BSSIDs. in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1877 * - Non PSC channel with unsolicited probe response and in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1880 if (!iwl_mvm_is_scan_fragmented(params->type)) { in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1881 if (!cfg80211_channel_is_psc(params->channels[i]) || in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1889 } else if (cfg80211_channel_is_psc(params->channels[i])) { in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1898 !cfg80211_channel_is_psc(params->channels[i]))) in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1903 cfg->flags |= cpu_to_le32(flags); in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1905 cfg->v5.psd_20 = psd_20; in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1910 if (params->n_channels > ch_cnt) in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1912 "6GHz: reducing number channels: (%u->%u)\n", in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1913 params->n_channels, ch_cnt); in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1933 iwl_mvm_is_scan_fragmented(params->type)) || in iwl_mvm_scan_umac_chan_flags_v2()
1935 iwl_mvm_is_scan_fragmented(params->hb_type))) in iwl_mvm_scan_umac_chan_flags_v2()
1939 * force EBS in case the scan is a fragmented and there is a need to take P2P in iwl_mvm_scan_umac_chan_flags_v2()
1943 iwl_mvm_is_scan_fragmented(params->type) && params->respect_p2p_go) || in iwl_mvm_scan_umac_chan_flags_v2()
1945 iwl_mvm_is_scan_fragmented(params->hb_type) && in iwl_mvm_scan_umac_chan_flags_v2()
1946 params->respect_p2p_go_hb)) { in iwl_mvm_scan_umac_chan_flags_v2()
1959 &mvm->nvm_data->bands[NL80211_BAND_6GHZ]; in iwl_mvm_scan_6ghz_passive_scan()
1962 params->enable_6ghz_passive = false; in iwl_mvm_scan_6ghz_passive_scan()
1964 if (params->scan_6ghz) in iwl_mvm_scan_6ghz_passive_scan()
1967 if (!fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_scan_6ghz_passive_scan()
1975 if (vif->type != NL80211_IFTYPE_STATION) { in iwl_mvm_scan_6ghz_passive_scan()
1982 * 6GHz passive scan is allowed in a defined time interval following HW in iwl_mvm_scan_6ghz_passive_scan()
1986 if ((vif->cfg.assoc || in iwl_mvm_scan_6ghz_passive_scan()
1987 time_after(mvm->last_6ghz_passive_scan_jiffies + in iwl_mvm_scan_6ghz_passive_scan()
1989 (time_before(mvm->last_reset_or_resume_time_jiffies + in iwl_mvm_scan_6ghz_passive_scan()
1993 vif->cfg.assoc ? "associated" : in iwl_mvm_scan_6ghz_passive_scan()
1998 /* not enough channels in the regular scan request */ in iwl_mvm_scan_6ghz_passive_scan()
1999 if (params->n_channels < IWL_MVM_6GHZ_PASSIVE_SCAN_MIN_CHANS) { in iwl_mvm_scan_6ghz_passive_scan()
2005 for (i = 0; i < params->n_ssids; i++) { in iwl_mvm_scan_6ghz_passive_scan()
2006 if (!params->ssids[i].ssid_len) in iwl_mvm_scan_6ghz_passive_scan()
2011 if (i == params->n_ssids) { in iwl_mvm_scan_6ghz_passive_scan()
2017 if (!sband || !sband->n_channels) { in iwl_mvm_scan_6ghz_passive_scan()
2023 for (i = 0, n_disabled = 0; i < sband->n_channels; i++) { in iwl_mvm_scan_6ghz_passive_scan()
2024 if (sband->channels[i].flags & (IEEE80211_CHAN_DISABLED)) in iwl_mvm_scan_6ghz_passive_scan()
2032 if (n_disabled != sband->n_channels) { in iwl_mvm_scan_6ghz_passive_scan()
2040 params->enable_6ghz_passive = true; in iwl_mvm_scan_6ghz_passive_scan()
2056 if (params->n_ssids == 0) in iwl_mvm_scan_umac_flags_v2()
2058 else if (params->n_ssids == 1 && params->ssids[0].ssid_len) in iwl_mvm_scan_umac_flags_v2()
2061 if (iwl_mvm_is_scan_fragmented(params->type)) in iwl_mvm_scan_umac_flags_v2()
2064 if (iwl_mvm_is_scan_fragmented(params->hb_type)) in iwl_mvm_scan_umac_flags_v2()
2067 if (params->pass_all) in iwl_mvm_scan_umac_flags_v2()
2075 if (params->iter_notif || in iwl_mvm_scan_umac_flags_v2()
2076 mvm->sched_scan_pass_all == SCHED_SCAN_PASS_ALL_ENABLED) in iwl_mvm_scan_umac_flags_v2()
2086 params->flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ) in iwl_mvm_scan_umac_flags_v2()
2089 if (params->enable_6ghz_passive) in iwl_mvm_scan_umac_flags_v2()
2093 (params->flags & (NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP | in iwl_mvm_scan_umac_flags_v2()
2108 if (params->respect_p2p_go) in iwl_mvm_scan_umac_flags2()
2110 if (params->respect_p2p_go_hb) in iwl_mvm_scan_umac_flags2()
2113 if (params->respect_p2p_go) in iwl_mvm_scan_umac_flags2()
2118 if (params->scan_6ghz && in iwl_mvm_scan_umac_flags2()
2119 fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_scan_umac_flags2()
2132 if (params->n_ssids == 0) in iwl_mvm_scan_umac_flags()
2135 if (params->n_ssids == 1 && params->ssids[0].ssid_len != 0) in iwl_mvm_scan_umac_flags()
2138 if (iwl_mvm_is_scan_fragmented(params->type)) in iwl_mvm_scan_umac_flags()
2142 iwl_mvm_is_scan_fragmented(params->hb_type)) in iwl_mvm_scan_umac_flags()
2146 fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_scan_umac_flags()
2150 if (params->pass_all) in iwl_mvm_scan_umac_flags()
2158 if (params->iter_notif) in iwl_mvm_scan_umac_flags()
2162 if (mvm->scan_iter_notif_enabled) in iwl_mvm_scan_umac_flags()
2166 if (mvm->sched_scan_pass_all == SCHED_SCAN_PASS_ALL_ENABLED) in iwl_mvm_scan_umac_flags()
2173 * Extended dwell is relevant only for low band to start with, as it is in iwl_mvm_scan_umac_flags()
2175 * only scan type on low band also for CDB. in iwl_mvm_scan_umac_flags()
2178 vif->type != NL80211_IFTYPE_P2P_DEVICE && in iwl_mvm_scan_umac_flags()
2179 !iwl_mvm_is_scan_fragmented(params->type) && in iwl_mvm_scan_umac_flags()
2185 if ((params->flags & in iwl_mvm_scan_umac_flags()
2193 if ((params->flags & in iwl_mvm_scan_umac_flags()
2197 if ((params->flags & NL80211_SCAN_FLAG_FILS_MAX_CHANNEL_TIME)) in iwl_mvm_scan_umac_flags()
2210 if (WARN_ON(!params->n_scan_plans || in iwl_mvm_fill_scan_sched_params()
2211 params->n_scan_plans > IWL_MAX_SCHED_SCAN_PLANS)) in iwl_mvm_fill_scan_sched_params()
2212 return -EINVAL; in iwl_mvm_fill_scan_sched_params()
2214 for (i = 0; i < params->n_scan_plans; i++) { in iwl_mvm_fill_scan_sched_params()
2216 &params->scan_plans[i]; in iwl_mvm_fill_scan_sched_params()
2218 schedule[i].iter_count = scan_plan->iterations; in iwl_mvm_fill_scan_sched_params()
2220 cpu_to_le16(scan_plan->interval); in iwl_mvm_fill_scan_sched_params()
2229 if (!schedule[params->n_scan_plans - 1].iter_count) in iwl_mvm_fill_scan_sched_params()
2230 schedule[params->n_scan_plans - 1].iter_count = 0xff; in iwl_mvm_fill_scan_sched_params()
2232 *delay = cpu_to_le16(params->delay); in iwl_mvm_fill_scan_sched_params()
2241 struct iwl_scan_req_umac *cmd = mvm->scan_cmd; in iwl_mvm_scan_umac()
2245 mvm->fw->ucode_capa.n_scan_channels; in iwl_mvm_scan_umac()
2260 mvm->scan_uid_status[uid] = type; in iwl_mvm_scan_umac()
2262 cmd->uid = cpu_to_le32(uid); in iwl_mvm_scan_umac()
2264 cmd->general_flags = cpu_to_le16(gen_flags); in iwl_mvm_scan_umac()
2267 cmd->v8.num_of_fragments[SCAN_LB_LMAC_IDX] = in iwl_mvm_scan_umac()
2270 cmd->v8.num_of_fragments[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac()
2273 cmd->v8.general_flags2 = in iwl_mvm_scan_umac()
2277 cmd->scan_start_mac_id = scan_vif->id; in iwl_mvm_scan_umac()
2280 cmd->flags = cpu_to_le32(IWL_UMAC_SCAN_FLAG_PREEMPTIVE); in iwl_mvm_scan_umac()
2297 chan_param->flags = channel_flags; in iwl_mvm_scan_umac()
2298 chan_param->count = params->n_channels; in iwl_mvm_scan_umac()
2300 ret = iwl_mvm_fill_scan_sched_params(params, tail_v2->schedule, in iwl_mvm_scan_umac()
2301 &tail_v2->delay); in iwl_mvm_scan_umac()
2303 mvm->scan_uid_status[uid] = 0; in iwl_mvm_scan_umac()
2308 tail_v2->preq = params->preq; in iwl_mvm_scan_umac()
2309 direct_scan = tail_v2->direct_scan; in iwl_mvm_scan_umac()
2312 iwl_mvm_scan_set_legacy_probe_req(&tail_v1->preq, in iwl_mvm_scan_umac()
2313 &params->preq); in iwl_mvm_scan_umac()
2314 direct_scan = tail_v1->direct_scan; in iwl_mvm_scan_umac()
2317 iwl_mvm_umac_scan_cfg_channels(mvm, params->channels, in iwl_mvm_scan_umac()
2318 params->n_channels, ssid_bitmap, in iwl_mvm_scan_umac()
2338 gp->flags = cpu_to_le16(gen_flags); in iwl_mvm_scan_umac_fill_general_p_v12()
2339 gp->flags2 = gen_flags2; in iwl_mvm_scan_umac_fill_general_p_v12()
2342 gp->num_of_fragments[SCAN_LB_LMAC_IDX] = IWL_SCAN_NUM_OF_FRAGS; in iwl_mvm_scan_umac_fill_general_p_v12()
2344 gp->num_of_fragments[SCAN_HB_LMAC_IDX] = IWL_SCAN_NUM_OF_FRAGS; in iwl_mvm_scan_umac_fill_general_p_v12()
2346 mvm->scan_link_id = 0; in iwl_mvm_scan_umac_fill_general_p_v12()
2349 gp->scan_start_mac_or_link_id = scan_vif->id; in iwl_mvm_scan_umac_fill_general_p_v12()
2352 scan_vif->link[params->tsf_report_link_id]; in iwl_mvm_scan_umac_fill_general_p_v12()
2354 mvm->scan_link_id = params->tsf_report_link_id; in iwl_mvm_scan_umac_fill_general_p_v12()
2356 gp->scan_start_mac_or_link_id = link_info->fw_link_id; in iwl_mvm_scan_umac_fill_general_p_v12()
2364 pp->preq = params->preq; in iwl_mvm_scan_umac_fill_probe_p_v3()
2365 pp->ssid_num = params->n_ssids; in iwl_mvm_scan_umac_fill_probe_p_v3()
2366 iwl_scan_build_ssids(params, pp->direct_scan, NULL); in iwl_mvm_scan_umac_fill_probe_p_v3()
2374 pp->preq = params->preq; in iwl_mvm_scan_umac_fill_probe_p_v4()
2375 iwl_scan_build_ssids(params, pp->direct_scan, bitmap_ssid); in iwl_mvm_scan_umac_fill_probe_p_v4()
2385 cp->flags = iwl_mvm_scan_umac_chan_flags_v2(mvm, params, vif); in iwl_mvm_scan_umac_fill_ch_p_v4()
2386 cp->count = params->n_channels; in iwl_mvm_scan_umac_fill_ch_p_v4()
2387 cp->num_of_aps_override = IWL_SCAN_ADWELL_N_APS_GO_FRIENDLY; in iwl_mvm_scan_umac_fill_ch_p_v4()
2389 iwl_mvm_umac_scan_cfg_channels_v4(mvm, params->channels, cp, in iwl_mvm_scan_umac_fill_ch_p_v4()
2390 params->n_channels, in iwl_mvm_scan_umac_fill_ch_p_v4()
2392 vif->type); in iwl_mvm_scan_umac_fill_ch_p_v4()
2403 cp->flags = iwl_mvm_scan_umac_chan_flags_v2(mvm, params, vif); in iwl_mvm_scan_umac_fill_ch_p_v7()
2404 cp->count = params->n_channels; in iwl_mvm_scan_umac_fill_ch_p_v7()
2405 cp->n_aps_override[0] = IWL_SCAN_ADWELL_N_APS_GO_FRIENDLY; in iwl_mvm_scan_umac_fill_ch_p_v7()
2406 cp->n_aps_override[1] = IWL_SCAN_ADWELL_N_APS_SOCIAL_CHS; in iwl_mvm_scan_umac_fill_ch_p_v7()
2408 iwl_mvm_umac_scan_cfg_channels_v7(mvm, params->channels, cp, in iwl_mvm_scan_umac_fill_ch_p_v7()
2409 params->n_channels, in iwl_mvm_scan_umac_fill_ch_p_v7()
2411 vif->type, version); in iwl_mvm_scan_umac_fill_ch_p_v7()
2413 if (params->enable_6ghz_passive) { in iwl_mvm_scan_umac_fill_ch_p_v7()
2415 &mvm->nvm_data->bands[NL80211_BAND_6GHZ]; in iwl_mvm_scan_umac_fill_ch_p_v7()
2418 for (i = 0; i < sband->n_channels; i++) { in iwl_mvm_scan_umac_fill_ch_p_v7()
2420 &sband->channels[i]; in iwl_mvm_scan_umac_fill_ch_p_v7()
2423 &cp->channel_config[cp->count]; in iwl_mvm_scan_umac_fill_ch_p_v7()
2428 cfg->v5.channel_num = channel->hw_value; in iwl_mvm_scan_umac_fill_ch_p_v7()
2429 cfg->v5.iter_count = 1; in iwl_mvm_scan_umac_fill_ch_p_v7()
2430 cfg->v5.iter_interval = 0; in iwl_mvm_scan_umac_fill_ch_p_v7()
2433 cfg->flags = 0; in iwl_mvm_scan_umac_fill_ch_p_v7()
2434 cfg->v2.band = PHY_BAND_6; in iwl_mvm_scan_umac_fill_ch_p_v7()
2436 cfg->flags = cpu_to_le32(PHY_BAND_6 << in iwl_mvm_scan_umac_fill_ch_p_v7()
2438 cfg->v5.psd_20 = in iwl_mvm_scan_umac_fill_ch_p_v7()
2441 cp->count++; in iwl_mvm_scan_umac_fill_ch_p_v7()
2450 struct iwl_scan_req_umac_v12 *cmd = mvm->scan_cmd; in iwl_mvm_scan_umac_v12()
2451 struct iwl_scan_req_params_v12 *scan_p = &cmd->scan_params; in iwl_mvm_scan_umac_v12()
2455 mvm->scan_uid_status[uid] = type; in iwl_mvm_scan_umac_v12()
2457 cmd->ooc_priority = cpu_to_le32(iwl_mvm_scan_umac_ooc_priority(params)); in iwl_mvm_scan_umac_v12()
2458 cmd->uid = cpu_to_le32(uid); in iwl_mvm_scan_umac_v12()
2462 &scan_p->general_params, in iwl_mvm_scan_umac_v12()
2466 scan_p->periodic_params.schedule, in iwl_mvm_scan_umac_v12()
2467 &scan_p->periodic_params.delay); in iwl_mvm_scan_umac_v12()
2471 iwl_mvm_scan_umac_fill_probe_p_v3(params, &scan_p->probe_params); in iwl_mvm_scan_umac_v12()
2473 &scan_p->channel_params, 0); in iwl_mvm_scan_umac_v12()
2483 struct iwl_scan_req_umac_v17 *cmd = mvm->scan_cmd; in iwl_mvm_scan_umac_v14_and_above()
2484 struct iwl_scan_req_params_v17 *scan_p = &cmd->scan_params; in iwl_mvm_scan_umac_v14_and_above()
2485 struct iwl_scan_channel_params_v7 *cp = &scan_p->channel_params; in iwl_mvm_scan_umac_v14_and_above()
2486 struct iwl_scan_probe_params_v4 *pb = &scan_p->probe_params; in iwl_mvm_scan_umac_v14_and_above()
2492 mvm->scan_uid_status[uid] = type; in iwl_mvm_scan_umac_v14_and_above()
2494 cmd->ooc_priority = cpu_to_le32(iwl_mvm_scan_umac_ooc_priority(params)); in iwl_mvm_scan_umac_v14_and_above()
2495 cmd->uid = cpu_to_le32(uid); in iwl_mvm_scan_umac_v14_and_above()
2505 &scan_p->general_params, in iwl_mvm_scan_umac_v14_and_above()
2509 scan_p->periodic_params.schedule, in iwl_mvm_scan_umac_v14_and_above()
2510 &scan_p->periodic_params.delay); in iwl_mvm_scan_umac_v14_and_above()
2514 if (!params->scan_6ghz) { in iwl_mvm_scan_umac_v14_and_above()
2516 &scan_p->probe_params, in iwl_mvm_scan_umac_v14_and_above()
2519 &scan_p->channel_params, in iwl_mvm_scan_umac_v14_and_above()
2524 pb->preq = params->preq; in iwl_mvm_scan_umac_v14_and_above()
2527 cp->flags = iwl_mvm_scan_umac_chan_flags_v2(mvm, params, vif); in iwl_mvm_scan_umac_v14_and_above()
2528 cp->n_aps_override[0] = IWL_SCAN_ADWELL_N_APS_GO_FRIENDLY; in iwl_mvm_scan_umac_v14_and_above()
2529 cp->n_aps_override[1] = IWL_SCAN_ADWELL_N_APS_SOCIAL_CHS; in iwl_mvm_scan_umac_v14_and_above()
2533 cp->count = iwl_mvm_umac_scan_cfg_channels_v7_6g(mvm, params, in iwl_mvm_scan_umac_v14_and_above()
2534 params->n_channels, in iwl_mvm_scan_umac_v14_and_above()
2535 pb, cp, vif->type, in iwl_mvm_scan_umac_v14_and_above()
2537 if (!cp->count) { in iwl_mvm_scan_umac_v14_and_above()
2538 mvm->scan_uid_status[uid] = 0; in iwl_mvm_scan_umac_v14_and_above()
2539 return -EINVAL; in iwl_mvm_scan_umac_v14_and_above()
2542 if (!params->n_ssids || in iwl_mvm_scan_umac_v14_and_above()
2543 (params->n_ssids == 1 && !params->ssids[0].ssid_len)) in iwl_mvm_scan_umac_v14_and_above()
2544 cp->flags |= IWL_SCAN_CHANNEL_FLAG_6G_PSC_NO_FILTER; in iwl_mvm_scan_umac_v14_and_above()
2579 return hweight32(mvm->scan_status & IWL_MVM_SCAN_MASK); in iwl_mvm_num_scans()
2584 bool unified_image = fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_check_running_scans()
2590 * return -EBUSY. But if the userspace wants to start a in iwl_mvm_check_running_scans()
2599 mvm->scan_status & (IWL_MVM_SCAN_SCHED | IWL_MVM_SCAN_NETDETECT)) in iwl_mvm_check_running_scans()
2600 return -EBUSY; in iwl_mvm_check_running_scans()
2602 if (iwl_mvm_num_scans(mvm) < mvm->max_scans) in iwl_mvm_check_running_scans()
2606 * than one bits set will fall in default and we will warn. in iwl_mvm_check_running_scans()
2610 if (mvm->scan_status & IWL_MVM_SCAN_REGULAR_MASK) in iwl_mvm_check_running_scans()
2611 return -EBUSY; in iwl_mvm_check_running_scans()
2614 if (mvm->scan_status & IWL_MVM_SCAN_SCHED_MASK) in iwl_mvm_check_running_scans()
2615 return -EBUSY; in iwl_mvm_check_running_scans()
2618 /* For non-unified images, there's no need to stop in iwl_mvm_check_running_scans()
2619 * anything for net-detect since the firmware is in iwl_mvm_check_running_scans()
2632 if (mvm->scan_status & IWL_MVM_SCAN_REGULAR_MASK) in iwl_mvm_check_running_scans()
2635 if (mvm->scan_status & IWL_MVM_SCAN_SCHED_MASK) in iwl_mvm_check_running_scans()
2647 return -EIO; in iwl_mvm_check_running_scans()
2660 iwl_force_nmi(mvm->trans); in iwl_mvm_scan_timeout_wk()
2668 params->type = in iwl_mvm_fill_scan_type()
2671 params->hb_type = in iwl_mvm_fill_scan_type()
2675 params->type = iwl_mvm_get_scan_type(mvm, vif); in iwl_mvm_fill_scan_type()
2709 mutex_lock(&mvm->mutex); in iwl_mvm_mei_scan_work()
2711 memcpy(bssid, info->conn_info.bssid, ETH_ALEN); in iwl_mvm_mei_scan_work()
2712 mutex_unlock(&mvm->mutex); in iwl_mvm_mei_scan_work()
2714 while ((skb = skb_dequeue(&scan_filter->scan_res))) { in iwl_mvm_mei_scan_work()
2715 struct ieee80211_mgmt *mgmt = (void *)skb->data; in iwl_mvm_mei_scan_work()
2717 if (!memcmp(mgmt->bssid, bssid, ETH_ALEN)) in iwl_mvm_mei_scan_work()
2718 ieee80211_rx_irqsafe(mvm->hw, skb); in iwl_mvm_mei_scan_work()
2726 skb_queue_head_init(&mei_scan_filter->scan_res); in iwl_mvm_mei_scan_filter_init()
2727 INIT_WORK(&mei_scan_filter->scan_work, iwl_mvm_mei_scan_work); in iwl_mvm_mei_scan_filter_init()
2730 /* In case CSME is connected and has link protection set, this function will
2747 conn_info = &info->conn_info; in iwl_mvm_mei_limited_scan()
2748 if (!info->conn_info.lp_state || !info->conn_info.ssid_len) in iwl_mvm_mei_limited_scan()
2751 if (!params->n_channels || !params->n_ssids) in iwl_mvm_mei_limited_scan()
2754 mvm->mei_scan_filter.is_mei_limited_scan = true; in iwl_mvm_mei_limited_scan()
2756 chan = ieee80211_get_channel(mvm->hw->wiphy, in iwl_mvm_mei_limited_scan()
2757 ieee80211_channel_to_frequency(conn_info->channel, in iwl_mvm_mei_limited_scan()
2758 conn_info->band)); in iwl_mvm_mei_limited_scan()
2761 "Failed to get CSME channel (chan=%u band=%u)\n", in iwl_mvm_mei_limited_scan()
2762 conn_info->channel, conn_info->band); in iwl_mvm_mei_limited_scan()
2770 scan_iters = min(IWL_MEI_SCAN_NUM_ITER, params->n_channels); in iwl_mvm_mei_limited_scan()
2771 params->n_channels = scan_iters; in iwl_mvm_mei_limited_scan()
2773 params->channels[i] = chan; in iwl_mvm_mei_limited_scan()
2777 params->n_ssids = 1; in iwl_mvm_mei_limited_scan()
2778 params->ssids[0].ssid_len = conn_info->ssid_len; in iwl_mvm_mei_limited_scan()
2779 memcpy(params->ssids[0].ssid, conn_info->ssid, conn_info->ssid_len); in iwl_mvm_mei_limited_scan()
2791 lockdep_assert_held(&mvm->mutex); in iwl_mvm_build_scan_cmd()
2792 memset(mvm->scan_cmd, 0, mvm->scan_cmd_size); in iwl_mvm_build_scan_cmd()
2796 if (!fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) { in iwl_mvm_build_scan_cmd()
2797 hcmd->id = SCAN_OFFLOAD_REQUEST_CMD; in iwl_mvm_build_scan_cmd()
2806 hcmd->id = WIDE_ID(IWL_ALWAYS_LONG_GROUP, SCAN_REQ_UMAC); in iwl_mvm_build_scan_cmd()
2808 scan_ver = iwl_fw_lookup_cmd_ver(mvm->fw, SCAN_REQ_UMAC, in iwl_mvm_build_scan_cmd()
2815 if (ver_handler->version != scan_ver) in iwl_mvm_build_scan_cmd()
2818 return ver_handler->handler(mvm, vif, params, type, uid); in iwl_mvm_build_scan_cmd()
2831 enum nl80211_band band; member
2841 if (vif == data->current_vif) in iwl_mvm_scan_respect_p2p_go_iter()
2844 if (vif->type == NL80211_IFTYPE_AP && vif->p2p) { in iwl_mvm_scan_respect_p2p_go_iter()
2848 link_id < ARRAY_SIZE(mvmvif->link); in iwl_mvm_scan_respect_p2p_go_iter()
2851 mvmvif->link[link_id]; in iwl_mvm_scan_respect_p2p_go_iter()
2853 if (link && link->phy_ctxt->id < NUM_PHY_CTX && in iwl_mvm_scan_respect_p2p_go_iter()
2854 (data->band == NUM_NL80211_BANDS || in iwl_mvm_scan_respect_p2p_go_iter()
2855 link->phy_ctxt->channel->band == data->band)) { in iwl_mvm_scan_respect_p2p_go_iter()
2856 data->p2p_go = true; in iwl_mvm_scan_respect_p2p_go_iter()
2866 enum nl80211_band band) in _iwl_mvm_get_respect_p2p_go() argument
2871 .band = band, in _iwl_mvm_get_respect_p2p_go()
2877 ieee80211_iterate_active_interfaces_atomic(mvm->hw, in _iwl_mvm_get_respect_p2p_go()
2887 enum nl80211_band band) in iwl_mvm_get_respect_p2p_go_band() argument
2889 bool low_latency = iwl_mvm_low_latency_band(mvm, band); in iwl_mvm_get_respect_p2p_go_band()
2891 return _iwl_mvm_get_respect_p2p_go(mvm, vif, low_latency, band); in iwl_mvm_get_respect_p2p_go_band()
2908 params->respect_p2p_go = in iwl_mvm_fill_respect_p2p_go()
2911 params->respect_p2p_go_hb = in iwl_mvm_fill_respect_p2p_go()
2915 params->respect_p2p_go = iwl_mvm_get_respect_p2p_go(mvm, vif); in iwl_mvm_fill_respect_p2p_go()
2925 .data = { mvm->scan_cmd, }, in iwl_mvm_reg_scan_start()
2932 lockdep_assert_held(&mvm->mutex); in iwl_mvm_reg_scan_start()
2934 if (iwl_mvm_is_lar_supported(mvm) && !mvm->lar_regdom_set) { in iwl_mvm_reg_scan_start()
2936 return -EBUSY; in iwl_mvm_reg_scan_start()
2944 if (WARN_ON(!mvm->scan_cmd)) in iwl_mvm_reg_scan_start()
2945 return -ENOMEM; in iwl_mvm_reg_scan_start()
2947 if (!iwl_mvm_scan_fits(mvm, req->n_ssids, ies, req->n_channels)) in iwl_mvm_reg_scan_start()
2948 return -ENOBUFS; in iwl_mvm_reg_scan_start()
2950 params.n_ssids = req->n_ssids; in iwl_mvm_reg_scan_start()
2951 params.flags = req->flags; in iwl_mvm_reg_scan_start()
2952 params.n_channels = req->n_channels; in iwl_mvm_reg_scan_start()
2954 params.ssids = req->ssids; in iwl_mvm_reg_scan_start()
2955 params.channels = req->channels; in iwl_mvm_reg_scan_start()
2956 params.mac_addr = req->mac_addr; in iwl_mvm_reg_scan_start()
2957 params.mac_addr_mask = req->mac_addr_mask; in iwl_mvm_reg_scan_start()
2958 params.no_cck = req->no_cck; in iwl_mvm_reg_scan_start()
2962 ether_addr_copy(params.bssid, req->bssid); in iwl_mvm_reg_scan_start()
2967 params.n_6ghz_params = req->n_6ghz_params; in iwl_mvm_reg_scan_start()
2968 params.scan_6ghz_params = req->scan_6ghz_params; in iwl_mvm_reg_scan_start()
2969 params.scan_6ghz = req->scan_6ghz; in iwl_mvm_reg_scan_start()
2973 if (req->duration) in iwl_mvm_reg_scan_start()
2976 params.tsf_report_link_id = req->tsf_report_link_id; in iwl_mvm_reg_scan_start()
2978 if (vif->active_links) in iwl_mvm_reg_scan_start()
2979 params.tsf_report_link_id = __ffs(vif->active_links); in iwl_mvm_reg_scan_start()
3004 mvm->scan_uid_status[uid] = 0; in iwl_mvm_reg_scan_start()
3009 mvm->scan_status |= IWL_MVM_SCAN_REGULAR; in iwl_mvm_reg_scan_start()
3010 mvm->scan_vif = iwl_mvm_vif_from_mac80211(vif); in iwl_mvm_reg_scan_start()
3013 mvm->last_6ghz_passive_scan_jiffies = jiffies; in iwl_mvm_reg_scan_start()
3015 schedule_delayed_work(&mvm->scan_timeout_dwork, in iwl_mvm_reg_scan_start()
3029 .data = { mvm->scan_cmd, }, in iwl_mvm_sched_scan_start()
3037 lockdep_assert_held(&mvm->mutex); in iwl_mvm_sched_scan_start()
3039 if (iwl_mvm_is_lar_supported(mvm) && !mvm->lar_regdom_set) { in iwl_mvm_sched_scan_start()
3040 IWL_ERR(mvm, "sched-scan while LAR regdomain is not set\n"); in iwl_mvm_sched_scan_start()
3041 return -EBUSY; in iwl_mvm_sched_scan_start()
3049 if (WARN_ON(!mvm->scan_cmd)) in iwl_mvm_sched_scan_start()
3050 return -ENOMEM; in iwl_mvm_sched_scan_start()
3053 params.n_ssids = req->n_ssids; in iwl_mvm_sched_scan_start()
3054 params.flags = req->flags; in iwl_mvm_sched_scan_start()
3055 params.n_channels = req->n_channels; in iwl_mvm_sched_scan_start()
3056 params.ssids = req->ssids; in iwl_mvm_sched_scan_start()
3057 params.channels = req->channels; in iwl_mvm_sched_scan_start()
3058 params.mac_addr = req->mac_addr; in iwl_mvm_sched_scan_start()
3059 params.mac_addr_mask = req->mac_addr_mask; in iwl_mvm_sched_scan_start()
3062 params.n_match_sets = req->n_match_sets; in iwl_mvm_sched_scan_start()
3063 params.match_sets = req->match_sets; in iwl_mvm_sched_scan_start()
3065 if (!req->n_scan_plans) in iwl_mvm_sched_scan_start()
3066 return -EINVAL; in iwl_mvm_sched_scan_start()
3068 params.n_scan_plans = req->n_scan_plans; in iwl_mvm_sched_scan_start()
3069 params.scan_plans = req->scan_plans; in iwl_mvm_sched_scan_start()
3074 /* In theory, LMAC scans can handle a 32-bit delay, but since in iwl_mvm_sched_scan_start()
3077 * 16-bit delays), trim it down to 16-bits. in iwl_mvm_sched_scan_start()
3079 if (req->delay > U16_MAX) { in iwl_mvm_sched_scan_start()
3081 "delay value is > 16-bits, set to max possible\n"); in iwl_mvm_sched_scan_start()
3084 params.delay = req->delay; in iwl_mvm_sched_scan_start()
3093 /* for 6 GHZ band only PSC channels need to be added */ in iwl_mvm_sched_scan_start()
3097 if (channel->band == NL80211_BAND_6GHZ && in iwl_mvm_sched_scan_start()
3110 return -ENOMEM; in iwl_mvm_sched_scan_start()
3113 if (params.channels[i]->band == NL80211_BAND_6GHZ && in iwl_mvm_sched_scan_start()
3122 !iwl_mvm_scan_fits(mvm, req->n_ssids, ies, params.n_channels)) { in iwl_mvm_sched_scan_start()
3124 return -ENOBUFS; in iwl_mvm_sched_scan_start()
3138 mvm->scan_status |= type; in iwl_mvm_sched_scan_start()
3145 mvm->scan_uid_status[uid] = 0; in iwl_mvm_sched_scan_start()
3146 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_DISABLED; in iwl_mvm_sched_scan_start()
3156 struct iwl_umac_scan_complete *notif = (void *)pkt->data; in iwl_mvm_rx_umac_scan_complete_notif()
3157 u32 uid = __le32_to_cpu(notif->uid); in iwl_mvm_rx_umac_scan_complete_notif()
3158 bool aborted = (notif->status == IWL_SCAN_OFFLOAD_ABORTED); in iwl_mvm_rx_umac_scan_complete_notif()
3160 mvm->mei_scan_filter.is_mei_limited_scan = false; in iwl_mvm_rx_umac_scan_complete_notif()
3162 if (WARN_ON(!(mvm->scan_uid_status[uid] & mvm->scan_status))) in iwl_mvm_rx_umac_scan_complete_notif()
3166 if (mvm->scan_uid_status[uid] == IWL_MVM_SCAN_REGULAR) { in iwl_mvm_rx_umac_scan_complete_notif()
3169 .scan_start_tsf = mvm->scan_start, in iwl_mvm_rx_umac_scan_complete_notif()
3171 struct iwl_mvm_vif *scan_vif = mvm->scan_vif; in iwl_mvm_rx_umac_scan_complete_notif()
3173 scan_vif->link[mvm->scan_link_id]; in iwl_mvm_rx_umac_scan_complete_notif()
3176 memcpy(info.tsf_bssid, link_info->bssid, ETH_ALEN); in iwl_mvm_rx_umac_scan_complete_notif()
3178 ieee80211_scan_completed(mvm->hw, &info); in iwl_mvm_rx_umac_scan_complete_notif()
3179 mvm->scan_vif = NULL; in iwl_mvm_rx_umac_scan_complete_notif()
3180 cancel_delayed_work(&mvm->scan_timeout_dwork); in iwl_mvm_rx_umac_scan_complete_notif()
3182 } else if (mvm->scan_uid_status[uid] == IWL_MVM_SCAN_SCHED) { in iwl_mvm_rx_umac_scan_complete_notif()
3183 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_rx_umac_scan_complete_notif()
3184 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_DISABLED; in iwl_mvm_rx_umac_scan_complete_notif()
3187 mvm->scan_status &= ~mvm->scan_uid_status[uid]; in iwl_mvm_rx_umac_scan_complete_notif()
3189 "Scan completed, uid %u type %u, status %s, EBS status %s\n", in iwl_mvm_rx_umac_scan_complete_notif()
3190 uid, mvm->scan_uid_status[uid], in iwl_mvm_rx_umac_scan_complete_notif()
3191 notif->status == IWL_SCAN_OFFLOAD_COMPLETED ? in iwl_mvm_rx_umac_scan_complete_notif()
3193 iwl_mvm_ebs_status_str(notif->ebs_status)); in iwl_mvm_rx_umac_scan_complete_notif()
3196 notif->last_schedule, notif->last_iter, in iwl_mvm_rx_umac_scan_complete_notif()
3197 __le32_to_cpu(notif->time_from_last_iter)); in iwl_mvm_rx_umac_scan_complete_notif()
3199 if (notif->ebs_status != IWL_SCAN_EBS_SUCCESS && in iwl_mvm_rx_umac_scan_complete_notif()
3200 notif->ebs_status != IWL_SCAN_EBS_INACTIVE) in iwl_mvm_rx_umac_scan_complete_notif()
3201 mvm->last_ebs_successful = false; in iwl_mvm_rx_umac_scan_complete_notif()
3203 mvm->scan_uid_status[uid] = 0; in iwl_mvm_rx_umac_scan_complete_notif()
3210 struct iwl_umac_scan_iter_complete_notif *notif = (void *)pkt->data; in iwl_mvm_rx_umac_scan_iter_complete_notif()
3212 mvm->scan_start = le64_to_cpu(notif->start_tsf); in iwl_mvm_rx_umac_scan_iter_complete_notif()
3215 "UMAC Scan iteration complete: status=0x%x scanned_channels=%d\n", in iwl_mvm_rx_umac_scan_iter_complete_notif()
3216 notif->status, notif->scanned_channels); in iwl_mvm_rx_umac_scan_iter_complete_notif()
3218 if (mvm->sched_scan_pass_all == SCHED_SCAN_PASS_ALL_FOUND) { in iwl_mvm_rx_umac_scan_iter_complete_notif()
3220 ieee80211_sched_scan_results(mvm->hw); in iwl_mvm_rx_umac_scan_iter_complete_notif()
3221 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_ENABLED; in iwl_mvm_rx_umac_scan_iter_complete_notif()
3226 mvm->scan_start); in iwl_mvm_rx_umac_scan_iter_complete_notif()
3234 lockdep_assert_held(&mvm->mutex); in iwl_mvm_umac_scan_abort()
3237 * checked that this type of scan was running in the generic in iwl_mvm_umac_scan_abort()
3252 mvm->scan_uid_status[uid] = type << IWL_MVM_SCAN_STOPPING_SHIFT; in iwl_mvm_umac_scan_abort()
3264 lockdep_assert_held(&mvm->mutex); in iwl_mvm_scan_stop_wait()
3266 iwl_init_notification_wait(&mvm->notif_wait, &wait_scan_done, in iwl_mvm_scan_stop_wait()
3273 if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) in iwl_mvm_scan_stop_wait()
3280 iwl_remove_notification(&mvm->notif_wait, &wait_scan_done); in iwl_mvm_scan_stop_wait()
3284 return iwl_wait_notification(&mvm->notif_wait, &wait_scan_done, in iwl_mvm_scan_stop_wait()
3306 u8 scan_ver = iwl_fw_lookup_cmd_ver(mvm->fw, SCAN_REQ_UMAC, in iwl_mvm_scan_size()
3323 if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) { in iwl_mvm_scan_size()
3331 mvm->fw->ucode_capa.n_scan_channels + in iwl_mvm_scan_size()
3336 mvm->fw->ucode_capa.n_scan_channels + in iwl_mvm_scan_size()
3341 * This function is used in nic restart flow, to inform mac80211 about scans
3346 if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) { in iwl_mvm_report_scan_aborted()
3355 cancel_delayed_work(&mvm->scan_timeout_dwork); in iwl_mvm_report_scan_aborted()
3357 ieee80211_scan_completed(mvm->hw, &info); in iwl_mvm_report_scan_aborted()
3358 mvm->scan_uid_status[uid] = 0; in iwl_mvm_report_scan_aborted()
3362 /* Sched scan will be restarted by mac80211 in in iwl_mvm_report_scan_aborted()
3366 if (!mvm->fw_restart) in iwl_mvm_report_scan_aborted()
3367 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_report_scan_aborted()
3368 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_DISABLED; in iwl_mvm_report_scan_aborted()
3369 mvm->scan_uid_status[uid] = 0; in iwl_mvm_report_scan_aborted()
3374 mvm->scan_uid_status[uid] = 0; in iwl_mvm_report_scan_aborted()
3379 mvm->scan_uid_status[uid] = 0; in iwl_mvm_report_scan_aborted()
3385 for (i = 0; i < mvm->max_scans; i++) { in iwl_mvm_report_scan_aborted()
3386 if (WARN_ONCE(mvm->scan_uid_status[i], in iwl_mvm_report_scan_aborted()
3387 "UMAC scan UID %d status was not cleaned\n", in iwl_mvm_report_scan_aborted()
3389 mvm->scan_uid_status[i] = 0; in iwl_mvm_report_scan_aborted()
3392 if (mvm->scan_status & IWL_MVM_SCAN_REGULAR) { in iwl_mvm_report_scan_aborted()
3397 cancel_delayed_work(&mvm->scan_timeout_dwork); in iwl_mvm_report_scan_aborted()
3398 ieee80211_scan_completed(mvm->hw, &info); in iwl_mvm_report_scan_aborted()
3401 /* Sched scan will be restarted by mac80211 in in iwl_mvm_report_scan_aborted()
3405 if ((mvm->scan_status & IWL_MVM_SCAN_SCHED) && in iwl_mvm_report_scan_aborted()
3406 !mvm->fw_restart) { in iwl_mvm_report_scan_aborted()
3407 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_report_scan_aborted()
3408 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_DISABLED; in iwl_mvm_report_scan_aborted()
3417 if (!(mvm->scan_status & type)) in iwl_mvm_scan_stop()
3420 if (!test_bit(STATUS_DEVICE_ENABLED, &mvm->trans->status)) { in iwl_mvm_scan_stop()
3427 mvm->scan_status |= type << IWL_MVM_SCAN_STOPPING_SHIFT; in iwl_mvm_scan_stop()
3429 /* Clear the scan status so the next scan requests will in iwl_mvm_scan_stop()
3434 mvm->scan_status &= ~type; in iwl_mvm_scan_stop()
3437 cancel_delayed_work(&mvm->scan_timeout_dwork); in iwl_mvm_scan_stop()
3443 ieee80211_scan_completed(mvm->hw, &info); in iwl_mvm_scan_stop()
3446 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_scan_stop()
3447 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_DISABLED; in iwl_mvm_scan_stop()