Lines Matching refs:rdev
140 static inline void bss_ref_get(struct cfg80211_registered_device *rdev, in bss_ref_get() argument
143 lockdep_assert_held(&rdev->bss_lock); in bss_ref_get()
154 static inline void bss_ref_put(struct cfg80211_registered_device *rdev, in bss_ref_put() argument
157 lockdep_assert_held(&rdev->bss_lock); in bss_ref_put()
185 static bool __cfg80211_unlink_bss(struct cfg80211_registered_device *rdev, in __cfg80211_unlink_bss() argument
188 lockdep_assert_held(&rdev->bss_lock); in __cfg80211_unlink_bss()
206 rb_erase(&bss->rbn, &rdev->bss_tree); in __cfg80211_unlink_bss()
207 rdev->bss_entries--; in __cfg80211_unlink_bss()
208 WARN_ONCE((rdev->bss_entries == 0) ^ list_empty(&rdev->bss_list), in __cfg80211_unlink_bss()
210 rdev->bss_entries, list_empty(&rdev->bss_list)); in __cfg80211_unlink_bss()
211 bss_ref_put(rdev, bss); in __cfg80211_unlink_bss()
476 static void __cfg80211_bss_expire(struct cfg80211_registered_device *rdev, in __cfg80211_bss_expire() argument
482 lockdep_assert_held(&rdev->bss_lock); in __cfg80211_bss_expire()
484 list_for_each_entry_safe(bss, tmp, &rdev->bss_list, list) { in __cfg80211_bss_expire()
490 if (__cfg80211_unlink_bss(rdev, bss)) in __cfg80211_bss_expire()
495 rdev->bss_generation++; in __cfg80211_bss_expire()
498 static bool cfg80211_bss_expire_oldest(struct cfg80211_registered_device *rdev) in cfg80211_bss_expire_oldest() argument
503 lockdep_assert_held(&rdev->bss_lock); in cfg80211_bss_expire_oldest()
505 list_for_each_entry(bss, &rdev->bss_list, list) { in cfg80211_bss_expire_oldest()
527 ret = __cfg80211_unlink_bss(rdev, oldest); in cfg80211_bss_expire_oldest()
768 static int cfg80211_scan_6ghz(struct cfg80211_registered_device *rdev) in cfg80211_scan_6ghz() argument
773 struct cfg80211_scan_request *request, *rdev_req = rdev->scan_req; in cfg80211_scan_6ghz()
780 if (!rdev->wiphy.bands[NL80211_BAND_6GHZ]) in cfg80211_scan_6ghz()
783 iftd = ieee80211_get_sband_iftype_data(rdev->wiphy.bands[NL80211_BAND_6GHZ], in cfg80211_scan_6ghz()
788 n_channels = rdev->wiphy.bands[NL80211_BAND_6GHZ]->n_channels; in cfg80211_scan_6ghz()
793 spin_lock_bh(&rdev->bss_lock); in cfg80211_scan_6ghz()
794 list_for_each_entry(intbss, &rdev->bss_list, list) { in cfg80211_scan_6ghz()
802 spin_unlock_bh(&rdev->bss_lock); in cfg80211_scan_6ghz()
858 ieee80211_get_channel(&rdev->wiphy, ap->center_freq); in cfg80211_scan_6ghz()
904 struct cfg80211_scan_request *old = rdev->int_scan_req; in cfg80211_scan_6ghz()
905 rdev->int_scan_req = request; in cfg80211_scan_6ghz()
922 rdev->int_scan_req->info = old->info; in cfg80211_scan_6ghz()
924 err = rdev_scan(rdev, request); in cfg80211_scan_6ghz()
926 rdev->int_scan_req = old; in cfg80211_scan_6ghz()
939 int cfg80211_scan(struct cfg80211_registered_device *rdev) in cfg80211_scan() argument
942 struct cfg80211_scan_request *rdev_req = rdev->scan_req; in cfg80211_scan()
945 if (!(rdev->wiphy.flags & WIPHY_FLAG_SPLIT_SCAN_6GHZ)) in cfg80211_scan()
946 return rdev_scan(rdev, rdev_req); in cfg80211_scan()
954 return cfg80211_scan_6ghz(rdev); in cfg80211_scan()
970 rdev->int_scan_req = request; in cfg80211_scan()
971 return rdev_scan(rdev, request); in cfg80211_scan()
974 void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev, in ___cfg80211_scan_done() argument
984 lockdep_assert_held(&rdev->wiphy.mtx); in ___cfg80211_scan_done()
986 if (rdev->scan_msg) { in ___cfg80211_scan_done()
987 nl80211_send_scan_msg(rdev, rdev->scan_msg); in ___cfg80211_scan_done()
988 rdev->scan_msg = NULL; in ___cfg80211_scan_done()
992 rdev_req = rdev->scan_req; in ___cfg80211_scan_done()
997 request = rdev->int_scan_req ? rdev->int_scan_req : rdev_req; in ___cfg80211_scan_done()
1000 (rdev->wiphy.flags & WIPHY_FLAG_SPLIT_SCAN_6GHZ) && in ___cfg80211_scan_done()
1002 !cfg80211_scan_6ghz(rdev)) in ___cfg80211_scan_done()
1016 spin_lock_bh(&rdev->bss_lock); in ___cfg80211_scan_done()
1017 __cfg80211_bss_expire(rdev, request->scan_start); in ___cfg80211_scan_done()
1018 spin_unlock_bh(&rdev->bss_lock); in ___cfg80211_scan_done()
1021 msg = nl80211_build_scan_msg(rdev, wdev, request->info.aborted); in ___cfg80211_scan_done()
1033 kfree(rdev->int_scan_req); in ___cfg80211_scan_done()
1034 rdev->int_scan_req = NULL; in ___cfg80211_scan_done()
1036 kfree(rdev->scan_req); in ___cfg80211_scan_done()
1037 rdev->scan_req = NULL; in ___cfg80211_scan_done()
1040 rdev->scan_msg = msg; in ___cfg80211_scan_done()
1042 nl80211_send_scan_msg(rdev, msg); in ___cfg80211_scan_done()
1047 struct cfg80211_registered_device *rdev; in __cfg80211_scan_done() local
1049 rdev = container_of(wk, struct cfg80211_registered_device, in __cfg80211_scan_done()
1052 wiphy_lock(&rdev->wiphy); in __cfg80211_scan_done()
1053 ___cfg80211_scan_done(rdev, true); in __cfg80211_scan_done()
1054 wiphy_unlock(&rdev->wiphy); in __cfg80211_scan_done()
1084 void cfg80211_add_sched_scan_req(struct cfg80211_registered_device *rdev, in cfg80211_add_sched_scan_req() argument
1087 lockdep_assert_held(&rdev->wiphy.mtx); in cfg80211_add_sched_scan_req()
1089 list_add_rcu(&req->list, &rdev->sched_scan_req_list); in cfg80211_add_sched_scan_req()
1092 static void cfg80211_del_sched_scan_req(struct cfg80211_registered_device *rdev, in cfg80211_del_sched_scan_req() argument
1095 lockdep_assert_held(&rdev->wiphy.mtx); in cfg80211_del_sched_scan_req()
1102 cfg80211_find_sched_scan_req(struct cfg80211_registered_device *rdev, u64 reqid) in cfg80211_find_sched_scan_req() argument
1106 list_for_each_entry_rcu(pos, &rdev->sched_scan_req_list, list, in cfg80211_find_sched_scan_req()
1107 lockdep_is_held(&rdev->wiphy.mtx)) { in cfg80211_find_sched_scan_req()
1122 int cfg80211_sched_scan_req_possible(struct cfg80211_registered_device *rdev, in cfg80211_sched_scan_req_possible() argument
1128 list_for_each_entry(pos, &rdev->sched_scan_req_list, list) { in cfg80211_sched_scan_req_possible()
1141 if (i == rdev->wiphy.max_sched_scan_reqs) in cfg80211_sched_scan_req_possible()
1149 struct cfg80211_registered_device *rdev; in cfg80211_sched_scan_results_wk() local
1152 rdev = container_of(work, struct cfg80211_registered_device, in cfg80211_sched_scan_results_wk()
1155 wiphy_lock(&rdev->wiphy); in cfg80211_sched_scan_results_wk()
1156 list_for_each_entry_safe(req, tmp, &rdev->sched_scan_req_list, list) { in cfg80211_sched_scan_results_wk()
1161 spin_lock_bh(&rdev->bss_lock); in cfg80211_sched_scan_results_wk()
1162 __cfg80211_bss_expire(rdev, req->scan_start); in cfg80211_sched_scan_results_wk()
1163 spin_unlock_bh(&rdev->bss_lock); in cfg80211_sched_scan_results_wk()
1170 wiphy_unlock(&rdev->wiphy); in cfg80211_sched_scan_results_wk()
1175 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); in cfg80211_sched_scan_results() local
1182 request = cfg80211_find_sched_scan_req(rdev, reqid); in cfg80211_sched_scan_results()
1185 queue_work(cfg80211_wq, &rdev->sched_scan_res_wk); in cfg80211_sched_scan_results()
1193 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); in cfg80211_sched_scan_stopped_locked() local
1199 __cfg80211_stop_sched_scan(rdev, reqid, true); in cfg80211_sched_scan_stopped_locked()
1211 int cfg80211_stop_sched_scan_req(struct cfg80211_registered_device *rdev, in cfg80211_stop_sched_scan_req() argument
1215 lockdep_assert_held(&rdev->wiphy.mtx); in cfg80211_stop_sched_scan_req()
1218 int err = rdev_sched_scan_stop(rdev, req->dev, req->reqid); in cfg80211_stop_sched_scan_req()
1225 cfg80211_del_sched_scan_req(rdev, req); in cfg80211_stop_sched_scan_req()
1230 int __cfg80211_stop_sched_scan(struct cfg80211_registered_device *rdev, in __cfg80211_stop_sched_scan() argument
1235 lockdep_assert_held(&rdev->wiphy.mtx); in __cfg80211_stop_sched_scan()
1237 sched_scan_req = cfg80211_find_sched_scan_req(rdev, reqid); in __cfg80211_stop_sched_scan()
1241 return cfg80211_stop_sched_scan_req(rdev, sched_scan_req, in __cfg80211_stop_sched_scan()
1245 void cfg80211_bss_age(struct cfg80211_registered_device *rdev, in cfg80211_bss_age() argument
1251 spin_lock_bh(&rdev->bss_lock); in cfg80211_bss_age()
1252 list_for_each_entry(bss, &rdev->bss_list, list) in cfg80211_bss_age()
1254 spin_unlock_bh(&rdev->bss_lock); in cfg80211_bss_age()
1257 void cfg80211_bss_expire(struct cfg80211_registered_device *rdev) in cfg80211_bss_expire() argument
1259 __cfg80211_bss_expire(rdev, jiffies - IEEE80211_SCAN_RESULT_EXPIRE); in cfg80211_bss_expire()
1264 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); in cfg80211_bss_flush() local
1266 spin_lock_bh(&rdev->bss_lock); in cfg80211_bss_flush()
1267 __cfg80211_bss_expire(rdev, jiffies); in cfg80211_bss_flush()
1268 spin_unlock_bh(&rdev->bss_lock); in cfg80211_bss_flush()
1476 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); in cfg80211_get_bss() local
1484 spin_lock_bh(&rdev->bss_lock); in cfg80211_get_bss()
1486 list_for_each_entry(bss, &rdev->bss_list, list) { in cfg80211_get_bss()
1505 bss_ref_get(rdev, res); in cfg80211_get_bss()
1510 spin_unlock_bh(&rdev->bss_lock); in cfg80211_get_bss()
1518 static void rb_insert_bss(struct cfg80211_registered_device *rdev, in rb_insert_bss() argument
1521 struct rb_node **p = &rdev->bss_tree.rb_node; in rb_insert_bss()
1544 rb_insert_color(&bss->rbn, &rdev->bss_tree); in rb_insert_bss()
1548 rb_find_bss(struct cfg80211_registered_device *rdev, in rb_find_bss() argument
1552 struct rb_node *n = rdev->bss_tree.rb_node; in rb_find_bss()
1571 static bool cfg80211_combine_bsses(struct cfg80211_registered_device *rdev, in cfg80211_combine_bsses() argument
1602 list_for_each_entry(bss, &rdev->bss_list, list) { in cfg80211_combine_bsses()
1637 WARN_ONCE(n_entries != rdev->bss_entries, in cfg80211_combine_bsses()
1639 rdev->bss_entries, n_entries); in cfg80211_combine_bsses()
1668 cfg80211_update_known_bss(struct cfg80211_registered_device *rdev, in cfg80211_update_known_bss() argument
1673 lockdep_assert_held(&rdev->bss_lock); in cfg80211_update_known_bss()
1748 cfg80211_bss_update(struct cfg80211_registered_device *rdev, in cfg80211_bss_update() argument
1759 spin_lock_bh(&rdev->bss_lock); in cfg80211_bss_update()
1762 spin_unlock_bh(&rdev->bss_lock); in cfg80211_bss_update()
1766 found = rb_find_bss(rdev, tmp, BSS_CMP_REGULAR); in cfg80211_bss_update()
1769 if (!cfg80211_update_known_bss(rdev, found, tmp, signal_valid)) in cfg80211_bss_update()
1781 new = kzalloc(sizeof(*new) + rdev->wiphy.bss_priv_size, in cfg80211_bss_update()
1800 hidden = rb_find_bss(rdev, tmp, BSS_CMP_HIDE_ZLEN); in cfg80211_bss_update()
1802 hidden = rb_find_bss(rdev, tmp, in cfg80211_bss_update()
1823 if (!cfg80211_combine_bsses(rdev, new)) { in cfg80211_bss_update()
1824 bss_ref_put(rdev, new); in cfg80211_bss_update()
1829 if (rdev->bss_entries >= bss_entries_limit && in cfg80211_bss_update()
1830 !cfg80211_bss_expire_oldest(rdev)) { in cfg80211_bss_update()
1831 bss_ref_put(rdev, new); in cfg80211_bss_update()
1843 bss_ref_get(rdev, pbss); in cfg80211_bss_update()
1846 list_add_tail(&new->list, &rdev->bss_list); in cfg80211_bss_update()
1847 rdev->bss_entries++; in cfg80211_bss_update()
1848 rb_insert_bss(rdev, new); in cfg80211_bss_update()
1852 rdev->bss_generation++; in cfg80211_bss_update()
1853 bss_ref_get(rdev, found); in cfg80211_bss_update()
1854 spin_unlock_bh(&rdev->bss_lock); in cfg80211_bss_update()
1858 spin_unlock_bh(&rdev->bss_lock); in cfg80211_bss_update()
1952 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); in cfg80211_inform_single_bss_data() local
2039 spin_lock_bh(&rdev->bss_lock); in cfg80211_inform_single_bss_data()
2042 if (__cfg80211_unlink_bss(rdev, res)) { in cfg80211_inform_single_bss_data()
2043 rdev->bss_generation++; in cfg80211_inform_single_bss_data()
2047 spin_unlock_bh(&rdev->bss_lock); in cfg80211_inform_single_bss_data()
2569 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); in cfg80211_ref_bss() local
2577 spin_lock_bh(&rdev->bss_lock); in cfg80211_ref_bss()
2578 bss_ref_get(rdev, bss); in cfg80211_ref_bss()
2579 spin_unlock_bh(&rdev->bss_lock); in cfg80211_ref_bss()
2585 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); in cfg80211_put_bss() local
2593 spin_lock_bh(&rdev->bss_lock); in cfg80211_put_bss()
2594 bss_ref_put(rdev, bss); in cfg80211_put_bss()
2595 spin_unlock_bh(&rdev->bss_lock); in cfg80211_put_bss()
2601 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); in cfg80211_unlink_bss() local
2610 spin_lock_bh(&rdev->bss_lock); in cfg80211_unlink_bss()
2619 if (__cfg80211_unlink_bss(rdev, tmp1)) in cfg80211_unlink_bss()
2620 rdev->bss_generation++; in cfg80211_unlink_bss()
2623 if (__cfg80211_unlink_bss(rdev, bss)) in cfg80211_unlink_bss()
2624 rdev->bss_generation++; in cfg80211_unlink_bss()
2626 spin_unlock_bh(&rdev->bss_lock); in cfg80211_unlink_bss()
2637 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); in cfg80211_bss_iter() local
2640 spin_lock_bh(&rdev->bss_lock); in cfg80211_bss_iter()
2642 list_for_each_entry(bss, &rdev->bss_list, list) { in cfg80211_bss_iter()
2648 spin_unlock_bh(&rdev->bss_lock); in cfg80211_bss_iter()
2657 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); in cfg80211_update_assoc_bss_entry() local
2664 spin_lock_bh(&rdev->bss_lock); in cfg80211_update_assoc_bss_entry()
2681 list_for_each_entry(bss, &rdev->bss_list, list) { in cfg80211_update_assoc_bss_entry()
2698 if (cfg80211_update_known_bss(rdev, cbss, new, false)) { in cfg80211_update_assoc_bss_entry()
2708 if (__cfg80211_unlink_bss(rdev, bss)) in cfg80211_update_assoc_bss_entry()
2709 rdev->bss_generation++; in cfg80211_update_assoc_bss_entry()
2713 if (!WARN_ON(!__cfg80211_unlink_bss(rdev, new))) in cfg80211_update_assoc_bss_entry()
2714 rdev->bss_generation++; in cfg80211_update_assoc_bss_entry()
2717 rb_erase(&cbss->rbn, &rdev->bss_tree); in cfg80211_update_assoc_bss_entry()
2718 rb_insert_bss(rdev, cbss); in cfg80211_update_assoc_bss_entry()
2719 rdev->bss_generation++; in cfg80211_update_assoc_bss_entry()
2727 rb_erase(&bss->rbn, &rdev->bss_tree); in cfg80211_update_assoc_bss_entry()
2728 rb_insert_bss(rdev, bss); in cfg80211_update_assoc_bss_entry()
2729 rdev->bss_generation++; in cfg80211_update_assoc_bss_entry()
2733 spin_unlock_bh(&rdev->bss_lock); in cfg80211_update_assoc_bss_entry()
2740 struct cfg80211_registered_device *rdev; in cfg80211_get_dev_from_ifindex() local
2749 rdev = wiphy_to_rdev(dev->ieee80211_ptr->wiphy); in cfg80211_get_dev_from_ifindex()
2751 rdev = ERR_PTR(-ENODEV); in cfg80211_get_dev_from_ifindex()
2753 return rdev; in cfg80211_get_dev_from_ifindex()
2760 struct cfg80211_registered_device *rdev; in cfg80211_wext_siwscan() local
2773 rdev = cfg80211_get_dev_from_ifindex(dev_net(dev), dev->ifindex); in cfg80211_wext_siwscan()
2775 if (IS_ERR(rdev)) in cfg80211_wext_siwscan()
2776 return PTR_ERR(rdev); in cfg80211_wext_siwscan()
2778 if (rdev->scan_req || rdev->scan_msg) in cfg80211_wext_siwscan()
2781 wiphy = &rdev->wiphy; in cfg80211_wext_siwscan()
2871 wiphy_lock(&rdev->wiphy); in cfg80211_wext_siwscan()
2873 rdev->scan_req = creq; in cfg80211_wext_siwscan()
2874 err = rdev_scan(rdev, creq); in cfg80211_wext_siwscan()
2876 rdev->scan_req = NULL; in cfg80211_wext_siwscan()
2879 nl80211_send_scan_start(rdev, dev->ieee80211_ptr); in cfg80211_wext_siwscan()
2884 wiphy_unlock(&rdev->wiphy); in cfg80211_wext_siwscan()
3198 static int ieee80211_scan_results(struct cfg80211_registered_device *rdev, in ieee80211_scan_results() argument
3207 spin_lock_bh(&rdev->bss_lock); in ieee80211_scan_results()
3208 cfg80211_bss_expire(rdev); in ieee80211_scan_results()
3210 list_for_each_entry(bss, &rdev->bss_list, list) { in ieee80211_scan_results()
3215 current_ev = ieee80211_bss(&rdev->wiphy, info, bss, in ieee80211_scan_results()
3222 spin_unlock_bh(&rdev->bss_lock); in ieee80211_scan_results()
3234 struct cfg80211_registered_device *rdev; in cfg80211_wext_giwscan() local
3240 rdev = cfg80211_get_dev_from_ifindex(dev_net(dev), dev->ifindex); in cfg80211_wext_giwscan()
3242 if (IS_ERR(rdev)) in cfg80211_wext_giwscan()
3243 return PTR_ERR(rdev); in cfg80211_wext_giwscan()
3245 if (rdev->scan_req || rdev->scan_msg) in cfg80211_wext_giwscan()
3248 res = ieee80211_scan_results(rdev, info, extra, data->length); in cfg80211_wext_giwscan()