aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/at76c50x-usb.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/at76c50x-usb.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/at76c50x-usb.c')
-rw-r--r--drivers/net/wireless/at76c50x-usb.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/drivers/net/wireless/at76c50x-usb.c b/drivers/net/wireless/at76c50x-usb.c
index aff09a1cf64f..7218dbabad3e 100644
--- a/drivers/net/wireless/at76c50x-usb.c
+++ b/drivers/net/wireless/at76c50x-usb.c
@@ -1875,8 +1875,8 @@ static void at76_dwork_hw_scan(struct work_struct *work)
1875 /* FIXME: add maximum time for scan to complete */ 1875 /* FIXME: add maximum time for scan to complete */
1876 1876
1877 if (ret != CMD_STATUS_COMPLETE) { 1877 if (ret != CMD_STATUS_COMPLETE) {
1878 queue_delayed_work(priv->hw->workqueue, &priv->dwork_hw_scan, 1878 ieee80211_queue_delayed_work(priv->hw, &priv->dwork_hw_scan,
1879 SCAN_POLL_INTERVAL); 1879 SCAN_POLL_INTERVAL);
1880 mutex_unlock(&priv->mtx); 1880 mutex_unlock(&priv->mtx);
1881 return; 1881 return;
1882 } 1882 }
@@ -1937,8 +1937,8 @@ static int at76_hw_scan(struct ieee80211_hw *hw,
1937 goto exit; 1937 goto exit;
1938 } 1938 }
1939 1939
1940 queue_delayed_work(priv->hw->workqueue, &priv->dwork_hw_scan, 1940 ieee80211_queue_delayed_work(priv->hw, &priv->dwork_hw_scan,
1941 SCAN_POLL_INTERVAL); 1941 SCAN_POLL_INTERVAL);
1942 1942
1943exit: 1943exit:
1944 mutex_unlock(&priv->mtx); 1944 mutex_unlock(&priv->mtx);
@@ -2027,7 +2027,7 @@ static void at76_configure_filter(struct ieee80211_hw *hw,
2027 } else 2027 } else
2028 return; 2028 return;
2029 2029
2030 queue_work(hw->workqueue, &priv->work_set_promisc); 2030 ieee80211_queue_work(hw, &priv->work_set_promisc);
2031} 2031}
2032 2032
2033static int at76_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, 2033static int at76_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,