Lines Matching refs:mvm

96 static int iwl_umac_scan_stop(struct iwl_mvm *mvm,
99 static u8 iwl_mvm_scan_rx_ant(struct iwl_mvm *mvm) in iwl_mvm_scan_rx_ant() argument
101 if (mvm->scan_rx_ant != ANT_NONE) in iwl_mvm_scan_rx_ant()
102 return mvm->scan_rx_ant; in iwl_mvm_scan_rx_ant()
103 return iwl_mvm_get_valid_rx_ant(mvm); in iwl_mvm_scan_rx_ant()
106 static inline __le16 iwl_mvm_scan_rx_chain(struct iwl_mvm *mvm) in iwl_mvm_scan_rx_chain() argument
111 rx_ant = iwl_mvm_scan_rx_ant(mvm); in iwl_mvm_scan_rx_chain()
128 iwl_mvm_scan_rate_n_flags(struct iwl_mvm *mvm, enum ieee80211_band band, in iwl_mvm_scan_rate_n_flags() argument
133 mvm->scan_last_antenna_idx = in iwl_mvm_scan_rate_n_flags()
134 iwl_mvm_next_antenna(mvm, iwl_mvm_get_valid_tx_ant(mvm), in iwl_mvm_scan_rate_n_flags()
135 mvm->scan_last_antenna_idx); in iwl_mvm_scan_rate_n_flags()
136 tx_ant = BIT(mvm->scan_last_antenna_idx) << RATE_MCS_ANT_POS; in iwl_mvm_scan_rate_n_flags()
177 static u16 iwl_mvm_get_active_dwell(struct iwl_mvm *mvm, in iwl_mvm_get_active_dwell() argument
180 if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_BASIC_DWELL) in iwl_mvm_get_active_dwell()
187 static u16 iwl_mvm_get_passive_dwell(struct iwl_mvm *mvm, in iwl_mvm_get_passive_dwell() argument
190 if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_BASIC_DWELL) in iwl_mvm_get_passive_dwell()
206 static void iwl_mvm_scan_calc_params(struct iwl_mvm *mvm, in iwl_mvm_scan_calc_params() argument
215 ieee80211_iterate_active_interfaces_atomic(mvm->hw, in iwl_mvm_scan_calc_params()
226 if (iwl_mvm_low_latency(mvm)) { in iwl_mvm_scan_calc_params()
227 if (mvm->fw->ucode_capa.api[0] & in iwl_mvm_scan_calc_params()
242 if (frag_passive_dwell && (mvm->fw->ucode_capa.api[0] & in iwl_mvm_scan_calc_params()
252 iwl_mvm_get_passive_dwell(mvm, in iwl_mvm_scan_calc_params()
269 params->dwell[band].passive = iwl_mvm_get_passive_dwell(mvm, in iwl_mvm_scan_calc_params()
271 params->dwell[band].active = iwl_mvm_get_active_dwell(mvm, band, in iwl_mvm_scan_calc_params()
276 static inline bool iwl_mvm_rrm_scan_needed(struct iwl_mvm *mvm) in iwl_mvm_rrm_scan_needed() argument
279 return mvm->fw->ucode_capa.capa[0] & in iwl_mvm_rrm_scan_needed()
283 static int iwl_mvm_max_scan_ie_fw_cmd_room(struct iwl_mvm *mvm, in iwl_mvm_max_scan_ie_fw_cmd_room() argument
294 if (iwl_mvm_rrm_scan_needed(mvm)) in iwl_mvm_max_scan_ie_fw_cmd_room()
300 int iwl_mvm_max_scan_ie_len(struct iwl_mvm *mvm, bool is_sched_scan) in iwl_mvm_max_scan_ie_len() argument
302 int max_ie_len = iwl_mvm_max_scan_ie_fw_cmd_room(mvm, is_sched_scan); in iwl_mvm_max_scan_ie_len()
317 int iwl_mvm_rx_scan_offload_iter_complete_notif(struct iwl_mvm *mvm, in iwl_mvm_rx_scan_offload_iter_complete_notif() argument
324 IWL_DEBUG_SCAN(mvm, in iwl_mvm_rx_scan_offload_iter_complete_notif()
330 int iwl_mvm_rx_scan_offload_results(struct iwl_mvm *mvm, in iwl_mvm_rx_scan_offload_results() argument
334 IWL_DEBUG_SCAN(mvm, "Scheduled scan results\n"); in iwl_mvm_rx_scan_offload_results()
335 ieee80211_sched_scan_results(mvm->hw); in iwl_mvm_rx_scan_offload_results()
340 int iwl_mvm_rx_scan_offload_complete_notif(struct iwl_mvm *mvm, in iwl_mvm_rx_scan_offload_complete_notif() argument
350 lockdep_assert_held(&mvm->mutex); in iwl_mvm_rx_scan_offload_complete_notif()
352 IWL_DEBUG_SCAN(mvm, in iwl_mvm_rx_scan_offload_complete_notif()
354 mvm->scan_status == IWL_MVM_SCAN_SCHED ? in iwl_mvm_rx_scan_offload_complete_notif()
363 if (mvm->scan_status == IWL_MVM_SCAN_SCHED) { in iwl_mvm_rx_scan_offload_complete_notif()
364 mvm->scan_status = IWL_MVM_SCAN_NONE; in iwl_mvm_rx_scan_offload_complete_notif()
365 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_rx_scan_offload_complete_notif()
366 } else if (mvm->scan_status == IWL_MVM_SCAN_OS) { in iwl_mvm_rx_scan_offload_complete_notif()
367 mvm->scan_status = IWL_MVM_SCAN_NONE; in iwl_mvm_rx_scan_offload_complete_notif()
368 ieee80211_scan_completed(mvm->hw, in iwl_mvm_rx_scan_offload_complete_notif()
370 iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN); in iwl_mvm_rx_scan_offload_complete_notif()
374 mvm->last_ebs_successful = false; in iwl_mvm_rx_scan_offload_complete_notif()
436 int iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm, in iwl_mvm_config_sched_scan_profiles() argument
455 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_SHORT_BL) in iwl_mvm_config_sched_scan_profiles()
494 IWL_DEBUG_SCAN(mvm, "Sending scheduled scan profile config\n"); in iwl_mvm_config_sched_scan_profiles()
496 ret = iwl_mvm_send_cmd(mvm, &cmd); in iwl_mvm_config_sched_scan_profiles()
504 static bool iwl_mvm_scan_pass_all(struct iwl_mvm *mvm, in iwl_mvm_scan_pass_all() argument
508 IWL_DEBUG_SCAN(mvm, in iwl_mvm_scan_pass_all()
514 IWL_DEBUG_SCAN(mvm, "Sending Scheduled scan without filtering\n"); in iwl_mvm_scan_pass_all()
518 int iwl_mvm_scan_offload_start(struct iwl_mvm *mvm, in iwl_mvm_scan_offload_start() argument
525 if (mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN) { in iwl_mvm_scan_offload_start()
526 ret = iwl_mvm_config_sched_scan_profiles(mvm, req); in iwl_mvm_scan_offload_start()
529 ret = iwl_mvm_sched_scan_umac(mvm, vif, req, ies); in iwl_mvm_scan_offload_start()
531 mvm->scan_status = IWL_MVM_SCAN_SCHED; in iwl_mvm_scan_offload_start()
532 ret = iwl_mvm_config_sched_scan_profiles(mvm, req); in iwl_mvm_scan_offload_start()
535 ret = iwl_mvm_unified_sched_scan_lmac(mvm, vif, req, ies); in iwl_mvm_scan_offload_start()
541 static int iwl_mvm_send_scan_offload_abort(struct iwl_mvm *mvm) in iwl_mvm_send_scan_offload_abort() argument
552 if (mvm->scan_status == IWL_MVM_SCAN_NONE) in iwl_mvm_send_scan_offload_abort()
555 ret = iwl_mvm_send_cmd_status(mvm, &cmd, &status); in iwl_mvm_send_scan_offload_abort()
567 IWL_DEBUG_SCAN(mvm, "SCAN OFFLOAD ABORT ret %d.\n", status); in iwl_mvm_send_scan_offload_abort()
574 int iwl_mvm_scan_offload_stop(struct iwl_mvm *mvm, bool notify) in iwl_mvm_scan_offload_stop() argument
579 bool sched = mvm->scan_status == IWL_MVM_SCAN_SCHED; in iwl_mvm_scan_offload_stop()
581 lockdep_assert_held(&mvm->mutex); in iwl_mvm_scan_offload_stop()
583 if (mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN) in iwl_mvm_scan_offload_stop()
584 return iwl_umac_scan_stop(mvm, IWL_UMAC_SCAN_UID_SCHED_SCAN, in iwl_mvm_scan_offload_stop()
587 if (mvm->scan_status == IWL_MVM_SCAN_NONE) in iwl_mvm_scan_offload_stop()
590 if (iwl_mvm_is_radio_killed(mvm)) { in iwl_mvm_scan_offload_stop()
595 iwl_init_notification_wait(&mvm->notif_wait, &wait_scan_done, in iwl_mvm_scan_offload_stop()
600 ret = iwl_mvm_send_scan_offload_abort(mvm); in iwl_mvm_scan_offload_stop()
602 IWL_DEBUG_SCAN(mvm, "Send stop %sscan failed %d\n", in iwl_mvm_scan_offload_stop()
604 iwl_remove_notification(&mvm->notif_wait, &wait_scan_done); in iwl_mvm_scan_offload_stop()
608 IWL_DEBUG_SCAN(mvm, "Successfully sent stop %sscan\n", in iwl_mvm_scan_offload_stop()
611 ret = iwl_wait_notification(&mvm->notif_wait, &wait_scan_done, 1 * HZ); in iwl_mvm_scan_offload_stop()
619 if (mvm->scan_status == IWL_MVM_SCAN_OS) in iwl_mvm_scan_offload_stop()
620 iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN); in iwl_mvm_scan_offload_stop()
622 mvm->scan_status = IWL_MVM_SCAN_NONE; in iwl_mvm_scan_offload_stop()
626 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_scan_offload_stop()
628 ieee80211_scan_completed(mvm->hw, true); in iwl_mvm_scan_offload_stop()
634 static void iwl_mvm_unified_scan_fill_tx_cmd(struct iwl_mvm *mvm, in iwl_mvm_unified_scan_fill_tx_cmd() argument
640 tx_cmd[0].rate_n_flags = iwl_mvm_scan_rate_n_flags(mvm, in iwl_mvm_unified_scan_fill_tx_cmd()
643 tx_cmd[0].sta_id = mvm->aux_sta.sta_id; in iwl_mvm_unified_scan_fill_tx_cmd()
647 tx_cmd[1].rate_n_flags = iwl_mvm_scan_rate_n_flags(mvm, in iwl_mvm_unified_scan_fill_tx_cmd()
650 tx_cmd[1].sta_id = mvm->aux_sta.sta_id; in iwl_mvm_unified_scan_fill_tx_cmd()
654 iwl_mvm_lmac_scan_cfg_channels(struct iwl_mvm *mvm, in iwl_mvm_lmac_scan_cfg_channels() argument
673 static u8 *iwl_mvm_copy_and_insert_ds_elem(struct iwl_mvm *mvm, const u8 *ies, in iwl_mvm_copy_and_insert_ds_elem() argument
685 if (!iwl_mvm_rrm_scan_needed(mvm)) { in iwl_mvm_copy_and_insert_ds_elem()
710 iwl_mvm_build_unified_scan_probe(struct iwl_mvm *mvm, struct ieee80211_vif *vif, in iwl_mvm_build_unified_scan_probe() argument
742 newpos = iwl_mvm_copy_and_insert_ds_elem(mvm, in iwl_mvm_build_unified_scan_probe()
762 iwl_mvm_build_generic_unified_scan_cmd(struct iwl_mvm *mvm, in iwl_mvm_build_generic_unified_scan_cmd() argument
772 cmd->rx_chain_select = iwl_mvm_scan_rx_chain(mvm); in iwl_mvm_build_generic_unified_scan_cmd()
778 if (iwl_mvm_rrm_scan_needed(mvm)) in iwl_mvm_build_generic_unified_scan_cmd()
783 int iwl_mvm_unified_scan_lmac(struct iwl_mvm *mvm, in iwl_mvm_unified_scan_lmac() argument
791 mvm->fw->ucode_capa.n_scan_channels + in iwl_mvm_unified_scan_lmac()
793 .data = { mvm->scan_cmd, }, in iwl_mvm_unified_scan_lmac()
796 struct iwl_scan_req_unified_lmac *cmd = mvm->scan_cmd; in iwl_mvm_unified_scan_lmac()
803 lockdep_assert_held(&mvm->mutex); in iwl_mvm_unified_scan_lmac()
806 if (WARN_ON(mvm->scan_cmd == NULL)) in iwl_mvm_unified_scan_lmac()
812 iwl_mvm_max_scan_ie_fw_cmd_room(mvm, false) || in iwl_mvm_unified_scan_lmac()
813 req->req.n_channels > mvm->fw->ucode_capa.n_scan_channels) in iwl_mvm_unified_scan_lmac()
816 mvm->scan_status = IWL_MVM_SCAN_OS; in iwl_mvm_unified_scan_lmac()
818 iwl_mvm_scan_calc_params(mvm, vif, req->req.n_ssids, req->req.flags, in iwl_mvm_unified_scan_lmac()
821 iwl_mvm_build_generic_unified_scan_cmd(mvm, cmd, &params); in iwl_mvm_unified_scan_lmac()
841 iwl_mvm_unified_scan_fill_tx_cmd(mvm, cmd->tx_cmd, req->req.no_cck); in iwl_mvm_unified_scan_lmac()
852 if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_SINGLE_SCAN_EBS && in iwl_mvm_unified_scan_lmac()
853 mvm->last_ebs_successful) { in iwl_mvm_unified_scan_lmac()
871 iwl_mvm_lmac_scan_cfg_channels(mvm, req->req.channels, in iwl_mvm_unified_scan_lmac()
876 mvm->fw->ucode_capa.n_scan_channels); in iwl_mvm_unified_scan_lmac()
878 iwl_mvm_build_unified_scan_probe(mvm, vif, &req->ies, preq, in iwl_mvm_unified_scan_lmac()
883 ret = iwl_mvm_send_cmd(mvm, &hcmd); in iwl_mvm_unified_scan_lmac()
885 IWL_DEBUG_SCAN(mvm, "Scan request was sent successfully\n"); in iwl_mvm_unified_scan_lmac()
892 IWL_ERR(mvm, "Scan failed! ret %d\n", ret); in iwl_mvm_unified_scan_lmac()
893 mvm->scan_status = IWL_MVM_SCAN_NONE; in iwl_mvm_unified_scan_lmac()
899 int iwl_mvm_unified_sched_scan_lmac(struct iwl_mvm *mvm, in iwl_mvm_unified_sched_scan_lmac() argument
908 mvm->fw->ucode_capa.n_scan_channels + in iwl_mvm_unified_sched_scan_lmac()
910 .data = { mvm->scan_cmd, }, in iwl_mvm_unified_sched_scan_lmac()
913 struct iwl_scan_req_unified_lmac *cmd = mvm->scan_cmd; in iwl_mvm_unified_sched_scan_lmac()
919 lockdep_assert_held(&mvm->mutex); in iwl_mvm_unified_sched_scan_lmac()
922 if (WARN_ON(mvm->scan_cmd == NULL)) in iwl_mvm_unified_sched_scan_lmac()
928 iwl_mvm_max_scan_ie_fw_cmd_room(mvm, true) || in iwl_mvm_unified_sched_scan_lmac()
929 req->n_channels > mvm->fw->ucode_capa.n_scan_channels) in iwl_mvm_unified_sched_scan_lmac()
932 iwl_mvm_scan_calc_params(mvm, vif, req->n_ssids, 0, &params); in iwl_mvm_unified_sched_scan_lmac()
934 iwl_mvm_build_generic_unified_scan_cmd(mvm, cmd, &params); in iwl_mvm_unified_sched_scan_lmac()
940 if (iwl_mvm_scan_pass_all(mvm, req)) in iwl_mvm_unified_sched_scan_lmac()
955 if (mvm->scan_iter_notif_enabled) in iwl_mvm_unified_sched_scan_lmac()
964 iwl_mvm_unified_scan_fill_tx_cmd(mvm, cmd->tx_cmd, false); in iwl_mvm_unified_sched_scan_lmac()
975 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_EBS_SUPPORT && in iwl_mvm_unified_sched_scan_lmac()
976 mvm->last_ebs_successful) { in iwl_mvm_unified_sched_scan_lmac()
991 iwl_mvm_lmac_scan_cfg_channels(mvm, req->channels, req->n_channels, in iwl_mvm_unified_sched_scan_lmac()
995 mvm->fw->ucode_capa.n_scan_channels); in iwl_mvm_unified_sched_scan_lmac()
997 iwl_mvm_build_unified_scan_probe(mvm, vif, ies, preq, in iwl_mvm_unified_sched_scan_lmac()
1002 ret = iwl_mvm_send_cmd(mvm, &hcmd); in iwl_mvm_unified_sched_scan_lmac()
1004 IWL_DEBUG_SCAN(mvm, in iwl_mvm_unified_sched_scan_lmac()
1012 IWL_ERR(mvm, "Sched scan failed! ret %d\n", ret); in iwl_mvm_unified_sched_scan_lmac()
1013 mvm->scan_status = IWL_MVM_SCAN_NONE; in iwl_mvm_unified_sched_scan_lmac()
1020 int iwl_mvm_cancel_scan(struct iwl_mvm *mvm) in iwl_mvm_cancel_scan() argument
1022 if (mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN) in iwl_mvm_cancel_scan()
1023 return iwl_umac_scan_stop(mvm, IWL_UMAC_SCAN_UID_REG_SCAN, in iwl_mvm_cancel_scan()
1026 if (mvm->scan_status == IWL_MVM_SCAN_NONE) in iwl_mvm_cancel_scan()
1029 if (iwl_mvm_is_radio_killed(mvm)) { in iwl_mvm_cancel_scan()
1030 ieee80211_scan_completed(mvm->hw, true); in iwl_mvm_cancel_scan()
1031 iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN); in iwl_mvm_cancel_scan()
1032 mvm->scan_status = IWL_MVM_SCAN_NONE; in iwl_mvm_cancel_scan()
1036 return iwl_mvm_scan_offload_stop(mvm, true); in iwl_mvm_cancel_scan()
1042 struct iwl_mvm *mvm; member
1066 static __le32 iwl_mvm_scan_config_rates(struct iwl_mvm *mvm) in iwl_mvm_scan_config_rates() argument
1072 band = &mvm->nvm_data->bands[IEEE80211_BAND_2GHZ]; in iwl_mvm_scan_config_rates()
1075 band = &mvm->nvm_data->bands[IEEE80211_BAND_5GHZ]; in iwl_mvm_scan_config_rates()
1085 int iwl_mvm_config_scan(struct iwl_mvm *mvm) in iwl_mvm_config_scan() argument
1091 mvm->nvm_data->bands[IEEE80211_BAND_2GHZ].n_channels + in iwl_mvm_config_scan()
1092 mvm->nvm_data->bands[IEEE80211_BAND_5GHZ].n_channels; in iwl_mvm_config_scan()
1098 if (WARN_ON(num_channels > mvm->fw->ucode_capa.n_scan_channels)) in iwl_mvm_config_scan()
1101 cmd_size = sizeof(*scan_config) + mvm->fw->ucode_capa.n_scan_channels; in iwl_mvm_config_scan()
1118 scan_config->tx_chains = cpu_to_le32(iwl_mvm_get_valid_tx_ant(mvm)); in iwl_mvm_config_scan()
1119 scan_config->rx_chains = cpu_to_le32(iwl_mvm_scan_rx_ant(mvm)); in iwl_mvm_config_scan()
1120 scan_config->legacy_rates = iwl_mvm_scan_config_rates(mvm); in iwl_mvm_config_scan()
1127 memcpy(&scan_config->mac_addr, &mvm->addresses[0].addr, ETH_ALEN); in iwl_mvm_config_scan()
1129 scan_config->bcast_sta_id = mvm->aux_sta.sta_id; in iwl_mvm_config_scan()
1135 band = &mvm->nvm_data->bands[IEEE80211_BAND_2GHZ]; in iwl_mvm_config_scan()
1138 band = &mvm->nvm_data->bands[IEEE80211_BAND_5GHZ]; in iwl_mvm_config_scan()
1146 IWL_DEBUG_SCAN(mvm, "Sending UMAC scan config\n"); in iwl_mvm_config_scan()
1148 ret = iwl_mvm_send_cmd(mvm, &cmd); in iwl_mvm_config_scan()
1154 static int iwl_mvm_find_scan_uid(struct iwl_mvm *mvm, u32 uid) in iwl_mvm_find_scan_uid() argument
1159 if (mvm->scan_uid[i] == uid) in iwl_mvm_find_scan_uid()
1165 static int iwl_mvm_find_free_scan_uid(struct iwl_mvm *mvm) in iwl_mvm_find_free_scan_uid() argument
1167 return iwl_mvm_find_scan_uid(mvm, 0); in iwl_mvm_find_free_scan_uid()
1170 static bool iwl_mvm_find_scan_type(struct iwl_mvm *mvm, in iwl_mvm_find_scan_type() argument
1176 if (mvm->scan_uid[i] & type) in iwl_mvm_find_scan_type()
1182 static int iwl_mvm_find_first_scan(struct iwl_mvm *mvm, in iwl_mvm_find_first_scan() argument
1188 if (mvm->scan_uid[i] & type) in iwl_mvm_find_first_scan()
1194 static u32 iwl_generate_scan_uid(struct iwl_mvm *mvm, in iwl_generate_scan_uid() argument
1208 uid = type | (mvm->scan_seq_num << in iwl_generate_scan_uid()
1210 mvm->scan_seq_num++; in iwl_generate_scan_uid()
1211 } while (iwl_mvm_find_scan_uid(mvm, uid) < in iwl_generate_scan_uid()
1214 IWL_DEBUG_SCAN(mvm, "Generated scan UID %u\n", uid); in iwl_generate_scan_uid()
1220 iwl_mvm_build_generic_umac_scan_cmd(struct iwl_mvm *mvm, in iwl_mvm_build_generic_umac_scan_cmd() argument
1225 cmd->hdr.size = cpu_to_le16(iwl_mvm_scan_size(mvm) - in iwl_mvm_build_generic_umac_scan_cmd()
1238 iwl_mvm_umac_scan_cfg_channels(struct iwl_mvm *mvm, in iwl_mvm_umac_scan_cfg_channels() argument
1254 static u32 iwl_mvm_scan_umac_common_flags(struct iwl_mvm *mvm, int n_ssids, in iwl_mvm_scan_umac_common_flags() argument
1269 if (iwl_mvm_rrm_scan_needed(mvm)) in iwl_mvm_scan_umac_common_flags()
1275 int iwl_mvm_scan_umac(struct iwl_mvm *mvm, struct ieee80211_vif *vif, in iwl_mvm_scan_umac() argument
1280 .len = { iwl_mvm_scan_size(mvm), }, in iwl_mvm_scan_umac()
1281 .data = { mvm->scan_cmd, }, in iwl_mvm_scan_umac()
1284 struct iwl_scan_req_umac *cmd = mvm->scan_cmd; in iwl_mvm_scan_umac()
1287 mvm->fw->ucode_capa.n_scan_channels; in iwl_mvm_scan_umac()
1293 lockdep_assert_held(&mvm->mutex); in iwl_mvm_scan_umac()
1295 uid_idx = iwl_mvm_find_free_scan_uid(mvm); in iwl_mvm_scan_umac()
1300 if (WARN_ON(mvm->scan_cmd == NULL)) in iwl_mvm_scan_umac()
1308 mvm->fw->ucode_capa.n_scan_channels)) in iwl_mvm_scan_umac()
1311 iwl_mvm_scan_calc_params(mvm, vif, req->req.n_ssids, req->req.flags, in iwl_mvm_scan_umac()
1314 iwl_mvm_build_generic_umac_scan_cmd(mvm, cmd, &params); in iwl_mvm_scan_umac()
1316 uid = iwl_generate_scan_uid(mvm, IWL_UMAC_SCAN_UID_REG_SCAN); in iwl_mvm_scan_umac()
1317 mvm->scan_uid[uid_idx] = uid; in iwl_mvm_scan_umac()
1322 flags = iwl_mvm_scan_umac_common_flags(mvm, req->req.n_ssids, in iwl_mvm_scan_umac()
1330 if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_SINGLE_SCAN_EBS && in iwl_mvm_scan_umac()
1331 mvm->last_ebs_successful) in iwl_mvm_scan_umac()
1341 iwl_mvm_umac_scan_cfg_channels(mvm, req->req.channels, in iwl_mvm_scan_umac()
1347 iwl_mvm_build_unified_scan_probe(mvm, vif, &req->ies, &sec_part->preq, in iwl_mvm_scan_umac()
1355 ret = iwl_mvm_send_cmd(mvm, &hcmd); in iwl_mvm_scan_umac()
1357 IWL_DEBUG_SCAN(mvm, in iwl_mvm_scan_umac()
1365 IWL_ERR(mvm, "Scan failed! ret %d\n", ret); in iwl_mvm_scan_umac()
1370 int iwl_mvm_sched_scan_umac(struct iwl_mvm *mvm, struct ieee80211_vif *vif, in iwl_mvm_sched_scan_umac() argument
1377 .len = { iwl_mvm_scan_size(mvm), }, in iwl_mvm_sched_scan_umac()
1378 .data = { mvm->scan_cmd, }, in iwl_mvm_sched_scan_umac()
1381 struct iwl_scan_req_umac *cmd = mvm->scan_cmd; in iwl_mvm_sched_scan_umac()
1384 mvm->fw->ucode_capa.n_scan_channels; in iwl_mvm_sched_scan_umac()
1390 lockdep_assert_held(&mvm->mutex); in iwl_mvm_sched_scan_umac()
1392 uid_idx = iwl_mvm_find_free_scan_uid(mvm); in iwl_mvm_sched_scan_umac()
1397 if (WARN_ON(mvm->scan_cmd == NULL)) in iwl_mvm_sched_scan_umac()
1404 mvm->fw->ucode_capa.n_scan_channels)) in iwl_mvm_sched_scan_umac()
1407 iwl_mvm_scan_calc_params(mvm, vif, req->n_ssids, req->flags, in iwl_mvm_sched_scan_umac()
1410 iwl_mvm_build_generic_umac_scan_cmd(mvm, cmd, &params); in iwl_mvm_sched_scan_umac()
1414 uid = iwl_generate_scan_uid(mvm, IWL_UMAC_SCAN_UID_SCHED_SCAN); in iwl_mvm_sched_scan_umac()
1415 mvm->scan_uid[uid_idx] = uid; in iwl_mvm_sched_scan_umac()
1420 flags = iwl_mvm_scan_umac_common_flags(mvm, req->n_ssids, req->ssids, in iwl_mvm_sched_scan_umac()
1425 if (iwl_mvm_scan_pass_all(mvm, req)) in iwl_mvm_sched_scan_umac()
1432 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_EBS_SUPPORT && in iwl_mvm_sched_scan_umac()
1433 mvm->last_ebs_successful) in iwl_mvm_sched_scan_umac()
1446 iwl_mvm_umac_scan_cfg_channels(mvm, req->channels, req->n_channels, in iwl_mvm_sched_scan_umac()
1454 IWL_DEBUG_SCAN(mvm, in iwl_mvm_sched_scan_umac()
1461 iwl_mvm_build_unified_scan_probe(mvm, vif, ies, &sec_part->preq, in iwl_mvm_sched_scan_umac()
1466 ret = iwl_mvm_send_cmd(mvm, &hcmd); in iwl_mvm_sched_scan_umac()
1468 IWL_DEBUG_SCAN(mvm, in iwl_mvm_sched_scan_umac()
1476 IWL_ERR(mvm, "Sched scan failed! ret %d\n", ret); in iwl_mvm_sched_scan_umac()
1481 int iwl_mvm_rx_umac_scan_complete_notif(struct iwl_mvm *mvm, in iwl_mvm_rx_umac_scan_complete_notif() argument
1489 int uid_idx = iwl_mvm_find_scan_uid(mvm, uid); in iwl_mvm_rx_umac_scan_complete_notif()
1497 IWL_DEBUG_SCAN(mvm, in iwl_mvm_rx_umac_scan_complete_notif()
1506 mvm->last_ebs_successful = false; in iwl_mvm_rx_umac_scan_complete_notif()
1508 mvm->scan_uid[uid_idx] = 0; in iwl_mvm_rx_umac_scan_complete_notif()
1511 ieee80211_scan_completed(mvm->hw, in iwl_mvm_rx_umac_scan_complete_notif()
1514 iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN); in iwl_mvm_rx_umac_scan_complete_notif()
1515 } else if (!iwl_mvm_find_scan_type(mvm, IWL_UMAC_SCAN_UID_SCHED_SCAN)) { in iwl_mvm_rx_umac_scan_complete_notif()
1516 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_rx_umac_scan_complete_notif()
1518 IWL_DEBUG_SCAN(mvm, "Another sched scan is running\n"); in iwl_mvm_rx_umac_scan_complete_notif()
1530 int uid_idx = iwl_mvm_find_scan_uid(scan_done->mvm, uid); in iwl_scan_umac_done_check()
1543 scan_done->mvm->scan_uid[uid_idx] = 0; in iwl_scan_umac_done_check()
1546 scan_done->mvm->last_ebs_successful = false; in iwl_scan_umac_done_check()
1548 return !iwl_mvm_find_scan_type(scan_done->mvm, scan_done->type); in iwl_scan_umac_done_check()
1551 static int iwl_umac_scan_abort_one(struct iwl_mvm *mvm, u32 uid) in iwl_umac_scan_abort_one() argument
1559 lockdep_assert_held(&mvm->mutex); in iwl_umac_scan_abort_one()
1561 IWL_DEBUG_SCAN(mvm, "Sending scan abort, uid %u\n", uid); in iwl_umac_scan_abort_one()
1563 return iwl_mvm_send_cmd_pdu(mvm, SCAN_ABORT_UMAC, 0, sizeof(cmd), &cmd); in iwl_umac_scan_abort_one()
1566 static int iwl_umac_scan_stop(struct iwl_mvm *mvm, in iwl_umac_scan_stop() argument
1572 .mvm = mvm, in iwl_umac_scan_stop()
1577 iwl_init_notification_wait(&mvm->notif_wait, &wait_scan_done, in iwl_umac_scan_stop()
1582 IWL_DEBUG_SCAN(mvm, "Preparing to stop scan, type %x\n", type); in iwl_umac_scan_stop()
1585 if (mvm->scan_uid[i] & type) { in iwl_umac_scan_stop()
1588 if (iwl_mvm_is_radio_killed(mvm) && in iwl_umac_scan_stop()
1590 ieee80211_scan_completed(mvm->hw, true); in iwl_umac_scan_stop()
1591 iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN); in iwl_umac_scan_stop()
1595 err = iwl_umac_scan_abort_one(mvm, mvm->scan_uid[i]); in iwl_umac_scan_stop()
1602 IWL_DEBUG_SCAN(mvm, "Couldn't stop scan\n"); in iwl_umac_scan_stop()
1603 iwl_remove_notification(&mvm->notif_wait, &wait_scan_done); in iwl_umac_scan_stop()
1607 ret = iwl_wait_notification(&mvm->notif_wait, &wait_scan_done, 1 * HZ); in iwl_umac_scan_stop()
1613 ieee80211_sched_scan_stopped(mvm->hw); in iwl_umac_scan_stop()
1615 ieee80211_scan_completed(mvm->hw, true); in iwl_umac_scan_stop()
1616 iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN); in iwl_umac_scan_stop()
1623 int iwl_mvm_scan_size(struct iwl_mvm *mvm) in iwl_mvm_scan_size() argument
1625 if (mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN) in iwl_mvm_scan_size()
1628 mvm->fw->ucode_capa.n_scan_channels + in iwl_mvm_scan_size()
1633 mvm->fw->ucode_capa.n_scan_channels + in iwl_mvm_scan_size()
1641 void iwl_mvm_report_scan_aborted(struct iwl_mvm *mvm) in iwl_mvm_report_scan_aborted() argument
1643 if (mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN) { in iwl_mvm_report_scan_aborted()
1646 uid = iwl_mvm_find_first_scan(mvm, IWL_UMAC_SCAN_UID_REG_SCAN); in iwl_mvm_report_scan_aborted()
1648 ieee80211_scan_completed(mvm->hw, true); in iwl_mvm_report_scan_aborted()
1649 mvm->scan_uid[uid] = 0; in iwl_mvm_report_scan_aborted()
1651 uid = iwl_mvm_find_first_scan(mvm, in iwl_mvm_report_scan_aborted()
1653 if (uid < IWL_MVM_MAX_SIMULTANEOUS_SCANS && !mvm->restart_fw) { in iwl_mvm_report_scan_aborted()
1654 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_report_scan_aborted()
1655 mvm->scan_uid[uid] = 0; in iwl_mvm_report_scan_aborted()
1663 if (WARN_ONCE(mvm->scan_uid[i], in iwl_mvm_report_scan_aborted()
1665 mvm->scan_uid[i])) in iwl_mvm_report_scan_aborted()
1666 mvm->scan_uid[i] = 0; in iwl_mvm_report_scan_aborted()
1669 switch (mvm->scan_status) { in iwl_mvm_report_scan_aborted()
1673 ieee80211_scan_completed(mvm->hw, true); in iwl_mvm_report_scan_aborted()
1681 if (!mvm->restart_fw) in iwl_mvm_report_scan_aborted()
1682 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_report_scan_aborted()