Lines Matching +full:out +full:- +full:of +full:- +full:band

8  * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
9 * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
10 * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
11 * Copyright(c) 2018 - 2019 Intel Corporation
14 * it under the terms of version 2 of the GNU General Public License as
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
27 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
31 * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
32 * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
33 * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
34 * Copyright(c) 2018 - 2019 Intel Corporation
41 * * Redistributions of source code must retain the above copyright
42 * notice, this list of conditions and the following disclaimer.
44 * notice, this list of conditions and the following disclaimer in
47 * * Neither the name Intel Corporation nor the names of its
53 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
57 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
59 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
60 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
61 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
70 #include "iwl-io.h"
86 /* adaptive dwell default high band APs number */
88 /* adaptive dwell default low band APs number */
92 /* number of scan channels */
94 /* adaptive dwell number of APs override mask for p2p friendly GO */
96 /* adaptive dwell number of APs override mask for social channels */
98 /* adaptive dwell number of APs override for p2p friendly GO channels */
100 /* adaptive dwell number of APs override for social channels */
132 /* For CDB this is low band scan type, for non-CDB - type. */
155 struct iwl_scan_req_umac *cmd = mvm->scan_cmd; in iwl_mvm_get_scan_req_umac_data()
158 return (void *)&cmd->v8.data; in iwl_mvm_get_scan_req_umac_data()
161 return (void *)&cmd->v7.data; in iwl_mvm_get_scan_req_umac_data()
164 return (void *)&cmd->v6.data; in iwl_mvm_get_scan_req_umac_data()
166 return (void *)&cmd->v1.data; in iwl_mvm_get_scan_req_umac_data()
172 struct iwl_scan_req_umac *cmd = mvm->scan_cmd; in iwl_mvm_get_scan_req_umac_channel()
175 return &cmd->v8.channel; in iwl_mvm_get_scan_req_umac_channel()
178 return &cmd->v7.channel; in iwl_mvm_get_scan_req_umac_channel()
181 return &cmd->v6.channel; in iwl_mvm_get_scan_req_umac_channel()
183 return &cmd->v1.channel; in iwl_mvm_get_scan_req_umac_channel()
188 if (mvm->scan_rx_ant != ANT_NONE) in iwl_mvm_scan_rx_ant()
189 return mvm->scan_rx_ant; in iwl_mvm_scan_rx_ant()
207 iwl_mvm_scan_rate_n_flags(struct iwl_mvm *mvm, enum nl80211_band band, in iwl_mvm_scan_rate_n_flags() argument
212 iwl_mvm_toggle_tx_ant(mvm, &mvm->scan_last_antenna_idx); in iwl_mvm_scan_rate_n_flags()
213 tx_ant = BIT(mvm->scan_last_antenna_idx) << RATE_MCS_ANT_POS; in iwl_mvm_scan_rate_n_flags()
215 if (band == NL80211_BAND_2GHZ && !no_cck) in iwl_mvm_scan_rate_n_flags()
228 if (vif->type != NL80211_IFTYPE_P2P_DEVICE && mvmvif->phy_ctxt && in iwl_mvm_scan_condition_iterator()
229 mvmvif->phy_ctxt->id < NUM_PHY_CTX) in iwl_mvm_scan_condition_iterator()
235 return mvm->tcm.result.global_load; in iwl_mvm_get_traffic_load()
239 iwl_mvm_get_traffic_load_band(struct iwl_mvm *mvm, enum nl80211_band band) in iwl_mvm_get_traffic_load_band() argument
241 return mvm->tcm.result.band_load[band]; in iwl_mvm_get_traffic_load_band()
255 iwl_mvm_vif_from_mac80211(data->current_vif); in iwl_mvm_is_dcm_with_go_iterator()
258 if (vif == data->current_vif) in iwl_mvm_is_dcm_with_go_iterator()
261 if (vif->type == NL80211_IFTYPE_AP && vif->p2p && in iwl_mvm_is_dcm_with_go_iterator()
262 other_mvmvif->phy_ctxt && curr_mvmvif->phy_ctxt && in iwl_mvm_is_dcm_with_go_iterator()
263 other_mvmvif->phy_ctxt->id != curr_mvmvif->phy_ctxt->id) in iwl_mvm_is_dcm_with_go_iterator()
264 data->is_dcm_with_p2p_go = true; in iwl_mvm_is_dcm_with_go_iterator()
275 ieee80211_iterate_active_interfaces_atomic(mvm->hw, in _iwl_mvm_get_scan_type()
282 if (fw_has_api(&mvm->fw->ucode_capa, in _iwl_mvm_get_scan_type()
285 (!vif || vif->type != NL80211_IFTYPE_P2P_DEVICE)) in _iwl_mvm_get_scan_type()
288 /* in case of DCM with GO where BSS DTIM interval < 220msec in _iwl_mvm_get_scan_type()
289 * set all scan requests as fast-balance scan in _iwl_mvm_get_scan_type()
291 if (vif && vif->type == NL80211_IFTYPE_STATION && in _iwl_mvm_get_scan_type()
292 vif->bss_conf.dtim_period < 220) { in _iwl_mvm_get_scan_type()
298 ieee80211_iterate_active_interfaces_atomic(mvm->hw, in _iwl_mvm_get_scan_type()
329 enum nl80211_band band) in iwl_mvm_get_scan_type_band() argument
334 load = iwl_mvm_get_traffic_load_band(mvm, band); in iwl_mvm_get_scan_type_band()
335 low_latency = iwl_mvm_low_latency_band(mvm, band); in iwl_mvm_get_scan_type_band()
343 return fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_rrm_scan_needed()
354 max_probe_len -= 24 + 2; in iwl_mvm_max_scan_ie_fw_cmd_room()
356 /* DS parameter set element is added on 2.4GHZ band if required */ in iwl_mvm_max_scan_ie_fw_cmd_room()
358 max_probe_len -= 3; in iwl_mvm_max_scan_ie_fw_cmd_room()
367 /* TODO: [BUG] This function should return the maximum allowed size of in iwl_mvm_max_scan_ie_len()
369 * in the same command. So the correct implementation of this function in iwl_mvm_max_scan_ie_len()
375 * functions with -ENOBUFS, if a large enough probe will be provided. in iwl_mvm_max_scan_ie_len()
384 struct iwl_lmac_scan_complete_notif *notif = (void *)pkt->data; in iwl_mvm_rx_lmac_scan_iter_complete_notif()
388 notif->status, notif->scanned_channels); in iwl_mvm_rx_lmac_scan_iter_complete_notif()
390 if (mvm->sched_scan_pass_all == SCHED_SCAN_PASS_ALL_FOUND) { in iwl_mvm_rx_lmac_scan_iter_complete_notif()
392 ieee80211_sched_scan_results(mvm->hw); in iwl_mvm_rx_lmac_scan_iter_complete_notif()
393 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_ENABLED; in iwl_mvm_rx_lmac_scan_iter_complete_notif()
401 ieee80211_sched_scan_results(mvm->hw); in iwl_mvm_rx_scan_match_found()
422 struct iwl_periodic_scan_complete *scan_notif = (void *)pkt->data; in iwl_mvm_rx_lmac_scan_complete_notif()
423 bool aborted = (scan_notif->status == IWL_SCAN_OFFLOAD_ABORTED); in iwl_mvm_rx_lmac_scan_complete_notif()
426 * notification during UMAC scans -- warn and ignore it. in iwl_mvm_rx_lmac_scan_complete_notif()
428 if (WARN_ON_ONCE(fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_rx_lmac_scan_complete_notif()
433 lockdep_assert_held(&mvm->mutex); in iwl_mvm_rx_lmac_scan_complete_notif()
440 * simultaneously, but we can't have two different types of in iwl_mvm_rx_lmac_scan_complete_notif()
445 if (mvm->scan_status & IWL_MVM_SCAN_STOPPING_SCHED) { in iwl_mvm_rx_lmac_scan_complete_notif()
446 WARN_ON_ONCE(mvm->scan_status & IWL_MVM_SCAN_STOPPING_REGULAR); in iwl_mvm_rx_lmac_scan_complete_notif()
450 iwl_mvm_ebs_status_str(scan_notif->ebs_status)); in iwl_mvm_rx_lmac_scan_complete_notif()
453 scan_notif->last_schedule_line, in iwl_mvm_rx_lmac_scan_complete_notif()
454 scan_notif->last_schedule_iteration, in iwl_mvm_rx_lmac_scan_complete_notif()
455 __le32_to_cpu(scan_notif->time_after_last_iter)); in iwl_mvm_rx_lmac_scan_complete_notif()
457 mvm->scan_status &= ~IWL_MVM_SCAN_STOPPING_SCHED; in iwl_mvm_rx_lmac_scan_complete_notif()
458 } else if (mvm->scan_status & IWL_MVM_SCAN_STOPPING_REGULAR) { in iwl_mvm_rx_lmac_scan_complete_notif()
461 iwl_mvm_ebs_status_str(scan_notif->ebs_status)); in iwl_mvm_rx_lmac_scan_complete_notif()
463 mvm->scan_status &= ~IWL_MVM_SCAN_STOPPING_REGULAR; in iwl_mvm_rx_lmac_scan_complete_notif()
464 } else if (mvm->scan_status & IWL_MVM_SCAN_SCHED) { in iwl_mvm_rx_lmac_scan_complete_notif()
465 WARN_ON_ONCE(mvm->scan_status & IWL_MVM_SCAN_REGULAR); in iwl_mvm_rx_lmac_scan_complete_notif()
469 iwl_mvm_ebs_status_str(scan_notif->ebs_status)); in iwl_mvm_rx_lmac_scan_complete_notif()
472 scan_notif->last_schedule_line, in iwl_mvm_rx_lmac_scan_complete_notif()
473 scan_notif->last_schedule_iteration, in iwl_mvm_rx_lmac_scan_complete_notif()
474 __le32_to_cpu(scan_notif->time_after_last_iter)); in iwl_mvm_rx_lmac_scan_complete_notif()
476 mvm->scan_status &= ~IWL_MVM_SCAN_SCHED; in iwl_mvm_rx_lmac_scan_complete_notif()
477 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_rx_lmac_scan_complete_notif()
478 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_DISABLED; in iwl_mvm_rx_lmac_scan_complete_notif()
479 } else if (mvm->scan_status & IWL_MVM_SCAN_REGULAR) { in iwl_mvm_rx_lmac_scan_complete_notif()
486 iwl_mvm_ebs_status_str(scan_notif->ebs_status)); in iwl_mvm_rx_lmac_scan_complete_notif()
488 mvm->scan_status &= ~IWL_MVM_SCAN_REGULAR; in iwl_mvm_rx_lmac_scan_complete_notif()
489 ieee80211_scan_completed(mvm->hw, &info); in iwl_mvm_rx_lmac_scan_complete_notif()
490 cancel_delayed_work(&mvm->scan_timeout_dwork); in iwl_mvm_rx_lmac_scan_complete_notif()
497 mvm->last_ebs_successful = in iwl_mvm_rx_lmac_scan_complete_notif()
498 scan_notif->ebs_status == IWL_SCAN_EBS_SUCCESS || in iwl_mvm_rx_lmac_scan_complete_notif()
499 scan_notif->ebs_status == IWL_SCAN_EBS_INACTIVE; in iwl_mvm_rx_lmac_scan_complete_notif()
510 !memcmp(ssid_list->ssid, ssid, ssid_len)) in iwl_ssid_exist()
513 return -1; in iwl_ssid_exist()
529 * iwl_config_sched_scan_profiles() uses the order of these ssids to in iwl_scan_build_ssids()
532 for (i = 0, j = params->n_match_sets - 1; in iwl_scan_build_ssids()
534 i++, j--) { in iwl_scan_build_ssids()
536 if (!params->match_sets[j].ssid.ssid_len) in iwl_scan_build_ssids()
539 ssids[i].len = params->match_sets[j].ssid.ssid_len; in iwl_scan_build_ssids()
540 memcpy(ssids[i].ssid, params->match_sets[j].ssid.ssid, in iwl_scan_build_ssids()
545 for (j = params->n_ssids - 1; in iwl_scan_build_ssids()
547 i++, j--) { in iwl_scan_build_ssids()
548 index = iwl_ssid_exist(params->ssids[j].ssid, in iwl_scan_build_ssids()
549 params->ssids[j].ssid_len, in iwl_scan_build_ssids()
553 ssids[i].len = params->ssids[j].ssid_len; in iwl_scan_build_ssids()
554 memcpy(ssids[i].ssid, params->ssids[j].ssid, in iwl_scan_build_ssids()
573 int max_profiles = iwl_umac_scan_get_max_profiles(mvm->fw); in iwl_mvm_config_sched_scan_profiles()
586 if (WARN_ON(req->n_match_sets > max_profiles)) in iwl_mvm_config_sched_scan_profiles()
587 return -EIO; in iwl_mvm_config_sched_scan_profiles()
589 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_SHORT_BL) in iwl_mvm_config_sched_scan_profiles()
596 return -ENOMEM; in iwl_mvm_config_sched_scan_profiles()
600 ret = -ENOMEM; in iwl_mvm_config_sched_scan_profiles()
613 data = &profile_cfg->data; in iwl_mvm_config_sched_scan_profiles()
615 data = &profile_cfg_v1->data; in iwl_mvm_config_sched_scan_profiles()
619 data->num_profiles = req->n_match_sets; in iwl_mvm_config_sched_scan_profiles()
620 data->active_clients = SCAN_CLIENT_SCHED_SCAN; in iwl_mvm_config_sched_scan_profiles()
621 data->pass_match = SCAN_CLIENT_SCHED_SCAN; in iwl_mvm_config_sched_scan_profiles()
622 data->match_notify = SCAN_CLIENT_SCHED_SCAN; in iwl_mvm_config_sched_scan_profiles()
624 if (!req->n_match_sets || !req->match_sets[0].ssid.ssid_len) in iwl_mvm_config_sched_scan_profiles()
625 data->any_beacon_notify = SCAN_CLIENT_SCHED_SCAN; in iwl_mvm_config_sched_scan_profiles()
627 for (i = 0; i < req->n_match_sets; i++) { in iwl_mvm_config_sched_scan_profiles()
628 profile = &profile_cfg_v1->profiles[i]; in iwl_mvm_config_sched_scan_profiles()
629 profile->ssid_index = i; in iwl_mvm_config_sched_scan_profiles()
631 profile->unicast_cipher = 0xff; in iwl_mvm_config_sched_scan_profiles()
632 profile->auth_alg = 0xff; in iwl_mvm_config_sched_scan_profiles()
633 profile->network_type = IWL_NETWORK_TYPE_ANY; in iwl_mvm_config_sched_scan_profiles()
634 profile->band_selection = IWL_SCAN_OFFLOAD_SELECT_ANY; in iwl_mvm_config_sched_scan_profiles()
635 profile->client_bitmap = SCAN_CLIENT_SCHED_SCAN; in iwl_mvm_config_sched_scan_profiles()
651 if (req->n_match_sets && req->match_sets[0].ssid.ssid_len) { in iwl_mvm_scan_pass_all()
654 req->n_match_sets); in iwl_mvm_scan_pass_all()
655 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_DISABLED; in iwl_mvm_scan_pass_all()
661 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_ENABLED; in iwl_mvm_scan_pass_all()
686 ret = -ENOENT; in iwl_mvm_lmac_scan_abort()
702 if (iwl_fw_lookup_cmd_ver(mvm->fw, LONG_GROUP, in iwl_mvm_scan_fill_tx_cmd()
705 tx_cmd[0].sta_id = mvm->aux_sta.sta_id; in iwl_mvm_scan_fill_tx_cmd()
706 tx_cmd[1].sta_id = mvm->aux_sta.sta_id; in iwl_mvm_scan_fill_tx_cmd()
731 struct iwl_scan_channel_cfg_lmac *channel_cfg = (void *)&cmd->data; in iwl_mvm_lmac_scan_cfg_channels()
736 cpu_to_le16(channels[i]->hw_value); in iwl_mvm_lmac_scan_cfg_channels()
775 memcpy(newpos, ies + offs, len - offs); in iwl_mvm_copy_and_insert_ds_elem()
776 newpos += len - offs; in iwl_mvm_copy_and_insert_ds_elem()
786 pos[1] = WFA_TPC_IE_LEN - 2; in iwl_mvm_add_tpc_report_ie()
792 /* pos[7] - tx power will be inserted by the FW */ in iwl_mvm_add_tpc_report_ie()
802 struct ieee80211_mgmt *frame = (void *)params->preq.buf; in iwl_mvm_build_scan_probe()
804 const u8 *mac_addr = params->flags & NL80211_SCAN_FLAG_RANDOM_ADDR ? in iwl_mvm_build_scan_probe()
805 params->mac_addr : NULL; in iwl_mvm_build_scan_probe()
814 get_random_mask_addr(frame->sa, mac_addr, in iwl_mvm_build_scan_probe()
815 params->mac_addr_mask); in iwl_mvm_build_scan_probe()
817 memcpy(frame->sa, vif->addr, ETH_ALEN); in iwl_mvm_build_scan_probe()
819 frame->frame_control = cpu_to_le16(IEEE80211_STYPE_PROBE_REQ); in iwl_mvm_build_scan_probe()
820 eth_broadcast_addr(frame->da); in iwl_mvm_build_scan_probe()
821 eth_broadcast_addr(frame->bssid); in iwl_mvm_build_scan_probe()
822 frame->seq_ctrl = 0; in iwl_mvm_build_scan_probe()
824 pos = frame->u.probe_req.variable; in iwl_mvm_build_scan_probe()
828 params->preq.mac_header.offset = 0; in iwl_mvm_build_scan_probe()
829 params->preq.mac_header.len = cpu_to_le16(24 + 2); in iwl_mvm_build_scan_probe()
831 /* Insert ds parameter set element on 2.4 GHz band */ in iwl_mvm_build_scan_probe()
833 ies->ies[NL80211_BAND_2GHZ], in iwl_mvm_build_scan_probe()
834 ies->len[NL80211_BAND_2GHZ], in iwl_mvm_build_scan_probe()
836 params->preq.band_data[0].offset = cpu_to_le16(pos - params->preq.buf); in iwl_mvm_build_scan_probe()
837 params->preq.band_data[0].len = cpu_to_le16(newpos - pos); in iwl_mvm_build_scan_probe()
840 memcpy(pos, ies->ies[NL80211_BAND_5GHZ], in iwl_mvm_build_scan_probe()
841 ies->len[NL80211_BAND_5GHZ]); in iwl_mvm_build_scan_probe()
842 params->preq.band_data[1].offset = cpu_to_le16(pos - params->preq.buf); in iwl_mvm_build_scan_probe()
843 params->preq.band_data[1].len = in iwl_mvm_build_scan_probe()
844 cpu_to_le16(ies->len[NL80211_BAND_5GHZ]); in iwl_mvm_build_scan_probe()
845 pos += ies->len[NL80211_BAND_5GHZ]; in iwl_mvm_build_scan_probe()
847 memcpy(pos, ies->common_ies, ies->common_ie_len); in iwl_mvm_build_scan_probe()
848 params->preq.common_data.offset = cpu_to_le16(pos - params->preq.buf); in iwl_mvm_build_scan_probe()
851 !fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_build_scan_probe()
853 iwl_mvm_add_tpc_report_ie(pos + ies->common_ie_len); in iwl_mvm_build_scan_probe()
854 params->preq.common_data.len = cpu_to_le16(ies->common_ie_len + in iwl_mvm_build_scan_probe()
857 params->preq.common_data.len = cpu_to_le16(ies->common_ie_len); in iwl_mvm_build_scan_probe()
865 cmd->active_dwell = IWL_SCAN_DWELL_ACTIVE; in iwl_mvm_scan_lmac_dwell()
866 cmd->passive_dwell = IWL_SCAN_DWELL_PASSIVE; in iwl_mvm_scan_lmac_dwell()
867 cmd->fragmented_dwell = IWL_SCAN_DWELL_FRAGMENTED; in iwl_mvm_scan_lmac_dwell()
868 cmd->extended_dwell = IWL_SCAN_DWELL_EXTENDED; in iwl_mvm_scan_lmac_dwell()
869 cmd->max_out_time = cpu_to_le32(scan_timing[params->type].max_out_time); in iwl_mvm_scan_lmac_dwell()
870 cmd->suspend_time = cpu_to_le32(scan_timing[params->type].suspend_time); in iwl_mvm_scan_lmac_dwell()
871 cmd->scan_prio = cpu_to_le32(IWL_SCAN_PRIORITY_EXT_6); in iwl_mvm_scan_lmac_dwell()
879 (n_channels <= mvm->fw->ucode_capa.n_scan_channels) & in iwl_mvm_scan_fits()
880 (ies->common_ie_len + in iwl_mvm_scan_fits()
881 ies->len[NL80211_BAND_2GHZ] + in iwl_mvm_scan_fits()
882 ies->len[NL80211_BAND_5GHZ] <= in iwl_mvm_scan_fits()
889 const struct iwl_ucode_capabilities *capa = &mvm->fw->ucode_capa; in iwl_mvm_scan_use_ebs()
905 return ((capa->flags & IWL_UCODE_TLV_FLAGS_EBS_SUPPORT) && in iwl_mvm_scan_use_ebs()
906 mvm->last_ebs_successful && IWL_MVM_ENABLE_EBS && in iwl_mvm_scan_use_ebs()
907 vif->type != NL80211_IFTYPE_P2P_DEVICE && in iwl_mvm_scan_use_ebs()
913 return params->n_scan_plans == 1 && in iwl_mvm_is_regular_scan()
914 params->scan_plans[0].iterations == 1; in iwl_mvm_is_regular_scan()
929 if (params->n_ssids == 0) in iwl_mvm_scan_lmac_flags()
932 if (params->n_ssids == 1 && params->ssids[0].ssid_len != 0) in iwl_mvm_scan_lmac_flags()
935 if (iwl_mvm_is_scan_fragmented(params->type)) in iwl_mvm_scan_lmac_flags()
939 fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_scan_lmac_flags()
943 if (params->pass_all) in iwl_mvm_scan_lmac_flags()
949 if (mvm->scan_iter_notif_enabled) in iwl_mvm_scan_lmac_flags()
953 if (mvm->sched_scan_pass_all == SCHED_SCAN_PASS_ALL_ENABLED) in iwl_mvm_scan_lmac_flags()
957 vif->type != NL80211_IFTYPE_P2P_DEVICE && in iwl_mvm_scan_lmac_flags()
958 !iwl_mvm_is_scan_fragmented(params->type)) in iwl_mvm_scan_lmac_flags()
970 p_req->mac_header = src_p_req->mac_header; in iwl_mvm_scan_set_legacy_probe_req()
972 p_req->band_data[i] = src_p_req->band_data[i]; in iwl_mvm_scan_set_legacy_probe_req()
973 p_req->common_data = src_p_req->common_data; in iwl_mvm_scan_set_legacy_probe_req()
974 memcpy(p_req->buf, src_p_req->buf, sizeof(p_req->buf)); in iwl_mvm_scan_set_legacy_probe_req()
980 struct iwl_scan_req_lmac *cmd = mvm->scan_cmd; in iwl_mvm_scan_lmac()
982 (void *)(cmd->data + sizeof(struct iwl_scan_channel_cfg_lmac) * in iwl_mvm_scan_lmac()
983 mvm->fw->ucode_capa.n_scan_channels); in iwl_mvm_scan_lmac()
986 u8 band; in iwl_mvm_scan_lmac() local
988 if (WARN_ON(params->n_scan_plans > IWL_MAX_SCHED_SCAN_PLANS)) in iwl_mvm_scan_lmac()
989 return -EINVAL; in iwl_mvm_scan_lmac()
993 cmd->rx_chain_select = iwl_mvm_scan_rx_chain(mvm); in iwl_mvm_scan_lmac()
994 cmd->iter_num = cpu_to_le32(1); in iwl_mvm_scan_lmac()
995 cmd->n_channels = (u8)params->n_channels; in iwl_mvm_scan_lmac()
997 cmd->delay = cpu_to_le32(params->delay); in iwl_mvm_scan_lmac()
999 cmd->scan_flags = cpu_to_le32(iwl_mvm_scan_lmac_flags(mvm, params, in iwl_mvm_scan_lmac()
1002 band = iwl_mvm_phy_band_from_nl80211(params->channels[0]->band); in iwl_mvm_scan_lmac()
1003 cmd->flags = cpu_to_le32(band); in iwl_mvm_scan_lmac()
1004 cmd->filter_flags = cpu_to_le32(MAC_FILTER_ACCEPT_GRP | in iwl_mvm_scan_lmac()
1006 iwl_mvm_scan_fill_tx_cmd(mvm, cmd->tx_cmd, params->no_cck); in iwl_mvm_scan_lmac()
1007 iwl_scan_build_ssids(params, cmd->direct_scan, &ssid_bitmap); in iwl_mvm_scan_lmac()
1009 /* this API uses bits 1-20 instead of 0-19 */ in iwl_mvm_scan_lmac()
1012 for (i = 0; i < params->n_scan_plans; i++) { in iwl_mvm_scan_lmac()
1014 &params->scan_plans[i]; in iwl_mvm_scan_lmac()
1016 cmd->schedule[i].delay = in iwl_mvm_scan_lmac()
1017 cpu_to_le16(scan_plan->interval); in iwl_mvm_scan_lmac()
1018 cmd->schedule[i].iterations = scan_plan->iterations; in iwl_mvm_scan_lmac()
1019 cmd->schedule[i].full_scan_mul = 1; in iwl_mvm_scan_lmac()
1023 * If the number of iterations of the last scan plan is set to in iwl_mvm_scan_lmac()
1028 if (!cmd->schedule[i - 1].iterations) in iwl_mvm_scan_lmac()
1029 cmd->schedule[i - 1].iterations = 0xff; in iwl_mvm_scan_lmac()
1032 cmd->channel_opt[0].flags = in iwl_mvm_scan_lmac()
1036 cmd->channel_opt[0].non_ebs_ratio = in iwl_mvm_scan_lmac()
1038 cmd->channel_opt[1].flags = in iwl_mvm_scan_lmac()
1042 cmd->channel_opt[1].non_ebs_ratio = in iwl_mvm_scan_lmac()
1046 iwl_mvm_lmac_scan_cfg_channels(mvm, params->channels, in iwl_mvm_scan_lmac()
1047 params->n_channels, ssid_bitmap, cmd); in iwl_mvm_scan_lmac()
1049 iwl_mvm_scan_set_legacy_probe_req(preq, &params->preq); in iwl_mvm_scan_lmac()
1076 struct ieee80211_supported_band *band; in iwl_mvm_scan_config_rates() local
1080 band = &mvm->nvm_data->bands[NL80211_BAND_2GHZ]; in iwl_mvm_scan_config_rates()
1081 for (i = 0; i < band->n_bitrates; i++) in iwl_mvm_scan_config_rates()
1082 rates |= rate_to_scan_rate_flag(band->bitrates[i].hw_value); in iwl_mvm_scan_config_rates()
1083 band = &mvm->nvm_data->bands[NL80211_BAND_5GHZ]; in iwl_mvm_scan_config_rates()
1084 for (i = 0; i < band->n_bitrates; i++) in iwl_mvm_scan_config_rates()
1085 rates |= rate_to_scan_rate_flag(band->bitrates[i].hw_value); in iwl_mvm_scan_config_rates()
1096 dwell->active = IWL_SCAN_DWELL_ACTIVE; in iwl_mvm_fill_scan_dwell()
1097 dwell->passive = IWL_SCAN_DWELL_PASSIVE; in iwl_mvm_fill_scan_dwell()
1098 dwell->fragmented = IWL_SCAN_DWELL_FRAGMENTED; in iwl_mvm_fill_scan_dwell()
1099 dwell->extended = IWL_SCAN_DWELL_EXTENDED; in iwl_mvm_fill_scan_dwell()
1105 struct ieee80211_supported_band *band; in iwl_mvm_fill_channels() local
1108 band = &mvm->nvm_data->bands[NL80211_BAND_2GHZ]; in iwl_mvm_fill_channels()
1109 for (i = 0; i < band->n_channels && j < max_channels; i++, j++) in iwl_mvm_fill_channels()
1110 channels[j] = band->channels[i].hw_value; in iwl_mvm_fill_channels()
1111 band = &mvm->nvm_data->bands[NL80211_BAND_5GHZ]; in iwl_mvm_fill_channels()
1112 for (i = 0; i < band->n_channels && j < max_channels; i++, j++) in iwl_mvm_fill_channels()
1113 channels[j] = band->channels[i].hw_value; in iwl_mvm_fill_channels()
1123 cfg->flags = cpu_to_le32(flags); in iwl_mvm_fill_scan_config_v1()
1124 cfg->tx_chains = cpu_to_le32(iwl_mvm_get_valid_tx_ant(mvm)); in iwl_mvm_fill_scan_config_v1()
1125 cfg->rx_chains = cpu_to_le32(iwl_mvm_scan_rx_ant(mvm)); in iwl_mvm_fill_scan_config_v1()
1126 cfg->legacy_rates = iwl_mvm_scan_config_rates(mvm); in iwl_mvm_fill_scan_config_v1()
1127 cfg->out_of_channel_time = cpu_to_le32(scan_timing[type].max_out_time); in iwl_mvm_fill_scan_config_v1()
1128 cfg->suspend_time = cpu_to_le32(scan_timing[type].suspend_time); in iwl_mvm_fill_scan_config_v1()
1130 iwl_mvm_fill_scan_dwell(mvm, &cfg->dwell); in iwl_mvm_fill_scan_config_v1()
1132 memcpy(&cfg->mac_addr, &mvm->addresses[0].addr, ETH_ALEN); in iwl_mvm_fill_scan_config_v1()
1135 WARN_ON_ONCE(iwl_fw_lookup_cmd_ver(mvm->fw, LONG_GROUP, in iwl_mvm_fill_scan_config_v1()
1138 cfg->bcast_sta_id = mvm->aux_sta.sta_id; in iwl_mvm_fill_scan_config_v1()
1139 cfg->channel_flags = channel_flags; in iwl_mvm_fill_scan_config_v1()
1141 iwl_mvm_fill_channels(mvm, cfg->channel_array, max_channels); in iwl_mvm_fill_scan_config_v1()
1150 cfg->flags = cpu_to_le32(flags); in iwl_mvm_fill_scan_config_v2()
1151 cfg->tx_chains = cpu_to_le32(iwl_mvm_get_valid_tx_ant(mvm)); in iwl_mvm_fill_scan_config_v2()
1152 cfg->rx_chains = cpu_to_le32(iwl_mvm_scan_rx_ant(mvm)); in iwl_mvm_fill_scan_config_v2()
1153 cfg->legacy_rates = iwl_mvm_scan_config_rates(mvm); in iwl_mvm_fill_scan_config_v2()
1163 cfg->out_of_channel_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_fill_scan_config_v2()
1165 cfg->suspend_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_fill_scan_config_v2()
1168 cfg->out_of_channel_time[SCAN_HB_LMAC_IDX] = in iwl_mvm_fill_scan_config_v2()
1170 cfg->suspend_time[SCAN_HB_LMAC_IDX] = in iwl_mvm_fill_scan_config_v2()
1176 cfg->out_of_channel_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_fill_scan_config_v2()
1178 cfg->suspend_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_fill_scan_config_v2()
1182 iwl_mvm_fill_scan_dwell(mvm, &cfg->dwell); in iwl_mvm_fill_scan_config_v2()
1184 memcpy(&cfg->mac_addr, &mvm->addresses[0].addr, ETH_ALEN); in iwl_mvm_fill_scan_config_v2()
1187 WARN_ON_ONCE(iwl_fw_lookup_cmd_ver(mvm->fw, LONG_GROUP, in iwl_mvm_fill_scan_config_v2()
1190 cfg->bcast_sta_id = mvm->aux_sta.sta_id; in iwl_mvm_fill_scan_config_v2()
1191 cfg->channel_flags = channel_flags; in iwl_mvm_fill_scan_config_v2()
1193 iwl_mvm_fill_channels(mvm, cfg->channel_array, max_channels); in iwl_mvm_fill_scan_config_v2()
1206 mvm->nvm_data->bands[NL80211_BAND_2GHZ].n_channels + in iwl_mvm_legacy_config_scan()
1207 mvm->nvm_data->bands[NL80211_BAND_5GHZ].n_channels; in iwl_mvm_legacy_config_scan()
1211 if (WARN_ON(num_channels > mvm->fw->ucode_capa.n_scan_channels)) in iwl_mvm_legacy_config_scan()
1212 num_channels = mvm->fw->ucode_capa.n_scan_channels; in iwl_mvm_legacy_config_scan()
1219 if (type == mvm->scan_type && hb_type == mvm->hb_scan_type) in iwl_mvm_legacy_config_scan()
1223 if (type == mvm->scan_type) in iwl_mvm_legacy_config_scan()
1231 cmd_size += mvm->fw->ucode_capa.n_scan_channels; in iwl_mvm_legacy_config_scan()
1235 return -ENOMEM; in iwl_mvm_legacy_config_scan()
1257 * Check for fragmented scan on LMAC2 - high band. in iwl_mvm_legacy_config_scan()
1258 * LMAC1 - low band is checked above. in iwl_mvm_legacy_config_scan()
1280 mvm->scan_type = type; in iwl_mvm_legacy_config_scan()
1281 mvm->hb_scan_type = hb_type; in iwl_mvm_legacy_config_scan()
1303 if (iwl_fw_lookup_cmd_ver(mvm->fw, LONG_GROUP, in iwl_mvm_config_scan()
1305 cfg.bcast_sta_id = mvm->aux_sta.sta_id; in iwl_mvm_config_scan()
1325 for (i = 0; i < mvm->max_scans; i++) in iwl_mvm_scan_uid_by_status()
1326 if (mvm->scan_uid_status[i] == status) in iwl_mvm_scan_uid_by_status()
1329 return -ENOENT; in iwl_mvm_scan_uid_by_status()
1339 timing = &scan_timing[params->type]; in iwl_mvm_scan_umac_dwell()
1344 cmd->v7.adwell_default_n_aps_social = in iwl_mvm_scan_umac_dwell()
1346 cmd->v7.adwell_default_n_aps = in iwl_mvm_scan_umac_dwell()
1350 cmd->v9.adwell_default_hb_n_aps = in iwl_mvm_scan_umac_dwell()
1355 cmd->v7.adwell_max_budget = in iwl_mvm_scan_umac_dwell()
1357 else if (params->ssids && params->ssids[0].ssid_len) in iwl_mvm_scan_umac_dwell()
1358 cmd->v7.adwell_max_budget = in iwl_mvm_scan_umac_dwell()
1361 cmd->v7.adwell_max_budget = in iwl_mvm_scan_umac_dwell()
1364 cmd->v7.scan_priority = cpu_to_le32(IWL_SCAN_PRIORITY_EXT_6); in iwl_mvm_scan_umac_dwell()
1365 cmd->v7.max_out_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1366 cpu_to_le32(timing->max_out_time); in iwl_mvm_scan_umac_dwell()
1367 cmd->v7.suspend_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1368 cpu_to_le32(timing->suspend_time); in iwl_mvm_scan_umac_dwell()
1371 hb_timing = &scan_timing[params->hb_type]; in iwl_mvm_scan_umac_dwell()
1373 cmd->v7.max_out_time[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1374 cpu_to_le32(hb_timing->max_out_time); in iwl_mvm_scan_umac_dwell()
1375 cmd->v7.suspend_time[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1376 cpu_to_le32(hb_timing->suspend_time); in iwl_mvm_scan_umac_dwell()
1380 cmd->v7.active_dwell = active_dwell; in iwl_mvm_scan_umac_dwell()
1381 cmd->v7.passive_dwell = passive_dwell; in iwl_mvm_scan_umac_dwell()
1382 cmd->v7.fragmented_dwell = IWL_SCAN_DWELL_FRAGMENTED; in iwl_mvm_scan_umac_dwell()
1384 cmd->v8.active_dwell[SCAN_LB_LMAC_IDX] = active_dwell; in iwl_mvm_scan_umac_dwell()
1385 cmd->v8.passive_dwell[SCAN_LB_LMAC_IDX] = passive_dwell; in iwl_mvm_scan_umac_dwell()
1387 cmd->v8.active_dwell[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1389 cmd->v8.passive_dwell[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1394 cmd->v1.extended_dwell = IWL_SCAN_DWELL_EXTENDED; in iwl_mvm_scan_umac_dwell()
1395 cmd->v1.active_dwell = active_dwell; in iwl_mvm_scan_umac_dwell()
1396 cmd->v1.passive_dwell = passive_dwell; in iwl_mvm_scan_umac_dwell()
1397 cmd->v1.fragmented_dwell = IWL_SCAN_DWELL_FRAGMENTED; in iwl_mvm_scan_umac_dwell()
1400 hb_timing = &scan_timing[params->hb_type]; in iwl_mvm_scan_umac_dwell()
1402 cmd->v6.max_out_time[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1403 cpu_to_le32(hb_timing->max_out_time); in iwl_mvm_scan_umac_dwell()
1404 cmd->v6.suspend_time[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1405 cpu_to_le32(hb_timing->suspend_time); in iwl_mvm_scan_umac_dwell()
1409 cmd->v6.scan_priority = in iwl_mvm_scan_umac_dwell()
1411 cmd->v6.max_out_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1412 cpu_to_le32(timing->max_out_time); in iwl_mvm_scan_umac_dwell()
1413 cmd->v6.suspend_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1414 cpu_to_le32(timing->suspend_time); in iwl_mvm_scan_umac_dwell()
1416 cmd->v1.scan_priority = in iwl_mvm_scan_umac_dwell()
1418 cmd->v1.max_out_time = in iwl_mvm_scan_umac_dwell()
1419 cpu_to_le32(timing->max_out_time); in iwl_mvm_scan_umac_dwell()
1420 cmd->v1.suspend_time = in iwl_mvm_scan_umac_dwell()
1421 cpu_to_le32(timing->suspend_time); in iwl_mvm_scan_umac_dwell()
1426 cmd->ooc_priority = cpu_to_le32(IWL_SCAN_PRIORITY_EXT_6); in iwl_mvm_scan_umac_dwell()
1428 cmd->ooc_priority = cpu_to_le32(IWL_SCAN_PRIORITY_EXT_2); in iwl_mvm_scan_umac_dwell()
1446 timing = &scan_timing[params->type]; in iwl_mvm_scan_umac_dwell_v10()
1450 general_params->adwell_default_social_chn = in iwl_mvm_scan_umac_dwell_v10()
1452 general_params->adwell_default_2g = IWL_SCAN_ADWELL_DEFAULT_LB_N_APS; in iwl_mvm_scan_umac_dwell_v10()
1453 general_params->adwell_default_5g = IWL_SCAN_ADWELL_DEFAULT_HB_N_APS; in iwl_mvm_scan_umac_dwell_v10()
1457 general_params->adwell_max_budget = in iwl_mvm_scan_umac_dwell_v10()
1459 else if (params->ssids && params->ssids[0].ssid_len) in iwl_mvm_scan_umac_dwell_v10()
1460 general_params->adwell_max_budget = in iwl_mvm_scan_umac_dwell_v10()
1463 general_params->adwell_max_budget = in iwl_mvm_scan_umac_dwell_v10()
1466 general_params->scan_priority = cpu_to_le32(IWL_SCAN_PRIORITY_EXT_6); in iwl_mvm_scan_umac_dwell_v10()
1467 general_params->max_out_of_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell_v10()
1468 cpu_to_le32(timing->max_out_time); in iwl_mvm_scan_umac_dwell_v10()
1469 general_params->suspend_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell_v10()
1470 cpu_to_le32(timing->suspend_time); in iwl_mvm_scan_umac_dwell_v10()
1472 hb_timing = &scan_timing[params->hb_type]; in iwl_mvm_scan_umac_dwell_v10()
1474 general_params->max_out_of_time[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell_v10()
1475 cpu_to_le32(hb_timing->max_out_time); in iwl_mvm_scan_umac_dwell_v10()
1476 general_params->suspend_time[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell_v10()
1477 cpu_to_le32(hb_timing->suspend_time); in iwl_mvm_scan_umac_dwell_v10()
1479 general_params->active_dwell[SCAN_LB_LMAC_IDX] = active_dwell; in iwl_mvm_scan_umac_dwell_v10()
1480 general_params->passive_dwell[SCAN_LB_LMAC_IDX] = passive_dwell; in iwl_mvm_scan_umac_dwell_v10()
1481 general_params->active_dwell[SCAN_HB_LMAC_IDX] = active_dwell; in iwl_mvm_scan_umac_dwell_v10()
1482 general_params->passive_dwell[SCAN_HB_LMAC_IDX] = passive_dwell; in iwl_mvm_scan_umac_dwell_v10()
1491 u8 band; member
1501 .band = PHY_BAND_24
1509 .band = PHY_BAND_5
1517 .band = PHY_BAND_5
1521 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
1526 return -EINVAL; in iwl_mvm_scan_ch_and_band_to_idx()
1533 if (ch_segment->band != band || in iwl_mvm_scan_ch_and_band_to_idx()
1534 ch_segment->first_channel_id > channel_id || in iwl_mvm_scan_ch_and_band_to_idx()
1535 ch_segment->last_channel_id < channel_id) in iwl_mvm_scan_ch_and_band_to_idx()
1538 ch_offset = (channel_id - ch_segment->first_channel_id) >> in iwl_mvm_scan_ch_and_band_to_idx()
1539 ch_segment->channel_spacing_shift; in iwl_mvm_scan_ch_and_band_to_idx()
1548 return -EINVAL; in iwl_mvm_scan_ch_and_band_to_idx()
1560 u8 ch_id, u8 band, u8 *ch_bitmap, in iwl_mvm_scan_ch_add_n_aps_override() argument
1572 ch_idx = iwl_mvm_scan_ch_and_band_to_idx(ch_id, band); in iwl_mvm_scan_ch_add_n_aps_override()
1594 goto out; in iwl_mvm_scan_ch_n_aps_flag()
1604 goto out; in iwl_mvm_scan_ch_n_aps_flag()
1613 out: in iwl_mvm_scan_ch_n_aps_flag()
1627 channel_cfg[i].v1.channel_num = channels[i]->hw_value; in iwl_mvm_umac_scan_cfg_channels()
1629 enum nl80211_band band = channels[i]->band; in iwl_mvm_umac_scan_cfg_channels() local
1631 channel_cfg[i].v2.band = in iwl_mvm_umac_scan_cfg_channels()
1632 iwl_mvm_phy_band_from_nl80211(band); in iwl_mvm_umac_scan_cfg_channels()
1649 u8 *bitmap = cp->adwell_ch_override_bitmap; in iwl_mvm_umac_scan_cfg_channels_v4()
1650 size_t bitmap_n_entries = ARRAY_SIZE(cp->adwell_ch_override_bitmap); in iwl_mvm_umac_scan_cfg_channels_v4()
1654 enum nl80211_band band = channels[i]->band; in iwl_mvm_umac_scan_cfg_channels_v4() local
1656 &cp->channel_config[i]; in iwl_mvm_umac_scan_cfg_channels_v4()
1658 cfg->flags = cpu_to_le32(flags); in iwl_mvm_umac_scan_cfg_channels_v4()
1659 cfg->v2.channel_num = channels[i]->hw_value; in iwl_mvm_umac_scan_cfg_channels_v4()
1660 cfg->v2.band = iwl_mvm_phy_band_from_nl80211(band); in iwl_mvm_umac_scan_cfg_channels_v4()
1661 cfg->v2.iter_count = 1; in iwl_mvm_umac_scan_cfg_channels_v4()
1662 cfg->v2.iter_interval = 0; in iwl_mvm_umac_scan_cfg_channels_v4()
1665 cfg->v2.channel_num, in iwl_mvm_umac_scan_cfg_channels_v4()
1666 cfg->v2.band, bitmap, in iwl_mvm_umac_scan_cfg_channels_v4()
1681 enum nl80211_band band = channels[i]->band; in iwl_mvm_umac_scan_cfg_channels_v6() local
1682 struct iwl_scan_channel_cfg_umac *cfg = &cp->channel_config[i]; in iwl_mvm_umac_scan_cfg_channels_v6()
1685 cfg->v2.channel_num); in iwl_mvm_umac_scan_cfg_channels_v6()
1687 cfg->flags = cpu_to_le32(flags | n_aps_flag); in iwl_mvm_umac_scan_cfg_channels_v6()
1688 cfg->v2.channel_num = channels[i]->hw_value; in iwl_mvm_umac_scan_cfg_channels_v6()
1689 cfg->v2.band = iwl_mvm_phy_band_from_nl80211(band); in iwl_mvm_umac_scan_cfg_channels_v6()
1690 cfg->v2.iter_count = 1; in iwl_mvm_umac_scan_cfg_channels_v6()
1691 cfg->v2.iter_interval = 0; in iwl_mvm_umac_scan_cfg_channels_v6()
1709 if (iwl_mvm_is_scan_fragmented(params->hb_type)) in iwl_mvm_scan_umac_chan_flags_v2()
1722 if (params->n_ssids == 0) in iwl_mvm_scan_umac_flags_v2()
1725 if (iwl_mvm_is_scan_fragmented(params->type)) in iwl_mvm_scan_umac_flags_v2()
1728 if (iwl_mvm_is_scan_fragmented(params->hb_type)) in iwl_mvm_scan_umac_flags_v2()
1731 if (params->pass_all) in iwl_mvm_scan_umac_flags_v2()
1739 if (params->iter_notif || in iwl_mvm_scan_umac_flags_v2()
1740 mvm->sched_scan_pass_all == SCHED_SCAN_PASS_ALL_ENABLED) in iwl_mvm_scan_umac_flags_v2()
1758 if (params->n_ssids == 0) in iwl_mvm_scan_umac_flags()
1761 if (params->n_ssids == 1 && params->ssids[0].ssid_len != 0) in iwl_mvm_scan_umac_flags()
1764 if (iwl_mvm_is_scan_fragmented(params->type)) in iwl_mvm_scan_umac_flags()
1768 iwl_mvm_is_scan_fragmented(params->hb_type)) in iwl_mvm_scan_umac_flags()
1772 fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_scan_umac_flags()
1776 if (params->pass_all) in iwl_mvm_scan_umac_flags()
1784 if (params->iter_notif) in iwl_mvm_scan_umac_flags()
1788 if (mvm->scan_iter_notif_enabled) in iwl_mvm_scan_umac_flags()
1792 if (mvm->sched_scan_pass_all == SCHED_SCAN_PASS_ALL_ENABLED) in iwl_mvm_scan_umac_flags()
1799 * Extended dwell is relevant only for low band to start with, as it is in iwl_mvm_scan_umac_flags()
1801 * only scan type on low band also for CDB. in iwl_mvm_scan_umac_flags()
1804 vif->type != NL80211_IFTYPE_P2P_DEVICE && in iwl_mvm_scan_umac_flags()
1805 !iwl_mvm_is_scan_fragmented(params->type) && in iwl_mvm_scan_umac_flags()
1811 if ((params->flags & in iwl_mvm_scan_umac_flags()
1819 if ((params->flags & in iwl_mvm_scan_umac_flags()
1823 if ((params->flags & NL80211_SCAN_FLAG_FILS_MAX_CHANNEL_TIME)) in iwl_mvm_scan_umac_flags()
1836 if (WARN_ON(!params->n_scan_plans || in iwl_mvm_fill_scan_sched_params()
1837 params->n_scan_plans > IWL_MAX_SCHED_SCAN_PLANS)) in iwl_mvm_fill_scan_sched_params()
1838 return -EINVAL; in iwl_mvm_fill_scan_sched_params()
1840 for (i = 0; i < params->n_scan_plans; i++) { in iwl_mvm_fill_scan_sched_params()
1842 &params->scan_plans[i]; in iwl_mvm_fill_scan_sched_params()
1844 schedule[i].iter_count = scan_plan->iterations; in iwl_mvm_fill_scan_sched_params()
1846 cpu_to_le16(scan_plan->interval); in iwl_mvm_fill_scan_sched_params()
1850 * If the number of iterations of the last scan plan is set to in iwl_mvm_fill_scan_sched_params()
1855 if (!schedule[params->n_scan_plans - 1].iter_count) in iwl_mvm_fill_scan_sched_params()
1856 schedule[params->n_scan_plans - 1].iter_count = 0xff; in iwl_mvm_fill_scan_sched_params()
1858 *delay = cpu_to_le16(params->delay); in iwl_mvm_fill_scan_sched_params()
1867 struct iwl_scan_req_umac *cmd = mvm->scan_cmd; in iwl_mvm_scan_umac()
1871 mvm->fw->ucode_capa.n_scan_channels; in iwl_mvm_scan_umac()
1886 mvm->scan_uid_status[uid] = type; in iwl_mvm_scan_umac()
1888 cmd->uid = cpu_to_le32(uid); in iwl_mvm_scan_umac()
1890 cmd->general_flags = cpu_to_le16(gen_flags); in iwl_mvm_scan_umac()
1893 cmd->v8.num_of_fragments[SCAN_LB_LMAC_IDX] = in iwl_mvm_scan_umac()
1896 cmd->v8.num_of_fragments[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac()
1899 cmd->v8.general_flags2 = in iwl_mvm_scan_umac()
1903 cmd->scan_start_mac_id = scan_vif->id; in iwl_mvm_scan_umac()
1906 cmd->flags = cpu_to_le32(IWL_UMAC_SCAN_FLAG_PREEMPTIVE); in iwl_mvm_scan_umac()
1923 chan_param->flags = channel_flags; in iwl_mvm_scan_umac()
1924 chan_param->count = params->n_channels; in iwl_mvm_scan_umac()
1926 ret = iwl_mvm_fill_scan_sched_params(params, tail_v2->schedule, in iwl_mvm_scan_umac()
1927 &tail_v2->delay); in iwl_mvm_scan_umac()
1932 tail_v2->preq = params->preq; in iwl_mvm_scan_umac()
1933 direct_scan = tail_v2->direct_scan; in iwl_mvm_scan_umac()
1936 iwl_mvm_scan_set_legacy_probe_req(&tail_v1->preq, in iwl_mvm_scan_umac()
1937 &params->preq); in iwl_mvm_scan_umac()
1938 direct_scan = tail_v1->direct_scan; in iwl_mvm_scan_umac()
1941 iwl_mvm_umac_scan_cfg_channels(mvm, params->channels, in iwl_mvm_scan_umac()
1942 params->n_channels, ssid_bitmap, in iwl_mvm_scan_umac()
1958 gp->flags = cpu_to_le16(gen_flags); in iwl_mvm_scan_umac_fill_general_p_v10()
1961 gp->num_of_fragments[SCAN_LB_LMAC_IDX] = IWL_SCAN_NUM_OF_FRAGS; in iwl_mvm_scan_umac_fill_general_p_v10()
1963 gp->num_of_fragments[SCAN_HB_LMAC_IDX] = IWL_SCAN_NUM_OF_FRAGS; in iwl_mvm_scan_umac_fill_general_p_v10()
1965 gp->scan_start_mac_id = scan_vif->id; in iwl_mvm_scan_umac_fill_general_p_v10()
1972 pp->preq = params->preq; in iwl_mvm_scan_umac_fill_probe_p_v3()
1973 pp->ssid_num = params->n_ssids; in iwl_mvm_scan_umac_fill_probe_p_v3()
1974 iwl_scan_build_ssids(params, pp->direct_scan, NULL); in iwl_mvm_scan_umac_fill_probe_p_v3()
1982 pp->preq = params->preq; in iwl_mvm_scan_umac_fill_probe_p_v4()
1983 iwl_scan_build_ssids(params, pp->direct_scan, bitmap_ssid); in iwl_mvm_scan_umac_fill_probe_p_v4()
1993 cp->flags = iwl_mvm_scan_umac_chan_flags_v2(mvm, params, vif); in iwl_mvm_scan_umac_fill_ch_p_v4()
1994 cp->count = params->n_channels; in iwl_mvm_scan_umac_fill_ch_p_v4()
1995 cp->num_of_aps_override = IWL_SCAN_ADWELL_N_APS_GO_FRIENDLY; in iwl_mvm_scan_umac_fill_ch_p_v4()
1997 iwl_mvm_umac_scan_cfg_channels_v4(mvm, params->channels, cp, in iwl_mvm_scan_umac_fill_ch_p_v4()
1998 params->n_channels, in iwl_mvm_scan_umac_fill_ch_p_v4()
2000 vif->type); in iwl_mvm_scan_umac_fill_ch_p_v4()
2010 cp->flags = iwl_mvm_scan_umac_chan_flags_v2(mvm, params, vif); in iwl_mvm_scan_umac_fill_ch_p_v6()
2011 cp->count = params->n_channels; in iwl_mvm_scan_umac_fill_ch_p_v6()
2012 cp->n_aps_override[0] = IWL_SCAN_ADWELL_N_APS_GO_FRIENDLY; in iwl_mvm_scan_umac_fill_ch_p_v6()
2013 cp->n_aps_override[1] = IWL_SCAN_ADWELL_N_APS_SOCIAL_CHS; in iwl_mvm_scan_umac_fill_ch_p_v6()
2015 iwl_mvm_umac_scan_cfg_channels_v6(mvm, params->channels, cp, in iwl_mvm_scan_umac_fill_ch_p_v6()
2016 params->n_channels, in iwl_mvm_scan_umac_fill_ch_p_v6()
2018 vif->type); in iwl_mvm_scan_umac_fill_ch_p_v6()
2025 struct iwl_scan_req_umac_v12 *cmd = mvm->scan_cmd; in iwl_mvm_scan_umac_v12()
2026 struct iwl_scan_req_params_v12 *scan_p = &cmd->scan_params; in iwl_mvm_scan_umac_v12()
2030 mvm->scan_uid_status[uid] = type; in iwl_mvm_scan_umac_v12()
2032 cmd->ooc_priority = cpu_to_le32(iwl_mvm_scan_umac_ooc_priority(params)); in iwl_mvm_scan_umac_v12()
2033 cmd->uid = cpu_to_le32(uid); in iwl_mvm_scan_umac_v12()
2037 &scan_p->general_params, in iwl_mvm_scan_umac_v12()
2041 scan_p->periodic_params.schedule, in iwl_mvm_scan_umac_v12()
2042 &scan_p->periodic_params.delay); in iwl_mvm_scan_umac_v12()
2046 iwl_mvm_scan_umac_fill_probe_p_v3(params, &scan_p->probe_params); in iwl_mvm_scan_umac_v12()
2048 &scan_p->channel_params, 0); in iwl_mvm_scan_umac_v12()
2057 struct iwl_scan_req_umac_v14 *cmd = mvm->scan_cmd; in iwl_mvm_scan_umac_v14()
2058 struct iwl_scan_req_params_v14 *scan_p = &cmd->scan_params; in iwl_mvm_scan_umac_v14()
2063 mvm->scan_uid_status[uid] = type; in iwl_mvm_scan_umac_v14()
2065 cmd->ooc_priority = cpu_to_le32(iwl_mvm_scan_umac_ooc_priority(params)); in iwl_mvm_scan_umac_v14()
2066 cmd->uid = cpu_to_le32(uid); in iwl_mvm_scan_umac_v14()
2070 &scan_p->general_params, in iwl_mvm_scan_umac_v14()
2074 scan_p->periodic_params.schedule, in iwl_mvm_scan_umac_v14()
2075 &scan_p->periodic_params.delay); in iwl_mvm_scan_umac_v14()
2079 iwl_mvm_scan_umac_fill_probe_p_v4(params, &scan_p->probe_params, in iwl_mvm_scan_umac_v14()
2082 &scan_p->channel_params, bitmap_ssid); in iwl_mvm_scan_umac_v14()
2089 return hweight32(mvm->scan_status & IWL_MVM_SCAN_MASK); in iwl_mvm_num_scans()
2094 bool unified_image = fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_check_running_scans()
2098 * out of possible simultaneous scans and the userspace is in iwl_mvm_check_running_scans()
2100 * return -EBUSY. But if the userspace wants to start a in iwl_mvm_check_running_scans()
2101 * different type of scan, we stop the opposite type to make in iwl_mvm_check_running_scans()
2109 mvm->scan_status & (IWL_MVM_SCAN_SCHED | IWL_MVM_SCAN_NETDETECT)) in iwl_mvm_check_running_scans()
2110 return -EBUSY; in iwl_mvm_check_running_scans()
2112 if (iwl_mvm_num_scans(mvm) < mvm->max_scans) in iwl_mvm_check_running_scans()
2120 if (mvm->scan_status & IWL_MVM_SCAN_REGULAR_MASK) in iwl_mvm_check_running_scans()
2121 return -EBUSY; in iwl_mvm_check_running_scans()
2124 if (mvm->scan_status & IWL_MVM_SCAN_SCHED_MASK) in iwl_mvm_check_running_scans()
2125 return -EBUSY; in iwl_mvm_check_running_scans()
2128 /* For non-unified images, there's no need to stop in iwl_mvm_check_running_scans()
2129 * anything for net-detect since the firmware is in iwl_mvm_check_running_scans()
2136 /* If this is a unified image and we ran out of scans, in iwl_mvm_check_running_scans()
2142 if (mvm->scan_status & IWL_MVM_SCAN_REGULAR_MASK) in iwl_mvm_check_running_scans()
2145 if (mvm->scan_status & IWL_MVM_SCAN_SCHED_MASK) in iwl_mvm_check_running_scans()
2149 * ran out of scans. in iwl_mvm_check_running_scans()
2157 return -EIO; in iwl_mvm_check_running_scans()
2168 IWL_ERR(mvm, "regular scan timed out\n"); in iwl_mvm_scan_timeout_wk()
2170 iwl_force_nmi(mvm->trans); in iwl_mvm_scan_timeout_wk()
2178 params->type = in iwl_mvm_fill_scan_type()
2181 params->hb_type = in iwl_mvm_fill_scan_type()
2185 params->type = iwl_mvm_get_scan_type(mvm, vif); in iwl_mvm_fill_scan_type()
2215 lockdep_assert_held(&mvm->mutex); in iwl_mvm_build_scan_cmd()
2216 memset(mvm->scan_cmd, 0, ksize(mvm->scan_cmd)); in iwl_mvm_build_scan_cmd()
2218 if (!fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) { in iwl_mvm_build_scan_cmd()
2219 hcmd->id = SCAN_OFFLOAD_REQUEST_CMD; in iwl_mvm_build_scan_cmd()
2228 hcmd->id = iwl_cmd_id(SCAN_REQ_UMAC, IWL_ALWAYS_LONG_GROUP, 0); in iwl_mvm_build_scan_cmd()
2230 scan_ver = iwl_fw_lookup_cmd_ver(mvm->fw, IWL_ALWAYS_LONG_GROUP, in iwl_mvm_build_scan_cmd()
2238 if (ver_handler->version != scan_ver) in iwl_mvm_build_scan_cmd()
2241 return ver_handler->handler(mvm, vif, params, type, uid); in iwl_mvm_build_scan_cmd()
2253 .data = { mvm->scan_cmd, }, in iwl_mvm_reg_scan_start()
2260 lockdep_assert_held(&mvm->mutex); in iwl_mvm_reg_scan_start()
2262 if (iwl_mvm_is_lar_supported(mvm) && !mvm->lar_regdom_set) { in iwl_mvm_reg_scan_start()
2264 return -EBUSY; in iwl_mvm_reg_scan_start()
2272 if (WARN_ON(!mvm->scan_cmd)) in iwl_mvm_reg_scan_start()
2273 return -ENOMEM; in iwl_mvm_reg_scan_start()
2275 if (!iwl_mvm_scan_fits(mvm, req->n_ssids, ies, req->n_channels)) in iwl_mvm_reg_scan_start()
2276 return -ENOBUFS; in iwl_mvm_reg_scan_start()
2278 params.n_ssids = req->n_ssids; in iwl_mvm_reg_scan_start()
2279 params.flags = req->flags; in iwl_mvm_reg_scan_start()
2280 params.n_channels = req->n_channels; in iwl_mvm_reg_scan_start()
2282 params.ssids = req->ssids; in iwl_mvm_reg_scan_start()
2283 params.channels = req->channels; in iwl_mvm_reg_scan_start()
2284 params.mac_addr = req->mac_addr; in iwl_mvm_reg_scan_start()
2285 params.mac_addr_mask = req->mac_addr_mask; in iwl_mvm_reg_scan_start()
2286 params.no_cck = req->no_cck; in iwl_mvm_reg_scan_start()
2296 if (req->duration) in iwl_mvm_reg_scan_start()
2321 mvm->scan_status |= IWL_MVM_SCAN_REGULAR; in iwl_mvm_reg_scan_start()
2322 mvm->scan_vif = iwl_mvm_vif_from_mac80211(vif); in iwl_mvm_reg_scan_start()
2324 schedule_delayed_work(&mvm->scan_timeout_dwork, in iwl_mvm_reg_scan_start()
2338 .data = { mvm->scan_cmd, }, in iwl_mvm_sched_scan_start()
2344 lockdep_assert_held(&mvm->mutex); in iwl_mvm_sched_scan_start()
2346 if (iwl_mvm_is_lar_supported(mvm) && !mvm->lar_regdom_set) { in iwl_mvm_sched_scan_start()
2347 IWL_ERR(mvm, "sched-scan while LAR regdomain is not set\n"); in iwl_mvm_sched_scan_start()
2348 return -EBUSY; in iwl_mvm_sched_scan_start()
2356 if (WARN_ON(!mvm->scan_cmd)) in iwl_mvm_sched_scan_start()
2357 return -ENOMEM; in iwl_mvm_sched_scan_start()
2359 if (!iwl_mvm_scan_fits(mvm, req->n_ssids, ies, req->n_channels)) in iwl_mvm_sched_scan_start()
2360 return -ENOBUFS; in iwl_mvm_sched_scan_start()
2362 params.n_ssids = req->n_ssids; in iwl_mvm_sched_scan_start()
2363 params.flags = req->flags; in iwl_mvm_sched_scan_start()
2364 params.n_channels = req->n_channels; in iwl_mvm_sched_scan_start()
2365 params.ssids = req->ssids; in iwl_mvm_sched_scan_start()
2366 params.channels = req->channels; in iwl_mvm_sched_scan_start()
2367 params.mac_addr = req->mac_addr; in iwl_mvm_sched_scan_start()
2368 params.mac_addr_mask = req->mac_addr_mask; in iwl_mvm_sched_scan_start()
2371 params.n_match_sets = req->n_match_sets; in iwl_mvm_sched_scan_start()
2372 params.match_sets = req->match_sets; in iwl_mvm_sched_scan_start()
2373 if (!req->n_scan_plans) in iwl_mvm_sched_scan_start()
2374 return -EINVAL; in iwl_mvm_sched_scan_start()
2376 params.n_scan_plans = req->n_scan_plans; in iwl_mvm_sched_scan_start()
2377 params.scan_plans = req->scan_plans; in iwl_mvm_sched_scan_start()
2381 /* In theory, LMAC scans can handle a 32-bit delay, but since in iwl_mvm_sched_scan_start()
2384 * 16-bit delays), trim it down to 16-bits. in iwl_mvm_sched_scan_start()
2386 if (req->delay > U16_MAX) { in iwl_mvm_sched_scan_start()
2388 "delay value is > 16-bits, set to max possible\n"); in iwl_mvm_sched_scan_start()
2391 params.delay = req->delay; in iwl_mvm_sched_scan_start()
2409 mvm->scan_status |= type; in iwl_mvm_sched_scan_start()
2425 struct iwl_umac_scan_complete *notif = (void *)pkt->data; in iwl_mvm_rx_umac_scan_complete_notif()
2426 u32 uid = __le32_to_cpu(notif->uid); in iwl_mvm_rx_umac_scan_complete_notif()
2427 bool aborted = (notif->status == IWL_SCAN_OFFLOAD_ABORTED); in iwl_mvm_rx_umac_scan_complete_notif()
2429 if (WARN_ON(!(mvm->scan_uid_status[uid] & mvm->scan_status))) in iwl_mvm_rx_umac_scan_complete_notif()
2433 if (mvm->scan_uid_status[uid] == IWL_MVM_SCAN_REGULAR) { in iwl_mvm_rx_umac_scan_complete_notif()
2436 .scan_start_tsf = mvm->scan_start, in iwl_mvm_rx_umac_scan_complete_notif()
2439 memcpy(info.tsf_bssid, mvm->scan_vif->bssid, ETH_ALEN); in iwl_mvm_rx_umac_scan_complete_notif()
2440 ieee80211_scan_completed(mvm->hw, &info); in iwl_mvm_rx_umac_scan_complete_notif()
2441 mvm->scan_vif = NULL; in iwl_mvm_rx_umac_scan_complete_notif()
2442 cancel_delayed_work(&mvm->scan_timeout_dwork); in iwl_mvm_rx_umac_scan_complete_notif()
2444 } else if (mvm->scan_uid_status[uid] == IWL_MVM_SCAN_SCHED) { in iwl_mvm_rx_umac_scan_complete_notif()
2445 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_rx_umac_scan_complete_notif()
2446 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_DISABLED; in iwl_mvm_rx_umac_scan_complete_notif()
2449 mvm->scan_status &= ~mvm->scan_uid_status[uid]; in iwl_mvm_rx_umac_scan_complete_notif()
2452 uid, mvm->scan_uid_status[uid], in iwl_mvm_rx_umac_scan_complete_notif()
2453 notif->status == IWL_SCAN_OFFLOAD_COMPLETED ? in iwl_mvm_rx_umac_scan_complete_notif()
2455 iwl_mvm_ebs_status_str(notif->ebs_status)); in iwl_mvm_rx_umac_scan_complete_notif()
2458 notif->last_schedule, notif->last_iter, in iwl_mvm_rx_umac_scan_complete_notif()
2459 __le32_to_cpu(notif->time_from_last_iter)); in iwl_mvm_rx_umac_scan_complete_notif()
2461 if (notif->ebs_status != IWL_SCAN_EBS_SUCCESS && in iwl_mvm_rx_umac_scan_complete_notif()
2462 notif->ebs_status != IWL_SCAN_EBS_INACTIVE) in iwl_mvm_rx_umac_scan_complete_notif()
2463 mvm->last_ebs_successful = false; in iwl_mvm_rx_umac_scan_complete_notif()
2465 mvm->scan_uid_status[uid] = 0; in iwl_mvm_rx_umac_scan_complete_notif()
2472 struct iwl_umac_scan_iter_complete_notif *notif = (void *)pkt->data; in iwl_mvm_rx_umac_scan_iter_complete_notif()
2474 mvm->scan_start = le64_to_cpu(notif->start_tsf); in iwl_mvm_rx_umac_scan_iter_complete_notif()
2478 notif->status, notif->scanned_channels); in iwl_mvm_rx_umac_scan_iter_complete_notif()
2480 if (mvm->sched_scan_pass_all == SCHED_SCAN_PASS_ALL_FOUND) { in iwl_mvm_rx_umac_scan_iter_complete_notif()
2482 ieee80211_sched_scan_results(mvm->hw); in iwl_mvm_rx_umac_scan_iter_complete_notif()
2483 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_ENABLED; in iwl_mvm_rx_umac_scan_iter_complete_notif()
2488 mvm->scan_start); in iwl_mvm_rx_umac_scan_iter_complete_notif()
2496 lockdep_assert_held(&mvm->mutex); in iwl_mvm_umac_scan_abort()
2499 * checked that this type of scan was running in the generic in iwl_mvm_umac_scan_abort()
2515 mvm->scan_uid_status[uid] = type << IWL_MVM_SCAN_STOPPING_SHIFT; in iwl_mvm_umac_scan_abort()
2527 lockdep_assert_held(&mvm->mutex); in iwl_mvm_scan_stop_wait()
2529 iwl_init_notification_wait(&mvm->notif_wait, &wait_scan_done, in iwl_mvm_scan_stop_wait()
2536 if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) in iwl_mvm_scan_stop_wait()
2543 iwl_remove_notification(&mvm->notif_wait, &wait_scan_done); in iwl_mvm_scan_stop_wait()
2547 return iwl_wait_notification(&mvm->notif_wait, &wait_scan_done, in iwl_mvm_scan_stop_wait()
2568 u8 scan_ver = iwl_fw_lookup_cmd_ver(mvm->fw, IWL_ALWAYS_LONG_GROUP, in iwl_mvm_scan_size()
2586 if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) { in iwl_mvm_scan_size()
2594 mvm->fw->ucode_capa.n_scan_channels + in iwl_mvm_scan_size()
2599 mvm->fw->ucode_capa.n_scan_channels + in iwl_mvm_scan_size()
2609 if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) { in iwl_mvm_report_scan_aborted()
2618 ieee80211_scan_completed(mvm->hw, &info); in iwl_mvm_report_scan_aborted()
2619 mvm->scan_uid_status[uid] = 0; in iwl_mvm_report_scan_aborted()
2622 if (uid >= 0 && !mvm->fw_restart) { in iwl_mvm_report_scan_aborted()
2623 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_report_scan_aborted()
2624 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_DISABLED; in iwl_mvm_report_scan_aborted()
2625 mvm->scan_uid_status[uid] = 0; in iwl_mvm_report_scan_aborted()
2630 mvm->scan_uid_status[uid] = 0; in iwl_mvm_report_scan_aborted()
2635 mvm->scan_uid_status[uid] = 0; in iwl_mvm_report_scan_aborted()
2641 for (i = 0; i < mvm->max_scans; i++) { in iwl_mvm_report_scan_aborted()
2642 if (WARN_ONCE(mvm->scan_uid_status[i], in iwl_mvm_report_scan_aborted()
2645 mvm->scan_uid_status[i] = 0; in iwl_mvm_report_scan_aborted()
2648 if (mvm->scan_status & IWL_MVM_SCAN_REGULAR) { in iwl_mvm_report_scan_aborted()
2653 ieee80211_scan_completed(mvm->hw, &info); in iwl_mvm_report_scan_aborted()
2660 if ((mvm->scan_status & IWL_MVM_SCAN_SCHED) && in iwl_mvm_report_scan_aborted()
2661 !mvm->fw_restart) { in iwl_mvm_report_scan_aborted()
2662 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_report_scan_aborted()
2663 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_DISABLED; in iwl_mvm_report_scan_aborted()
2672 if (!(mvm->scan_status & type)) in iwl_mvm_scan_stop()
2677 goto out; in iwl_mvm_scan_stop()
2682 mvm->scan_status |= type << IWL_MVM_SCAN_STOPPING_SHIFT; in iwl_mvm_scan_stop()
2683 out: in iwl_mvm_scan_stop()
2689 mvm->scan_status &= ~type; in iwl_mvm_scan_stop()
2692 cancel_delayed_work(&mvm->scan_timeout_dwork); in iwl_mvm_scan_stop()
2698 ieee80211_scan_completed(mvm->hw, &info); in iwl_mvm_scan_stop()
2701 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_scan_stop()
2702 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_DISABLED; in iwl_mvm_scan_stop()