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()
59 ieee80211_update_bss_from_elems(struct ieee80211_local *local, in ieee80211_update_bss_from_elems() argument
129 local->hw.wiphy->bands[rx_status->band]; in ieee80211_update_bss_from_elems()
144 ieee80211_bss_info_update(struct ieee80211_local *local, in ieee80211_bss_info_update() argument
164 else if (ieee80211_hw_check(&local->hw, SIGNAL_DBM)) in ieee80211_bss_info_update()
166 else if (ieee80211_hw_check(&local->hw, SIGNAL_UNSPEC)) in ieee80211_bss_info_update()
167 bss_meta.signal = (rx_status->signal * 100) / local->hw.max_signal; in ieee80211_bss_info_update()
178 scan_sdata = rcu_dereference(local->scan_sdata); in ieee80211_bss_info_update()
183 ieee80211_calculate_rx_timestamp(local, rx_status, in ieee80211_bss_info_update()
190 cbss = cfg80211_inform_bss_frame_data(local->hw.wiphy, &bss_meta, in ieee80211_bss_info_update()
221 ieee80211_update_bss_from_elems(local, bss, &elems, rx_status, beacon); in ieee80211_bss_info_update()
226 ieee80211_update_bss_from_elems(local, non_tx_bss, &elems, in ieee80211_bss_info_update()
247 void ieee80211_scan_rx(struct ieee80211_local *local, struct sk_buff *skb) in ieee80211_scan_rx() argument
263 sdata1 = rcu_dereference(local->scan_sdata); in ieee80211_scan_rx()
264 sdata2 = rcu_dereference(local->sched_scan_sdata); in ieee80211_scan_rx()
274 scan_req = rcu_dereference(local->scan_req); in ieee80211_scan_rx()
275 sched_scan_req = rcu_dereference(local->sched_scan_req); in ieee80211_scan_rx()
293 channel = ieee80211_get_channel_khz(local->hw.wiphy, in ieee80211_scan_rx()
299 bss = ieee80211_bss_info_update(local, rx_status, in ieee80211_scan_rx()
303 ieee80211_rx_bss_put(local, bss); in ieee80211_scan_rx()
327 struct ieee80211_local *local = sdata->local; in ieee80211_prep_hw_scan() local
334 req = rcu_dereference_protected(local->scan_req, in ieee80211_prep_hw_scan()
335 lockdep_is_held(&local->mtx)); in ieee80211_prep_hw_scan()
337 if (test_bit(SCAN_HW_CANCELLED, &local->scanning)) in ieee80211_prep_hw_scan()
340 if (ieee80211_hw_check(&local->hw, SINGLE_SCAN_ON_ALL_BANDS)) { in ieee80211_prep_hw_scan()
342 local->hw_scan_req->req.channels[i] = req->channels[i]; in ieee80211_prep_hw_scan()
349 if (local->hw_scan_band == NUM_NL80211_BANDS) in ieee80211_prep_hw_scan()
356 local->hw_scan_band) in ieee80211_prep_hw_scan()
358 local->hw_scan_req->req.channels[n_chans] = in ieee80211_prep_hw_scan()
364 local->hw_scan_band++; in ieee80211_prep_hw_scan()
368 local->hw_scan_req->req.n_channels = n_chans; in ieee80211_prep_hw_scan()
375 (u8 *)local->hw_scan_req->req.ie, in ieee80211_prep_hw_scan()
376 local->hw_scan_ies_bufsize, in ieee80211_prep_hw_scan()
377 &local->hw_scan_req->ies, in ieee80211_prep_hw_scan()
381 local->hw_scan_req->req.ie_len = ielen; in ieee80211_prep_hw_scan()
382 local->hw_scan_req->req.no_cck = req->no_cck; in ieee80211_prep_hw_scan()
383 ether_addr_copy(local->hw_scan_req->req.mac_addr, req->mac_addr); in ieee80211_prep_hw_scan()
384 ether_addr_copy(local->hw_scan_req->req.mac_addr_mask, in ieee80211_prep_hw_scan()
386 ether_addr_copy(local->hw_scan_req->req.bssid, req->bssid); in ieee80211_prep_hw_scan()
393 struct ieee80211_local *local = hw_to_local(hw); in __ieee80211_scan_completed() local
394 bool hw_scan = test_bit(SCAN_HW_SCANNING, &local->scanning); in __ieee80211_scan_completed()
395 bool was_scanning = local->scanning; in __ieee80211_scan_completed()
400 lockdep_assert_held(&local->mtx); in __ieee80211_scan_completed()
405 * local->scan_req next), but not to complete it in __ieee80211_scan_completed()
408 if (WARN_ON(!local->scanning && !aborted)) in __ieee80211_scan_completed()
411 if (WARN_ON(!local->scan_req)) in __ieee80211_scan_completed()
414 scan_sdata = rcu_dereference_protected(local->scan_sdata, in __ieee80211_scan_completed()
415 lockdep_is_held(&local->mtx)); in __ieee80211_scan_completed()
418 !ieee80211_hw_check(&local->hw, SINGLE_SCAN_ON_ALL_BANDS) && in __ieee80211_scan_completed()
422 rc = drv_hw_scan(local, in __ieee80211_scan_completed()
423 rcu_dereference_protected(local->scan_sdata, in __ieee80211_scan_completed()
424 lockdep_is_held(&local->mtx)), in __ieee80211_scan_completed()
425 local->hw_scan_req); in __ieee80211_scan_completed()
433 memset(&local->scan_info, 0, sizeof(local->scan_info)); in __ieee80211_scan_completed()
437 kfree(local->hw_scan_req); in __ieee80211_scan_completed()
438 local->hw_scan_req = NULL; in __ieee80211_scan_completed()
440 scan_req = rcu_dereference_protected(local->scan_req, in __ieee80211_scan_completed()
441 lockdep_is_held(&local->mtx)); in __ieee80211_scan_completed()
443 if (scan_req != local->int_scan_req) { in __ieee80211_scan_completed()
444 local->scan_info.aborted = aborted; in __ieee80211_scan_completed()
445 cfg80211_scan_done(scan_req, &local->scan_info); in __ieee80211_scan_completed()
447 RCU_INIT_POINTER(local->scan_req, NULL); in __ieee80211_scan_completed()
448 RCU_INIT_POINTER(local->scan_sdata, NULL); in __ieee80211_scan_completed()
450 local->scanning = 0; in __ieee80211_scan_completed()
451 local->scan_chandef.chan = NULL; in __ieee80211_scan_completed()
454 ieee80211_hw_config(local, 0); in __ieee80211_scan_completed()
457 ieee80211_configure_filter(local); in __ieee80211_scan_completed()
458 drv_sw_scan_complete(local, scan_sdata); in __ieee80211_scan_completed()
459 ieee80211_offchannel_return(local); in __ieee80211_scan_completed()
462 ieee80211_recalc_idle(local); in __ieee80211_scan_completed()
464 ieee80211_mlme_notify_scan_completed(local); in __ieee80211_scan_completed()
465 ieee80211_ibss_notify_scan_completed(local); in __ieee80211_scan_completed()
471 list_for_each_entry_rcu(sdata, &local->interfaces, list) { in __ieee80211_scan_completed()
473 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in __ieee80211_scan_completed()
477 ieee80211_start_next_roc(local); in __ieee80211_scan_completed()
483 struct ieee80211_local *local = hw_to_local(hw); in ieee80211_scan_completed() local
485 trace_api_scan_completed(local, info->aborted); in ieee80211_scan_completed()
487 set_bit(SCAN_COMPLETED, &local->scanning); in ieee80211_scan_completed()
489 set_bit(SCAN_ABORTED, &local->scanning); in ieee80211_scan_completed()
491 memcpy(&local->scan_info, info, sizeof(*info)); in ieee80211_scan_completed()
493 ieee80211_queue_delayed_work(&local->hw, &local->scan_work, 0); in ieee80211_scan_completed()
497 static int ieee80211_start_sw_scan(struct ieee80211_local *local, in ieee80211_start_sw_scan() argument
501 if (local->use_chanctx) in ieee80211_start_sw_scan()
513 * Note that while local->sw_scanning is true everything else but in ieee80211_start_sw_scan()
517 drv_sw_scan_start(local, sdata, local->scan_addr); in ieee80211_start_sw_scan()
519 local->leave_oper_channel_time = jiffies; in ieee80211_start_sw_scan()
520 local->next_scan_state = SCAN_DECISION; in ieee80211_start_sw_scan()
521 local->scan_channel_idx = 0; in ieee80211_start_sw_scan()
523 ieee80211_offchannel_stop_vifs(local); in ieee80211_start_sw_scan()
526 ieee80211_flush_queues(local, NULL, false); in ieee80211_start_sw_scan()
528 ieee80211_configure_filter(local); in ieee80211_start_sw_scan()
531 ieee80211_hw_config(local, 0); in ieee80211_start_sw_scan()
533 ieee80211_queue_delayed_work(&local->hw, in ieee80211_start_sw_scan()
534 &local->scan_work, 0); in ieee80211_start_sw_scan()
541 struct ieee80211_local *local = sdata->local; in __ieee80211_can_leave_ch() local
544 if (!ieee80211_is_radar_required(local)) in __ieee80211_can_leave_ch()
547 if (!regulatory_pre_cac_allowed(local->hw.wiphy)) in __ieee80211_can_leave_ch()
550 mutex_lock(&local->iflist_mtx); in __ieee80211_can_leave_ch()
551 list_for_each_entry(sdata_iter, &local->interfaces, list) { in __ieee80211_can_leave_ch()
553 mutex_unlock(&local->iflist_mtx); in __ieee80211_can_leave_ch()
557 mutex_unlock(&local->iflist_mtx); in __ieee80211_can_leave_ch()
562 static bool ieee80211_can_scan(struct ieee80211_local *local, in ieee80211_can_scan() argument
568 if (!list_empty(&local->roc_list)) in ieee80211_can_scan()
578 void ieee80211_run_deferred_scan(struct ieee80211_local *local) in ieee80211_run_deferred_scan() argument
580 lockdep_assert_held(&local->mtx); in ieee80211_run_deferred_scan()
582 if (!local->scan_req || local->scanning) in ieee80211_run_deferred_scan()
585 if (!ieee80211_can_scan(local, in ieee80211_run_deferred_scan()
587 local->scan_sdata, in ieee80211_run_deferred_scan()
588 lockdep_is_held(&local->mtx)))) in ieee80211_run_deferred_scan()
591 ieee80211_queue_delayed_work(&local->hw, &local->scan_work, in ieee80211_run_deferred_scan()
623 static void ieee80211_scan_state_send_probe(struct ieee80211_local *local, in ieee80211_scan_state_send_probe() argument
629 enum nl80211_band band = local->hw.conf.chandef.chan->band; in ieee80211_scan_state_send_probe()
632 scan_req = rcu_dereference_protected(local->scan_req, in ieee80211_scan_state_send_probe()
633 lockdep_is_held(&local->mtx)); in ieee80211_scan_state_send_probe()
643 sdata = rcu_dereference_protected(local->scan_sdata, in ieee80211_scan_state_send_probe()
644 lockdep_is_held(&local->mtx)); in ieee80211_scan_state_send_probe()
648 sdata, local->scan_addr, scan_req->bssid, in ieee80211_scan_state_send_probe()
652 tx_flags, local->hw.conf.chandef.chan); in ieee80211_scan_state_send_probe()
659 local->next_scan_state = SCAN_DECISION; in ieee80211_scan_state_send_probe()
665 struct ieee80211_local *local = sdata->local; in __ieee80211_start_scan() local
666 bool hw_scan = local->ops->hw_scan; in __ieee80211_start_scan()
669 lockdep_assert_held(&local->mtx); in __ieee80211_start_scan()
671 if (local->scan_req) in __ieee80211_start_scan()
677 if (!ieee80211_can_scan(local, sdata)) { in __ieee80211_start_scan()
679 rcu_assign_pointer(local->scan_req, req); in __ieee80211_start_scan()
680 rcu_assign_pointer(local->scan_sdata, sdata); in __ieee80211_start_scan()
688 local->hw_scan_ies_bufsize = local->scan_ies_len + req->ie_len; in __ieee80211_start_scan()
690 if (ieee80211_hw_check(&local->hw, SINGLE_SCAN_ON_ALL_BANDS)) { in __ieee80211_start_scan()
701 local->hw_scan_ies_bufsize *= n_bands; in __ieee80211_start_scan()
704 local->hw_scan_req = kmalloc( in __ieee80211_start_scan()
705 sizeof(*local->hw_scan_req) + in __ieee80211_start_scan()
707 local->hw_scan_ies_bufsize, GFP_KERNEL); in __ieee80211_start_scan()
708 if (!local->hw_scan_req) in __ieee80211_start_scan()
711 local->hw_scan_req->req.ssids = req->ssids; in __ieee80211_start_scan()
712 local->hw_scan_req->req.n_ssids = req->n_ssids; in __ieee80211_start_scan()
713 ies = (u8 *)local->hw_scan_req + in __ieee80211_start_scan()
714 sizeof(*local->hw_scan_req) + in __ieee80211_start_scan()
716 local->hw_scan_req->req.ie = ies; in __ieee80211_start_scan()
717 local->hw_scan_req->req.flags = req->flags; in __ieee80211_start_scan()
718 eth_broadcast_addr(local->hw_scan_req->req.bssid); in __ieee80211_start_scan()
719 local->hw_scan_req->req.duration = req->duration; in __ieee80211_start_scan()
720 local->hw_scan_req->req.duration_mandatory = in __ieee80211_start_scan()
723 local->hw_scan_band = 0; in __ieee80211_start_scan()
724 local->hw_scan_req->req.n_6ghz_params = req->n_6ghz_params; in __ieee80211_start_scan()
725 local->hw_scan_req->req.scan_6ghz_params = in __ieee80211_start_scan()
727 local->hw_scan_req->req.scan_6ghz = req->scan_6ghz; in __ieee80211_start_scan()
730 * After allocating local->hw_scan_req, we must in __ieee80211_start_scan()
738 rcu_assign_pointer(local->scan_req, req); in __ieee80211_start_scan()
739 rcu_assign_pointer(local->scan_sdata, sdata); in __ieee80211_start_scan()
742 get_random_mask_addr(local->scan_addr, in __ieee80211_start_scan()
746 memcpy(local->scan_addr, sdata->vif.addr, ETH_ALEN); in __ieee80211_start_scan()
749 __set_bit(SCAN_HW_SCANNING, &local->scanning); in __ieee80211_start_scan()
751 (req->channels[0] == local->_oper_chandef.chan)) { in __ieee80211_start_scan()
758 __set_bit(SCAN_ONCHANNEL_SCANNING, &local->scanning); in __ieee80211_start_scan()
760 ieee80211_recalc_idle(local); in __ieee80211_start_scan()
764 drv_sw_scan_start(local, sdata, local->scan_addr); in __ieee80211_start_scan()
766 ieee80211_configure_filter(local); /* accept probe-responses */ in __ieee80211_start_scan()
769 ieee80211_hw_config(local, 0); in __ieee80211_start_scan()
776 ieee80211_scan_state_send_probe(local, &next_delay); in __ieee80211_start_scan()
781 ieee80211_queue_delayed_work(&local->hw, &local->scan_work, in __ieee80211_start_scan()
786 __set_bit(SCAN_SW_SCANNING, &local->scanning); in __ieee80211_start_scan()
789 ieee80211_recalc_idle(local); in __ieee80211_start_scan()
793 rc = drv_hw_scan(local, sdata, local->hw_scan_req); in __ieee80211_start_scan()
795 rc = ieee80211_start_sw_scan(local, sdata); in __ieee80211_start_scan()
799 kfree(local->hw_scan_req); in __ieee80211_start_scan()
800 local->hw_scan_req = NULL; in __ieee80211_start_scan()
801 local->scanning = 0; in __ieee80211_start_scan()
803 ieee80211_recalc_idle(local); in __ieee80211_start_scan()
805 local->scan_req = NULL; in __ieee80211_start_scan()
806 RCU_INIT_POINTER(local->scan_sdata, NULL); in __ieee80211_start_scan()
836 static void ieee80211_scan_state_decision(struct ieee80211_local *local, in ieee80211_scan_state_decision() argument
852 mutex_lock(&local->iflist_mtx); in ieee80211_scan_state_decision()
853 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_scan_state_decision()
868 mutex_unlock(&local->iflist_mtx); in ieee80211_scan_state_decision()
870 scan_req = rcu_dereference_protected(local->scan_req, in ieee80211_scan_state_decision()
871 lockdep_is_held(&local->mtx)); in ieee80211_scan_state_decision()
873 next_chan = scan_req->channels[local->scan_channel_idx]; in ieee80211_scan_state_decision()
885 local->leave_oper_channel_time + HZ / 8); in ieee80211_scan_state_decision()
898 local->next_scan_state = next_scan_state; in ieee80211_scan_state_decision()
903 static void ieee80211_scan_state_set_channel(struct ieee80211_local *local, in ieee80211_scan_state_set_channel() argument
911 scan_req = rcu_dereference_protected(local->scan_req, in ieee80211_scan_state_set_channel()
912 lockdep_is_held(&local->mtx)); in ieee80211_scan_state_set_channel()
915 chan = scan_req->channels[local->scan_channel_idx]; in ieee80211_scan_state_set_channel()
917 local->scan_chandef.chan = chan; in ieee80211_scan_state_set_channel()
918 local->scan_chandef.center_freq1 = chan->center_freq; in ieee80211_scan_state_set_channel()
919 local->scan_chandef.freq1_offset = chan->freq_offset; in ieee80211_scan_state_set_channel()
920 local->scan_chandef.center_freq2 = 0; in ieee80211_scan_state_set_channel()
928 local->scan_chandef.width = ieee80211_s1g_channel_width(chan); in ieee80211_scan_state_set_channel()
934 local->scan_chandef.width = NL80211_CHAN_WIDTH_5; in ieee80211_scan_state_set_channel()
937 local->scan_chandef.width = NL80211_CHAN_WIDTH_10; in ieee80211_scan_state_set_channel()
945 &local->_oper_chandef); in ieee80211_scan_state_set_channel()
946 if (chan == local->_oper_chandef.chan && in ieee80211_scan_state_set_channel()
948 local->scan_chandef = local->_oper_chandef; in ieee80211_scan_state_set_channel()
950 local->scan_chandef.width = NL80211_CHAN_WIDTH_20_NOHT; in ieee80211_scan_state_set_channel()
960 if (ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL)) in ieee80211_scan_state_set_channel()
964 local->scan_channel_idx++; in ieee80211_scan_state_set_channel()
968 local->next_scan_state = SCAN_DECISION; in ieee80211_scan_state_set_channel()
985 local->next_scan_state = SCAN_DECISION; in ieee80211_scan_state_set_channel()
991 local->next_scan_state = SCAN_SEND_PROBE; in ieee80211_scan_state_set_channel()
994 static void ieee80211_scan_state_suspend(struct ieee80211_local *local, in ieee80211_scan_state_suspend() argument
998 local->scan_chandef.chan = NULL; in ieee80211_scan_state_suspend()
999 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL); in ieee80211_scan_state_suspend()
1002 ieee80211_offchannel_return(local); in ieee80211_scan_state_suspend()
1006 local->next_scan_state = SCAN_RESUME; in ieee80211_scan_state_suspend()
1009 static void ieee80211_scan_state_resume(struct ieee80211_local *local, in ieee80211_scan_state_resume() argument
1012 ieee80211_offchannel_stop_vifs(local); in ieee80211_scan_state_resume()
1014 if (local->ops->flush) { in ieee80211_scan_state_resume()
1015 ieee80211_flush_queues(local, NULL, false); in ieee80211_scan_state_resume()
1021 local->leave_oper_channel_time = jiffies; in ieee80211_scan_state_resume()
1024 local->next_scan_state = SCAN_SET_CHANNEL; in ieee80211_scan_state_resume()
1029 struct ieee80211_local *local = in ieee80211_scan_work() local
1036 mutex_lock(&local->mtx); in ieee80211_scan_work()
1038 if (!ieee80211_can_run_worker(local)) { in ieee80211_scan_work()
1043 sdata = rcu_dereference_protected(local->scan_sdata, in ieee80211_scan_work()
1044 lockdep_is_held(&local->mtx)); in ieee80211_scan_work()
1045 scan_req = rcu_dereference_protected(local->scan_req, in ieee80211_scan_work()
1046 lockdep_is_held(&local->mtx)); in ieee80211_scan_work()
1049 if (test_bit(SCAN_ONCHANNEL_SCANNING, &local->scanning)) { in ieee80211_scan_work()
1050 aborted = test_and_clear_bit(SCAN_ABORTED, &local->scanning); in ieee80211_scan_work()
1054 if (test_and_clear_bit(SCAN_COMPLETED, &local->scanning)) { in ieee80211_scan_work()
1055 aborted = test_and_clear_bit(SCAN_ABORTED, &local->scanning); in ieee80211_scan_work()
1062 if (!local->scanning) { in ieee80211_scan_work()
1065 RCU_INIT_POINTER(local->scan_req, NULL); in ieee80211_scan_work()
1066 RCU_INIT_POINTER(local->scan_sdata, NULL); in ieee80211_scan_work()
1071 rcu_assign_pointer(local->scan_req, scan_req); in ieee80211_scan_work()
1088 switch (local->next_scan_state) { in ieee80211_scan_work()
1091 if (local->scan_channel_idx >= scan_req->n_channels) { in ieee80211_scan_work()
1095 ieee80211_scan_state_decision(local, &next_delay); in ieee80211_scan_work()
1098 ieee80211_scan_state_set_channel(local, &next_delay); in ieee80211_scan_work()
1101 ieee80211_scan_state_send_probe(local, &next_delay); in ieee80211_scan_work()
1104 ieee80211_scan_state_suspend(local, &next_delay); in ieee80211_scan_work()
1107 ieee80211_scan_state_resume(local, &next_delay); in ieee80211_scan_work()
1115 ieee80211_queue_delayed_work(&local->hw, &local->scan_work, next_delay); in ieee80211_scan_work()
1119 __ieee80211_scan_completed(&local->hw, aborted); in ieee80211_scan_work()
1121 mutex_unlock(&local->mtx); in ieee80211_scan_work()
1129 mutex_lock(&sdata->local->mtx); in ieee80211_request_scan()
1131 mutex_unlock(&sdata->local->mtx); in ieee80211_request_scan()
1142 struct ieee80211_local *local = sdata->local; in ieee80211_request_ibss_scan() local
1146 mutex_lock(&local->mtx); in ieee80211_request_ibss_scan()
1149 if (local->scan_req) in ieee80211_request_ibss_scan()
1157 if (!local->hw.wiphy->bands[band] || in ieee80211_request_ibss_scan()
1161 max_n = local->hw.wiphy->bands[band]->n_channels; in ieee80211_request_ibss_scan()
1164 &local->hw.wiphy->bands[band]->channels[i]; in ieee80211_request_ibss_scan()
1170 local->int_scan_req->channels[n_ch] = tmp_ch; in ieee80211_request_ibss_scan()
1178 local->int_scan_req->n_channels = n_ch; in ieee80211_request_ibss_scan()
1185 local->int_scan_req->channels[n_ch] = channels[i]; in ieee80211_request_ibss_scan()
1192 local->int_scan_req->n_channels = n_ch; in ieee80211_request_ibss_scan()
1195 local->int_scan_req->ssids = &local->scan_ssid; in ieee80211_request_ibss_scan()
1196 local->int_scan_req->n_ssids = 1; in ieee80211_request_ibss_scan()
1197 local->int_scan_req->scan_width = scan_width; in ieee80211_request_ibss_scan()
1198 memcpy(local->int_scan_req->ssids[0].ssid, ssid, IEEE80211_MAX_SSID_LEN); in ieee80211_request_ibss_scan()
1199 local->int_scan_req->ssids[0].ssid_len = ssid_len; in ieee80211_request_ibss_scan()
1201 ret = __ieee80211_start_scan(sdata, sdata->local->int_scan_req); in ieee80211_request_ibss_scan()
1203 mutex_unlock(&local->mtx); in ieee80211_request_ibss_scan()
1210 void ieee80211_scan_cancel(struct ieee80211_local *local) in ieee80211_scan_cancel() argument
1219 * local->hw_scan_req to operate on 5G band, what race with in ieee80211_scan_cancel()
1220 * driver which can use local->hw_scan_req in ieee80211_scan_cancel()
1230 mutex_lock(&local->mtx); in ieee80211_scan_cancel()
1231 if (!local->scan_req) in ieee80211_scan_cancel()
1239 if (test_bit(SCAN_HW_SCANNING, &local->scanning) && in ieee80211_scan_cancel()
1240 test_bit(SCAN_COMPLETED, &local->scanning)) { in ieee80211_scan_cancel()
1241 set_bit(SCAN_HW_CANCELLED, &local->scanning); in ieee80211_scan_cancel()
1245 if (test_bit(SCAN_HW_SCANNING, &local->scanning)) { in ieee80211_scan_cancel()
1250 set_bit(SCAN_HW_CANCELLED, &local->scanning); in ieee80211_scan_cancel()
1251 if (local->ops->cancel_hw_scan) in ieee80211_scan_cancel()
1252 drv_cancel_hw_scan(local, in ieee80211_scan_cancel()
1253 rcu_dereference_protected(local->scan_sdata, in ieee80211_scan_cancel()
1254 lockdep_is_held(&local->mtx))); in ieee80211_scan_cancel()
1263 cancel_delayed_work(&local->scan_work); in ieee80211_scan_cancel()
1265 memset(&local->scan_info, 0, sizeof(local->scan_info)); in ieee80211_scan_cancel()
1266 __ieee80211_scan_completed(&local->hw, true); in ieee80211_scan_cancel()
1268 mutex_unlock(&local->mtx); in ieee80211_scan_cancel()
1274 struct ieee80211_local *local = sdata->local; in __ieee80211_request_sched_scan_start() local
1283 iebufsz = local->scan_ies_len + req->ie_len; in __ieee80211_request_sched_scan_start()
1285 lockdep_assert_held(&local->mtx); in __ieee80211_request_sched_scan_start()
1287 if (!local->ops->sched_scan_start) in __ieee80211_request_sched_scan_start()
1291 if (local->hw.wiphy->bands[i]) { in __ieee80211_request_sched_scan_start()
1314 ret = drv_sched_scan_start(local, sdata, req, &sched_scan_ies); in __ieee80211_request_sched_scan_start()
1316 rcu_assign_pointer(local->sched_scan_sdata, sdata); in __ieee80211_request_sched_scan_start()
1317 rcu_assign_pointer(local->sched_scan_req, req); in __ieee80211_request_sched_scan_start()
1325 RCU_INIT_POINTER(local->sched_scan_sdata, NULL); in __ieee80211_request_sched_scan_start()
1326 RCU_INIT_POINTER(local->sched_scan_req, NULL); in __ieee80211_request_sched_scan_start()
1335 struct ieee80211_local *local = sdata->local; in ieee80211_request_sched_scan_start() local
1338 mutex_lock(&local->mtx); in ieee80211_request_sched_scan_start()
1340 if (rcu_access_pointer(local->sched_scan_sdata)) { in ieee80211_request_sched_scan_start()
1341 mutex_unlock(&local->mtx); in ieee80211_request_sched_scan_start()
1347 mutex_unlock(&local->mtx); in ieee80211_request_sched_scan_start()
1351 int ieee80211_request_sched_scan_stop(struct ieee80211_local *local) in ieee80211_request_sched_scan_stop() argument
1356 mutex_lock(&local->mtx); in ieee80211_request_sched_scan_stop()
1358 if (!local->ops->sched_scan_stop) { in ieee80211_request_sched_scan_stop()
1364 RCU_INIT_POINTER(local->sched_scan_req, NULL); in ieee80211_request_sched_scan_stop()
1366 sched_scan_sdata = rcu_dereference_protected(local->sched_scan_sdata, in ieee80211_request_sched_scan_stop()
1367 lockdep_is_held(&local->mtx)); in ieee80211_request_sched_scan_stop()
1369 ret = drv_sched_scan_stop(local, sched_scan_sdata); in ieee80211_request_sched_scan_stop()
1371 RCU_INIT_POINTER(local->sched_scan_sdata, NULL); in ieee80211_request_sched_scan_stop()
1374 mutex_unlock(&local->mtx); in ieee80211_request_sched_scan_stop()
1381 struct ieee80211_local *local = hw_to_local(hw); in ieee80211_sched_scan_results() local
1383 trace_api_sched_scan_results(local); in ieee80211_sched_scan_results()
1389 void ieee80211_sched_scan_end(struct ieee80211_local *local) in ieee80211_sched_scan_end() argument
1391 mutex_lock(&local->mtx); in ieee80211_sched_scan_end()
1393 if (!rcu_access_pointer(local->sched_scan_sdata)) { in ieee80211_sched_scan_end()
1394 mutex_unlock(&local->mtx); in ieee80211_sched_scan_end()
1398 RCU_INIT_POINTER(local->sched_scan_sdata, NULL); in ieee80211_sched_scan_end()
1401 RCU_INIT_POINTER(local->sched_scan_req, NULL); in ieee80211_sched_scan_end()
1403 mutex_unlock(&local->mtx); in ieee80211_sched_scan_end()
1405 cfg80211_sched_scan_stopped(local->hw.wiphy, 0); in ieee80211_sched_scan_end()
1410 struct ieee80211_local *local = in ieee80211_sched_scan_stopped_work() local
1414 ieee80211_sched_scan_end(local); in ieee80211_sched_scan_stopped_work()
1419 struct ieee80211_local *local = hw_to_local(hw); in ieee80211_sched_scan_stopped() local
1421 trace_api_sched_scan_stopped(local); in ieee80211_sched_scan_stopped()
1428 if (local->in_reconfig) in ieee80211_sched_scan_stopped()
1431 schedule_work(&local->sched_scan_stopped_work); in ieee80211_sched_scan_stopped()