Lines Matching refs:mvm
146 static u8 iwl_mvm_scan_rx_ant(struct iwl_mvm *mvm) in iwl_mvm_scan_rx_ant() argument
148 if (mvm->scan_rx_ant != ANT_NONE) in iwl_mvm_scan_rx_ant()
149 return mvm->scan_rx_ant; in iwl_mvm_scan_rx_ant()
150 return iwl_mvm_get_valid_rx_ant(mvm); in iwl_mvm_scan_rx_ant()
153 static inline __le16 iwl_mvm_scan_rx_chain(struct iwl_mvm *mvm) in iwl_mvm_scan_rx_chain() argument
158 rx_ant = iwl_mvm_scan_rx_ant(mvm); in iwl_mvm_scan_rx_chain()
175 iwl_mvm_scan_rate_n_flags(struct iwl_mvm *mvm, enum ieee80211_band band, in iwl_mvm_scan_rate_n_flags() argument
180 mvm->scan_last_antenna_idx = in iwl_mvm_scan_rate_n_flags()
181 iwl_mvm_next_antenna(mvm, iwl_mvm_get_valid_tx_ant(mvm), in iwl_mvm_scan_rate_n_flags()
182 mvm->scan_last_antenna_idx); in iwl_mvm_scan_rate_n_flags()
183 tx_ant = BIT(mvm->scan_last_antenna_idx) << RATE_MCS_ANT_POS; in iwl_mvm_scan_rate_n_flags()
203 static enum iwl_mvm_traffic_load iwl_mvm_get_traffic_load(struct iwl_mvm *mvm) in iwl_mvm_get_traffic_load() argument
209 iwl_mvm_scan_type iwl_mvm_get_scan_type(struct iwl_mvm *mvm, in iwl_mvm_get_scan_type() argument
217 ieee80211_iterate_active_interfaces_atomic(mvm->hw, in iwl_mvm_get_scan_type()
224 load = iwl_mvm_get_traffic_load(mvm); in iwl_mvm_get_scan_type()
225 low_latency = iwl_mvm_low_latency(mvm); in iwl_mvm_get_scan_type()
229 fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_FRAGMENTED_SCAN)) in iwl_mvm_get_scan_type()
238 static inline bool iwl_mvm_rrm_scan_needed(struct iwl_mvm *mvm) in iwl_mvm_rrm_scan_needed() argument
241 return fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_rrm_scan_needed()
245 static int iwl_mvm_max_scan_ie_fw_cmd_room(struct iwl_mvm *mvm) in iwl_mvm_max_scan_ie_fw_cmd_room() argument
255 if (iwl_mvm_rrm_scan_needed(mvm)) in iwl_mvm_max_scan_ie_fw_cmd_room()
261 int iwl_mvm_max_scan_ie_len(struct iwl_mvm *mvm) in iwl_mvm_max_scan_ie_len() argument
263 int max_ie_len = iwl_mvm_max_scan_ie_fw_cmd_room(mvm); in iwl_mvm_max_scan_ie_len()
293 void iwl_mvm_rx_lmac_scan_iter_complete_notif(struct iwl_mvm *mvm, in iwl_mvm_rx_lmac_scan_iter_complete_notif() argument
300 IWL_DEBUG_SCAN(mvm, in iwl_mvm_rx_lmac_scan_iter_complete_notif()
308 void iwl_mvm_rx_scan_match_found(struct iwl_mvm *mvm, in iwl_mvm_rx_scan_match_found() argument
311 IWL_DEBUG_SCAN(mvm, "Scheduled scan results\n"); in iwl_mvm_rx_scan_match_found()
312 ieee80211_sched_scan_results(mvm->hw); in iwl_mvm_rx_scan_match_found()
329 void iwl_mvm_rx_lmac_scan_complete_notif(struct iwl_mvm *mvm, in iwl_mvm_rx_lmac_scan_complete_notif() argument
337 lockdep_assert_held(&mvm->mutex); in iwl_mvm_rx_lmac_scan_complete_notif()
349 if (mvm->scan_status & IWL_MVM_SCAN_STOPPING_SCHED) { in iwl_mvm_rx_lmac_scan_complete_notif()
350 WARN_ON_ONCE(mvm->scan_status & IWL_MVM_SCAN_STOPPING_REGULAR); in iwl_mvm_rx_lmac_scan_complete_notif()
352 IWL_DEBUG_SCAN(mvm, "Scheduled scan %s, EBS status %s\n", in iwl_mvm_rx_lmac_scan_complete_notif()
355 IWL_DEBUG_SCAN(mvm, in iwl_mvm_rx_lmac_scan_complete_notif()
361 mvm->scan_status &= ~IWL_MVM_SCAN_STOPPING_SCHED; in iwl_mvm_rx_lmac_scan_complete_notif()
362 } else if (mvm->scan_status & IWL_MVM_SCAN_STOPPING_REGULAR) { in iwl_mvm_rx_lmac_scan_complete_notif()
363 IWL_DEBUG_SCAN(mvm, "Regular scan %s, EBS status %s\n", in iwl_mvm_rx_lmac_scan_complete_notif()
367 mvm->scan_status &= ~IWL_MVM_SCAN_STOPPING_REGULAR; in iwl_mvm_rx_lmac_scan_complete_notif()
368 } else if (mvm->scan_status & IWL_MVM_SCAN_SCHED) { in iwl_mvm_rx_lmac_scan_complete_notif()
369 WARN_ON_ONCE(mvm->scan_status & IWL_MVM_SCAN_REGULAR); in iwl_mvm_rx_lmac_scan_complete_notif()
371 IWL_DEBUG_SCAN(mvm, "Scheduled scan %s, EBS status %s\n", in iwl_mvm_rx_lmac_scan_complete_notif()
374 IWL_DEBUG_SCAN(mvm, in iwl_mvm_rx_lmac_scan_complete_notif()
380 mvm->scan_status &= ~IWL_MVM_SCAN_SCHED; in iwl_mvm_rx_lmac_scan_complete_notif()
381 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_rx_lmac_scan_complete_notif()
382 } else if (mvm->scan_status & IWL_MVM_SCAN_REGULAR) { in iwl_mvm_rx_lmac_scan_complete_notif()
383 IWL_DEBUG_SCAN(mvm, "Regular scan %s, EBS status %s (FW)\n", in iwl_mvm_rx_lmac_scan_complete_notif()
387 mvm->scan_status &= ~IWL_MVM_SCAN_REGULAR; in iwl_mvm_rx_lmac_scan_complete_notif()
388 ieee80211_scan_completed(mvm->hw, in iwl_mvm_rx_lmac_scan_complete_notif()
390 iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN); in iwl_mvm_rx_lmac_scan_complete_notif()
393 mvm->last_ebs_successful = in iwl_mvm_rx_lmac_scan_complete_notif()
460 iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm, in iwl_mvm_config_sched_scan_profiles() argument
479 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_SHORT_BL) in iwl_mvm_config_sched_scan_profiles()
518 IWL_DEBUG_SCAN(mvm, "Sending scheduled scan profile config\n"); in iwl_mvm_config_sched_scan_profiles()
520 ret = iwl_mvm_send_cmd(mvm, &cmd); in iwl_mvm_config_sched_scan_profiles()
528 static bool iwl_mvm_scan_pass_all(struct iwl_mvm *mvm, in iwl_mvm_scan_pass_all() argument
532 IWL_DEBUG_SCAN(mvm, in iwl_mvm_scan_pass_all()
538 IWL_DEBUG_SCAN(mvm, "Sending Scheduled scan without filtering\n"); in iwl_mvm_scan_pass_all()
542 static int iwl_mvm_lmac_scan_abort(struct iwl_mvm *mvm) in iwl_mvm_lmac_scan_abort() argument
550 ret = iwl_mvm_send_cmd_status(mvm, &cmd, &status); in iwl_mvm_lmac_scan_abort()
562 IWL_DEBUG_SCAN(mvm, "SCAN OFFLOAD ABORT ret %d.\n", status); in iwl_mvm_lmac_scan_abort()
569 static void iwl_mvm_scan_fill_tx_cmd(struct iwl_mvm *mvm, in iwl_mvm_scan_fill_tx_cmd() argument
575 tx_cmd[0].rate_n_flags = iwl_mvm_scan_rate_n_flags(mvm, in iwl_mvm_scan_fill_tx_cmd()
578 tx_cmd[0].sta_id = mvm->aux_sta.sta_id; in iwl_mvm_scan_fill_tx_cmd()
582 tx_cmd[1].rate_n_flags = iwl_mvm_scan_rate_n_flags(mvm, in iwl_mvm_scan_fill_tx_cmd()
585 tx_cmd[1].sta_id = mvm->aux_sta.sta_id; in iwl_mvm_scan_fill_tx_cmd()
589 iwl_mvm_lmac_scan_cfg_channels(struct iwl_mvm *mvm, in iwl_mvm_lmac_scan_cfg_channels() argument
608 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
620 if (!iwl_mvm_rrm_scan_needed(mvm)) { in iwl_mvm_copy_and_insert_ds_elem()
645 iwl_mvm_build_scan_probe(struct iwl_mvm *mvm, struct ieee80211_vif *vif, in iwl_mvm_build_scan_probe() argument
679 newpos = iwl_mvm_copy_and_insert_ds_elem(mvm, in iwl_mvm_build_scan_probe()
699 static __le32 iwl_mvm_scan_priority(struct iwl_mvm *mvm, in iwl_mvm_scan_priority() argument
702 if (fw_has_api(&mvm->fw->ucode_capa, in iwl_mvm_scan_priority()
715 static void iwl_mvm_scan_lmac_dwell(struct iwl_mvm *mvm, in iwl_mvm_scan_lmac_dwell() argument
724 cmd->scan_prio = iwl_mvm_scan_priority(mvm, IWL_SCAN_PRIORITY_EXT_6); in iwl_mvm_scan_lmac_dwell()
727 static inline bool iwl_mvm_scan_fits(struct iwl_mvm *mvm, int n_ssids, in iwl_mvm_scan_fits() argument
732 (n_channels <= mvm->fw->ucode_capa.n_scan_channels) & in iwl_mvm_scan_fits()
736 iwl_mvm_max_scan_ie_fw_cmd_room(mvm))); in iwl_mvm_scan_fits()
739 static inline bool iwl_mvm_scan_use_ebs(struct iwl_mvm *mvm, in iwl_mvm_scan_use_ebs() argument
742 const struct iwl_ucode_capabilities *capa = &mvm->fw->ucode_capa; in iwl_mvm_scan_use_ebs()
751 mvm->last_ebs_successful && in iwl_mvm_scan_use_ebs()
755 static int iwl_mvm_scan_lmac_flags(struct iwl_mvm *mvm, in iwl_mvm_scan_lmac_flags() argument
769 if (iwl_mvm_rrm_scan_needed(mvm)) in iwl_mvm_scan_lmac_flags()
778 if (mvm->scan_iter_notif_enabled) in iwl_mvm_scan_lmac_flags()
785 static int iwl_mvm_scan_lmac(struct iwl_mvm *mvm, struct ieee80211_vif *vif, in iwl_mvm_scan_lmac() argument
788 struct iwl_scan_req_lmac *cmd = mvm->scan_cmd; in iwl_mvm_scan_lmac()
791 mvm->fw->ucode_capa.n_scan_channels); in iwl_mvm_scan_lmac()
795 lockdep_assert_held(&mvm->mutex); in iwl_mvm_scan_lmac()
802 iwl_mvm_scan_lmac_dwell(mvm, cmd, params); in iwl_mvm_scan_lmac()
804 cmd->rx_chain_select = iwl_mvm_scan_rx_chain(mvm); in iwl_mvm_scan_lmac()
810 cmd->scan_flags = cpu_to_le32(iwl_mvm_scan_lmac_flags(mvm, params)); in iwl_mvm_scan_lmac()
815 iwl_mvm_scan_fill_tx_cmd(mvm, cmd->tx_cmd, params->no_cck); in iwl_mvm_scan_lmac()
840 if (iwl_mvm_scan_use_ebs(mvm, vif)) { in iwl_mvm_scan_lmac()
855 iwl_mvm_lmac_scan_cfg_channels(mvm, params->channels, in iwl_mvm_scan_lmac()
883 static __le32 iwl_mvm_scan_config_rates(struct iwl_mvm *mvm) in iwl_mvm_scan_config_rates() argument
889 band = &mvm->nvm_data->bands[IEEE80211_BAND_2GHZ]; in iwl_mvm_scan_config_rates()
892 band = &mvm->nvm_data->bands[IEEE80211_BAND_5GHZ]; in iwl_mvm_scan_config_rates()
902 int iwl_mvm_config_scan(struct iwl_mvm *mvm) in iwl_mvm_config_scan() argument
907 mvm->nvm_data->bands[IEEE80211_BAND_2GHZ].n_channels + in iwl_mvm_config_scan()
908 mvm->nvm_data->bands[IEEE80211_BAND_5GHZ].n_channels; in iwl_mvm_config_scan()
914 if (WARN_ON(num_channels > mvm->fw->ucode_capa.n_scan_channels)) in iwl_mvm_config_scan()
917 cmd_size = sizeof(*scan_config) + mvm->fw->ucode_capa.n_scan_channels; in iwl_mvm_config_scan()
932 scan_config->tx_chains = cpu_to_le32(iwl_mvm_get_valid_tx_ant(mvm)); in iwl_mvm_config_scan()
933 scan_config->rx_chains = cpu_to_le32(iwl_mvm_scan_rx_ant(mvm)); in iwl_mvm_config_scan()
934 scan_config->legacy_rates = iwl_mvm_scan_config_rates(mvm); in iwl_mvm_config_scan()
941 memcpy(&scan_config->mac_addr, &mvm->addresses[0].addr, ETH_ALEN); in iwl_mvm_config_scan()
943 scan_config->bcast_sta_id = mvm->aux_sta.sta_id; in iwl_mvm_config_scan()
949 band = &mvm->nvm_data->bands[IEEE80211_BAND_2GHZ]; in iwl_mvm_config_scan()
952 band = &mvm->nvm_data->bands[IEEE80211_BAND_5GHZ]; in iwl_mvm_config_scan()
960 IWL_DEBUG_SCAN(mvm, "Sending UMAC scan config\n"); in iwl_mvm_config_scan()
962 ret = iwl_mvm_send_cmd(mvm, &cmd); in iwl_mvm_config_scan()
968 static int iwl_mvm_scan_uid_by_status(struct iwl_mvm *mvm, int status) in iwl_mvm_scan_uid_by_status() argument
972 for (i = 0; i < mvm->max_scans; i++) in iwl_mvm_scan_uid_by_status()
973 if (mvm->scan_uid_status[i] == status) in iwl_mvm_scan_uid_by_status()
985 static void iwl_mvm_scan_umac_dwell(struct iwl_mvm *mvm, in iwl_mvm_scan_umac_dwell() argument
995 iwl_mvm_scan_priority(mvm, IWL_SCAN_PRIORITY_EXT_6); in iwl_mvm_scan_umac_dwell()
999 iwl_mvm_scan_priority(mvm, IWL_SCAN_PRIORITY_EXT_6); in iwl_mvm_scan_umac_dwell()
1002 iwl_mvm_scan_priority(mvm, IWL_SCAN_PRIORITY_EXT_2); in iwl_mvm_scan_umac_dwell()
1006 iwl_mvm_umac_scan_cfg_channels(struct iwl_mvm *mvm, in iwl_mvm_umac_scan_cfg_channels() argument
1022 static u32 iwl_mvm_scan_umac_flags(struct iwl_mvm *mvm, in iwl_mvm_scan_umac_flags() argument
1036 if (iwl_mvm_rrm_scan_needed(mvm)) in iwl_mvm_scan_umac_flags()
1048 if (mvm->scan_iter_notif_enabled) in iwl_mvm_scan_umac_flags()
1054 static int iwl_mvm_scan_umac(struct iwl_mvm *mvm, struct ieee80211_vif *vif, in iwl_mvm_scan_umac() argument
1058 struct iwl_scan_req_umac *cmd = mvm->scan_cmd; in iwl_mvm_scan_umac()
1061 mvm->fw->ucode_capa.n_scan_channels; in iwl_mvm_scan_umac()
1065 lockdep_assert_held(&mvm->mutex); in iwl_mvm_scan_umac()
1070 uid = iwl_mvm_scan_uid_by_status(mvm, 0); in iwl_mvm_scan_umac()
1076 iwl_mvm_scan_umac_dwell(mvm, cmd, params); in iwl_mvm_scan_umac()
1078 mvm->scan_uid_status[uid] = type; in iwl_mvm_scan_umac()
1081 cmd->general_flags = cpu_to_le32(iwl_mvm_scan_umac_flags(mvm, params)); in iwl_mvm_scan_umac()
1086 if (iwl_mvm_scan_use_ebs(mvm, vif)) in iwl_mvm_scan_umac()
1095 iwl_mvm_umac_scan_cfg_channels(mvm, params->channels, in iwl_mvm_scan_umac()
1122 static int iwl_mvm_num_scans(struct iwl_mvm *mvm) in iwl_mvm_num_scans() argument
1124 return hweight32(mvm->scan_status & IWL_MVM_SCAN_MASK); in iwl_mvm_num_scans()
1127 static int iwl_mvm_check_running_scans(struct iwl_mvm *mvm, int type) in iwl_mvm_check_running_scans() argument
1139 if (iwl_mvm_num_scans(mvm) < mvm->max_scans) in iwl_mvm_check_running_scans()
1147 if (mvm->scan_status & IWL_MVM_SCAN_REGULAR_MASK) in iwl_mvm_check_running_scans()
1149 return iwl_mvm_scan_stop(mvm, IWL_MVM_SCAN_SCHED, true); in iwl_mvm_check_running_scans()
1151 if (mvm->scan_status & IWL_MVM_SCAN_SCHED_MASK) in iwl_mvm_check_running_scans()
1153 iwl_mvm_scan_stop(mvm, IWL_MVM_SCAN_REGULAR, true); in iwl_mvm_check_running_scans()
1169 int iwl_mvm_reg_scan_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif, in iwl_mvm_reg_scan_start() argument
1174 .len = { iwl_mvm_scan_size(mvm), }, in iwl_mvm_reg_scan_start()
1175 .data = { mvm->scan_cmd, }, in iwl_mvm_reg_scan_start()
1182 lockdep_assert_held(&mvm->mutex); in iwl_mvm_reg_scan_start()
1184 if (iwl_mvm_is_lar_supported(mvm) && !mvm->lar_regdom_set) { in iwl_mvm_reg_scan_start()
1185 IWL_ERR(mvm, "scan while LAR regdomain is not set\n"); in iwl_mvm_reg_scan_start()
1189 ret = iwl_mvm_check_running_scans(mvm, IWL_MVM_SCAN_REGULAR); in iwl_mvm_reg_scan_start()
1194 if (WARN_ON(!mvm->scan_cmd)) in iwl_mvm_reg_scan_start()
1197 if (!iwl_mvm_scan_fits(mvm, req->n_ssids, ies, req->n_channels)) in iwl_mvm_reg_scan_start()
1216 params.type = iwl_mvm_get_scan_type(mvm, vif, ¶ms); in iwl_mvm_reg_scan_start()
1218 iwl_mvm_build_scan_probe(mvm, vif, ies, ¶ms); in iwl_mvm_reg_scan_start()
1220 if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) { in iwl_mvm_reg_scan_start()
1222 ret = iwl_mvm_scan_umac(mvm, vif, ¶ms, in iwl_mvm_reg_scan_start()
1226 ret = iwl_mvm_scan_lmac(mvm, vif, ¶ms); in iwl_mvm_reg_scan_start()
1232 ret = iwl_mvm_send_cmd(mvm, &hcmd); in iwl_mvm_reg_scan_start()
1238 IWL_ERR(mvm, "Scan failed! ret %d\n", ret); in iwl_mvm_reg_scan_start()
1242 IWL_DEBUG_SCAN(mvm, "Scan request was sent successfully\n"); in iwl_mvm_reg_scan_start()
1243 mvm->scan_status |= IWL_MVM_SCAN_REGULAR; in iwl_mvm_reg_scan_start()
1244 iwl_mvm_ref(mvm, IWL_MVM_REF_SCAN); in iwl_mvm_reg_scan_start()
1249 int iwl_mvm_sched_scan_start(struct iwl_mvm *mvm, in iwl_mvm_sched_scan_start() argument
1256 .len = { iwl_mvm_scan_size(mvm), }, in iwl_mvm_sched_scan_start()
1257 .data = { mvm->scan_cmd, }, in iwl_mvm_sched_scan_start()
1263 lockdep_assert_held(&mvm->mutex); in iwl_mvm_sched_scan_start()
1265 if (iwl_mvm_is_lar_supported(mvm) && !mvm->lar_regdom_set) { in iwl_mvm_sched_scan_start()
1266 IWL_ERR(mvm, "sched-scan while LAR regdomain is not set\n"); in iwl_mvm_sched_scan_start()
1274 ret = iwl_mvm_check_running_scans(mvm, type); in iwl_mvm_sched_scan_start()
1279 if (WARN_ON(!mvm->scan_cmd)) in iwl_mvm_sched_scan_start()
1282 if (!iwl_mvm_scan_fits(mvm, req->n_ssids, ies, req->n_channels)) in iwl_mvm_sched_scan_start()
1293 params.pass_all = iwl_mvm_scan_pass_all(mvm, req); in iwl_mvm_sched_scan_start()
1302 params.type = iwl_mvm_get_scan_type(mvm, vif, ¶ms); in iwl_mvm_sched_scan_start()
1310 IWL_DEBUG_SCAN(mvm, in iwl_mvm_sched_scan_start()
1317 ret = iwl_mvm_config_sched_scan_profiles(mvm, req); in iwl_mvm_sched_scan_start()
1321 iwl_mvm_build_scan_probe(mvm, vif, ies, ¶ms); in iwl_mvm_sched_scan_start()
1323 if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) { in iwl_mvm_sched_scan_start()
1325 ret = iwl_mvm_scan_umac(mvm, vif, ¶ms, IWL_MVM_SCAN_SCHED); in iwl_mvm_sched_scan_start()
1328 ret = iwl_mvm_scan_lmac(mvm, vif, ¶ms); in iwl_mvm_sched_scan_start()
1334 ret = iwl_mvm_send_cmd(mvm, &hcmd); in iwl_mvm_sched_scan_start()
1336 IWL_DEBUG_SCAN(mvm, in iwl_mvm_sched_scan_start()
1338 mvm->scan_status |= type; in iwl_mvm_sched_scan_start()
1344 IWL_ERR(mvm, "Sched scan failed! ret %d\n", ret); in iwl_mvm_sched_scan_start()
1350 void iwl_mvm_rx_umac_scan_complete_notif(struct iwl_mvm *mvm, in iwl_mvm_rx_umac_scan_complete_notif() argument
1358 if (WARN_ON(!(mvm->scan_uid_status[uid] & mvm->scan_status))) in iwl_mvm_rx_umac_scan_complete_notif()
1362 if (mvm->scan_uid_status[uid] == IWL_MVM_SCAN_REGULAR) { in iwl_mvm_rx_umac_scan_complete_notif()
1363 ieee80211_scan_completed(mvm->hw, aborted); in iwl_mvm_rx_umac_scan_complete_notif()
1364 iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN); in iwl_mvm_rx_umac_scan_complete_notif()
1365 } else if (mvm->scan_uid_status[uid] == IWL_MVM_SCAN_SCHED) { in iwl_mvm_rx_umac_scan_complete_notif()
1366 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_rx_umac_scan_complete_notif()
1369 mvm->scan_status &= ~mvm->scan_uid_status[uid]; in iwl_mvm_rx_umac_scan_complete_notif()
1370 IWL_DEBUG_SCAN(mvm, in iwl_mvm_rx_umac_scan_complete_notif()
1372 uid, mvm->scan_uid_status[uid], in iwl_mvm_rx_umac_scan_complete_notif()
1376 IWL_DEBUG_SCAN(mvm, in iwl_mvm_rx_umac_scan_complete_notif()
1383 mvm->last_ebs_successful = false; in iwl_mvm_rx_umac_scan_complete_notif()
1385 mvm->scan_uid_status[uid] = 0; in iwl_mvm_rx_umac_scan_complete_notif()
1388 void iwl_mvm_rx_umac_scan_iter_complete_notif(struct iwl_mvm *mvm, in iwl_mvm_rx_umac_scan_iter_complete_notif() argument
1395 IWL_DEBUG_SCAN(mvm, in iwl_mvm_rx_umac_scan_iter_complete_notif()
1403 static int iwl_mvm_umac_scan_abort(struct iwl_mvm *mvm, int type) in iwl_mvm_umac_scan_abort() argument
1408 lockdep_assert_held(&mvm->mutex); in iwl_mvm_umac_scan_abort()
1414 uid = iwl_mvm_scan_uid_by_status(mvm, type); in iwl_mvm_umac_scan_abort()
1420 IWL_DEBUG_SCAN(mvm, "Sending scan abort, uid %u\n", uid); in iwl_mvm_umac_scan_abort()
1422 ret = iwl_mvm_send_cmd_pdu(mvm, in iwl_mvm_umac_scan_abort()
1427 mvm->scan_uid_status[uid] = type << IWL_MVM_SCAN_STOPPING_SHIFT; in iwl_mvm_umac_scan_abort()
1432 static int iwl_mvm_scan_stop_wait(struct iwl_mvm *mvm, int type) in iwl_mvm_scan_stop_wait() argument
1439 lockdep_assert_held(&mvm->mutex); in iwl_mvm_scan_stop_wait()
1441 iwl_init_notification_wait(&mvm->notif_wait, &wait_scan_done, in iwl_mvm_scan_stop_wait()
1446 IWL_DEBUG_SCAN(mvm, "Preparing to stop scan, type %x\n", type); in iwl_mvm_scan_stop_wait()
1448 if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) in iwl_mvm_scan_stop_wait()
1449 ret = iwl_mvm_umac_scan_abort(mvm, type); in iwl_mvm_scan_stop_wait()
1451 ret = iwl_mvm_lmac_scan_abort(mvm); in iwl_mvm_scan_stop_wait()
1454 IWL_DEBUG_SCAN(mvm, "couldn't stop scan type %d\n", type); in iwl_mvm_scan_stop_wait()
1455 iwl_remove_notification(&mvm->notif_wait, &wait_scan_done); in iwl_mvm_scan_stop_wait()
1459 ret = iwl_wait_notification(&mvm->notif_wait, &wait_scan_done, 1 * HZ); in iwl_mvm_scan_stop_wait()
1464 int iwl_mvm_scan_size(struct iwl_mvm *mvm) in iwl_mvm_scan_size() argument
1466 if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) in iwl_mvm_scan_size()
1469 mvm->fw->ucode_capa.n_scan_channels + in iwl_mvm_scan_size()
1474 mvm->fw->ucode_capa.n_scan_channels + in iwl_mvm_scan_size()
1482 void iwl_mvm_report_scan_aborted(struct iwl_mvm *mvm) in iwl_mvm_report_scan_aborted() argument
1484 if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) { in iwl_mvm_report_scan_aborted()
1487 uid = iwl_mvm_scan_uid_by_status(mvm, IWL_MVM_SCAN_REGULAR); in iwl_mvm_report_scan_aborted()
1489 ieee80211_scan_completed(mvm->hw, true); in iwl_mvm_report_scan_aborted()
1490 mvm->scan_uid_status[uid] = 0; in iwl_mvm_report_scan_aborted()
1492 uid = iwl_mvm_scan_uid_by_status(mvm, IWL_MVM_SCAN_SCHED); in iwl_mvm_report_scan_aborted()
1493 if (uid >= 0 && !mvm->restart_fw) { in iwl_mvm_report_scan_aborted()
1494 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_report_scan_aborted()
1495 mvm->scan_uid_status[uid] = 0; in iwl_mvm_report_scan_aborted()
1502 for (i = 0; i < mvm->max_scans; i++) { in iwl_mvm_report_scan_aborted()
1503 if (WARN_ONCE(mvm->scan_uid_status[i], in iwl_mvm_report_scan_aborted()
1506 mvm->scan_uid_status[i] = 0; in iwl_mvm_report_scan_aborted()
1509 if (mvm->scan_status & IWL_MVM_SCAN_REGULAR) in iwl_mvm_report_scan_aborted()
1510 ieee80211_scan_completed(mvm->hw, true); in iwl_mvm_report_scan_aborted()
1516 if ((mvm->scan_status & IWL_MVM_SCAN_SCHED) && !mvm->restart_fw) in iwl_mvm_report_scan_aborted()
1517 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_report_scan_aborted()
1521 int iwl_mvm_scan_stop(struct iwl_mvm *mvm, int type, bool notify) in iwl_mvm_scan_stop() argument
1525 if (!(mvm->scan_status & type)) in iwl_mvm_scan_stop()
1528 if (iwl_mvm_is_radio_killed(mvm)) { in iwl_mvm_scan_stop()
1533 ret = iwl_mvm_scan_stop_wait(mvm, type); in iwl_mvm_scan_stop()
1535 mvm->scan_status |= type << IWL_MVM_SCAN_STOPPING_SHIFT; in iwl_mvm_scan_stop()
1542 mvm->scan_status &= ~type; in iwl_mvm_scan_stop()
1548 iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN); in iwl_mvm_scan_stop()
1550 ieee80211_scan_completed(mvm->hw, true); in iwl_mvm_scan_stop()
1552 ieee80211_sched_scan_stopped(mvm->hw); in iwl_mvm_scan_stop()