aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/main.c
diff options
context:
space:
mode:
authorLuis R. Rodriguez <lrodriguez@atheros.com>2009-07-29 20:08:07 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-08-04 16:44:14 -0400
commit42935ecaf4e784d0815afa9a7e5fe7e141157ca3 (patch)
treedc0a0dcfff761e98d8a2a23a7edc8f9182c2774c /net/mac80211/main.c
parent64344d78228f6346a0462ba2d5fc03494aef4e6b (diff)
mac80211: redefine usage of the mac80211 workqueue
The mac80211 workqueue exists to enable mac80211 and drivers to queue their own work on a single threaded workqueue. mac80211 takes care to flush the workqueue during suspend but we never really had requirements on drivers for how they should use the workqueue in consideration for suspend. We extend mac80211 to document how the mac80211 workqueue should be used, how it should not be used and finally move raw access to the workqueue to mac80211 only. Drivers and mac80211 use helpers to queue work onto the mac80211 workqueue: * ieee80211_queue_work() * ieee80211_queue_delayed_work() These helpers will now warn if mac80211 already completed its suspend cycle and someone is trying to queue work. mac80211 flushes the mac80211 workqueue prior to suspend a few times, but we haven't taken the care to ensure drivers won't add more work after suspend. To help with this we add a warning when someone tries to add work and mac80211 already completed the suspend cycle. Drivers should ensure they cancel any work or delayed work in the mac80211 stop() callback. Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/main.c')
-rw-r--r--net/mac80211/main.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/net/mac80211/main.c b/net/mac80211/main.c
index 5e76dd1daf71..22e07385ff60 100644
--- a/net/mac80211/main.c
+++ b/net/mac80211/main.c
@@ -821,9 +821,9 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
821 if (hw->queues > IEEE80211_MAX_QUEUES) 821 if (hw->queues > IEEE80211_MAX_QUEUES)
822 hw->queues = IEEE80211_MAX_QUEUES; 822 hw->queues = IEEE80211_MAX_QUEUES;
823 823
824 local->hw.workqueue = 824 local->workqueue =
825 create_singlethread_workqueue(wiphy_name(local->hw.wiphy)); 825 create_singlethread_workqueue(wiphy_name(local->hw.wiphy));
826 if (!local->hw.workqueue) { 826 if (!local->workqueue) {
827 result = -ENOMEM; 827 result = -ENOMEM;
828 goto fail_workqueue; 828 goto fail_workqueue;
829 } 829 }
@@ -913,7 +913,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
913 sta_info_stop(local); 913 sta_info_stop(local);
914 fail_sta_info: 914 fail_sta_info:
915 debugfs_hw_del(local); 915 debugfs_hw_del(local);
916 destroy_workqueue(local->hw.workqueue); 916 destroy_workqueue(local->workqueue);
917 fail_workqueue: 917 fail_workqueue:
918 wiphy_unregister(local->hw.wiphy); 918 wiphy_unregister(local->hw.wiphy);
919 fail_wiphy_register: 919 fail_wiphy_register:
@@ -955,7 +955,7 @@ void ieee80211_unregister_hw(struct ieee80211_hw *hw)
955 skb_queue_purge(&local->skb_queue); 955 skb_queue_purge(&local->skb_queue);
956 skb_queue_purge(&local->skb_queue_unreliable); 956 skb_queue_purge(&local->skb_queue_unreliable);
957 957
958 destroy_workqueue(local->hw.workqueue); 958 destroy_workqueue(local->workqueue);
959 wiphy_unregister(local->hw.wiphy); 959 wiphy_unregister(local->hw.wiphy);
960 ieee80211_wep_free(local); 960 ieee80211_wep_free(local);
961 ieee80211_led_exit(local); 961 ieee80211_led_exit(local);