Lines Matching full:local

32 void ieee80211_rx_bss_put(struct ieee80211_local *local,  in ieee80211_rx_bss_put()  argument
37 cfg80211_put_bss(local->hw.wiphy, in ieee80211_rx_bss_put()
68 struct ieee80211_local *local = wiphy_priv(wiphy); in ieee80211_inform_bss() local
147 local->hw.wiphy->bands[rx_status->band]; in ieee80211_inform_bss()
164 ieee80211_bss_info_update(struct ieee80211_local *local, in ieee80211_bss_info_update() argument
185 else if (ieee80211_hw_check(&local->hw, SIGNAL_DBM)) in ieee80211_bss_info_update()
187 else if (ieee80211_hw_check(&local->hw, SIGNAL_UNSPEC)) in ieee80211_bss_info_update()
188 bss_meta.signal = (rx_status->signal * 100) / local->hw.max_signal; in ieee80211_bss_info_update()
193 scan_sdata = rcu_dereference(local->scan_sdata); in ieee80211_bss_info_update()
215 ieee80211_calculate_rx_timestamp(local, in ieee80211_bss_info_update()
226 cbss = cfg80211_inform_bss_frame_data(local->hw.wiphy, &bss_meta, in ieee80211_bss_info_update()
257 void ieee80211_scan_rx(struct ieee80211_local *local, struct sk_buff *skb) in ieee80211_scan_rx() argument
283 if (test_and_clear_bit(SCAN_BEACON_WAIT, &local->scanning)) { in ieee80211_scan_rx()
289 set_bit(SCAN_BEACON_DONE, &local->scanning); in ieee80211_scan_rx()
290 wiphy_delayed_work_queue(local->hw.wiphy, &local->scan_work, 0); in ieee80211_scan_rx()
293 channel = ieee80211_get_channel_khz(local->hw.wiphy, in ieee80211_scan_rx()
305 sdata1 = rcu_dereference(local->scan_sdata); in ieee80211_scan_rx()
306 sdata2 = rcu_dereference(local->sched_scan_sdata); in ieee80211_scan_rx()
311 scan_req = rcu_dereference(local->scan_req); in ieee80211_scan_rx()
312 sched_scan_req = rcu_dereference(local->sched_scan_req); in ieee80211_scan_rx()
337 if (local->open_count == local->monitors) in ieee80211_scan_rx()
340 bss = ieee80211_bss_info_update(local, rx_status, in ieee80211_scan_rx()
344 ieee80211_rx_bss_put(local, bss); in ieee80211_scan_rx()
357 struct ieee80211_local *local = sdata->local; in ieee80211_prep_hw_scan() local
365 req = rcu_dereference_protected(local->scan_req, in ieee80211_prep_hw_scan()
366 lockdep_is_held(&local->hw.wiphy->mtx)); in ieee80211_prep_hw_scan()
368 if (test_bit(SCAN_HW_CANCELLED, &local->scanning)) in ieee80211_prep_hw_scan()
371 if (ieee80211_hw_check(&local->hw, SINGLE_SCAN_ON_ALL_BANDS)) { in ieee80211_prep_hw_scan()
372 local->hw_scan_req->req.n_channels = req->n_channels; in ieee80211_prep_hw_scan()
375 local->hw_scan_req->req.channels[i] = req->channels[i]; in ieee80211_prep_hw_scan()
380 if (local->hw_scan_band == NUM_NL80211_BANDS) in ieee80211_prep_hw_scan()
383 n_chans = &local->hw_scan_req->req.n_channels; in ieee80211_prep_hw_scan()
388 local->hw_scan_band) in ieee80211_prep_hw_scan()
390 local->hw_scan_req->req.channels[(*n_chans)++] = in ieee80211_prep_hw_scan()
396 local->hw_scan_band++; in ieee80211_prep_hw_scan()
406 (u8 *)local->hw_scan_req->req.ie, in ieee80211_prep_hw_scan()
407 local->hw_scan_ies_bufsize, in ieee80211_prep_hw_scan()
408 &local->hw_scan_req->ies, in ieee80211_prep_hw_scan()
414 local->hw_scan_req->req.ie_len = ielen; in ieee80211_prep_hw_scan()
415 local->hw_scan_req->req.no_cck = req->no_cck; in ieee80211_prep_hw_scan()
416 ether_addr_copy(local->hw_scan_req->req.mac_addr, req->mac_addr); in ieee80211_prep_hw_scan()
417 ether_addr_copy(local->hw_scan_req->req.mac_addr_mask, in ieee80211_prep_hw_scan()
419 ether_addr_copy(local->hw_scan_req->req.bssid, req->bssid); in ieee80211_prep_hw_scan()
426 struct ieee80211_local *local = hw_to_local(hw); in __ieee80211_scan_completed() local
427 bool hw_scan = test_bit(SCAN_HW_SCANNING, &local->scanning); in __ieee80211_scan_completed()
428 bool was_scanning = local->scanning; in __ieee80211_scan_completed()
433 lockdep_assert_wiphy(local->hw.wiphy); in __ieee80211_scan_completed()
438 * local->scan_req next), but not to complete it in __ieee80211_scan_completed()
441 if (WARN_ON(!local->scanning && !aborted)) in __ieee80211_scan_completed()
444 if (WARN_ON(!local->scan_req)) in __ieee80211_scan_completed()
447 scan_sdata = rcu_dereference_protected(local->scan_sdata, in __ieee80211_scan_completed()
448 lockdep_is_held(&local->hw.wiphy->mtx)); in __ieee80211_scan_completed()
451 !ieee80211_hw_check(&local->hw, SINGLE_SCAN_ON_ALL_BANDS) && in __ieee80211_scan_completed()
455 rc = drv_hw_scan(local, in __ieee80211_scan_completed()
456 rcu_dereference_protected(local->scan_sdata, in __ieee80211_scan_completed()
457 lockdep_is_held(&local->hw.wiphy->mtx)), in __ieee80211_scan_completed()
458 local->hw_scan_req); in __ieee80211_scan_completed()
466 memset(&local->scan_info, 0, sizeof(local->scan_info)); in __ieee80211_scan_completed()
470 kfree(local->hw_scan_req); in __ieee80211_scan_completed()
471 local->hw_scan_req = NULL; in __ieee80211_scan_completed()
473 scan_req = rcu_dereference_protected(local->scan_req, in __ieee80211_scan_completed()
474 lockdep_is_held(&local->hw.wiphy->mtx)); in __ieee80211_scan_completed()
476 RCU_INIT_POINTER(local->scan_req, NULL); in __ieee80211_scan_completed()
477 RCU_INIT_POINTER(local->scan_sdata, NULL); in __ieee80211_scan_completed()
479 local->scanning = 0; in __ieee80211_scan_completed()
480 local->scan_chandef.chan = NULL; in __ieee80211_scan_completed()
484 if (scan_req != local->int_scan_req) { in __ieee80211_scan_completed()
485 local->scan_info.aborted = aborted; in __ieee80211_scan_completed()
486 cfg80211_scan_done(scan_req, &local->scan_info); in __ieee80211_scan_completed()
490 ieee80211_hw_conf_chan(local); in __ieee80211_scan_completed()
493 ieee80211_configure_filter(local); in __ieee80211_scan_completed()
494 drv_sw_scan_complete(local, scan_sdata); in __ieee80211_scan_completed()
495 ieee80211_offchannel_return(local); in __ieee80211_scan_completed()
498 ieee80211_recalc_idle(local); in __ieee80211_scan_completed()
500 ieee80211_mlme_notify_scan_completed(local); in __ieee80211_scan_completed()
501 ieee80211_ibss_notify_scan_completed(local); in __ieee80211_scan_completed()
507 list_for_each_entry(sdata, &local->interfaces, list) { in __ieee80211_scan_completed()
509 wiphy_work_queue(sdata->local->hw.wiphy, &sdata->work); in __ieee80211_scan_completed()
513 ieee80211_start_next_roc(local); in __ieee80211_scan_completed()
519 struct ieee80211_local *local = hw_to_local(hw); in ieee80211_scan_completed() local
521 trace_api_scan_completed(local, info->aborted); in ieee80211_scan_completed()
523 set_bit(SCAN_COMPLETED, &local->scanning); in ieee80211_scan_completed()
525 set_bit(SCAN_ABORTED, &local->scanning); in ieee80211_scan_completed()
527 memcpy(&local->scan_info, info, sizeof(*info)); in ieee80211_scan_completed()
529 wiphy_delayed_work_queue(local->hw.wiphy, &local->scan_work, 0); in ieee80211_scan_completed()
533 static int ieee80211_start_sw_scan(struct ieee80211_local *local, in ieee80211_start_sw_scan() argument
537 if (!local->emulate_chanctx) in ieee80211_start_sw_scan()
549 * Note that while local->sw_scanning is true everything else but in ieee80211_start_sw_scan()
553 drv_sw_scan_start(local, sdata, local->scan_addr); in ieee80211_start_sw_scan()
555 local->leave_oper_channel_time = jiffies; in ieee80211_start_sw_scan()
556 local->next_scan_state = SCAN_DECISION; in ieee80211_start_sw_scan()
557 local->scan_channel_idx = 0; in ieee80211_start_sw_scan()
559 ieee80211_offchannel_stop_vifs(local); in ieee80211_start_sw_scan()
562 ieee80211_flush_queues(local, NULL, false); in ieee80211_start_sw_scan()
564 ieee80211_configure_filter(local); in ieee80211_start_sw_scan()
567 ieee80211_hw_conf_chan(local); in ieee80211_start_sw_scan()
569 wiphy_delayed_work_queue(local->hw.wiphy, &local->scan_work, 0); in ieee80211_start_sw_scan()
576 struct ieee80211_local *local = sdata->local; in __ieee80211_can_leave_ch() local
580 lockdep_assert_wiphy(local->hw.wiphy); in __ieee80211_can_leave_ch()
582 if (!ieee80211_is_radar_required(local)) in __ieee80211_can_leave_ch()
585 if (!regulatory_pre_cac_allowed(local->hw.wiphy)) in __ieee80211_can_leave_ch()
588 list_for_each_entry(sdata_iter, &local->interfaces, list) { in __ieee80211_can_leave_ch()
597 static bool ieee80211_can_scan(struct ieee80211_local *local, in ieee80211_can_scan() argument
603 if (!list_empty(&local->roc_list)) in ieee80211_can_scan()
613 void ieee80211_run_deferred_scan(struct ieee80211_local *local) in ieee80211_run_deferred_scan() argument
615 lockdep_assert_wiphy(local->hw.wiphy); in ieee80211_run_deferred_scan()
617 if (!local->scan_req || local->scanning) in ieee80211_run_deferred_scan()
620 if (!ieee80211_can_scan(local, in ieee80211_run_deferred_scan()
622 local->scan_sdata, in ieee80211_run_deferred_scan()
623 lockdep_is_held(&local->hw.wiphy->mtx)))) in ieee80211_run_deferred_scan()
626 wiphy_delayed_work_queue(local->hw.wiphy, &local->scan_work, in ieee80211_run_deferred_scan()
659 static void ieee80211_scan_state_send_probe(struct ieee80211_local *local, in ieee80211_scan_state_send_probe() argument
665 enum nl80211_band band = local->hw.conf.chandef.chan->band; in ieee80211_scan_state_send_probe()
668 scan_req = rcu_dereference_protected(local->scan_req, in ieee80211_scan_state_send_probe()
669 lockdep_is_held(&local->hw.wiphy->mtx)); in ieee80211_scan_state_send_probe()
679 sdata = rcu_dereference_protected(local->scan_sdata, in ieee80211_scan_state_send_probe()
680 lockdep_is_held(&local->hw.wiphy->mtx)); in ieee80211_scan_state_send_probe()
684 sdata, local->scan_addr, scan_req->bssid, in ieee80211_scan_state_send_probe()
688 tx_flags, local->hw.conf.chandef.chan); in ieee80211_scan_state_send_probe()
698 local->next_scan_state = SCAN_DECISION; in ieee80211_scan_state_send_probe()
704 struct ieee80211_local *local = sdata->local; in __ieee80211_start_scan() local
705 bool hw_scan = local->ops->hw_scan; in __ieee80211_start_scan()
708 lockdep_assert_wiphy(local->hw.wiphy); in __ieee80211_start_scan()
710 if (local->scan_req) in __ieee80211_start_scan()
723 if (!ieee80211_can_scan(local, sdata)) { in __ieee80211_start_scan()
725 rcu_assign_pointer(local->scan_req, req); in __ieee80211_start_scan()
726 rcu_assign_pointer(local->scan_sdata, sdata); in __ieee80211_start_scan()
734 local->hw_scan_ies_bufsize = local->scan_ies_len + req->ie_len; in __ieee80211_start_scan()
736 if (ieee80211_hw_check(&local->hw, SINGLE_SCAN_ON_ALL_BANDS)) { in __ieee80211_start_scan()
747 local->hw_scan_ies_bufsize *= n_bands; in __ieee80211_start_scan()
750 local->hw_scan_req = kmalloc(struct_size(local->hw_scan_req, in __ieee80211_start_scan()
753 local->hw_scan_ies_bufsize, in __ieee80211_start_scan()
755 if (!local->hw_scan_req) in __ieee80211_start_scan()
758 local->hw_scan_req->req.ssids = req->ssids; in __ieee80211_start_scan()
759 local->hw_scan_req->req.n_ssids = req->n_ssids; in __ieee80211_start_scan()
763 local->hw_scan_req->req.n_channels = req->n_channels; in __ieee80211_start_scan()
765 ies = (u8 *)local->hw_scan_req + in __ieee80211_start_scan()
766 sizeof(*local->hw_scan_req) + in __ieee80211_start_scan()
768 local->hw_scan_req->req.ie = ies; in __ieee80211_start_scan()
769 local->hw_scan_req->req.flags = req->flags; in __ieee80211_start_scan()
770 eth_broadcast_addr(local->hw_scan_req->req.bssid); in __ieee80211_start_scan()
771 local->hw_scan_req->req.duration = req->duration; in __ieee80211_start_scan()
772 local->hw_scan_req->req.duration_mandatory = in __ieee80211_start_scan()
774 local->hw_scan_req->req.tsf_report_link_id = in __ieee80211_start_scan()
777 local->hw_scan_band = 0; in __ieee80211_start_scan()
778 local->hw_scan_req->req.n_6ghz_params = req->n_6ghz_params; in __ieee80211_start_scan()
779 local->hw_scan_req->req.scan_6ghz_params = in __ieee80211_start_scan()
781 local->hw_scan_req->req.scan_6ghz = req->scan_6ghz; in __ieee80211_start_scan()
784 * After allocating local->hw_scan_req, we must in __ieee80211_start_scan()
792 rcu_assign_pointer(local->scan_req, req); in __ieee80211_start_scan()
793 rcu_assign_pointer(local->scan_sdata, sdata); in __ieee80211_start_scan()
796 get_random_mask_addr(local->scan_addr, in __ieee80211_start_scan()
800 memcpy(local->scan_addr, sdata->vif.addr, ETH_ALEN); in __ieee80211_start_scan()
803 __set_bit(SCAN_HW_SCANNING, &local->scanning); in __ieee80211_start_scan()
805 (req->channels[0] == local->hw.conf.chandef.chan)) { in __ieee80211_start_scan()
812 __set_bit(SCAN_ONCHANNEL_SCANNING, &local->scanning); in __ieee80211_start_scan()
814 ieee80211_recalc_idle(local); in __ieee80211_start_scan()
818 drv_sw_scan_start(local, sdata, local->scan_addr); in __ieee80211_start_scan()
820 ieee80211_configure_filter(local); /* accept probe-responses */ in __ieee80211_start_scan()
823 ieee80211_hw_conf_chan(local); in __ieee80211_start_scan()
830 set_bit(SCAN_BEACON_WAIT, &local->scanning); in __ieee80211_start_scan()
832 ieee80211_scan_state_send_probe(local, &next_delay); in __ieee80211_start_scan()
837 wiphy_delayed_work_queue(local->hw.wiphy, &local->scan_work, in __ieee80211_start_scan()
842 __set_bit(SCAN_SW_SCANNING, &local->scanning); in __ieee80211_start_scan()
845 ieee80211_recalc_idle(local); in __ieee80211_start_scan()
849 rc = drv_hw_scan(local, sdata, local->hw_scan_req); in __ieee80211_start_scan()
851 rc = ieee80211_start_sw_scan(local, sdata); in __ieee80211_start_scan()
855 kfree(local->hw_scan_req); in __ieee80211_start_scan()
856 local->hw_scan_req = NULL; in __ieee80211_start_scan()
857 local->scanning = 0; in __ieee80211_start_scan()
859 ieee80211_recalc_idle(local); in __ieee80211_start_scan()
861 local->scan_req = NULL; in __ieee80211_start_scan()
862 RCU_INIT_POINTER(local->scan_sdata, NULL); in __ieee80211_start_scan()
892 static void ieee80211_scan_state_decision(struct ieee80211_local *local, in ieee80211_scan_state_decision() argument
903 lockdep_assert_wiphy(local->hw.wiphy); in ieee80211_scan_state_decision()
910 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_scan_state_decision()
926 scan_req = rcu_dereference_protected(local->scan_req, in ieee80211_scan_state_decision()
927 lockdep_is_held(&local->hw.wiphy->mtx)); in ieee80211_scan_state_decision()
929 next_chan = scan_req->channels[local->scan_channel_idx]; in ieee80211_scan_state_decision()
941 local->leave_oper_channel_time + HZ / 8); in ieee80211_scan_state_decision()
954 local->next_scan_state = next_scan_state; in ieee80211_scan_state_decision()
959 static void ieee80211_scan_state_set_channel(struct ieee80211_local *local, in ieee80211_scan_state_set_channel() argument
966 scan_req = rcu_dereference_protected(local->scan_req, in ieee80211_scan_state_set_channel()
967 lockdep_is_held(&local->hw.wiphy->mtx)); in ieee80211_scan_state_set_channel()
970 chan = scan_req->channels[local->scan_channel_idx]; in ieee80211_scan_state_set_channel()
972 local->scan_chandef.chan = chan; in ieee80211_scan_state_set_channel()
973 local->scan_chandef.center_freq1 = chan->center_freq; in ieee80211_scan_state_set_channel()
974 local->scan_chandef.freq1_offset = chan->freq_offset; in ieee80211_scan_state_set_channel()
975 local->scan_chandef.center_freq2 = 0; in ieee80211_scan_state_set_channel()
981 local->scan_chandef.width = ieee80211_s1g_channel_width(chan); in ieee80211_scan_state_set_channel()
988 if (chan == local->hw.conf.chandef.chan) in ieee80211_scan_state_set_channel()
989 local->scan_chandef = local->hw.conf.chandef; in ieee80211_scan_state_set_channel()
991 local->scan_chandef.width = NL80211_CHAN_WIDTH_20_NOHT; in ieee80211_scan_state_set_channel()
994 if (ieee80211_hw_conf_chan(local)) in ieee80211_scan_state_set_channel()
998 local->scan_channel_idx++; in ieee80211_scan_state_set_channel()
1002 local->next_scan_state = SCAN_DECISION; in ieee80211_scan_state_set_channel()
1020 local->next_scan_state = SCAN_DECISION; in ieee80211_scan_state_set_channel()
1022 set_bit(SCAN_BEACON_WAIT, &local->scanning); in ieee80211_scan_state_set_channel()
1028 local->next_scan_state = SCAN_SEND_PROBE; in ieee80211_scan_state_set_channel()
1031 static void ieee80211_scan_state_suspend(struct ieee80211_local *local, in ieee80211_scan_state_suspend() argument
1035 local->scan_chandef.chan = NULL; in ieee80211_scan_state_suspend()
1036 ieee80211_hw_conf_chan(local); in ieee80211_scan_state_suspend()
1039 ieee80211_offchannel_return(local); in ieee80211_scan_state_suspend()
1043 local->next_scan_state = SCAN_RESUME; in ieee80211_scan_state_suspend()
1046 static void ieee80211_scan_state_resume(struct ieee80211_local *local, in ieee80211_scan_state_resume() argument
1049 ieee80211_offchannel_stop_vifs(local); in ieee80211_scan_state_resume()
1051 if (local->ops->flush) { in ieee80211_scan_state_resume()
1052 ieee80211_flush_queues(local, NULL, false); in ieee80211_scan_state_resume()
1058 local->leave_oper_channel_time = jiffies; in ieee80211_scan_state_resume()
1061 local->next_scan_state = SCAN_SET_CHANNEL; in ieee80211_scan_state_resume()
1066 struct ieee80211_local *local = in ieee80211_scan_work() local
1073 lockdep_assert_wiphy(local->hw.wiphy); in ieee80211_scan_work()
1075 if (!ieee80211_can_run_worker(local)) { in ieee80211_scan_work()
1080 sdata = rcu_dereference_protected(local->scan_sdata, in ieee80211_scan_work()
1081 lockdep_is_held(&local->hw.wiphy->mtx)); in ieee80211_scan_work()
1082 scan_req = rcu_dereference_protected(local->scan_req, in ieee80211_scan_work()
1083 lockdep_is_held(&local->hw.wiphy->mtx)); in ieee80211_scan_work()
1086 if (test_bit(SCAN_ONCHANNEL_SCANNING, &local->scanning)) { in ieee80211_scan_work()
1087 aborted = test_and_clear_bit(SCAN_ABORTED, &local->scanning); in ieee80211_scan_work()
1091 if (test_and_clear_bit(SCAN_COMPLETED, &local->scanning)) { in ieee80211_scan_work()
1092 aborted = test_and_clear_bit(SCAN_ABORTED, &local->scanning); in ieee80211_scan_work()
1099 if (!local->scanning) { in ieee80211_scan_work()
1102 RCU_INIT_POINTER(local->scan_req, NULL); in ieee80211_scan_work()
1103 RCU_INIT_POINTER(local->scan_sdata, NULL); in ieee80211_scan_work()
1109 rcu_assign_pointer(local->scan_req, scan_req); in ieee80211_scan_work()
1114 clear_bit(SCAN_BEACON_WAIT, &local->scanning); in ieee80211_scan_work()
1126 if (test_and_clear_bit(SCAN_BEACON_DONE, &local->scanning) && in ieee80211_scan_work()
1127 local->next_scan_state == SCAN_DECISION) in ieee80211_scan_work()
1128 local->next_scan_state = SCAN_SEND_PROBE; in ieee80211_scan_work()
1130 switch (local->next_scan_state) { in ieee80211_scan_work()
1133 if (local->scan_channel_idx >= scan_req->n_channels) { in ieee80211_scan_work()
1137 ieee80211_scan_state_decision(local, &next_delay); in ieee80211_scan_work()
1140 ieee80211_scan_state_set_channel(local, &next_delay); in ieee80211_scan_work()
1143 ieee80211_scan_state_send_probe(local, &next_delay); in ieee80211_scan_work()
1146 ieee80211_scan_state_suspend(local, &next_delay); in ieee80211_scan_work()
1149 ieee80211_scan_state_resume(local, &next_delay); in ieee80211_scan_work()
1157 wiphy_delayed_work_queue(local->hw.wiphy, &local->scan_work, in ieee80211_scan_work()
1162 __ieee80211_scan_completed(&local->hw, aborted); in ieee80211_scan_work()
1168 lockdep_assert_wiphy(sdata->local->hw.wiphy); in ieee80211_request_scan()
1178 struct ieee80211_local *local = sdata->local; in ieee80211_request_ibss_scan() local
1182 lockdep_assert_wiphy(local->hw.wiphy); in ieee80211_request_ibss_scan()
1185 if (local->scan_req) in ieee80211_request_ibss_scan()
1193 if (!local->hw.wiphy->bands[band] || in ieee80211_request_ibss_scan()
1197 max_n = local->hw.wiphy->bands[band]->n_channels; in ieee80211_request_ibss_scan()
1200 &local->hw.wiphy->bands[band]->channels[i]; in ieee80211_request_ibss_scan()
1208 local->int_scan_req->channels[n_ch] = tmp_ch; in ieee80211_request_ibss_scan()
1216 local->int_scan_req->n_channels = n_ch; in ieee80211_request_ibss_scan()
1225 local->int_scan_req->channels[n_ch] = channels[i]; in ieee80211_request_ibss_scan()
1232 local->int_scan_req->n_channels = n_ch; in ieee80211_request_ibss_scan()
1235 local->int_scan_req->ssids = &local->scan_ssid; in ieee80211_request_ibss_scan()
1236 local->int_scan_req->n_ssids = 1; in ieee80211_request_ibss_scan()
1237 memcpy(local->int_scan_req->ssids[0].ssid, ssid, IEEE80211_MAX_SSID_LEN); in ieee80211_request_ibss_scan()
1238 local->int_scan_req->ssids[0].ssid_len = ssid_len; in ieee80211_request_ibss_scan()
1240 return __ieee80211_start_scan(sdata, sdata->local->int_scan_req); in ieee80211_request_ibss_scan()
1243 void ieee80211_scan_cancel(struct ieee80211_local *local) in ieee80211_scan_cancel() argument
1246 lockdep_assert_wiphy(local->hw.wiphy); in ieee80211_scan_cancel()
1255 * local->hw_scan_req to operate on 5G band, what race with in ieee80211_scan_cancel()
1256 * driver which can use local->hw_scan_req in ieee80211_scan_cancel()
1266 if (!local->scan_req) in ieee80211_scan_cancel()
1274 if (test_bit(SCAN_HW_SCANNING, &local->scanning) && in ieee80211_scan_cancel()
1275 test_bit(SCAN_COMPLETED, &local->scanning)) { in ieee80211_scan_cancel()
1276 set_bit(SCAN_HW_CANCELLED, &local->scanning); in ieee80211_scan_cancel()
1280 if (test_bit(SCAN_HW_SCANNING, &local->scanning)) { in ieee80211_scan_cancel()
1285 set_bit(SCAN_HW_CANCELLED, &local->scanning); in ieee80211_scan_cancel()
1286 if (local->ops->cancel_hw_scan) in ieee80211_scan_cancel()
1287 drv_cancel_hw_scan(local, in ieee80211_scan_cancel()
1288 rcu_dereference_protected(local->scan_sdata, in ieee80211_scan_cancel()
1289 lockdep_is_held(&local->hw.wiphy->mtx))); in ieee80211_scan_cancel()
1293 wiphy_delayed_work_cancel(local->hw.wiphy, &local->scan_work); in ieee80211_scan_cancel()
1295 memset(&local->scan_info, 0, sizeof(local->scan_info)); in ieee80211_scan_cancel()
1296 __ieee80211_scan_completed(&local->hw, true); in ieee80211_scan_cancel()
1302 struct ieee80211_local *local = sdata->local; in __ieee80211_request_sched_scan_start() local
1311 lockdep_assert_wiphy(local->hw.wiphy); in __ieee80211_request_sched_scan_start()
1313 iebufsz = local->scan_ies_len + req->ie_len; in __ieee80211_request_sched_scan_start()
1315 if (!local->ops->sched_scan_start) in __ieee80211_request_sched_scan_start()
1319 if (local->hw.wiphy->bands[i]) { in __ieee80211_request_sched_scan_start()
1344 ret = drv_sched_scan_start(local, sdata, req, &sched_scan_ies); in __ieee80211_request_sched_scan_start()
1346 rcu_assign_pointer(local->sched_scan_sdata, sdata); in __ieee80211_request_sched_scan_start()
1347 rcu_assign_pointer(local->sched_scan_req, req); in __ieee80211_request_sched_scan_start()
1355 RCU_INIT_POINTER(local->sched_scan_sdata, NULL); in __ieee80211_request_sched_scan_start()
1356 RCU_INIT_POINTER(local->sched_scan_req, NULL); in __ieee80211_request_sched_scan_start()
1365 struct ieee80211_local *local = sdata->local; in ieee80211_request_sched_scan_start() local
1367 lockdep_assert_wiphy(local->hw.wiphy); in ieee80211_request_sched_scan_start()
1369 if (rcu_access_pointer(local->sched_scan_sdata)) in ieee80211_request_sched_scan_start()
1375 int ieee80211_request_sched_scan_stop(struct ieee80211_local *local) in ieee80211_request_sched_scan_stop() argument
1380 lockdep_assert_wiphy(local->hw.wiphy); in ieee80211_request_sched_scan_stop()
1382 if (!local->ops->sched_scan_stop) in ieee80211_request_sched_scan_stop()
1386 RCU_INIT_POINTER(local->sched_scan_req, NULL); in ieee80211_request_sched_scan_stop()
1388 sched_scan_sdata = rcu_dereference_protected(local->sched_scan_sdata, in ieee80211_request_sched_scan_stop()
1389 lockdep_is_held(&local->hw.wiphy->mtx)); in ieee80211_request_sched_scan_stop()
1391 ret = drv_sched_scan_stop(local, sched_scan_sdata); in ieee80211_request_sched_scan_stop()
1393 RCU_INIT_POINTER(local->sched_scan_sdata, NULL); in ieee80211_request_sched_scan_stop()
1401 struct ieee80211_local *local = hw_to_local(hw); in ieee80211_sched_scan_results() local
1403 trace_api_sched_scan_results(local); in ieee80211_sched_scan_results()
1409 void ieee80211_sched_scan_end(struct ieee80211_local *local) in ieee80211_sched_scan_end() argument
1411 lockdep_assert_wiphy(local->hw.wiphy); in ieee80211_sched_scan_end()
1413 if (!rcu_access_pointer(local->sched_scan_sdata)) in ieee80211_sched_scan_end()
1416 RCU_INIT_POINTER(local->sched_scan_sdata, NULL); in ieee80211_sched_scan_end()
1419 RCU_INIT_POINTER(local->sched_scan_req, NULL); in ieee80211_sched_scan_end()
1421 cfg80211_sched_scan_stopped_locked(local->hw.wiphy, 0); in ieee80211_sched_scan_end()
1427 struct ieee80211_local *local = in ieee80211_sched_scan_stopped_work() local
1431 ieee80211_sched_scan_end(local); in ieee80211_sched_scan_stopped_work()
1436 struct ieee80211_local *local = hw_to_local(hw); in ieee80211_sched_scan_stopped() local
1438 trace_api_sched_scan_stopped(local); in ieee80211_sched_scan_stopped()
1445 if (local->in_reconfig) in ieee80211_sched_scan_stopped()
1448 wiphy_work_queue(hw->wiphy, &local->sched_scan_stopped_work); in ieee80211_sched_scan_stopped()