aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ar9170/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 /drivers/net/wireless/ath/ar9170/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 'drivers/net/wireless/ath/ar9170/main.c')
-rw-r--r--drivers/net/wireless/ath/ar9170/main.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/drivers/net/wireless/ath/ar9170/main.c b/drivers/net/wireless/ath/ar9170/main.c
index 099ed3c3ba28..4fc389ae74b4 100644
--- a/drivers/net/wireless/ath/ar9170/main.c
+++ b/drivers/net/wireless/ath/ar9170/main.c
@@ -595,10 +595,12 @@ static void ar9170_tx_janitor(struct work_struct *work)
595 595
596 ar9170_tx_fake_ampdu_status(ar); 596 ar9170_tx_fake_ampdu_status(ar);
597 597
598 if (resched) 598 if (!resched)
599 queue_delayed_work(ar->hw->workqueue, 599 return;
600 &ar->tx_janitor, 600
601 msecs_to_jiffies(AR9170_JANITOR_DELAY)); 601 ieee80211_queue_delayed_work(ar->hw,
602 &ar->tx_janitor,
603 msecs_to_jiffies(AR9170_JANITOR_DELAY));
602} 604}
603 605
604void ar9170_handle_command_response(struct ar9170 *ar, void *buf, u32 len) 606void ar9170_handle_command_response(struct ar9170 *ar, void *buf, u32 len)
@@ -648,7 +650,7 @@ void ar9170_handle_command_response(struct ar9170 *ar, void *buf, u32 len)
648 * pre-TBTT event 650 * pre-TBTT event
649 */ 651 */
650 if (ar->vif && ar->vif->type == NL80211_IFTYPE_AP) 652 if (ar->vif && ar->vif->type == NL80211_IFTYPE_AP)
651 queue_work(ar->hw->workqueue, &ar->beacon_work); 653 ieee80211_queue_work(ar->hw, &ar->beacon_work);
652 break; 654 break;
653 655
654 case 0xc2: 656 case 0xc2:
@@ -1825,10 +1827,12 @@ static void ar9170_tx(struct ar9170 *ar)
1825 } 1827 }
1826 } 1828 }
1827 1829
1828 if (schedule_garbagecollector) 1830 if (!schedule_garbagecollector)
1829 queue_delayed_work(ar->hw->workqueue, 1831 return;
1830 &ar->tx_janitor, 1832
1831 msecs_to_jiffies(AR9170_JANITOR_DELAY)); 1833 ieee80211_queue_delayed_work(ar->hw,
1834 &ar->tx_janitor,
1835 msecs_to_jiffies(AR9170_JANITOR_DELAY));
1832} 1836}
1833 1837
1834static bool ar9170_tx_ampdu_queue(struct ar9170 *ar, struct sk_buff *skb) 1838static bool ar9170_tx_ampdu_queue(struct ar9170 *ar, struct sk_buff *skb)
@@ -2157,7 +2161,7 @@ static void ar9170_op_configure_filter(struct ieee80211_hw *hw,
2157 } 2161 }
2158 2162
2159 if (likely(IS_STARTED(ar))) 2163 if (likely(IS_STARTED(ar)))
2160 queue_work(ar->hw->workqueue, &ar->filter_config_work); 2164 ieee80211_queue_work(ar->hw, &ar->filter_config_work);
2161} 2165}
2162 2166
2163static void ar9170_op_bss_info_changed(struct ieee80211_hw *hw, 2167static void ar9170_op_bss_info_changed(struct ieee80211_hw *hw,
@@ -2415,7 +2419,7 @@ static void ar9170_sta_notify(struct ieee80211_hw *hw,
2415 } 2419 }
2416 2420
2417 if (IS_STARTED(ar) && ar->filter_changed) 2421 if (IS_STARTED(ar) && ar->filter_changed)
2418 queue_work(ar->hw->workqueue, &ar->filter_config_work); 2422 ieee80211_queue_work(ar->hw, &ar->filter_config_work);
2419} 2423}
2420 2424
2421static int ar9170_get_stats(struct ieee80211_hw *hw, 2425static int ar9170_get_stats(struct ieee80211_hw *hw,