core.c (cce3b573a52a41dd7face9dbf745f10f9bf4632b) core.c (e8c2af660ba0790afd14d5cbc2fd05c6dc85e207)
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * This is the linux wireless configuration interface.
4 *
5 * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
6 * Copyright 2013-2014 Intel Mobile Communications GmbH
7 * Copyright 2015-2017 Intel Deutschland GmbH
8 * Copyright (C) 2018-2022 Intel Corporation

--- 115 unchanged lines hidden (view full) ---

124}
125
126int cfg80211_dev_rename(struct cfg80211_registered_device *rdev,
127 char *newname)
128{
129 int result;
130
131 ASSERT_RTNL();
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * This is the linux wireless configuration interface.
4 *
5 * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
6 * Copyright 2013-2014 Intel Mobile Communications GmbH
7 * Copyright 2015-2017 Intel Deutschland GmbH
8 * Copyright (C) 2018-2022 Intel Corporation

--- 115 unchanged lines hidden (view full) ---

124}
125
126int cfg80211_dev_rename(struct cfg80211_registered_device *rdev,
127 char *newname)
128{
129 int result;
130
131 ASSERT_RTNL();
132 lockdep_assert_wiphy(&rdev->wiphy);
132
133 /* Ignore nop renames */
134 if (strcmp(newname, wiphy_name(&rdev->wiphy)) == 0)
135 return 0;
136
137 result = cfg80211_dev_check_name(rdev, newname);
138 if (result < 0)
139 return result;

--- 50 unchanged lines hidden (view full) ---

190 return err;
191 }
192
193 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
194 if (!wdev->netdev)
195 continue;
196 nl80211_notify_iface(rdev, wdev, NL80211_CMD_DEL_INTERFACE);
197 }
133
134 /* Ignore nop renames */
135 if (strcmp(newname, wiphy_name(&rdev->wiphy)) == 0)
136 return 0;
137
138 result = cfg80211_dev_check_name(rdev, newname);
139 if (result < 0)
140 return result;

--- 50 unchanged lines hidden (view full) ---

191 return err;
192 }
193
194 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
195 if (!wdev->netdev)
196 continue;
197 nl80211_notify_iface(rdev, wdev, NL80211_CMD_DEL_INTERFACE);
198 }
199
200 wiphy_lock(&rdev->wiphy);
198 nl80211_notify_wiphy(rdev, NL80211_CMD_DEL_WIPHY);
199
200 wiphy_net_set(&rdev->wiphy, net);
201
202 err = device_rename(&rdev->wiphy.dev, dev_name(&rdev->wiphy.dev));
203 WARN_ON(err);
204
205 nl80211_notify_wiphy(rdev, NL80211_CMD_NEW_WIPHY);
201 nl80211_notify_wiphy(rdev, NL80211_CMD_DEL_WIPHY);
202
203 wiphy_net_set(&rdev->wiphy, net);
204
205 err = device_rename(&rdev->wiphy.dev, dev_name(&rdev->wiphy.dev));
206 WARN_ON(err);
207
208 nl80211_notify_wiphy(rdev, NL80211_CMD_NEW_WIPHY);
209 wiphy_unlock(&rdev->wiphy);
210
206 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
207 if (!wdev->netdev)
208 continue;
209 nl80211_notify_iface(rdev, wdev, NL80211_CMD_NEW_INTERFACE);
210 }
211
212 return 0;
213}

--- 141 unchanged lines hidden (view full) ---

355 rdev = container_of(work, struct cfg80211_registered_device,
356 destroy_work);
357
358 rtnl_lock();
359 cfg80211_destroy_ifaces(rdev);
360 rtnl_unlock();
361}
362
211 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
212 if (!wdev->netdev)
213 continue;
214 nl80211_notify_iface(rdev, wdev, NL80211_CMD_NEW_INTERFACE);
215 }
216
217 return 0;
218}

--- 141 unchanged lines hidden (view full) ---

360 rdev = container_of(work, struct cfg80211_registered_device,
361 destroy_work);
362
363 rtnl_lock();
364 cfg80211_destroy_ifaces(rdev);
365 rtnl_unlock();
366}
367
363static void cfg80211_sched_scan_stop_wk(struct work_struct *work)
368static void cfg80211_sched_scan_stop_wk(struct wiphy *wiphy,
369 struct wiphy_work *work)
364{
365 struct cfg80211_registered_device *rdev;
366 struct cfg80211_sched_scan_request *req, *tmp;
367
368 rdev = container_of(work, struct cfg80211_registered_device,
369 sched_scan_stop_wk);
370
370{
371 struct cfg80211_registered_device *rdev;
372 struct cfg80211_sched_scan_request *req, *tmp;
373
374 rdev = container_of(work, struct cfg80211_registered_device,
375 sched_scan_stop_wk);
376
371 wiphy_lock(&rdev->wiphy);
372 list_for_each_entry_safe(req, tmp, &rdev->sched_scan_req_list, list) {
373 if (req->nl_owner_dead)
374 cfg80211_stop_sched_scan_req(rdev, req, false);
375 }
377 list_for_each_entry_safe(req, tmp, &rdev->sched_scan_req_list, list) {
378 if (req->nl_owner_dead)
379 cfg80211_stop_sched_scan_req(rdev, req, false);
380 }
376 wiphy_unlock(&rdev->wiphy);
377}
378
379static void cfg80211_propagate_radar_detect_wk(struct work_struct *work)
380{
381 struct cfg80211_registered_device *rdev;
382
383 rdev = container_of(work, struct cfg80211_registered_device,
384 propagate_radar_detect_wk);

--- 18 unchanged lines hidden (view full) ---

403
404 regulatory_propagate_dfs_state(&rdev->wiphy, &rdev->cac_done_chandef,
405 NL80211_DFS_AVAILABLE,
406 NL80211_RADAR_CAC_FINISHED);
407
408 rtnl_unlock();
409}
410
381}
382
383static void cfg80211_propagate_radar_detect_wk(struct work_struct *work)
384{
385 struct cfg80211_registered_device *rdev;
386
387 rdev = container_of(work, struct cfg80211_registered_device,
388 propagate_radar_detect_wk);

--- 18 unchanged lines hidden (view full) ---

407
408 regulatory_propagate_dfs_state(&rdev->wiphy, &rdev->cac_done_chandef,
409 NL80211_DFS_AVAILABLE,
410 NL80211_RADAR_CAC_FINISHED);
411
412 rtnl_unlock();
413}
414
415static void cfg80211_wiphy_work(struct work_struct *work)
416{
417 struct cfg80211_registered_device *rdev;
418 struct wiphy_work *wk;
419
420 rdev = container_of(work, struct cfg80211_registered_device, wiphy_work);
421
422 wiphy_lock(&rdev->wiphy);
423 if (rdev->suspended)
424 goto out;
425
426 spin_lock_irq(&rdev->wiphy_work_lock);
427 wk = list_first_entry_or_null(&rdev->wiphy_work_list,
428 struct wiphy_work, entry);
429 if (wk) {
430 list_del_init(&wk->entry);
431 if (!list_empty(&rdev->wiphy_work_list))
432 schedule_work(work);
433 spin_unlock_irq(&rdev->wiphy_work_lock);
434
435 wk->func(&rdev->wiphy, wk);
436 } else {
437 spin_unlock_irq(&rdev->wiphy_work_lock);
438 }
439out:
440 wiphy_unlock(&rdev->wiphy);
441}
442
411/* exported functions */
412
413struct wiphy *wiphy_new_nm(const struct cfg80211_ops *ops, int sizeof_priv,
414 const char *requested_name)
415{
416 static atomic_t wiphy_counter = ATOMIC_INIT(0);
417
418 struct cfg80211_registered_device *rdev;

--- 71 unchanged lines hidden (view full) ---

490
491 mutex_init(&rdev->wiphy.mtx);
492 INIT_LIST_HEAD(&rdev->wiphy.wdev_list);
493 INIT_LIST_HEAD(&rdev->beacon_registrations);
494 spin_lock_init(&rdev->beacon_registrations_lock);
495 spin_lock_init(&rdev->bss_lock);
496 INIT_LIST_HEAD(&rdev->bss_list);
497 INIT_LIST_HEAD(&rdev->sched_scan_req_list);
443/* exported functions */
444
445struct wiphy *wiphy_new_nm(const struct cfg80211_ops *ops, int sizeof_priv,
446 const char *requested_name)
447{
448 static atomic_t wiphy_counter = ATOMIC_INIT(0);
449
450 struct cfg80211_registered_device *rdev;

--- 71 unchanged lines hidden (view full) ---

522
523 mutex_init(&rdev->wiphy.mtx);
524 INIT_LIST_HEAD(&rdev->wiphy.wdev_list);
525 INIT_LIST_HEAD(&rdev->beacon_registrations);
526 spin_lock_init(&rdev->beacon_registrations_lock);
527 spin_lock_init(&rdev->bss_lock);
528 INIT_LIST_HEAD(&rdev->bss_list);
529 INIT_LIST_HEAD(&rdev->sched_scan_req_list);
498 INIT_WORK(&rdev->scan_done_wk, __cfg80211_scan_done);
530 wiphy_work_init(&rdev->scan_done_wk, __cfg80211_scan_done);
499 INIT_DELAYED_WORK(&rdev->dfs_update_channels_wk,
500 cfg80211_dfs_channels_update_work);
501#ifdef CONFIG_CFG80211_WEXT
502 rdev->wiphy.wext = &cfg80211_wext_handler;
503#endif
504
505 device_initialize(&rdev->wiphy.dev);
506 rdev->wiphy.dev.class = &ieee80211_class;
507 rdev->wiphy.dev.platform_data = rdev;
508 device_enable_async_suspend(&rdev->wiphy.dev);
509
510 INIT_WORK(&rdev->destroy_work, cfg80211_destroy_iface_wk);
531 INIT_DELAYED_WORK(&rdev->dfs_update_channels_wk,
532 cfg80211_dfs_channels_update_work);
533#ifdef CONFIG_CFG80211_WEXT
534 rdev->wiphy.wext = &cfg80211_wext_handler;
535#endif
536
537 device_initialize(&rdev->wiphy.dev);
538 rdev->wiphy.dev.class = &ieee80211_class;
539 rdev->wiphy.dev.platform_data = rdev;
540 device_enable_async_suspend(&rdev->wiphy.dev);
541
542 INIT_WORK(&rdev->destroy_work, cfg80211_destroy_iface_wk);
511 INIT_WORK(&rdev->sched_scan_stop_wk, cfg80211_sched_scan_stop_wk);
543 wiphy_work_init(&rdev->sched_scan_stop_wk, cfg80211_sched_scan_stop_wk);
512 INIT_WORK(&rdev->sched_scan_res_wk, cfg80211_sched_scan_results_wk);
513 INIT_WORK(&rdev->propagate_radar_detect_wk,
514 cfg80211_propagate_radar_detect_wk);
515 INIT_WORK(&rdev->propagate_cac_done_wk, cfg80211_propagate_cac_done_wk);
516 INIT_WORK(&rdev->mgmt_registrations_update_wk,
517 cfg80211_mgmt_registrations_update_wk);
518 spin_lock_init(&rdev->mgmt_registrations_lock);
519

--- 8 unchanged lines hidden (view full) ---

528 &rdev->wiphy.dev, RFKILL_TYPE_WLAN,
529 &rdev->rfkill_ops, rdev);
530
531 if (!rdev->wiphy.rfkill) {
532 wiphy_free(&rdev->wiphy);
533 return NULL;
534 }
535
544 INIT_WORK(&rdev->sched_scan_res_wk, cfg80211_sched_scan_results_wk);
545 INIT_WORK(&rdev->propagate_radar_detect_wk,
546 cfg80211_propagate_radar_detect_wk);
547 INIT_WORK(&rdev->propagate_cac_done_wk, cfg80211_propagate_cac_done_wk);
548 INIT_WORK(&rdev->mgmt_registrations_update_wk,
549 cfg80211_mgmt_registrations_update_wk);
550 spin_lock_init(&rdev->mgmt_registrations_lock);
551

--- 8 unchanged lines hidden (view full) ---

560 &rdev->wiphy.dev, RFKILL_TYPE_WLAN,
561 &rdev->rfkill_ops, rdev);
562
563 if (!rdev->wiphy.rfkill) {
564 wiphy_free(&rdev->wiphy);
565 return NULL;
566 }
567
568 INIT_WORK(&rdev->wiphy_work, cfg80211_wiphy_work);
569 INIT_LIST_HEAD(&rdev->wiphy_work_list);
570 spin_lock_init(&rdev->wiphy_work_lock);
536 INIT_WORK(&rdev->rfkill_block, cfg80211_rfkill_block_work);
537 INIT_WORK(&rdev->conn_work, cfg80211_conn_work);
538 INIT_WORK(&rdev->event_work, cfg80211_event_work);
539 INIT_WORK(&rdev->background_cac_abort_wk,
540 cfg80211_background_cac_abort_wk);
541 INIT_DELAYED_WORK(&rdev->background_cac_done_wk,
542 cfg80211_background_cac_done_wk);
543

--- 172 unchanged lines hidden (view full) ---

716 BIT(NL80211_CHAN_WIDTH_80) |
717 BIT(NL80211_CHAN_WIDTH_80P80) |
718 BIT(NL80211_CHAN_WIDTH_160) |
719 BIT(NL80211_CHAN_WIDTH_5) |
720 BIT(NL80211_CHAN_WIDTH_10))))
721 return -EINVAL;
722 }
723
571 INIT_WORK(&rdev->rfkill_block, cfg80211_rfkill_block_work);
572 INIT_WORK(&rdev->conn_work, cfg80211_conn_work);
573 INIT_WORK(&rdev->event_work, cfg80211_event_work);
574 INIT_WORK(&rdev->background_cac_abort_wk,
575 cfg80211_background_cac_abort_wk);
576 INIT_DELAYED_WORK(&rdev->background_cac_done_wk,
577 cfg80211_background_cac_done_wk);
578

--- 172 unchanged lines hidden (view full) ---

751 BIT(NL80211_CHAN_WIDTH_80) |
752 BIT(NL80211_CHAN_WIDTH_80P80) |
753 BIT(NL80211_CHAN_WIDTH_160) |
754 BIT(NL80211_CHAN_WIDTH_5) |
755 BIT(NL80211_CHAN_WIDTH_10))))
756 return -EINVAL;
757 }
758
724 /*
725 * if a wiphy has unsupported modes for regulatory channel enforcement,
726 * opt-out of enforcement checking
727 */
728 if (wiphy->interface_modes & ~(BIT(NL80211_IFTYPE_STATION) |
729 BIT(NL80211_IFTYPE_P2P_CLIENT) |
730 BIT(NL80211_IFTYPE_AP) |
731 BIT(NL80211_IFTYPE_MESH_POINT) |
732 BIT(NL80211_IFTYPE_P2P_GO) |
733 BIT(NL80211_IFTYPE_ADHOC) |
734 BIT(NL80211_IFTYPE_P2P_DEVICE) |
735 BIT(NL80211_IFTYPE_NAN) |
736 BIT(NL80211_IFTYPE_AP_VLAN) |
737 BIT(NL80211_IFTYPE_MONITOR)))
738 wiphy->regulatory_flags |= REGULATORY_IGNORE_STALE_KICKOFF;
739
740 if (WARN_ON((wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED) &&
741 (wiphy->regulatory_flags &
742 (REGULATORY_CUSTOM_REG |
743 REGULATORY_STRICT_REG |
744 REGULATORY_COUNTRY_IE_FOLLOW_POWER |
745 REGULATORY_COUNTRY_IE_IGNORE))))
746 return -EINVAL;
747

--- 188 unchanged lines hidden (view full) ---

936 return -EINVAL;
937
938 /* check and set up bitrates */
939 ieee80211_set_bitrate_flags(wiphy);
940
941 rdev->wiphy.features |= NL80211_FEATURE_SCAN_FLUSH;
942
943 rtnl_lock();
759 if (WARN_ON((wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED) &&
760 (wiphy->regulatory_flags &
761 (REGULATORY_CUSTOM_REG |
762 REGULATORY_STRICT_REG |
763 REGULATORY_COUNTRY_IE_FOLLOW_POWER |
764 REGULATORY_COUNTRY_IE_IGNORE))))
765 return -EINVAL;
766

--- 188 unchanged lines hidden (view full) ---

955 return -EINVAL;
956
957 /* check and set up bitrates */
958 ieee80211_set_bitrate_flags(wiphy);
959
960 rdev->wiphy.features |= NL80211_FEATURE_SCAN_FLUSH;
961
962 rtnl_lock();
963 wiphy_lock(&rdev->wiphy);
944 res = device_add(&rdev->wiphy.dev);
945 if (res) {
964 res = device_add(&rdev->wiphy.dev);
965 if (res) {
966 wiphy_unlock(&rdev->wiphy);
946 rtnl_unlock();
947 return res;
948 }
949
950 list_add_rcu(&rdev->list, &cfg80211_rdev_list);
951 cfg80211_rdev_list_generation++;
952
953 /* add to debugfs */
954 rdev->wiphy.debugfsdir = debugfs_create_dir(wiphy_name(&rdev->wiphy),
955 ieee80211_debugfs_dir);
956
957 cfg80211_debugfs_rdev_add(rdev);
958 nl80211_notify_wiphy(rdev, NL80211_CMD_NEW_WIPHY);
967 rtnl_unlock();
968 return res;
969 }
970
971 list_add_rcu(&rdev->list, &cfg80211_rdev_list);
972 cfg80211_rdev_list_generation++;
973
974 /* add to debugfs */
975 rdev->wiphy.debugfsdir = debugfs_create_dir(wiphy_name(&rdev->wiphy),
976 ieee80211_debugfs_dir);
977
978 cfg80211_debugfs_rdev_add(rdev);
979 nl80211_notify_wiphy(rdev, NL80211_CMD_NEW_WIPHY);
980 wiphy_unlock(&rdev->wiphy);
959
960 /* set up regulatory info */
961 wiphy_regulatory_register(wiphy);
962
963 if (wiphy->regulatory_flags & REGULATORY_CUSTOM_REG) {
964 struct regulatory_request request;
965
966 request.wiphy_idx = get_wiphy_idx(wiphy);

--- 55 unchanged lines hidden (view full) ---

1022
1023 if (!rdev->ops->rfkill_poll)
1024 return;
1025 rdev->rfkill_ops.poll = cfg80211_rfkill_poll;
1026 rfkill_resume_polling(wiphy->rfkill);
1027}
1028EXPORT_SYMBOL(wiphy_rfkill_start_polling);
1029
981
982 /* set up regulatory info */
983 wiphy_regulatory_register(wiphy);
984
985 if (wiphy->regulatory_flags & REGULATORY_CUSTOM_REG) {
986 struct regulatory_request request;
987
988 request.wiphy_idx = get_wiphy_idx(wiphy);

--- 55 unchanged lines hidden (view full) ---

1044
1045 if (!rdev->ops->rfkill_poll)
1046 return;
1047 rdev->rfkill_ops.poll = cfg80211_rfkill_poll;
1048 rfkill_resume_polling(wiphy->rfkill);
1049}
1050EXPORT_SYMBOL(wiphy_rfkill_start_polling);
1051
1052void cfg80211_process_wiphy_works(struct cfg80211_registered_device *rdev)
1053{
1054 unsigned int runaway_limit = 100;
1055 unsigned long flags;
1056
1057 lockdep_assert_held(&rdev->wiphy.mtx);
1058
1059 spin_lock_irqsave(&rdev->wiphy_work_lock, flags);
1060 while (!list_empty(&rdev->wiphy_work_list)) {
1061 struct wiphy_work *wk;
1062
1063 wk = list_first_entry(&rdev->wiphy_work_list,
1064 struct wiphy_work, entry);
1065 list_del_init(&wk->entry);
1066 spin_unlock_irqrestore(&rdev->wiphy_work_lock, flags);
1067
1068 wk->func(&rdev->wiphy, wk);
1069
1070 spin_lock_irqsave(&rdev->wiphy_work_lock, flags);
1071 if (WARN_ON(--runaway_limit == 0))
1072 INIT_LIST_HEAD(&rdev->wiphy_work_list);
1073 }
1074 spin_unlock_irqrestore(&rdev->wiphy_work_lock, flags);
1075}
1076
1030void wiphy_unregister(struct wiphy *wiphy)
1031{
1032 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1033
1034 wait_event(rdev->dev_wait, ({
1035 int __count;
1036 wiphy_lock(&rdev->wiphy);
1037 __count = rdev->opencount;

--- 22 unchanged lines hidden (view full) ---

1060 * If this device got a regulatory hint tell core its
1061 * free to listen now to a new shiny device regulatory hint
1062 */
1063 wiphy_regulatory_deregister(wiphy);
1064
1065 cfg80211_rdev_list_generation++;
1066 device_del(&rdev->wiphy.dev);
1067
1077void wiphy_unregister(struct wiphy *wiphy)
1078{
1079 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1080
1081 wait_event(rdev->dev_wait, ({
1082 int __count;
1083 wiphy_lock(&rdev->wiphy);
1084 __count = rdev->opencount;

--- 22 unchanged lines hidden (view full) ---

1107 * If this device got a regulatory hint tell core its
1108 * free to listen now to a new shiny device regulatory hint
1109 */
1110 wiphy_regulatory_deregister(wiphy);
1111
1112 cfg80211_rdev_list_generation++;
1113 device_del(&rdev->wiphy.dev);
1114
1115#ifdef CONFIG_PM
1116 if (rdev->wiphy.wowlan_config && rdev->ops->set_wakeup)
1117 rdev_set_wakeup(rdev, false);
1118#endif
1119
1120 /* surely nothing is reachable now, clean up work */
1121 cfg80211_process_wiphy_works(rdev);
1068 wiphy_unlock(&rdev->wiphy);
1069 rtnl_unlock();
1070
1122 wiphy_unlock(&rdev->wiphy);
1123 rtnl_unlock();
1124
1071 flush_work(&rdev->scan_done_wk);
1125 /* this has nothing to do now but make sure it's gone */
1126 cancel_work_sync(&rdev->wiphy_work);
1127
1072 cancel_work_sync(&rdev->conn_work);
1073 flush_work(&rdev->event_work);
1074 cancel_delayed_work_sync(&rdev->dfs_update_channels_wk);
1075 cancel_delayed_work_sync(&rdev->background_cac_done_wk);
1076 flush_work(&rdev->destroy_work);
1128 cancel_work_sync(&rdev->conn_work);
1129 flush_work(&rdev->event_work);
1130 cancel_delayed_work_sync(&rdev->dfs_update_channels_wk);
1131 cancel_delayed_work_sync(&rdev->background_cac_done_wk);
1132 flush_work(&rdev->destroy_work);
1077 flush_work(&rdev->sched_scan_stop_wk);
1078 flush_work(&rdev->propagate_radar_detect_wk);
1079 flush_work(&rdev->propagate_cac_done_wk);
1080 flush_work(&rdev->mgmt_registrations_update_wk);
1081 flush_work(&rdev->background_cac_abort_wk);
1082
1133 flush_work(&rdev->propagate_radar_detect_wk);
1134 flush_work(&rdev->propagate_cac_done_wk);
1135 flush_work(&rdev->mgmt_registrations_update_wk);
1136 flush_work(&rdev->background_cac_abort_wk);
1137
1083#ifdef CONFIG_PM
1084 if (rdev->wiphy.wowlan_config && rdev->ops->set_wakeup)
1085 rdev_set_wakeup(rdev, false);
1086#endif
1087 cfg80211_rdev_free_wowlan(rdev);
1088 cfg80211_rdev_free_coalesce(rdev);
1089}
1090EXPORT_SYMBOL(wiphy_unregister);
1091
1092void cfg80211_dev_free(struct cfg80211_registered_device *rdev)
1093{
1094 struct cfg80211_internal_bss *scan, *tmp;

--- 45 unchanged lines hidden (view full) ---

1140 bool unregister_netdev)
1141{
1142 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
1143 unsigned int link_id;
1144
1145 ASSERT_RTNL();
1146 lockdep_assert_held(&rdev->wiphy.mtx);
1147
1138 cfg80211_rdev_free_wowlan(rdev);
1139 cfg80211_rdev_free_coalesce(rdev);
1140}
1141EXPORT_SYMBOL(wiphy_unregister);
1142
1143void cfg80211_dev_free(struct cfg80211_registered_device *rdev)
1144{
1145 struct cfg80211_internal_bss *scan, *tmp;

--- 45 unchanged lines hidden (view full) ---

1191 bool unregister_netdev)
1192{
1193 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
1194 unsigned int link_id;
1195
1196 ASSERT_RTNL();
1197 lockdep_assert_held(&rdev->wiphy.mtx);
1198
1148 flush_work(&wdev->pmsr_free_wk);
1149
1150 nl80211_notify_iface(rdev, wdev, NL80211_CMD_DEL_INTERFACE);
1151
1152 wdev->registered = false;
1153
1154 if (wdev->netdev) {
1155 sysfs_remove_link(&wdev->netdev->dev.kobj, "phy80211");
1156 if (unregister_netdev)
1157 unregister_netdevice(wdev->netdev);

--- 15 unchanged lines hidden (view full) ---

1173 default:
1174 break;
1175 }
1176
1177#ifdef CONFIG_CFG80211_WEXT
1178 kfree_sensitive(wdev->wext.keys);
1179 wdev->wext.keys = NULL;
1180#endif
1199 nl80211_notify_iface(rdev, wdev, NL80211_CMD_DEL_INTERFACE);
1200
1201 wdev->registered = false;
1202
1203 if (wdev->netdev) {
1204 sysfs_remove_link(&wdev->netdev->dev.kobj, "phy80211");
1205 if (unregister_netdev)
1206 unregister_netdevice(wdev->netdev);

--- 15 unchanged lines hidden (view full) ---

1222 default:
1223 break;
1224 }
1225
1226#ifdef CONFIG_CFG80211_WEXT
1227 kfree_sensitive(wdev->wext.keys);
1228 wdev->wext.keys = NULL;
1229#endif
1181 /* only initialized if we have a netdev */
1182 if (wdev->netdev)
1183 flush_work(&wdev->disconnect_wk);
1184
1185 cfg80211_cqm_config_free(wdev);
1186
1187 /*
1188 * Ensure that all events have been processed and
1189 * freed.
1190 */
1191 cfg80211_process_wdev_events(wdev);
1192

--- 257 unchanged lines hidden (view full) ---

1450 wiphy_unlock(&rdev->wiphy);
1451 }
1452 break;
1453 case NETDEV_GOING_DOWN:
1454 wiphy_lock(&rdev->wiphy);
1455 cfg80211_leave(rdev, wdev);
1456 cfg80211_remove_links(wdev);
1457 wiphy_unlock(&rdev->wiphy);
1230 cfg80211_cqm_config_free(wdev);
1231
1232 /*
1233 * Ensure that all events have been processed and
1234 * freed.
1235 */
1236 cfg80211_process_wdev_events(wdev);
1237

--- 257 unchanged lines hidden (view full) ---

1495 wiphy_unlock(&rdev->wiphy);
1496 }
1497 break;
1498 case NETDEV_GOING_DOWN:
1499 wiphy_lock(&rdev->wiphy);
1500 cfg80211_leave(rdev, wdev);
1501 cfg80211_remove_links(wdev);
1502 wiphy_unlock(&rdev->wiphy);
1503 /* since we just did cfg80211_leave() nothing to do there */
1504 cancel_work_sync(&wdev->disconnect_wk);
1505 cancel_work_sync(&wdev->pmsr_free_wk);
1458 break;
1459 case NETDEV_DOWN:
1460 wiphy_lock(&rdev->wiphy);
1461 cfg80211_update_iface_num(rdev, wdev->iftype, -1);
1462 if (rdev->scan_req && rdev->scan_req->wdev == wdev) {
1463 if (WARN_ON(!rdev->scan_req->notified &&
1464 (!rdev->int_scan_req ||
1465 !rdev->int_scan_req->notified)))

--- 93 unchanged lines hidden (view full) ---

1559 }
1560 rtnl_unlock();
1561}
1562
1563static struct pernet_operations cfg80211_pernet_ops = {
1564 .exit = cfg80211_pernet_exit,
1565};
1566
1506 break;
1507 case NETDEV_DOWN:
1508 wiphy_lock(&rdev->wiphy);
1509 cfg80211_update_iface_num(rdev, wdev->iftype, -1);
1510 if (rdev->scan_req && rdev->scan_req->wdev == wdev) {
1511 if (WARN_ON(!rdev->scan_req->notified &&
1512 (!rdev->int_scan_req ||
1513 !rdev->int_scan_req->notified)))

--- 93 unchanged lines hidden (view full) ---

1607 }
1608 rtnl_unlock();
1609}
1610
1611static struct pernet_operations cfg80211_pernet_ops = {
1612 .exit = cfg80211_pernet_exit,
1613};
1614
1615void wiphy_work_queue(struct wiphy *wiphy, struct wiphy_work *work)
1616{
1617 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1618 unsigned long flags;
1619
1620 spin_lock_irqsave(&rdev->wiphy_work_lock, flags);
1621 if (list_empty(&work->entry))
1622 list_add_tail(&work->entry, &rdev->wiphy_work_list);
1623 spin_unlock_irqrestore(&rdev->wiphy_work_lock, flags);
1624
1625 schedule_work(&rdev->wiphy_work);
1626}
1627EXPORT_SYMBOL_GPL(wiphy_work_queue);
1628
1629void wiphy_work_cancel(struct wiphy *wiphy, struct wiphy_work *work)
1630{
1631 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1632 unsigned long flags;
1633
1634 lockdep_assert_held(&wiphy->mtx);
1635
1636 spin_lock_irqsave(&rdev->wiphy_work_lock, flags);
1637 if (!list_empty(&work->entry))
1638 list_del_init(&work->entry);
1639 spin_unlock_irqrestore(&rdev->wiphy_work_lock, flags);
1640}
1641EXPORT_SYMBOL_GPL(wiphy_work_cancel);
1642
1643void wiphy_delayed_work_timer(struct timer_list *t)
1644{
1645 struct wiphy_delayed_work *dwork = from_timer(dwork, t, timer);
1646
1647 wiphy_work_queue(dwork->wiphy, &dwork->work);
1648}
1649EXPORT_SYMBOL(wiphy_delayed_work_timer);
1650
1651void wiphy_delayed_work_queue(struct wiphy *wiphy,
1652 struct wiphy_delayed_work *dwork,
1653 unsigned long delay)
1654{
1655 if (!delay) {
1656 wiphy_work_queue(wiphy, &dwork->work);
1657 return;
1658 }
1659
1660 dwork->wiphy = wiphy;
1661 mod_timer(&dwork->timer, jiffies + delay);
1662}
1663EXPORT_SYMBOL_GPL(wiphy_delayed_work_queue);
1664
1665void wiphy_delayed_work_cancel(struct wiphy *wiphy,
1666 struct wiphy_delayed_work *dwork)
1667{
1668 lockdep_assert_held(&wiphy->mtx);
1669
1670 del_timer_sync(&dwork->timer);
1671 wiphy_work_cancel(wiphy, &dwork->work);
1672}
1673EXPORT_SYMBOL_GPL(wiphy_delayed_work_cancel);
1674
1567static int __init cfg80211_init(void)
1568{
1569 int err;
1570
1571 err = register_pernet_device(&cfg80211_pernet_ops);
1572 if (err)
1573 goto out_fail_pernet;
1574

--- 53 unchanged lines hidden ---
1675static int __init cfg80211_init(void)
1676{
1677 int err;
1678
1679 err = register_pernet_device(&cfg80211_pernet_ops);
1680 if (err)
1681 goto out_fail_pernet;
1682

--- 53 unchanged lines hidden ---