Lines Matching +full:umac +full:- +full:reset

1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
3 * Copyright (C) 2012-2014, 2018-2025 Intel Corporation
4 * Copyright (C) 2013-2015 Intel Mobile Communications GmbH
5 * Copyright (C) 2016-2017 Intel Deutschland GmbH
13 #include "iwl-io.h"
14 #include "iwl-utils.h"
83 /* For CDB this is low band scan type, for non-CDB - type. */
113 struct iwl_scan_req_umac *cmd = mvm->scan_cmd; in iwl_mvm_get_scan_req_umac_data()
116 return (void *)&cmd->v8.data; in iwl_mvm_get_scan_req_umac_data()
119 return (void *)&cmd->v7.data; in iwl_mvm_get_scan_req_umac_data()
122 return (void *)&cmd->v6.data; in iwl_mvm_get_scan_req_umac_data()
124 return (void *)&cmd->v1.data; in iwl_mvm_get_scan_req_umac_data()
130 struct iwl_scan_req_umac *cmd = mvm->scan_cmd; in iwl_mvm_get_scan_req_umac_channel()
133 return &cmd->v8.channel; in iwl_mvm_get_scan_req_umac_channel()
136 return &cmd->v7.channel; in iwl_mvm_get_scan_req_umac_channel()
139 return &cmd->v6.channel; in iwl_mvm_get_scan_req_umac_channel()
141 return &cmd->v1.channel; in iwl_mvm_get_scan_req_umac_channel()
146 if (mvm->scan_rx_ant != ANT_NONE) in iwl_mvm_scan_rx_ant()
147 return mvm->scan_rx_ant; in iwl_mvm_scan_rx_ant()
170 iwl_mvm_toggle_tx_ant(mvm, &mvm->scan_last_antenna_idx); in iwl_mvm_scan_rate_n_flags()
171 tx_ant = BIT(mvm->scan_last_antenna_idx) << RATE_MCS_ANT_POS; in iwl_mvm_scan_rate_n_flags()
182 return mvm->tcm.result.global_load; in iwl_mvm_get_traffic_load()
188 return mvm->tcm.result.band_load[band]; in iwl_mvm_get_traffic_load_band()
204 if (vif->type != NL80211_IFTYPE_P2P_DEVICE && in iwl_mvm_scan_iterator()
205 mvmvif->deflink.phy_ctxt && in iwl_mvm_scan_iterator()
206 mvmvif->deflink.phy_ctxt->id < NUM_PHY_CTX) in iwl_mvm_scan_iterator()
207 data->global_cnt += 1; in iwl_mvm_scan_iterator()
209 if (!data->current_vif || vif == data->current_vif) in iwl_mvm_scan_iterator()
212 curr_mvmvif = iwl_mvm_vif_from_mac80211(data->current_vif); in iwl_mvm_scan_iterator()
215 mvmvif->deflink.phy_ctxt && curr_mvmvif->deflink.phy_ctxt && in iwl_mvm_scan_iterator()
216 mvmvif->deflink.phy_ctxt->id != curr_mvmvif->deflink.phy_ctxt->id) in iwl_mvm_scan_iterator()
217 data->is_dcm_with_p2p_go = true; in iwl_mvm_scan_iterator()
235 * Force a non-fragmented scan in that case. in _iwl_mvm_get_scan_type()
240 ieee80211_iterate_active_interfaces_atomic(mvm->hw, in _iwl_mvm_get_scan_type()
248 if (fw_has_api(&mvm->fw->ucode_capa, in _iwl_mvm_get_scan_type()
251 (!vif || vif->type != NL80211_IFTYPE_P2P_DEVICE)) in _iwl_mvm_get_scan_type()
256 * fast-balance scan in _iwl_mvm_get_scan_type()
258 if (vif && vif->type == NL80211_IFTYPE_STATION && in _iwl_mvm_get_scan_type()
299 return fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_rrm_scan_needed()
310 max_probe_len -= 24 + 2 + WFA_TPC_IE_LEN; in iwl_mvm_max_scan_ie_fw_cmd_room()
314 max_probe_len -= 3; in iwl_mvm_max_scan_ie_fw_cmd_room()
331 * functions with -ENOBUFS, if a large enough probe will be provided. in iwl_mvm_max_scan_ie_len()
340 struct iwl_lmac_scan_complete_notif *notif = (void *)pkt->data; in iwl_mvm_rx_lmac_scan_iter_complete_notif()
344 notif->status, notif->scanned_channels); in iwl_mvm_rx_lmac_scan_iter_complete_notif()
346 if (mvm->sched_scan_pass_all == SCHED_SCAN_PASS_ALL_FOUND) { in iwl_mvm_rx_lmac_scan_iter_complete_notif()
348 ieee80211_sched_scan_results(mvm->hw); in iwl_mvm_rx_lmac_scan_iter_complete_notif()
349 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_ENABLED; in iwl_mvm_rx_lmac_scan_iter_complete_notif()
357 ieee80211_sched_scan_results(mvm->hw); in iwl_mvm_rx_scan_match_found()
378 struct iwl_periodic_scan_complete *scan_notif = (void *)pkt->data; in iwl_mvm_rx_lmac_scan_complete_notif()
379 bool aborted = (scan_notif->status == IWL_SCAN_OFFLOAD_ABORTED); in iwl_mvm_rx_lmac_scan_complete_notif()
382 * notification during UMAC scans -- warn and ignore it. in iwl_mvm_rx_lmac_scan_complete_notif()
384 if (WARN_ON_ONCE(fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_rx_lmac_scan_complete_notif()
389 lockdep_assert_held(&mvm->mutex); in iwl_mvm_rx_lmac_scan_complete_notif()
401 if (mvm->scan_status & IWL_MVM_SCAN_STOPPING_SCHED) { in iwl_mvm_rx_lmac_scan_complete_notif()
402 WARN_ON_ONCE(mvm->scan_status & IWL_MVM_SCAN_STOPPING_REGULAR); in iwl_mvm_rx_lmac_scan_complete_notif()
406 iwl_mvm_ebs_status_str(scan_notif->ebs_status)); in iwl_mvm_rx_lmac_scan_complete_notif()
409 scan_notif->last_schedule_line, in iwl_mvm_rx_lmac_scan_complete_notif()
410 scan_notif->last_schedule_iteration, in iwl_mvm_rx_lmac_scan_complete_notif()
411 __le32_to_cpu(scan_notif->time_after_last_iter)); in iwl_mvm_rx_lmac_scan_complete_notif()
413 mvm->scan_status &= ~IWL_MVM_SCAN_STOPPING_SCHED; in iwl_mvm_rx_lmac_scan_complete_notif()
414 } else if (mvm->scan_status & IWL_MVM_SCAN_STOPPING_REGULAR) { in iwl_mvm_rx_lmac_scan_complete_notif()
417 iwl_mvm_ebs_status_str(scan_notif->ebs_status)); in iwl_mvm_rx_lmac_scan_complete_notif()
419 mvm->scan_status &= ~IWL_MVM_SCAN_STOPPING_REGULAR; in iwl_mvm_rx_lmac_scan_complete_notif()
420 } else if (mvm->scan_status & IWL_MVM_SCAN_SCHED) { in iwl_mvm_rx_lmac_scan_complete_notif()
421 WARN_ON_ONCE(mvm->scan_status & IWL_MVM_SCAN_REGULAR); in iwl_mvm_rx_lmac_scan_complete_notif()
425 iwl_mvm_ebs_status_str(scan_notif->ebs_status)); in iwl_mvm_rx_lmac_scan_complete_notif()
428 scan_notif->last_schedule_line, in iwl_mvm_rx_lmac_scan_complete_notif()
429 scan_notif->last_schedule_iteration, in iwl_mvm_rx_lmac_scan_complete_notif()
430 __le32_to_cpu(scan_notif->time_after_last_iter)); in iwl_mvm_rx_lmac_scan_complete_notif()
432 mvm->scan_status &= ~IWL_MVM_SCAN_SCHED; in iwl_mvm_rx_lmac_scan_complete_notif()
433 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_rx_lmac_scan_complete_notif()
434 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_DISABLED; in iwl_mvm_rx_lmac_scan_complete_notif()
435 } else if (mvm->scan_status & IWL_MVM_SCAN_REGULAR) { in iwl_mvm_rx_lmac_scan_complete_notif()
442 iwl_mvm_ebs_status_str(scan_notif->ebs_status)); in iwl_mvm_rx_lmac_scan_complete_notif()
444 mvm->scan_status &= ~IWL_MVM_SCAN_REGULAR; in iwl_mvm_rx_lmac_scan_complete_notif()
445 ieee80211_scan_completed(mvm->hw, &info); in iwl_mvm_rx_lmac_scan_complete_notif()
446 cancel_delayed_work(&mvm->scan_timeout_dwork); in iwl_mvm_rx_lmac_scan_complete_notif()
453 mvm->last_ebs_successful = in iwl_mvm_rx_lmac_scan_complete_notif()
454 scan_notif->ebs_status == IWL_SCAN_EBS_SUCCESS || in iwl_mvm_rx_lmac_scan_complete_notif()
455 scan_notif->ebs_status == IWL_SCAN_EBS_INACTIVE; in iwl_mvm_rx_lmac_scan_complete_notif()
469 return -1; in iwl_ssid_exist()
488 for (i = 0, j = params->n_match_sets - 1; in iwl_scan_build_ssids()
490 i++, j--) { in iwl_scan_build_ssids()
492 if (!params->match_sets[j].ssid.ssid_len) in iwl_scan_build_ssids()
495 ssids[i].len = params->match_sets[j].ssid.ssid_len; in iwl_scan_build_ssids()
496 memcpy(ssids[i].ssid, params->match_sets[j].ssid.ssid, in iwl_scan_build_ssids()
501 for (j = params->n_ssids - 1; in iwl_scan_build_ssids()
503 i++, j--) { in iwl_scan_build_ssids()
504 index = iwl_ssid_exist(params->ssids[j].ssid, in iwl_scan_build_ssids()
505 params->ssids[j].ssid_len, in iwl_scan_build_ssids()
509 ssids[i].len = params->ssids[j].ssid_len; in iwl_scan_build_ssids()
510 memcpy(ssids[i].ssid, params->ssids[j].ssid, in iwl_scan_build_ssids()
529 int max_profiles = iwl_umac_scan_get_max_profiles(mvm->fw); in iwl_mvm_config_sched_scan_profiles()
542 if (WARN_ON(req->n_match_sets > max_profiles)) in iwl_mvm_config_sched_scan_profiles()
543 return -EIO; in iwl_mvm_config_sched_scan_profiles()
545 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_SHORT_BL) in iwl_mvm_config_sched_scan_profiles()
552 return -ENOMEM; in iwl_mvm_config_sched_scan_profiles()
556 ret = -ENOMEM; in iwl_mvm_config_sched_scan_profiles()
569 data = &profile_cfg->data; in iwl_mvm_config_sched_scan_profiles()
571 data = &profile_cfg_v1->data; in iwl_mvm_config_sched_scan_profiles()
575 data->num_profiles = req->n_match_sets; in iwl_mvm_config_sched_scan_profiles()
576 data->active_clients = SCAN_CLIENT_SCHED_SCAN; in iwl_mvm_config_sched_scan_profiles()
577 data->pass_match = SCAN_CLIENT_SCHED_SCAN; in iwl_mvm_config_sched_scan_profiles()
578 data->match_notify = SCAN_CLIENT_SCHED_SCAN; in iwl_mvm_config_sched_scan_profiles()
580 if (!req->n_match_sets || !req->match_sets[0].ssid.ssid_len) in iwl_mvm_config_sched_scan_profiles()
581 data->any_beacon_notify = SCAN_CLIENT_SCHED_SCAN; in iwl_mvm_config_sched_scan_profiles()
583 for (i = 0; i < req->n_match_sets; i++) { in iwl_mvm_config_sched_scan_profiles()
584 profile = &profile_cfg_v1->profiles[i]; in iwl_mvm_config_sched_scan_profiles()
585 profile->ssid_index = i; in iwl_mvm_config_sched_scan_profiles()
587 profile->unicast_cipher = 0xff; in iwl_mvm_config_sched_scan_profiles()
588 profile->auth_alg = IWL_AUTH_ALGO_UNSUPPORTED | in iwl_mvm_config_sched_scan_profiles()
591 profile->network_type = IWL_NETWORK_TYPE_ANY; in iwl_mvm_config_sched_scan_profiles()
592 profile->band_selection = IWL_SCAN_OFFLOAD_SELECT_ANY; in iwl_mvm_config_sched_scan_profiles()
593 profile->client_bitmap = SCAN_CLIENT_SCHED_SCAN; in iwl_mvm_config_sched_scan_profiles()
609 if (req->n_match_sets && req->match_sets[0].ssid.ssid_len) { in iwl_mvm_scan_pass_all()
612 req->n_match_sets); in iwl_mvm_scan_pass_all()
613 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_DISABLED; in iwl_mvm_scan_pass_all()
619 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_ENABLED; in iwl_mvm_scan_pass_all()
644 ret = -ENOENT; in iwl_mvm_lmac_scan_abort()
660 if (!iwl_mvm_has_new_station_api(mvm->fw)) { in iwl_mvm_scan_fill_tx_cmd()
661 tx_cmd[0].sta_id = mvm->aux_sta.sta_id; in iwl_mvm_scan_fill_tx_cmd()
662 tx_cmd[1].sta_id = mvm->aux_sta.sta_id; in iwl_mvm_scan_fill_tx_cmd()
687 struct iwl_scan_channel_cfg_lmac *channel_cfg = (void *)&cmd->data; in iwl_mvm_lmac_scan_cfg_channels()
692 cpu_to_le16(channels[i]->hw_value); in iwl_mvm_lmac_scan_cfg_channels()
731 memcpy(newpos, ies + offs, len - offs); in iwl_mvm_copy_and_insert_ds_elem()
732 newpos += len - offs; in iwl_mvm_copy_and_insert_ds_elem()
740 pos[1] = WFA_TPC_IE_LEN - 2; in iwl_mvm_add_tpc_report_ie()
746 /* pos[7] - tx power will be inserted by the FW */ in iwl_mvm_add_tpc_report_ie()
756 struct ieee80211_mgmt *frame = (void *)params->preq.buf; in iwl_mvm_build_scan_probe()
758 const u8 *mac_addr = params->flags & NL80211_SCAN_FLAG_RANDOM_ADDR ? in iwl_mvm_build_scan_probe()
759 params->mac_addr : NULL; in iwl_mvm_build_scan_probe()
768 get_random_mask_addr(frame->sa, mac_addr, in iwl_mvm_build_scan_probe()
769 params->mac_addr_mask); in iwl_mvm_build_scan_probe()
771 memcpy(frame->sa, vif->addr, ETH_ALEN); in iwl_mvm_build_scan_probe()
773 frame->frame_control = cpu_to_le16(IEEE80211_STYPE_PROBE_REQ); in iwl_mvm_build_scan_probe()
774 eth_broadcast_addr(frame->da); in iwl_mvm_build_scan_probe()
775 ether_addr_copy(frame->bssid, params->bssid); in iwl_mvm_build_scan_probe()
776 frame->seq_ctrl = 0; in iwl_mvm_build_scan_probe()
778 pos = frame->u.probe_req.variable; in iwl_mvm_build_scan_probe()
782 params->preq.mac_header.offset = 0; in iwl_mvm_build_scan_probe()
783 params->preq.mac_header.len = cpu_to_le16(24 + 2); in iwl_mvm_build_scan_probe()
787 ies->ies[NL80211_BAND_2GHZ], in iwl_mvm_build_scan_probe()
788 ies->len[NL80211_BAND_2GHZ], in iwl_mvm_build_scan_probe()
790 params->preq.band_data[0].offset = cpu_to_le16(pos - params->preq.buf); in iwl_mvm_build_scan_probe()
791 params->preq.band_data[0].len = cpu_to_le16(newpos - pos); in iwl_mvm_build_scan_probe()
794 memcpy(pos, ies->ies[NL80211_BAND_5GHZ], in iwl_mvm_build_scan_probe()
795 ies->len[NL80211_BAND_5GHZ]); in iwl_mvm_build_scan_probe()
796 params->preq.band_data[1].offset = cpu_to_le16(pos - params->preq.buf); in iwl_mvm_build_scan_probe()
797 params->preq.band_data[1].len = in iwl_mvm_build_scan_probe()
798 cpu_to_le16(ies->len[NL80211_BAND_5GHZ]); in iwl_mvm_build_scan_probe()
799 pos += ies->len[NL80211_BAND_5GHZ]; in iwl_mvm_build_scan_probe()
801 memcpy(pos, ies->ies[NL80211_BAND_6GHZ], in iwl_mvm_build_scan_probe()
802 ies->len[NL80211_BAND_6GHZ]); in iwl_mvm_build_scan_probe()
803 params->preq.band_data[2].offset = cpu_to_le16(pos - params->preq.buf); in iwl_mvm_build_scan_probe()
804 params->preq.band_data[2].len = in iwl_mvm_build_scan_probe()
805 cpu_to_le16(ies->len[NL80211_BAND_6GHZ]); in iwl_mvm_build_scan_probe()
806 pos += ies->len[NL80211_BAND_6GHZ]; in iwl_mvm_build_scan_probe()
807 memcpy(pos, ies->common_ies, ies->common_ie_len); in iwl_mvm_build_scan_probe()
808 params->preq.common_data.offset = cpu_to_le16(pos - params->preq.buf); in iwl_mvm_build_scan_probe()
811 !fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_build_scan_probe()
813 iwl_mvm_add_tpc_report_ie(pos + ies->common_ie_len); in iwl_mvm_build_scan_probe()
814 params->preq.common_data.len = cpu_to_le16(ies->common_ie_len + in iwl_mvm_build_scan_probe()
817 params->preq.common_data.len = cpu_to_le16(ies->common_ie_len); in iwl_mvm_build_scan_probe()
825 cmd->active_dwell = IWL_SCAN_DWELL_ACTIVE; in iwl_mvm_scan_lmac_dwell()
826 cmd->passive_dwell = IWL_SCAN_DWELL_PASSIVE; in iwl_mvm_scan_lmac_dwell()
827 cmd->fragmented_dwell = IWL_SCAN_DWELL_FRAGMENTED; in iwl_mvm_scan_lmac_dwell()
828 cmd->extended_dwell = IWL_SCAN_DWELL_EXTENDED; in iwl_mvm_scan_lmac_dwell()
829 cmd->max_out_time = cpu_to_le32(scan_timing[params->type].max_out_time); in iwl_mvm_scan_lmac_dwell()
830 cmd->suspend_time = cpu_to_le32(scan_timing[params->type].suspend_time); in iwl_mvm_scan_lmac_dwell()
831 cmd->scan_prio = cpu_to_le32(IWL_SCAN_PRIORITY_EXT_6); in iwl_mvm_scan_lmac_dwell()
839 (n_channels <= mvm->fw->ucode_capa.n_scan_channels) && in iwl_mvm_scan_fits()
840 (ies->common_ie_len + in iwl_mvm_scan_fits()
841 ies->len[NL80211_BAND_2GHZ] + ies->len[NL80211_BAND_5GHZ] + in iwl_mvm_scan_fits()
842 ies->len[NL80211_BAND_6GHZ] <= in iwl_mvm_scan_fits()
849 const struct iwl_ucode_capabilities *capa = &mvm->fw->ucode_capa; in iwl_mvm_scan_use_ebs()
866 return ((capa->flags & IWL_UCODE_TLV_FLAGS_EBS_SUPPORT) && in iwl_mvm_scan_use_ebs()
867 mvm->last_ebs_successful && IWL_MVM_ENABLE_EBS && in iwl_mvm_scan_use_ebs()
868 vif->type != NL80211_IFTYPE_P2P_DEVICE && in iwl_mvm_scan_use_ebs()
875 return params->n_scan_plans == 1 && in iwl_mvm_is_regular_scan()
876 params->scan_plans[0].iterations == 1; in iwl_mvm_is_regular_scan()
891 if (params->n_ssids == 0) in iwl_mvm_scan_lmac_flags()
894 if (params->n_ssids == 1 && params->ssids[0].ssid_len != 0) in iwl_mvm_scan_lmac_flags()
897 if (iwl_mvm_is_scan_fragmented(params->type)) in iwl_mvm_scan_lmac_flags()
901 fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_scan_lmac_flags()
905 if (params->pass_all) in iwl_mvm_scan_lmac_flags()
911 if (mvm->scan_iter_notif_enabled) in iwl_mvm_scan_lmac_flags()
915 if (mvm->sched_scan_pass_all == SCHED_SCAN_PASS_ALL_ENABLED) in iwl_mvm_scan_lmac_flags()
919 vif->type != NL80211_IFTYPE_P2P_DEVICE && in iwl_mvm_scan_lmac_flags()
920 !iwl_mvm_is_scan_fragmented(params->type)) in iwl_mvm_scan_lmac_flags()
932 p_req->mac_header = src_p_req->mac_header; in iwl_mvm_scan_set_legacy_probe_req()
934 p_req->band_data[i] = src_p_req->band_data[i]; in iwl_mvm_scan_set_legacy_probe_req()
935 p_req->common_data = src_p_req->common_data; in iwl_mvm_scan_set_legacy_probe_req()
936 memcpy(p_req->buf, src_p_req->buf, sizeof(p_req->buf)); in iwl_mvm_scan_set_legacy_probe_req()
942 struct iwl_scan_req_lmac *cmd = mvm->scan_cmd; in iwl_mvm_scan_lmac()
944 (void *)(cmd->data + sizeof(struct iwl_scan_channel_cfg_lmac) * in iwl_mvm_scan_lmac()
945 mvm->fw->ucode_capa.n_scan_channels); in iwl_mvm_scan_lmac()
950 if (WARN_ON(params->n_scan_plans > IWL_MAX_SCHED_SCAN_PLANS)) in iwl_mvm_scan_lmac()
951 return -EINVAL; in iwl_mvm_scan_lmac()
955 cmd->rx_chain_select = iwl_mvm_scan_rx_chain(mvm); in iwl_mvm_scan_lmac()
956 cmd->iter_num = cpu_to_le32(1); in iwl_mvm_scan_lmac()
957 cmd->n_channels = (u8)params->n_channels; in iwl_mvm_scan_lmac()
959 cmd->delay = cpu_to_le32(params->delay); in iwl_mvm_scan_lmac()
961 cmd->scan_flags = cpu_to_le32(iwl_mvm_scan_lmac_flags(mvm, params, in iwl_mvm_scan_lmac()
964 band = iwl_mvm_phy_band_from_nl80211(params->channels[0]->band); in iwl_mvm_scan_lmac()
965 cmd->flags = cpu_to_le32(band); in iwl_mvm_scan_lmac()
966 cmd->filter_flags = cpu_to_le32(MAC_FILTER_ACCEPT_GRP | in iwl_mvm_scan_lmac()
968 iwl_mvm_scan_fill_tx_cmd(mvm, cmd->tx_cmd, params->no_cck); in iwl_mvm_scan_lmac()
969 iwl_scan_build_ssids(params, cmd->direct_scan, &ssid_bitmap); in iwl_mvm_scan_lmac()
971 /* this API uses bits 1-20 instead of 0-19 */ in iwl_mvm_scan_lmac()
974 for (i = 0; i < params->n_scan_plans; i++) { in iwl_mvm_scan_lmac()
976 &params->scan_plans[i]; in iwl_mvm_scan_lmac()
978 cmd->schedule[i].delay = in iwl_mvm_scan_lmac()
979 cpu_to_le16(scan_plan->interval); in iwl_mvm_scan_lmac()
980 cmd->schedule[i].iterations = scan_plan->iterations; in iwl_mvm_scan_lmac()
981 cmd->schedule[i].full_scan_mul = 1; in iwl_mvm_scan_lmac()
990 if (!cmd->schedule[i - 1].iterations) in iwl_mvm_scan_lmac()
991 cmd->schedule[i - 1].iterations = 0xff; in iwl_mvm_scan_lmac()
994 cmd->channel_opt[0].flags = in iwl_mvm_scan_lmac()
998 cmd->channel_opt[0].non_ebs_ratio = in iwl_mvm_scan_lmac()
1000 cmd->channel_opt[1].flags = in iwl_mvm_scan_lmac()
1004 cmd->channel_opt[1].non_ebs_ratio = in iwl_mvm_scan_lmac()
1008 iwl_mvm_lmac_scan_cfg_channels(mvm, params->channels, in iwl_mvm_scan_lmac()
1009 params->n_channels, ssid_bitmap, cmd); in iwl_mvm_scan_lmac()
1011 iwl_mvm_scan_set_legacy_probe_req(preq, &params->preq); in iwl_mvm_scan_lmac()
1042 band = &mvm->nvm_data->bands[NL80211_BAND_2GHZ]; in iwl_mvm_scan_config_rates()
1043 for (i = 0; i < band->n_bitrates; i++) in iwl_mvm_scan_config_rates()
1044 rates |= rate_to_scan_rate_flag(band->bitrates[i].hw_value); in iwl_mvm_scan_config_rates()
1045 band = &mvm->nvm_data->bands[NL80211_BAND_5GHZ]; in iwl_mvm_scan_config_rates()
1046 for (i = 0; i < band->n_bitrates; i++) in iwl_mvm_scan_config_rates()
1047 rates |= rate_to_scan_rate_flag(band->bitrates[i].hw_value); in iwl_mvm_scan_config_rates()
1058 dwell->active = IWL_SCAN_DWELL_ACTIVE; in iwl_mvm_fill_scan_dwell()
1059 dwell->passive = IWL_SCAN_DWELL_PASSIVE; in iwl_mvm_fill_scan_dwell()
1060 dwell->fragmented = IWL_SCAN_DWELL_FRAGMENTED; in iwl_mvm_fill_scan_dwell()
1061 dwell->extended = IWL_SCAN_DWELL_EXTENDED; in iwl_mvm_fill_scan_dwell()
1070 band = &mvm->nvm_data->bands[NL80211_BAND_2GHZ]; in iwl_mvm_fill_channels()
1071 for (i = 0; i < band->n_channels && j < max_channels; i++, j++) in iwl_mvm_fill_channels()
1072 channels[j] = band->channels[i].hw_value; in iwl_mvm_fill_channels()
1073 band = &mvm->nvm_data->bands[NL80211_BAND_5GHZ]; in iwl_mvm_fill_channels()
1074 for (i = 0; i < band->n_channels && j < max_channels; i++, j++) in iwl_mvm_fill_channels()
1075 channels[j] = band->channels[i].hw_value; in iwl_mvm_fill_channels()
1085 cfg->flags = cpu_to_le32(flags); in iwl_mvm_fill_scan_config_v1()
1086 cfg->tx_chains = cpu_to_le32(iwl_mvm_get_valid_tx_ant(mvm)); in iwl_mvm_fill_scan_config_v1()
1087 cfg->rx_chains = cpu_to_le32(iwl_mvm_scan_rx_ant(mvm)); in iwl_mvm_fill_scan_config_v1()
1088 cfg->legacy_rates = iwl_mvm_scan_config_rates(mvm); in iwl_mvm_fill_scan_config_v1()
1089 cfg->out_of_channel_time = cpu_to_le32(scan_timing[type].max_out_time); in iwl_mvm_fill_scan_config_v1()
1090 cfg->suspend_time = cpu_to_le32(scan_timing[type].suspend_time); in iwl_mvm_fill_scan_config_v1()
1092 iwl_mvm_fill_scan_dwell(mvm, &cfg->dwell); in iwl_mvm_fill_scan_config_v1()
1094 memcpy(&cfg->mac_addr, &mvm->addresses[0].addr, ETH_ALEN); in iwl_mvm_fill_scan_config_v1()
1097 WARN_ON_ONCE(iwl_mvm_has_new_station_api(mvm->fw)); in iwl_mvm_fill_scan_config_v1()
1099 cfg->bcast_sta_id = mvm->aux_sta.sta_id; in iwl_mvm_fill_scan_config_v1()
1100 cfg->channel_flags = channel_flags; in iwl_mvm_fill_scan_config_v1()
1102 iwl_mvm_fill_channels(mvm, cfg->channel_array, max_channels); in iwl_mvm_fill_scan_config_v1()
1111 cfg->flags = cpu_to_le32(flags); in iwl_mvm_fill_scan_config_v2()
1112 cfg->tx_chains = cpu_to_le32(iwl_mvm_get_valid_tx_ant(mvm)); in iwl_mvm_fill_scan_config_v2()
1113 cfg->rx_chains = cpu_to_le32(iwl_mvm_scan_rx_ant(mvm)); in iwl_mvm_fill_scan_config_v2()
1114 cfg->legacy_rates = iwl_mvm_scan_config_rates(mvm); in iwl_mvm_fill_scan_config_v2()
1124 cfg->out_of_channel_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_fill_scan_config_v2()
1126 cfg->suspend_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_fill_scan_config_v2()
1129 cfg->out_of_channel_time[SCAN_HB_LMAC_IDX] = in iwl_mvm_fill_scan_config_v2()
1131 cfg->suspend_time[SCAN_HB_LMAC_IDX] = in iwl_mvm_fill_scan_config_v2()
1137 cfg->out_of_channel_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_fill_scan_config_v2()
1139 cfg->suspend_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_fill_scan_config_v2()
1143 iwl_mvm_fill_scan_dwell(mvm, &cfg->dwell); in iwl_mvm_fill_scan_config_v2()
1145 memcpy(&cfg->mac_addr, &mvm->addresses[0].addr, ETH_ALEN); in iwl_mvm_fill_scan_config_v2()
1148 WARN_ON_ONCE(iwl_mvm_has_new_station_api(mvm->fw)); in iwl_mvm_fill_scan_config_v2()
1150 cfg->bcast_sta_id = mvm->aux_sta.sta_id; in iwl_mvm_fill_scan_config_v2()
1151 cfg->channel_flags = channel_flags; in iwl_mvm_fill_scan_config_v2()
1153 iwl_mvm_fill_channels(mvm, cfg->channel_array, max_channels); in iwl_mvm_fill_scan_config_v2()
1166 mvm->nvm_data->bands[NL80211_BAND_2GHZ].n_channels + in iwl_mvm_legacy_config_scan()
1167 mvm->nvm_data->bands[NL80211_BAND_5GHZ].n_channels; in iwl_mvm_legacy_config_scan()
1171 if (WARN_ON(num_channels > mvm->fw->ucode_capa.n_scan_channels)) in iwl_mvm_legacy_config_scan()
1172 num_channels = mvm->fw->ucode_capa.n_scan_channels; in iwl_mvm_legacy_config_scan()
1179 if (type == mvm->scan_type && hb_type == mvm->hb_scan_type) in iwl_mvm_legacy_config_scan()
1183 if (type == mvm->scan_type) in iwl_mvm_legacy_config_scan()
1191 cmd_size += mvm->fw->ucode_capa.n_scan_channels; in iwl_mvm_legacy_config_scan()
1195 return -ENOMEM; in iwl_mvm_legacy_config_scan()
1217 * Check for fragmented scan on LMAC2 - high band. in iwl_mvm_legacy_config_scan()
1218 * LMAC1 - low band is checked above. in iwl_mvm_legacy_config_scan()
1236 IWL_DEBUG_SCAN(mvm, "Sending UMAC scan config\n"); in iwl_mvm_legacy_config_scan()
1240 mvm->scan_type = type; in iwl_mvm_legacy_config_scan()
1241 mvm->hb_scan_type = hb_type; in iwl_mvm_legacy_config_scan()
1263 if (!iwl_mvm_has_new_station_api(mvm->fw)) { in iwl_mvm_config_scan()
1264 cfg.bcast_sta_id = mvm->aux_sta.sta_id; in iwl_mvm_config_scan()
1265 } else if (iwl_fw_lookup_cmd_ver(mvm->fw, SCAN_CFG_CMD, 0) < 5) { in iwl_mvm_config_scan()
1276 IWL_DEBUG_SCAN(mvm, "Sending UMAC scan config\n"); in iwl_mvm_config_scan()
1285 for (i = 0; i < mvm->max_scans; i++) in iwl_mvm_scan_uid_by_status()
1286 if (mvm->scan_uid_status[i] == status) in iwl_mvm_scan_uid_by_status()
1289 return -ENOENT; in iwl_mvm_scan_uid_by_status()
1299 timing = &scan_timing[params->type]; in iwl_mvm_scan_umac_dwell()
1304 cmd->v7.adwell_default_n_aps_social = in iwl_mvm_scan_umac_dwell()
1306 cmd->v7.adwell_default_n_aps = in iwl_mvm_scan_umac_dwell()
1310 cmd->v9.adwell_default_hb_n_aps = in iwl_mvm_scan_umac_dwell()
1315 cmd->v7.adwell_max_budget = in iwl_mvm_scan_umac_dwell()
1317 else if (params->n_ssids && params->ssids[0].ssid_len) in iwl_mvm_scan_umac_dwell()
1318 cmd->v7.adwell_max_budget = in iwl_mvm_scan_umac_dwell()
1321 cmd->v7.adwell_max_budget = in iwl_mvm_scan_umac_dwell()
1324 cmd->v7.scan_priority = cpu_to_le32(IWL_SCAN_PRIORITY_EXT_6); in iwl_mvm_scan_umac_dwell()
1325 cmd->v7.max_out_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1326 cpu_to_le32(timing->max_out_time); in iwl_mvm_scan_umac_dwell()
1327 cmd->v7.suspend_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1328 cpu_to_le32(timing->suspend_time); in iwl_mvm_scan_umac_dwell()
1331 hb_timing = &scan_timing[params->hb_type]; in iwl_mvm_scan_umac_dwell()
1333 cmd->v7.max_out_time[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1334 cpu_to_le32(hb_timing->max_out_time); in iwl_mvm_scan_umac_dwell()
1335 cmd->v7.suspend_time[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1336 cpu_to_le32(hb_timing->suspend_time); in iwl_mvm_scan_umac_dwell()
1340 cmd->v7.active_dwell = active_dwell; in iwl_mvm_scan_umac_dwell()
1341 cmd->v7.passive_dwell = passive_dwell; in iwl_mvm_scan_umac_dwell()
1342 cmd->v7.fragmented_dwell = IWL_SCAN_DWELL_FRAGMENTED; in iwl_mvm_scan_umac_dwell()
1344 cmd->v8.active_dwell[SCAN_LB_LMAC_IDX] = active_dwell; in iwl_mvm_scan_umac_dwell()
1345 cmd->v8.passive_dwell[SCAN_LB_LMAC_IDX] = passive_dwell; in iwl_mvm_scan_umac_dwell()
1347 cmd->v8.active_dwell[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1349 cmd->v8.passive_dwell[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1354 cmd->v1.extended_dwell = IWL_SCAN_DWELL_EXTENDED; in iwl_mvm_scan_umac_dwell()
1355 cmd->v1.active_dwell = active_dwell; in iwl_mvm_scan_umac_dwell()
1356 cmd->v1.passive_dwell = passive_dwell; in iwl_mvm_scan_umac_dwell()
1357 cmd->v1.fragmented_dwell = IWL_SCAN_DWELL_FRAGMENTED; in iwl_mvm_scan_umac_dwell()
1360 hb_timing = &scan_timing[params->hb_type]; in iwl_mvm_scan_umac_dwell()
1362 cmd->v6.max_out_time[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1363 cpu_to_le32(hb_timing->max_out_time); in iwl_mvm_scan_umac_dwell()
1364 cmd->v6.suspend_time[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1365 cpu_to_le32(hb_timing->suspend_time); in iwl_mvm_scan_umac_dwell()
1369 cmd->v6.scan_priority = in iwl_mvm_scan_umac_dwell()
1371 cmd->v6.max_out_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1372 cpu_to_le32(timing->max_out_time); in iwl_mvm_scan_umac_dwell()
1373 cmd->v6.suspend_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell()
1374 cpu_to_le32(timing->suspend_time); in iwl_mvm_scan_umac_dwell()
1376 cmd->v1.scan_priority = in iwl_mvm_scan_umac_dwell()
1378 cmd->v1.max_out_time = in iwl_mvm_scan_umac_dwell()
1379 cpu_to_le32(timing->max_out_time); in iwl_mvm_scan_umac_dwell()
1380 cmd->v1.suspend_time = in iwl_mvm_scan_umac_dwell()
1381 cpu_to_le32(timing->suspend_time); in iwl_mvm_scan_umac_dwell()
1386 cmd->ooc_priority = cpu_to_le32(IWL_SCAN_PRIORITY_EXT_6); in iwl_mvm_scan_umac_dwell()
1388 cmd->ooc_priority = cpu_to_le32(IWL_SCAN_PRIORITY_EXT_2); in iwl_mvm_scan_umac_dwell()
1409 timing = &scan_timing[params->type]; in iwl_mvm_scan_umac_dwell_v11()
1413 general_params->adwell_default_social_chn = in iwl_mvm_scan_umac_dwell_v11()
1415 general_params->adwell_default_2g = IWL_SCAN_ADWELL_DEFAULT_LB_N_APS; in iwl_mvm_scan_umac_dwell_v11()
1416 general_params->adwell_default_5g = IWL_SCAN_ADWELL_DEFAULT_HB_N_APS; in iwl_mvm_scan_umac_dwell_v11()
1420 general_params->adwell_max_budget = in iwl_mvm_scan_umac_dwell_v11()
1422 else if (params->n_ssids && params->ssids[0].ssid_len) in iwl_mvm_scan_umac_dwell_v11()
1423 general_params->adwell_max_budget = in iwl_mvm_scan_umac_dwell_v11()
1426 general_params->adwell_max_budget = in iwl_mvm_scan_umac_dwell_v11()
1429 general_params->scan_priority = cpu_to_le32(IWL_SCAN_PRIORITY_EXT_6); in iwl_mvm_scan_umac_dwell_v11()
1430 general_params->max_out_of_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell_v11()
1431 cpu_to_le32(timing->max_out_time); in iwl_mvm_scan_umac_dwell_v11()
1432 general_params->suspend_time[SCAN_LB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell_v11()
1433 cpu_to_le32(timing->suspend_time); in iwl_mvm_scan_umac_dwell_v11()
1435 hb_timing = &scan_timing[params->hb_type]; in iwl_mvm_scan_umac_dwell_v11()
1437 general_params->max_out_of_time[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell_v11()
1438 cpu_to_le32(hb_timing->max_out_time); in iwl_mvm_scan_umac_dwell_v11()
1439 general_params->suspend_time[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac_dwell_v11()
1440 cpu_to_le32(hb_timing->suspend_time); in iwl_mvm_scan_umac_dwell_v11()
1442 general_params->active_dwell[SCAN_LB_LMAC_IDX] = active_dwell; in iwl_mvm_scan_umac_dwell_v11()
1443 general_params->passive_dwell[SCAN_LB_LMAC_IDX] = passive_dwell; in iwl_mvm_scan_umac_dwell_v11()
1444 general_params->active_dwell[SCAN_HB_LMAC_IDX] = active_dwell; in iwl_mvm_scan_umac_dwell_v11()
1445 general_params->passive_dwell[SCAN_HB_LMAC_IDX] = passive_dwell; in iwl_mvm_scan_umac_dwell_v11()
1497 return -EINVAL; in iwl_mvm_scan_ch_and_band_to_idx()
1504 if (ch_segment->band != band || in iwl_mvm_scan_ch_and_band_to_idx()
1505 ch_segment->first_channel_id > channel_id || in iwl_mvm_scan_ch_and_band_to_idx()
1506 ch_segment->last_channel_id < channel_id) in iwl_mvm_scan_ch_and_band_to_idx()
1509 ch_offset = (channel_id - ch_segment->first_channel_id) >> in iwl_mvm_scan_ch_and_band_to_idx()
1510 ch_segment->channel_spacing_shift; in iwl_mvm_scan_ch_and_band_to_idx()
1519 return -EINVAL; in iwl_mvm_scan_ch_and_band_to_idx()
1598 channel_cfg[i].channel_num = channels[i]->hw_value; in iwl_mvm_umac_scan_cfg_channels()
1600 enum nl80211_band band = channels[i]->band; in iwl_mvm_umac_scan_cfg_channels()
1620 u8 *bitmap = cp->adwell_ch_override_bitmap; in iwl_mvm_umac_scan_cfg_channels_v4()
1621 size_t bitmap_n_entries = ARRAY_SIZE(cp->adwell_ch_override_bitmap); in iwl_mvm_umac_scan_cfg_channels_v4()
1625 enum nl80211_band band = channels[i]->band; in iwl_mvm_umac_scan_cfg_channels_v4()
1627 &cp->channel_config[i]; in iwl_mvm_umac_scan_cfg_channels_v4()
1629 cfg->flags = cpu_to_le32(flags); in iwl_mvm_umac_scan_cfg_channels_v4()
1630 cfg->channel_num = channels[i]->hw_value; in iwl_mvm_umac_scan_cfg_channels_v4()
1631 cfg->v2.band = iwl_mvm_phy_band_from_nl80211(band); in iwl_mvm_umac_scan_cfg_channels_v4()
1632 cfg->v2.iter_count = 1; in iwl_mvm_umac_scan_cfg_channels_v4()
1633 cfg->v2.iter_interval = 0; in iwl_mvm_umac_scan_cfg_channels_v4()
1636 cfg->channel_num, in iwl_mvm_umac_scan_cfg_channels_v4()
1637 cfg->v2.band, bitmap, in iwl_mvm_umac_scan_cfg_channels_v4()
1652 enum nl80211_band band = channels[i]->band; in iwl_mvm_umac_scan_cfg_channels_v7()
1653 struct iwl_scan_channel_cfg_umac *cfg = &cp->channel_config[i]; in iwl_mvm_umac_scan_cfg_channels_v7()
1656 channels[i]->hw_value); in iwl_mvm_umac_scan_cfg_channels_v7()
1659 cfg->flags = cpu_to_le32(flags | n_aps_flag); in iwl_mvm_umac_scan_cfg_channels_v7()
1660 cfg->channel_num = channels[i]->hw_value; in iwl_mvm_umac_scan_cfg_channels_v7()
1662 cfg->flags = 0; in iwl_mvm_umac_scan_cfg_channels_v7()
1669 WARN_ON_ONCE(cfg->flags != 0); in iwl_mvm_umac_scan_cfg_channels_v7()
1670 cfg->flags = in iwl_mvm_umac_scan_cfg_channels_v7()
1674 cfg->v2.iter_count = 1; in iwl_mvm_umac_scan_cfg_channels_v7()
1675 cfg->v2.iter_interval = 0; in iwl_mvm_umac_scan_cfg_channels_v7()
1677 cfg->v2.band = iwl_band; in iwl_mvm_umac_scan_cfg_channels_v7()
1679 cfg->flags |= cpu_to_le32((iwl_band << in iwl_mvm_umac_scan_cfg_channels_v7()
1691 params->scan_6ghz_params; in iwl_mvm_umac_scan_fill_6g_chan_list()
1692 bool hidden_supported = fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_umac_scan_fill_6g_chan_list()
1695 for (j = 0; j < params->n_ssids && idex_s < SCAN_SHORT_SSID_MAX_SIZE; in iwl_mvm_umac_scan_fill_6g_chan_list()
1697 if (!params->ssids[j].ssid_len) in iwl_mvm_umac_scan_fill_6g_chan_list()
1700 pp->short_ssid[idex_s] = in iwl_mvm_umac_scan_fill_6g_chan_list()
1701 cpu_to_le32(~crc32_le(~0, params->ssids[j].ssid, in iwl_mvm_umac_scan_fill_6g_chan_list()
1702 params->ssids[j].ssid_len)); in iwl_mvm_umac_scan_fill_6g_chan_list()
1705 pp->direct_scan[idex_s].id = WLAN_EID_SSID; in iwl_mvm_umac_scan_fill_6g_chan_list()
1706 pp->direct_scan[idex_s].len = params->ssids[j].ssid_len; in iwl_mvm_umac_scan_fill_6g_chan_list()
1707 memcpy(pp->direct_scan[idex_s].ssid, params->ssids[j].ssid, in iwl_mvm_umac_scan_fill_6g_chan_list()
1708 params->ssids[j].ssid_len); in iwl_mvm_umac_scan_fill_6g_chan_list()
1721 for (j = 0; j < params->n_6ghz_params; j++) { in iwl_mvm_umac_scan_fill_6g_chan_list()
1727 if (pp->short_ssid[k] == in iwl_mvm_umac_scan_fill_6g_chan_list()
1733 pp->short_ssid[idex_s++] = in iwl_mvm_umac_scan_fill_6g_chan_list()
1740 if (!memcmp(&pp->bssid_array[k], in iwl_mvm_umac_scan_fill_6g_chan_list()
1749 memcpy(&pp->bssid_array[idex_b++], in iwl_mvm_umac_scan_fill_6g_chan_list()
1754 pp->short_ssid_num = idex_s; in iwl_mvm_umac_scan_fill_6g_chan_list()
1755 pp->bssid_num = idex_b; in iwl_mvm_umac_scan_fill_6g_chan_list()
1770 params->scan_6ghz_params; in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1773 for (i = 0, ch_cnt = 0; i < params->n_channels; i++) { in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1775 &cp->channel_config[ch_cnt]; in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1789 if (!cfg80211_channel_is_psc(params->channels[i]) && in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1790 !params->n_6ghz_params && params->n_ssids) in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1793 cfg->channel_num = params->channels[i]->hw_value; in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1795 cfg->v2.band = PHY_BAND_6; in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1797 cfg->flags |= cpu_to_le32(PHY_BAND_6 << in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1800 cfg->v5.iter_count = 1; in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1801 cfg->v5.iter_interval = 0; in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1803 for (u32 j = 0; j < params->n_6ghz_params; j++) { in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1829 * - PSC channel with NO_LISTEN_FLAG on should be treated in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1831 * - Non PSC channel with more than 3 short SSIDs or more in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1833 * - Non PSC Channel with unsolicited probe response and in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1835 * - PSC channel with more than 2 short SSIDs or more than in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1838 * - PSC channel with more than 1 SSID or 3 BSSIDs. in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1839 * - Non PSC channel with more than 2 SSIDs or 6 BSSIDs. in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1840 * - Non PSC channel with unsolicited probe response and in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1843 if (!iwl_mvm_is_scan_fragmented(params->type)) { in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1844 if (!cfg80211_channel_is_psc(params->channels[i]) || in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1857 } else if (cfg80211_channel_is_psc(params->channels[i])) { in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1877 for (u32 j = 0; j < params->n_6ghz_params; j++) { in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1884 k < pp->short_ssid_num && n_s_ssids < max_s_ssids; in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1887 le32_to_cpu(pp->short_ssid[k]) == in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1904 !pp->direct_scan[k].len) in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1908 if (pp->direct_scan[k].len) in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1921 for (k = 0; k < pp->bssid_num; k++) { in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1922 if (!memcmp(&pp->bssid_array[k], in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1938 if (cfg80211_channel_is_psc(params->channels[i]) && in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1947 !cfg80211_channel_is_psc(params->channels[i]))) in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1952 cfg->flags |= cpu_to_le32(flags); in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1954 cfg->v5.psd_20 = psd_20; in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1959 if (params->n_channels > ch_cnt) in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1961 "6GHz: reducing number channels: (%u->%u)\n", in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1962 params->n_channels, ch_cnt); in iwl_mvm_umac_scan_cfg_channels_v7_6g()
1982 iwl_mvm_is_scan_fragmented(params->type)) || in iwl_mvm_scan_umac_chan_flags_v2()
1984 iwl_mvm_is_scan_fragmented(params->hb_type))) in iwl_mvm_scan_umac_chan_flags_v2()
1992 iwl_mvm_is_scan_fragmented(params->type) && params->respect_p2p_go) || in iwl_mvm_scan_umac_chan_flags_v2()
1994 iwl_mvm_is_scan_fragmented(params->hb_type) && in iwl_mvm_scan_umac_chan_flags_v2()
1995 params->respect_p2p_go_hb)) { in iwl_mvm_scan_umac_chan_flags_v2()
2008 &mvm->nvm_data->bands[NL80211_BAND_6GHZ]; in iwl_mvm_scan_6ghz_passive_scan()
2011 params->enable_6ghz_passive = false; in iwl_mvm_scan_6ghz_passive_scan()
2013 if (params->scan_6ghz) in iwl_mvm_scan_6ghz_passive_scan()
2016 if (!fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_scan_6ghz_passive_scan()
2024 if (vif->type != NL80211_IFTYPE_STATION) { in iwl_mvm_scan_6ghz_passive_scan()
2032 * reset or resume flow, or while not associated and a large interval in iwl_mvm_scan_6ghz_passive_scan()
2035 if ((vif->cfg.assoc || in iwl_mvm_scan_6ghz_passive_scan()
2036 time_after(mvm->last_6ghz_passive_scan_jiffies + in iwl_mvm_scan_6ghz_passive_scan()
2038 (time_before(mvm->last_reset_or_resume_time_jiffies + in iwl_mvm_scan_6ghz_passive_scan()
2042 vif->cfg.assoc ? "associated" : in iwl_mvm_scan_6ghz_passive_scan()
2048 if (params->n_channels < IWL_MVM_6GHZ_PASSIVE_SCAN_MIN_CHANS) { in iwl_mvm_scan_6ghz_passive_scan()
2054 for (i = 0; i < params->n_ssids; i++) { in iwl_mvm_scan_6ghz_passive_scan()
2055 if (!params->ssids[i].ssid_len) in iwl_mvm_scan_6ghz_passive_scan()
2060 if (i == params->n_ssids) { in iwl_mvm_scan_6ghz_passive_scan()
2066 if (!sband || !sband->n_channels) { in iwl_mvm_scan_6ghz_passive_scan()
2072 for (i = 0, n_disabled = 0; i < sband->n_channels; i++) { in iwl_mvm_scan_6ghz_passive_scan()
2073 if (sband->channels[i].flags & (IEEE80211_CHAN_DISABLED)) in iwl_mvm_scan_6ghz_passive_scan()
2081 if (n_disabled != sband->n_channels) { in iwl_mvm_scan_6ghz_passive_scan()
2089 params->enable_6ghz_passive = true; in iwl_mvm_scan_6ghz_passive_scan()
2105 if (params->n_ssids == 0) in iwl_mvm_scan_umac_flags_v2()
2107 else if (params->n_ssids == 1 && params->ssids[0].ssid_len) in iwl_mvm_scan_umac_flags_v2()
2110 if (iwl_mvm_is_scan_fragmented(params->type)) in iwl_mvm_scan_umac_flags_v2()
2113 if (iwl_mvm_is_scan_fragmented(params->hb_type)) in iwl_mvm_scan_umac_flags_v2()
2116 if (params->pass_all) in iwl_mvm_scan_umac_flags_v2()
2124 if (params->iter_notif || in iwl_mvm_scan_umac_flags_v2()
2125 mvm->sched_scan_pass_all == SCHED_SCAN_PASS_ALL_ENABLED) in iwl_mvm_scan_umac_flags_v2()
2135 params->flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ) in iwl_mvm_scan_umac_flags_v2()
2138 if (params->enable_6ghz_passive) in iwl_mvm_scan_umac_flags_v2()
2142 (params->flags & (NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP | in iwl_mvm_scan_umac_flags_v2()
2158 if (params->respect_p2p_go) in iwl_mvm_scan_umac_flags2()
2160 if (params->respect_p2p_go_hb) in iwl_mvm_scan_umac_flags2()
2163 if (params->respect_p2p_go) in iwl_mvm_scan_umac_flags2()
2168 if (params->scan_6ghz && in iwl_mvm_scan_umac_flags2()
2169 fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_scan_umac_flags2()
2173 /* Passive and AP interface -> ACS (automatic channel selection) */ in iwl_mvm_scan_umac_flags2()
2176 iwl_fw_lookup_notif_ver(mvm->fw, SCAN_GROUP, CHANNEL_SURVEY_NOTIF, in iwl_mvm_scan_umac_flags2()
2189 if (params->n_ssids == 0) in iwl_mvm_scan_umac_flags()
2192 if (params->n_ssids == 1 && params->ssids[0].ssid_len != 0) in iwl_mvm_scan_umac_flags()
2195 if (iwl_mvm_is_scan_fragmented(params->type)) in iwl_mvm_scan_umac_flags()
2199 iwl_mvm_is_scan_fragmented(params->hb_type)) in iwl_mvm_scan_umac_flags()
2203 fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_scan_umac_flags()
2207 if (params->pass_all) in iwl_mvm_scan_umac_flags()
2215 if (params->iter_notif) in iwl_mvm_scan_umac_flags()
2219 if (mvm->scan_iter_notif_enabled) in iwl_mvm_scan_umac_flags()
2223 if (mvm->sched_scan_pass_all == SCHED_SCAN_PASS_ALL_ENABLED) in iwl_mvm_scan_umac_flags()
2235 vif->type != NL80211_IFTYPE_P2P_DEVICE && in iwl_mvm_scan_umac_flags()
2236 !iwl_mvm_is_scan_fragmented(params->type) && in iwl_mvm_scan_umac_flags()
2242 if ((params->flags & in iwl_mvm_scan_umac_flags()
2250 if ((params->flags & in iwl_mvm_scan_umac_flags()
2254 if ((params->flags & NL80211_SCAN_FLAG_FILS_MAX_CHANNEL_TIME)) in iwl_mvm_scan_umac_flags()
2267 if (WARN_ON(!params->n_scan_plans || in iwl_mvm_fill_scan_sched_params()
2268 params->n_scan_plans > IWL_MAX_SCHED_SCAN_PLANS)) in iwl_mvm_fill_scan_sched_params()
2269 return -EINVAL; in iwl_mvm_fill_scan_sched_params()
2271 for (i = 0; i < params->n_scan_plans; i++) { in iwl_mvm_fill_scan_sched_params()
2273 &params->scan_plans[i]; in iwl_mvm_fill_scan_sched_params()
2275 schedule[i].iter_count = scan_plan->iterations; in iwl_mvm_fill_scan_sched_params()
2277 cpu_to_le16(scan_plan->interval); in iwl_mvm_fill_scan_sched_params()
2286 if (!schedule[params->n_scan_plans - 1].iter_count) in iwl_mvm_fill_scan_sched_params()
2287 schedule[params->n_scan_plans - 1].iter_count = 0xff; in iwl_mvm_fill_scan_sched_params()
2289 *delay = cpu_to_le16(params->delay); in iwl_mvm_fill_scan_sched_params()
2298 struct iwl_scan_req_umac *cmd = mvm->scan_cmd; in iwl_mvm_scan_umac()
2302 mvm->fw->ucode_capa.n_scan_channels; in iwl_mvm_scan_umac()
2317 cmd->uid = cpu_to_le32(uid); in iwl_mvm_scan_umac()
2319 cmd->general_flags = cpu_to_le16(gen_flags); in iwl_mvm_scan_umac()
2322 cmd->v8.num_of_fragments[SCAN_LB_LMAC_IDX] = in iwl_mvm_scan_umac()
2325 cmd->v8.num_of_fragments[SCAN_HB_LMAC_IDX] = in iwl_mvm_scan_umac()
2328 cmd->v8.general_flags2 = in iwl_mvm_scan_umac()
2332 cmd->scan_start_mac_id = scan_vif->id; in iwl_mvm_scan_umac()
2335 cmd->flags = cpu_to_le32(IWL_UMAC_SCAN_FLAG_PREEMPTIVE); in iwl_mvm_scan_umac()
2352 chan_param->flags = channel_flags; in iwl_mvm_scan_umac()
2353 chan_param->count = params->n_channels; in iwl_mvm_scan_umac()
2355 ret = iwl_mvm_fill_scan_sched_params(params, tail_v2->schedule, in iwl_mvm_scan_umac()
2356 &tail_v2->delay); in iwl_mvm_scan_umac()
2361 tail_v2->preq = params->preq; in iwl_mvm_scan_umac()
2362 direct_scan = tail_v2->direct_scan; in iwl_mvm_scan_umac()
2365 iwl_mvm_scan_set_legacy_probe_req(&tail_v1->preq, in iwl_mvm_scan_umac()
2366 &params->preq); in iwl_mvm_scan_umac()
2367 direct_scan = tail_v1->direct_scan; in iwl_mvm_scan_umac()
2370 iwl_mvm_umac_scan_cfg_channels(mvm, params->channels, in iwl_mvm_scan_umac()
2371 params->n_channels, ssid_bitmap, in iwl_mvm_scan_umac()
2391 gp->flags = cpu_to_le16(gen_flags); in iwl_mvm_scan_umac_fill_general_p_v12()
2392 gp->flags2 = gen_flags2; in iwl_mvm_scan_umac_fill_general_p_v12()
2395 gp->num_of_fragments[SCAN_LB_LMAC_IDX] = IWL_SCAN_NUM_OF_FRAGS; in iwl_mvm_scan_umac_fill_general_p_v12()
2397 gp->num_of_fragments[SCAN_HB_LMAC_IDX] = IWL_SCAN_NUM_OF_FRAGS; in iwl_mvm_scan_umac_fill_general_p_v12()
2399 mvm->scan_link_id = 0; in iwl_mvm_scan_umac_fill_general_p_v12()
2402 gp->scan_start_mac_or_link_id = scan_vif->id; in iwl_mvm_scan_umac_fill_general_p_v12()
2405 scan_vif->link[params->tsf_report_link_id]; in iwl_mvm_scan_umac_fill_general_p_v12()
2407 mvm->scan_link_id = params->tsf_report_link_id; in iwl_mvm_scan_umac_fill_general_p_v12()
2409 gp->scan_start_mac_or_link_id = link_info->fw_link_id; in iwl_mvm_scan_umac_fill_general_p_v12()
2417 pp->preq = params->preq; in iwl_mvm_scan_umac_fill_probe_p_v3()
2418 pp->ssid_num = params->n_ssids; in iwl_mvm_scan_umac_fill_probe_p_v3()
2419 iwl_scan_build_ssids(params, pp->direct_scan, NULL); in iwl_mvm_scan_umac_fill_probe_p_v3()
2427 pp->preq = params->preq; in iwl_mvm_scan_umac_fill_probe_p_v4()
2428 iwl_scan_build_ssids(params, pp->direct_scan, bitmap_ssid); in iwl_mvm_scan_umac_fill_probe_p_v4()
2438 cp->flags = iwl_mvm_scan_umac_chan_flags_v2(mvm, params, vif); in iwl_mvm_scan_umac_fill_ch_p_v4()
2439 cp->count = params->n_channels; in iwl_mvm_scan_umac_fill_ch_p_v4()
2440 cp->num_of_aps_override = IWL_SCAN_ADWELL_N_APS_GO_FRIENDLY; in iwl_mvm_scan_umac_fill_ch_p_v4()
2442 iwl_mvm_umac_scan_cfg_channels_v4(mvm, params->channels, cp, in iwl_mvm_scan_umac_fill_ch_p_v4()
2443 params->n_channels, in iwl_mvm_scan_umac_fill_ch_p_v4()
2445 vif->type); in iwl_mvm_scan_umac_fill_ch_p_v4()
2456 cp->flags = iwl_mvm_scan_umac_chan_flags_v2(mvm, params, vif); in iwl_mvm_scan_umac_fill_ch_p_v7()
2457 cp->count = params->n_channels; in iwl_mvm_scan_umac_fill_ch_p_v7()
2458 cp->n_aps_override[0] = IWL_SCAN_ADWELL_N_APS_GO_FRIENDLY; in iwl_mvm_scan_umac_fill_ch_p_v7()
2459 cp->n_aps_override[1] = IWL_SCAN_ADWELL_N_APS_SOCIAL_CHS; in iwl_mvm_scan_umac_fill_ch_p_v7()
2461 iwl_mvm_umac_scan_cfg_channels_v7(mvm, params->channels, cp, in iwl_mvm_scan_umac_fill_ch_p_v7()
2462 params->n_channels, in iwl_mvm_scan_umac_fill_ch_p_v7()
2464 vif->type, version); in iwl_mvm_scan_umac_fill_ch_p_v7()
2466 if (params->enable_6ghz_passive) { in iwl_mvm_scan_umac_fill_ch_p_v7()
2468 &mvm->nvm_data->bands[NL80211_BAND_6GHZ]; in iwl_mvm_scan_umac_fill_ch_p_v7()
2471 for (i = 0; i < sband->n_channels; i++) { in iwl_mvm_scan_umac_fill_ch_p_v7()
2473 &sband->channels[i]; in iwl_mvm_scan_umac_fill_ch_p_v7()
2476 &cp->channel_config[cp->count]; in iwl_mvm_scan_umac_fill_ch_p_v7()
2481 cfg->channel_num = channel->hw_value; in iwl_mvm_scan_umac_fill_ch_p_v7()
2482 cfg->v5.iter_count = 1; in iwl_mvm_scan_umac_fill_ch_p_v7()
2483 cfg->v5.iter_interval = 0; in iwl_mvm_scan_umac_fill_ch_p_v7()
2486 cfg->flags = 0; in iwl_mvm_scan_umac_fill_ch_p_v7()
2487 cfg->v2.band = PHY_BAND_6; in iwl_mvm_scan_umac_fill_ch_p_v7()
2489 cfg->flags = cpu_to_le32(PHY_BAND_6 << in iwl_mvm_scan_umac_fill_ch_p_v7()
2491 cfg->v5.psd_20 = in iwl_mvm_scan_umac_fill_ch_p_v7()
2494 cp->count++; in iwl_mvm_scan_umac_fill_ch_p_v7()
2503 struct iwl_scan_req_umac_v12 *cmd = mvm->scan_cmd; in iwl_mvm_scan_umac_v12()
2504 struct iwl_scan_req_params_v12 *scan_p = &cmd->scan_params; in iwl_mvm_scan_umac_v12()
2508 cmd->ooc_priority = cpu_to_le32(iwl_mvm_scan_umac_ooc_priority(type)); in iwl_mvm_scan_umac_v12()
2509 cmd->uid = cpu_to_le32(uid); in iwl_mvm_scan_umac_v12()
2513 &scan_p->general_params, in iwl_mvm_scan_umac_v12()
2517 scan_p->periodic_params.schedule, in iwl_mvm_scan_umac_v12()
2518 &scan_p->periodic_params.delay); in iwl_mvm_scan_umac_v12()
2522 iwl_mvm_scan_umac_fill_probe_p_v3(params, &scan_p->probe_params); in iwl_mvm_scan_umac_v12()
2524 &scan_p->channel_params, 0); in iwl_mvm_scan_umac_v12()
2534 struct iwl_scan_req_umac_v17 *cmd = mvm->scan_cmd; in iwl_mvm_scan_umac_v14_and_above()
2535 struct iwl_scan_req_params_v17 *scan_p = &cmd->scan_params; in iwl_mvm_scan_umac_v14_and_above()
2536 struct iwl_scan_channel_params_v7 *cp = &scan_p->channel_params; in iwl_mvm_scan_umac_v14_and_above()
2537 struct iwl_scan_probe_params_v4 *pb = &scan_p->probe_params; in iwl_mvm_scan_umac_v14_and_above()
2543 cmd->ooc_priority = cpu_to_le32(iwl_mvm_scan_umac_ooc_priority(type)); in iwl_mvm_scan_umac_v14_and_above()
2544 cmd->uid = cpu_to_le32(uid); in iwl_mvm_scan_umac_v14_and_above()
2555 &scan_p->general_params, in iwl_mvm_scan_umac_v14_and_above()
2559 scan_p->periodic_params.schedule, in iwl_mvm_scan_umac_v14_and_above()
2560 &scan_p->periodic_params.delay); in iwl_mvm_scan_umac_v14_and_above()
2564 if (!params->scan_6ghz) { in iwl_mvm_scan_umac_v14_and_above()
2566 &scan_p->probe_params, in iwl_mvm_scan_umac_v14_and_above()
2569 &scan_p->channel_params, in iwl_mvm_scan_umac_v14_and_above()
2574 pb->preq = params->preq; in iwl_mvm_scan_umac_v14_and_above()
2577 cp->flags = iwl_mvm_scan_umac_chan_flags_v2(mvm, params, vif); in iwl_mvm_scan_umac_v14_and_above()
2578 cp->n_aps_override[0] = IWL_SCAN_ADWELL_N_APS_GO_FRIENDLY; in iwl_mvm_scan_umac_v14_and_above()
2579 cp->n_aps_override[1] = IWL_SCAN_ADWELL_N_APS_SOCIAL_CHS; in iwl_mvm_scan_umac_v14_and_above()
2583 cp->count = iwl_mvm_umac_scan_cfg_channels_v7_6g(mvm, params, in iwl_mvm_scan_umac_v14_and_above()
2584 params->n_channels, in iwl_mvm_scan_umac_v14_and_above()
2585 pb, cp, vif->type, in iwl_mvm_scan_umac_v14_and_above()
2587 if (!cp->count) in iwl_mvm_scan_umac_v14_and_above()
2588 return -EINVAL; in iwl_mvm_scan_umac_v14_and_above()
2590 if (!params->n_ssids || in iwl_mvm_scan_umac_v14_and_above()
2591 (params->n_ssids == 1 && !params->ssids[0].ssid_len)) in iwl_mvm_scan_umac_v14_and_above()
2592 cp->flags |= IWL_SCAN_CHANNEL_FLAG_6G_PSC_NO_FILTER; in iwl_mvm_scan_umac_v14_and_above()
2627 return hweight32(mvm->scan_status & IWL_MVM_SCAN_MASK); in iwl_mvm_num_scans()
2632 bool unified_image = fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_check_running_scans()
2638 * return -EBUSY. But if the userspace wants to start a in iwl_mvm_check_running_scans()
2647 mvm->scan_status & (IWL_MVM_SCAN_SCHED | IWL_MVM_SCAN_NETDETECT)) in iwl_mvm_check_running_scans()
2648 return -EBUSY; in iwl_mvm_check_running_scans()
2650 if (iwl_mvm_num_scans(mvm) < mvm->max_scans) in iwl_mvm_check_running_scans()
2658 if (mvm->scan_status & IWL_MVM_SCAN_REGULAR_MASK) in iwl_mvm_check_running_scans()
2659 return -EBUSY; in iwl_mvm_check_running_scans()
2662 if (mvm->scan_status & IWL_MVM_SCAN_SCHED_MASK) in iwl_mvm_check_running_scans()
2663 return -EBUSY; in iwl_mvm_check_running_scans()
2666 /* For non-unified images, there's no need to stop in iwl_mvm_check_running_scans()
2667 * anything for net-detect since the firmware is in iwl_mvm_check_running_scans()
2680 if (mvm->scan_status & IWL_MVM_SCAN_REGULAR_MASK) in iwl_mvm_check_running_scans()
2683 if (mvm->scan_status & IWL_MVM_SCAN_SCHED_MASK) in iwl_mvm_check_running_scans()
2695 return -EIO; in iwl_mvm_check_running_scans()
2708 iwl_force_nmi(mvm->trans); in iwl_mvm_scan_timeout_wk()
2716 params->type = in iwl_mvm_fill_scan_type()
2719 params->hb_type = in iwl_mvm_fill_scan_type()
2723 params->type = iwl_mvm_get_scan_type(mvm, vif); in iwl_mvm_fill_scan_type()
2757 mutex_lock(&mvm->mutex); in iwl_mvm_mei_scan_work()
2759 memcpy(bssid, info->conn_info.bssid, ETH_ALEN); in iwl_mvm_mei_scan_work()
2760 mutex_unlock(&mvm->mutex); in iwl_mvm_mei_scan_work()
2762 while ((skb = skb_dequeue(&scan_filter->scan_res))) { in iwl_mvm_mei_scan_work()
2763 struct ieee80211_mgmt *mgmt = (void *)skb->data; in iwl_mvm_mei_scan_work()
2765 if (!memcmp(mgmt->bssid, bssid, ETH_ALEN)) in iwl_mvm_mei_scan_work()
2766 ieee80211_rx_irqsafe(mvm->hw, skb); in iwl_mvm_mei_scan_work()
2774 skb_queue_head_init(&mei_scan_filter->scan_res); in iwl_mvm_mei_scan_filter_init()
2775 INIT_WORK(&mei_scan_filter->scan_work, iwl_mvm_mei_scan_work); in iwl_mvm_mei_scan_filter_init()
2795 conn_info = &info->conn_info; in iwl_mvm_mei_limited_scan()
2796 if (!info->conn_info.lp_state || !info->conn_info.ssid_len) in iwl_mvm_mei_limited_scan()
2799 if (!params->n_channels || !params->n_ssids) in iwl_mvm_mei_limited_scan()
2802 mvm->mei_scan_filter.is_mei_limited_scan = true; in iwl_mvm_mei_limited_scan()
2804 chan = ieee80211_get_channel(mvm->hw->wiphy, in iwl_mvm_mei_limited_scan()
2805 ieee80211_channel_to_frequency(conn_info->channel, in iwl_mvm_mei_limited_scan()
2806 conn_info->band)); in iwl_mvm_mei_limited_scan()
2810 conn_info->channel, conn_info->band); in iwl_mvm_mei_limited_scan()
2818 scan_iters = min(IWL_MEI_SCAN_NUM_ITER, params->n_channels); in iwl_mvm_mei_limited_scan()
2819 params->n_channels = scan_iters; in iwl_mvm_mei_limited_scan()
2821 params->channels[i] = chan; in iwl_mvm_mei_limited_scan()
2825 params->n_ssids = 1; in iwl_mvm_mei_limited_scan()
2826 params->ssids[0].ssid_len = conn_info->ssid_len; in iwl_mvm_mei_limited_scan()
2827 memcpy(params->ssids[0].ssid, conn_info->ssid, conn_info->ssid_len); in iwl_mvm_mei_limited_scan()
2839 lockdep_assert_held(&mvm->mutex); in iwl_mvm_build_scan_cmd()
2840 memset(mvm->scan_cmd, 0, mvm->scan_cmd_size); in iwl_mvm_build_scan_cmd()
2844 if (!fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) { in iwl_mvm_build_scan_cmd()
2845 hcmd->id = SCAN_OFFLOAD_REQUEST_CMD; in iwl_mvm_build_scan_cmd()
2854 hcmd->id = WIDE_ID(IWL_ALWAYS_LONG_GROUP, SCAN_REQ_UMAC); in iwl_mvm_build_scan_cmd()
2856 scan_ver = iwl_fw_lookup_cmd_ver(mvm->fw, SCAN_REQ_UMAC, in iwl_mvm_build_scan_cmd()
2863 if (ver_handler->version != scan_ver) in iwl_mvm_build_scan_cmd()
2866 err = ver_handler->handler(mvm, vif, params, type, uid); in iwl_mvm_build_scan_cmd()
2890 if (vif == data->current_vif) in iwl_mvm_scan_respect_p2p_go_iter()
2897 link_id < ARRAY_SIZE(mvmvif->link); in iwl_mvm_scan_respect_p2p_go_iter()
2900 mvmvif->link[link_id]; in iwl_mvm_scan_respect_p2p_go_iter()
2902 if (link && link->phy_ctxt->id < NUM_PHY_CTX && in iwl_mvm_scan_respect_p2p_go_iter()
2903 (data->band == NUM_NL80211_BANDS || in iwl_mvm_scan_respect_p2p_go_iter()
2904 link->phy_ctxt->channel->band == data->band)) { in iwl_mvm_scan_respect_p2p_go_iter()
2905 data->p2p_go = true; in iwl_mvm_scan_respect_p2p_go_iter()
2926 ieee80211_iterate_active_interfaces_atomic(mvm->hw, in _iwl_mvm_get_respect_p2p_go()
2957 params->respect_p2p_go = in iwl_mvm_fill_respect_p2p_go()
2960 params->respect_p2p_go_hb = in iwl_mvm_fill_respect_p2p_go()
2964 params->respect_p2p_go = iwl_mvm_get_respect_p2p_go(mvm, vif); in iwl_mvm_fill_respect_p2p_go()
2976 .data = { mvm->scan_cmd, }, in _iwl_mvm_single_scan_start()
2983 lockdep_assert_held(&mvm->mutex); in _iwl_mvm_single_scan_start()
2985 if (iwl_mvm_is_lar_supported(mvm) && !mvm->lar_regdom_set) { in _iwl_mvm_single_scan_start()
2987 return -EBUSY; in _iwl_mvm_single_scan_start()
2995 if (WARN_ON(!mvm->scan_cmd)) in _iwl_mvm_single_scan_start()
2996 return -ENOMEM; in _iwl_mvm_single_scan_start()
2998 if (!iwl_mvm_scan_fits(mvm, req->n_ssids, ies, req->n_channels)) in _iwl_mvm_single_scan_start()
2999 return -ENOBUFS; in _iwl_mvm_single_scan_start()
3001 params.n_ssids = req->n_ssids; in _iwl_mvm_single_scan_start()
3002 params.flags = req->flags; in _iwl_mvm_single_scan_start()
3003 params.n_channels = req->n_channels; in _iwl_mvm_single_scan_start()
3005 params.ssids = req->ssids; in _iwl_mvm_single_scan_start()
3006 params.channels = req->channels; in _iwl_mvm_single_scan_start()
3007 params.mac_addr = req->mac_addr; in _iwl_mvm_single_scan_start()
3008 params.mac_addr_mask = req->mac_addr_mask; in _iwl_mvm_single_scan_start()
3009 params.no_cck = req->no_cck; in _iwl_mvm_single_scan_start()
3013 ether_addr_copy(params.bssid, req->bssid); in _iwl_mvm_single_scan_start()
3018 params.n_6ghz_params = req->n_6ghz_params; in _iwl_mvm_single_scan_start()
3019 params.scan_6ghz_params = req->scan_6ghz_params; in _iwl_mvm_single_scan_start()
3020 params.scan_6ghz = req->scan_6ghz; in _iwl_mvm_single_scan_start()
3024 if (req->duration) in _iwl_mvm_single_scan_start()
3027 params.tsf_report_link_id = req->tsf_report_link_id; in _iwl_mvm_single_scan_start()
3029 if (vif->active_links) in _iwl_mvm_single_scan_start()
3030 params.tsf_report_link_id = __ffs(vif->active_links); in _iwl_mvm_single_scan_start()
3060 mvm->scan_uid_status[uid] = type; in _iwl_mvm_single_scan_start()
3061 mvm->scan_status |= type; in _iwl_mvm_single_scan_start()
3064 mvm->scan_vif = iwl_mvm_vif_from_mac80211(vif); in _iwl_mvm_single_scan_start()
3065 schedule_delayed_work(&mvm->scan_timeout_dwork, in _iwl_mvm_single_scan_start()
3070 mvm->last_6ghz_passive_scan_jiffies = jiffies; in _iwl_mvm_single_scan_start()
3091 .data = { mvm->scan_cmd, }, in iwl_mvm_sched_scan_start()
3099 lockdep_assert_held(&mvm->mutex); in iwl_mvm_sched_scan_start()
3101 if (iwl_mvm_is_lar_supported(mvm) && !mvm->lar_regdom_set) { in iwl_mvm_sched_scan_start()
3102 IWL_ERR(mvm, "sched-scan while LAR regdomain is not set\n"); in iwl_mvm_sched_scan_start()
3103 return -EBUSY; in iwl_mvm_sched_scan_start()
3111 if (WARN_ON(!mvm->scan_cmd)) in iwl_mvm_sched_scan_start()
3112 return -ENOMEM; in iwl_mvm_sched_scan_start()
3115 params.n_ssids = req->n_ssids; in iwl_mvm_sched_scan_start()
3116 params.flags = req->flags; in iwl_mvm_sched_scan_start()
3117 params.n_channels = req->n_channels; in iwl_mvm_sched_scan_start()
3118 params.ssids = req->ssids; in iwl_mvm_sched_scan_start()
3119 params.channels = req->channels; in iwl_mvm_sched_scan_start()
3120 params.mac_addr = req->mac_addr; in iwl_mvm_sched_scan_start()
3121 params.mac_addr_mask = req->mac_addr_mask; in iwl_mvm_sched_scan_start()
3124 params.n_match_sets = req->n_match_sets; in iwl_mvm_sched_scan_start()
3125 params.match_sets = req->match_sets; in iwl_mvm_sched_scan_start()
3127 if (!req->n_scan_plans) in iwl_mvm_sched_scan_start()
3128 return -EINVAL; in iwl_mvm_sched_scan_start()
3130 params.n_scan_plans = req->n_scan_plans; in iwl_mvm_sched_scan_start()
3131 params.scan_plans = req->scan_plans; in iwl_mvm_sched_scan_start()
3136 /* In theory, LMAC scans can handle a 32-bit delay, but since in iwl_mvm_sched_scan_start()
3138 * and to keep it aligned with UMAC scans (which only support in iwl_mvm_sched_scan_start()
3139 * 16-bit delays), trim it down to 16-bits. in iwl_mvm_sched_scan_start()
3141 if (req->delay > U16_MAX) { in iwl_mvm_sched_scan_start()
3143 "delay value is > 16-bits, set to max possible\n"); in iwl_mvm_sched_scan_start()
3146 params.delay = req->delay; in iwl_mvm_sched_scan_start()
3159 if (channel->band == NL80211_BAND_6GHZ && in iwl_mvm_sched_scan_start()
3172 return -ENOMEM; in iwl_mvm_sched_scan_start()
3175 if (params.channels[i]->band == NL80211_BAND_6GHZ && in iwl_mvm_sched_scan_start()
3183 if (!iwl_mvm_scan_fits(mvm, req->n_ssids, ies, params.n_channels)) { in iwl_mvm_sched_scan_start()
3184 ret = -ENOBUFS; in iwl_mvm_sched_scan_start()
3199 mvm->scan_uid_status[uid] = type; in iwl_mvm_sched_scan_start()
3200 mvm->scan_status |= type; in iwl_mvm_sched_scan_start()
3207 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_DISABLED; in iwl_mvm_sched_scan_start()
3220 struct iwl_umac_scan_complete *notif = (void *)pkt->data; in iwl_mvm_rx_umac_scan_complete_notif()
3221 u32 uid = __le32_to_cpu(notif->uid); in iwl_mvm_rx_umac_scan_complete_notif()
3222 bool aborted = (notif->status == IWL_SCAN_OFFLOAD_ABORTED); in iwl_mvm_rx_umac_scan_complete_notif()
3225 mvm->mei_scan_filter.is_mei_limited_scan = false; in iwl_mvm_rx_umac_scan_complete_notif()
3229 uid, mvm->scan_uid_status[uid], in iwl_mvm_rx_umac_scan_complete_notif()
3230 notif->status == IWL_SCAN_OFFLOAD_COMPLETED ? in iwl_mvm_rx_umac_scan_complete_notif()
3232 iwl_mvm_ebs_status_str(notif->ebs_status)); in iwl_mvm_rx_umac_scan_complete_notif()
3235 mvm->scan_status); in iwl_mvm_rx_umac_scan_complete_notif()
3239 notif->last_schedule, notif->last_iter, in iwl_mvm_rx_umac_scan_complete_notif()
3240 __le32_to_cpu(notif->time_from_last_iter)); in iwl_mvm_rx_umac_scan_complete_notif()
3242 if (WARN_ON(!(mvm->scan_uid_status[uid] & mvm->scan_status))) in iwl_mvm_rx_umac_scan_complete_notif()
3246 if (mvm->scan_uid_status[uid] == IWL_MVM_SCAN_REGULAR) { in iwl_mvm_rx_umac_scan_complete_notif()
3249 .scan_start_tsf = mvm->scan_start, in iwl_mvm_rx_umac_scan_complete_notif()
3251 struct iwl_mvm_vif *scan_vif = mvm->scan_vif; in iwl_mvm_rx_umac_scan_complete_notif()
3253 scan_vif->link[mvm->scan_link_id]; in iwl_mvm_rx_umac_scan_complete_notif()
3259 memcpy(info.tsf_bssid, link_info->bssid, ETH_ALEN); in iwl_mvm_rx_umac_scan_complete_notif()
3263 ieee80211_scan_completed(mvm->hw, &info); in iwl_mvm_rx_umac_scan_complete_notif()
3264 mvm->scan_vif = NULL; in iwl_mvm_rx_umac_scan_complete_notif()
3265 cancel_delayed_work(&mvm->scan_timeout_dwork); in iwl_mvm_rx_umac_scan_complete_notif()
3267 } else if (mvm->scan_uid_status[uid] == IWL_MVM_SCAN_SCHED) { in iwl_mvm_rx_umac_scan_complete_notif()
3268 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_rx_umac_scan_complete_notif()
3269 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_DISABLED; in iwl_mvm_rx_umac_scan_complete_notif()
3270 } else if (mvm->scan_uid_status[uid] == IWL_MVM_SCAN_INT_MLO) { in iwl_mvm_rx_umac_scan_complete_notif()
3276 select_links = notif->status == IWL_SCAN_OFFLOAD_COMPLETED; in iwl_mvm_rx_umac_scan_complete_notif()
3279 mvm->scan_status &= ~mvm->scan_uid_status[uid]; in iwl_mvm_rx_umac_scan_complete_notif()
3282 mvm->scan_status); in iwl_mvm_rx_umac_scan_complete_notif()
3284 if (notif->ebs_status != IWL_SCAN_EBS_SUCCESS && in iwl_mvm_rx_umac_scan_complete_notif()
3285 notif->ebs_status != IWL_SCAN_EBS_INACTIVE) in iwl_mvm_rx_umac_scan_complete_notif()
3286 mvm->last_ebs_successful = false; in iwl_mvm_rx_umac_scan_complete_notif()
3288 mvm->scan_uid_status[uid] = 0; in iwl_mvm_rx_umac_scan_complete_notif()
3291 wiphy_work_queue(mvm->hw->wiphy, &mvm->trig_link_selection_wk); in iwl_mvm_rx_umac_scan_complete_notif()
3298 struct iwl_umac_scan_iter_complete_notif *notif = (void *)pkt->data; in iwl_mvm_rx_umac_scan_iter_complete_notif()
3300 mvm->scan_start = le64_to_cpu(notif->start_tsf); in iwl_mvm_rx_umac_scan_iter_complete_notif()
3303 "UMAC Scan iteration complete: status=0x%x scanned_channels=%d\n", in iwl_mvm_rx_umac_scan_iter_complete_notif()
3304 notif->status, notif->scanned_channels); in iwl_mvm_rx_umac_scan_iter_complete_notif()
3306 if (mvm->sched_scan_pass_all == SCHED_SCAN_PASS_ALL_FOUND) { in iwl_mvm_rx_umac_scan_iter_complete_notif()
3308 ieee80211_sched_scan_results(mvm->hw); in iwl_mvm_rx_umac_scan_iter_complete_notif()
3309 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_ENABLED; in iwl_mvm_rx_umac_scan_iter_complete_notif()
3313 "UMAC Scan iteration complete: scan started at %llu (TSF)\n", in iwl_mvm_rx_umac_scan_iter_complete_notif()
3314 mvm->scan_start); in iwl_mvm_rx_umac_scan_iter_complete_notif()
3330 lockdep_assert_held(&mvm->mutex); in iwl_mvm_umac_scan_abort()
3350 mvm->scan_uid_status[uid] = type << IWL_MVM_SCAN_STOPPING_SHIFT; in iwl_mvm_umac_scan_abort()
3360 mvm->scan_uid_status[uid] = type << IWL_MVM_SCAN_STOPPING_SHIFT; in iwl_mvm_umac_scan_abort()
3375 lockdep_assert_held(&mvm->mutex); in iwl_mvm_scan_stop_wait()
3377 iwl_init_notification_wait(&mvm->notif_wait, &wait_scan_done, in iwl_mvm_scan_stop_wait()
3384 if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) in iwl_mvm_scan_stop_wait()
3391 iwl_remove_notification(&mvm->notif_wait, &wait_scan_done); in iwl_mvm_scan_stop_wait()
3395 iwl_remove_notification(&mvm->notif_wait, &wait_scan_done); in iwl_mvm_scan_stop_wait()
3399 return iwl_wait_notification(&mvm->notif_wait, &wait_scan_done, in iwl_mvm_scan_stop_wait()
3421 u8 scan_ver = iwl_fw_lookup_cmd_ver(mvm->fw, SCAN_REQ_UMAC, in iwl_mvm_scan_size()
3438 if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) { in iwl_mvm_scan_size()
3446 mvm->fw->ucode_capa.n_scan_channels + in iwl_mvm_scan_size()
3451 mvm->fw->ucode_capa.n_scan_channels + in iwl_mvm_scan_size()
3461 if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) { in iwl_mvm_report_scan_aborted()
3470 cancel_delayed_work(&mvm->scan_timeout_dwork); in iwl_mvm_report_scan_aborted()
3472 ieee80211_scan_completed(mvm->hw, &info); in iwl_mvm_report_scan_aborted()
3473 mvm->scan_uid_status[uid] = 0; in iwl_mvm_report_scan_aborted()
3482 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_report_scan_aborted()
3483 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_DISABLED; in iwl_mvm_report_scan_aborted()
3484 mvm->scan_uid_status[uid] = 0; in iwl_mvm_report_scan_aborted()
3489 mvm->scan_uid_status[uid] = 0; in iwl_mvm_report_scan_aborted()
3495 mvm->scan_uid_status[uid] = 0; in iwl_mvm_report_scan_aborted()
3500 mvm->scan_uid_status[uid] = 0; in iwl_mvm_report_scan_aborted()
3505 mvm->scan_uid_status[uid] = 0; in iwl_mvm_report_scan_aborted()
3511 for (i = 0; i < mvm->max_scans; i++) { in iwl_mvm_report_scan_aborted()
3512 if (WARN_ONCE(mvm->scan_uid_status[i], in iwl_mvm_report_scan_aborted()
3513 "UMAC scan UID %d status was not cleaned\n", in iwl_mvm_report_scan_aborted()
3515 mvm->scan_uid_status[i] = 0; in iwl_mvm_report_scan_aborted()
3518 if (mvm->scan_status & IWL_MVM_SCAN_REGULAR) { in iwl_mvm_report_scan_aborted()
3523 cancel_delayed_work(&mvm->scan_timeout_dwork); in iwl_mvm_report_scan_aborted()
3524 ieee80211_scan_completed(mvm->hw, &info); in iwl_mvm_report_scan_aborted()
3531 if ((mvm->scan_status & IWL_MVM_SCAN_SCHED) && in iwl_mvm_report_scan_aborted()
3533 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_report_scan_aborted()
3534 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_DISABLED; in iwl_mvm_report_scan_aborted()
3545 type, mvm->scan_status); in iwl_mvm_scan_stop()
3547 if (!(mvm->scan_status & type)) in iwl_mvm_scan_stop()
3550 if (!iwl_trans_device_enabled(mvm->trans)) { in iwl_mvm_scan_stop()
3557 mvm->scan_status |= type << IWL_MVM_SCAN_STOPPING_SHIFT; in iwl_mvm_scan_stop()
3567 mvm->scan_status &= ~type; in iwl_mvm_scan_stop()
3570 cancel_delayed_work(&mvm->scan_timeout_dwork); in iwl_mvm_scan_stop()
3576 ieee80211_scan_completed(mvm->hw, &info); in iwl_mvm_scan_stop()
3579 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_scan_stop()
3580 mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_DISABLED; in iwl_mvm_scan_stop()
3596 lockdep_assert_held(&mvm->mutex); in iwl_mvm_int_mlo_scan_start()
3601 if (!vif->cfg.assoc || !ieee80211_vif_is_mld(vif) || in iwl_mvm_int_mlo_scan_start()
3602 hweight16(vif->valid_links) == 1) in iwl_mvm_int_mlo_scan_start()
3603 return -EINVAL; in iwl_mvm_int_mlo_scan_start()
3608 return -ENOMEM; in iwl_mvm_int_mlo_scan_start()
3612 req->channels[i] = channels[i]; in iwl_mvm_int_mlo_scan_start()
3614 req->n_channels = n_channels; in iwl_mvm_int_mlo_scan_start()
3618 if (mvm->hw->wiphy->bands[i]) in iwl_mvm_int_mlo_scan_start()
3619 req->rates[i] = in iwl_mvm_int_mlo_scan_start()
3620 (1 << mvm->hw->wiphy->bands[i]->n_bitrates) - 1; in iwl_mvm_int_mlo_scan_start()
3622 req->wdev = ieee80211_vif_to_wdev(vif); in iwl_mvm_int_mlo_scan_start()
3623 req->wiphy = mvm->hw->wiphy; in iwl_mvm_int_mlo_scan_start()
3624 req->scan_start = jiffies; in iwl_mvm_int_mlo_scan_start()
3625 req->tsf_report_link_id = -1; in iwl_mvm_int_mlo_scan_start()
3642 lockdep_assert_held(&mvm->mutex); in iwl_mvm_int_mlo_scan()
3644 if (mvm->scan_status & IWL_MVM_SCAN_INT_MLO) { in iwl_mvm_int_mlo_scan()
3646 return -EBUSY; in iwl_mvm_int_mlo_scan()
3653 rcu_dereference(vif->link_conf[link_id]); in iwl_mvm_int_mlo_scan()
3658 channels[n_channels++] = link_conf->chanreq.oper.chan; in iwl_mvm_int_mlo_scan()
3664 return -EINVAL; in iwl_mvm_int_mlo_scan()
3673 struct ieee80211_supported_band *sband = mvm->hw->wiphy->bands[band]; in iwl_mvm_chanidx_from_phy()
3677 return -EINVAL; in iwl_mvm_chanidx_from_phy()
3679 for (chan_idx = 0; chan_idx < sband->n_channels; chan_idx++) { in iwl_mvm_chanidx_from_phy()
3680 struct ieee80211_channel *channel = &sband->channels[chan_idx]; in iwl_mvm_chanidx_from_phy()
3682 if (channel->hw_value == phy_chan_num) in iwl_mvm_chanidx_from_phy()
3686 return -EINVAL; in iwl_mvm_chanidx_from_phy()
3694 (void *)pkt->data; in iwl_mvm_rx_channel_survey_notif()
3699 lockdep_assert_held(&mvm->mutex); in iwl_mvm_rx_channel_survey_notif()
3701 if (!mvm->acs_survey) { in iwl_mvm_rx_channel_survey_notif()
3705 if (!mvm->hw->wiphy->bands[band]) in iwl_mvm_rx_channel_survey_notif()
3708 n_channels += mvm->hw->wiphy->bands[band]->n_channels; in iwl_mvm_rx_channel_survey_notif()
3711 mvm->acs_survey = kzalloc(struct_size(mvm->acs_survey, in iwl_mvm_rx_channel_survey_notif()
3715 if (!mvm->acs_survey) in iwl_mvm_rx_channel_survey_notif()
3718 mvm->acs_survey->n_channels = n_channels; in iwl_mvm_rx_channel_survey_notif()
3721 if (!mvm->hw->wiphy->bands[band]) in iwl_mvm_rx_channel_survey_notif()
3724 mvm->acs_survey->bands[band] = in iwl_mvm_rx_channel_survey_notif()
3725 &mvm->acs_survey->channels[n_channels]; in iwl_mvm_rx_channel_survey_notif()
3726 n_channels += mvm->hw->wiphy->bands[band]->n_channels; in iwl_mvm_rx_channel_survey_notif()
3730 band = iwl_mvm_nl80211_band_from_phy(le32_to_cpu(notif->band)); in iwl_mvm_rx_channel_survey_notif()
3732 le32_to_cpu(notif->channel)); in iwl_mvm_rx_channel_survey_notif()
3737 mvm->hw->wiphy->bands[band]->channels[chan_idx].center_freq); in iwl_mvm_rx_channel_survey_notif()
3739 info = &mvm->acs_survey->bands[band][chan_idx]; in iwl_mvm_rx_channel_survey_notif()
3742 info->time = le32_to_cpu(notif->active_time); in iwl_mvm_rx_channel_survey_notif()
3743 info->time_busy = le32_to_cpu(notif->busy_time); in iwl_mvm_rx_channel_survey_notif()
3744 info->time_rx = le32_to_cpu(notif->rx_time); in iwl_mvm_rx_channel_survey_notif()
3745 info->time_tx = le32_to_cpu(notif->tx_time); in iwl_mvm_rx_channel_survey_notif()
3746 info->noise = in iwl_mvm_rx_channel_survey_notif()
3747 iwl_average_neg_dbm(notif->noise, ARRAY_SIZE(notif->noise)); in iwl_mvm_rx_channel_survey_notif()