diff options
author | Luis R. Rodriguez <lrodriguez@atheros.com> | 2009-07-29 20:08:07 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-08-04 16:44:14 -0400 |
commit | 42935ecaf4e784d0815afa9a7e5fe7e141157ca3 (patch) | |
tree | dc0a0dcfff761e98d8a2a23a7edc8f9182c2774c /drivers | |
parent | 64344d78228f6346a0462ba2d5fc03494aef4e6b (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')
-rw-r--r-- | drivers/net/wireless/at76c50x-usb.c | 10 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ar9170/led.c | 11 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ar9170/main.c | 26 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/main.c | 15 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/virtual.c | 17 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/xmit.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/b43/main.c | 8 | ||||
-rw-r--r-- | drivers/net/wireless/b43/phy_common.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/b43/pio.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/b43legacy/main.c | 8 | ||||
-rw-r--r-- | drivers/net/wireless/p54/led.c | 5 | ||||
-rw-r--r-- | drivers/net/wireless/p54/main.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/p54/p54spi.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/p54/txrx.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00dev.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00link.c | 8 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00mac.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rtl818x/rtl8187_dev.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rtl818x/rtl8187_leds.c | 10 | ||||
-rw-r--r-- | drivers/net/wireless/zd1211rw/zd_mac.c | 2 |
20 files changed, 74 insertions, 66 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 | ||
1943 | exit: | 1943 | exit: |
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 | ||
2033 | static int at76_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, | 2033 | static int at76_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, |
diff --git a/drivers/net/wireless/ath/ar9170/led.c b/drivers/net/wireless/ath/ar9170/led.c index 63fda6cd2101..86c4e79f6bc8 100644 --- a/drivers/net/wireless/ath/ar9170/led.c +++ b/drivers/net/wireless/ath/ar9170/led.c | |||
@@ -90,9 +90,12 @@ static void ar9170_update_leds(struct work_struct *work) | |||
90 | ar9170_set_leds_state(ar, led_val); | 90 | ar9170_set_leds_state(ar, led_val); |
91 | mutex_unlock(&ar->mutex); | 91 | mutex_unlock(&ar->mutex); |
92 | 92 | ||
93 | if (rerun) | 93 | if (!rerun) |
94 | queue_delayed_work(ar->hw->workqueue, &ar->led_work, | 94 | return; |
95 | msecs_to_jiffies(blink_delay)); | 95 | |
96 | ieee80211_queue_delayed_work(ar->hw, | ||
97 | &ar->led_work, | ||
98 | msecs_to_jiffies(blink_delay)); | ||
96 | } | 99 | } |
97 | 100 | ||
98 | static void ar9170_led_brightness_set(struct led_classdev *led, | 101 | static void ar9170_led_brightness_set(struct led_classdev *led, |
@@ -110,7 +113,7 @@ static void ar9170_led_brightness_set(struct led_classdev *led, | |||
110 | } | 113 | } |
111 | 114 | ||
112 | if (likely(IS_ACCEPTING_CMD(ar) && arl->toggled)) | 115 | if (likely(IS_ACCEPTING_CMD(ar) && arl->toggled)) |
113 | queue_delayed_work(ar->hw->workqueue, &ar->led_work, HZ/10); | 116 | ieee80211_queue_delayed_work(ar->hw, &ar->led_work, HZ/10); |
114 | } | 117 | } |
115 | 118 | ||
116 | static int ar9170_register_led(struct ar9170 *ar, int i, char *name, | 119 | static int ar9170_register_led(struct ar9170 *ar, int i, char *name, |
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 | ||
604 | void ar9170_handle_command_response(struct ar9170 *ar, void *buf, u32 len) | 606 | void 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 | ||
1834 | static bool ar9170_tx_ampdu_queue(struct ar9170 *ar, struct sk_buff *skb) | 1838 | static 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 | ||
2163 | static void ar9170_op_bss_info_changed(struct ieee80211_hw *hw, | 2167 | static 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 | ||
2421 | static int ar9170_get_stats(struct ieee80211_hw *hw, | 2425 | static int ar9170_get_stats(struct ieee80211_hw *hw, |
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index cf44623b5cd2..292ac2b41891 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
@@ -973,10 +973,11 @@ static void ath_led_blink_work(struct work_struct *work) | |||
973 | ath9k_hw_set_gpio(sc->sc_ah, ATH_LED_PIN, | 973 | ath9k_hw_set_gpio(sc->sc_ah, ATH_LED_PIN, |
974 | (sc->sc_flags & SC_OP_LED_ON) ? 1 : 0); | 974 | (sc->sc_flags & SC_OP_LED_ON) ? 1 : 0); |
975 | 975 | ||
976 | queue_delayed_work(sc->hw->workqueue, &sc->ath_led_blink_work, | 976 | ieee80211_queue_delayed_work(sc->hw, |
977 | (sc->sc_flags & SC_OP_LED_ON) ? | 977 | &sc->ath_led_blink_work, |
978 | msecs_to_jiffies(sc->led_off_duration) : | 978 | (sc->sc_flags & SC_OP_LED_ON) ? |
979 | msecs_to_jiffies(sc->led_on_duration)); | 979 | msecs_to_jiffies(sc->led_off_duration) : |
980 | msecs_to_jiffies(sc->led_on_duration)); | ||
980 | 981 | ||
981 | sc->led_on_duration = sc->led_on_cnt ? | 982 | sc->led_on_duration = sc->led_on_cnt ? |
982 | max((ATH_LED_ON_DURATION_IDLE - sc->led_on_cnt), 25) : | 983 | max((ATH_LED_ON_DURATION_IDLE - sc->led_on_cnt), 25) : |
@@ -1013,8 +1014,8 @@ static void ath_led_brightness(struct led_classdev *led_cdev, | |||
1013 | case LED_FULL: | 1014 | case LED_FULL: |
1014 | if (led->led_type == ATH_LED_ASSOC) { | 1015 | if (led->led_type == ATH_LED_ASSOC) { |
1015 | sc->sc_flags |= SC_OP_LED_ASSOCIATED; | 1016 | sc->sc_flags |= SC_OP_LED_ASSOCIATED; |
1016 | queue_delayed_work(sc->hw->workqueue, | 1017 | ieee80211_queue_delayed_work(sc->hw, |
1017 | &sc->ath_led_blink_work, 0); | 1018 | &sc->ath_led_blink_work, 0); |
1018 | } else if (led->led_type == ATH_LED_RADIO) { | 1019 | } else if (led->led_type == ATH_LED_RADIO) { |
1019 | ath9k_hw_set_gpio(sc->sc_ah, ATH_LED_PIN, 0); | 1020 | ath9k_hw_set_gpio(sc->sc_ah, ATH_LED_PIN, 0); |
1020 | sc->sc_flags |= SC_OP_LED_ON; | 1021 | sc->sc_flags |= SC_OP_LED_ON; |
@@ -1972,7 +1973,7 @@ static int ath9k_start(struct ieee80211_hw *hw) | |||
1972 | 1973 | ||
1973 | ieee80211_wake_queues(hw); | 1974 | ieee80211_wake_queues(hw); |
1974 | 1975 | ||
1975 | queue_delayed_work(sc->hw->workqueue, &sc->tx_complete_work, 0); | 1976 | ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 0); |
1976 | 1977 | ||
1977 | mutex_unlock: | 1978 | mutex_unlock: |
1978 | mutex_unlock(&sc->mutex); | 1979 | mutex_unlock(&sc->mutex); |
diff --git a/drivers/net/wireless/ath/ath9k/virtual.c b/drivers/net/wireless/ath/ath9k/virtual.c index e1d419e02b4a..19b88f8177fd 100644 --- a/drivers/net/wireless/ath/ath9k/virtual.c +++ b/drivers/net/wireless/ath/ath9k/virtual.c | |||
@@ -351,7 +351,7 @@ void ath9k_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
351 | * Drop from tasklet to work to allow mutex for channel | 351 | * Drop from tasklet to work to allow mutex for channel |
352 | * change. | 352 | * change. |
353 | */ | 353 | */ |
354 | queue_work(aphy->sc->hw->workqueue, | 354 | ieee80211_queue_work(aphy->sc->hw, |
355 | &aphy->sc->chan_work); | 355 | &aphy->sc->chan_work); |
356 | } | 356 | } |
357 | } | 357 | } |
@@ -367,7 +367,7 @@ static void ath9k_mark_paused(struct ath_wiphy *aphy) | |||
367 | struct ath_softc *sc = aphy->sc; | 367 | struct ath_softc *sc = aphy->sc; |
368 | aphy->state = ATH_WIPHY_PAUSED; | 368 | aphy->state = ATH_WIPHY_PAUSED; |
369 | if (!__ath9k_wiphy_pausing(sc)) | 369 | if (!__ath9k_wiphy_pausing(sc)) |
370 | queue_work(sc->hw->workqueue, &sc->chan_work); | 370 | ieee80211_queue_work(sc->hw, &sc->chan_work); |
371 | } | 371 | } |
372 | 372 | ||
373 | static void ath9k_pause_iter(void *data, u8 *mac, struct ieee80211_vif *vif) | 373 | static void ath9k_pause_iter(void *data, u8 *mac, struct ieee80211_vif *vif) |
@@ -521,7 +521,7 @@ int ath9k_wiphy_select(struct ath_wiphy *aphy) | |||
521 | spin_unlock_bh(&sc->wiphy_lock); | 521 | spin_unlock_bh(&sc->wiphy_lock); |
522 | ath_radio_disable(sc); | 522 | ath_radio_disable(sc); |
523 | ath_radio_enable(sc); | 523 | ath_radio_enable(sc); |
524 | queue_work(aphy->sc->hw->workqueue, | 524 | ieee80211_queue_work(aphy->sc->hw, |
525 | &aphy->sc->chan_work); | 525 | &aphy->sc->chan_work); |
526 | return -EBUSY; /* previous select still in progress */ | 526 | return -EBUSY; /* previous select still in progress */ |
527 | } | 527 | } |
@@ -541,7 +541,7 @@ int ath9k_wiphy_select(struct ath_wiphy *aphy) | |||
541 | 541 | ||
542 | if (now) { | 542 | if (now) { |
543 | /* Ready to request channel change immediately */ | 543 | /* Ready to request channel change immediately */ |
544 | queue_work(aphy->sc->hw->workqueue, &aphy->sc->chan_work); | 544 | ieee80211_queue_work(aphy->sc->hw, &aphy->sc->chan_work); |
545 | } | 545 | } |
546 | 546 | ||
547 | /* | 547 | /* |
@@ -648,8 +648,9 @@ try_again: | |||
648 | "change\n"); | 648 | "change\n"); |
649 | } | 649 | } |
650 | 650 | ||
651 | queue_delayed_work(sc->hw->workqueue, &sc->wiphy_work, | 651 | ieee80211_queue_delayed_work(sc->hw, |
652 | sc->wiphy_scheduler_int); | 652 | &sc->wiphy_work, |
653 | sc->wiphy_scheduler_int); | ||
653 | } | 654 | } |
654 | 655 | ||
655 | void ath9k_wiphy_set_scheduler(struct ath_softc *sc, unsigned int msec_int) | 656 | void ath9k_wiphy_set_scheduler(struct ath_softc *sc, unsigned int msec_int) |
@@ -657,8 +658,8 @@ void ath9k_wiphy_set_scheduler(struct ath_softc *sc, unsigned int msec_int) | |||
657 | cancel_delayed_work_sync(&sc->wiphy_work); | 658 | cancel_delayed_work_sync(&sc->wiphy_work); |
658 | sc->wiphy_scheduler_int = msecs_to_jiffies(msec_int); | 659 | sc->wiphy_scheduler_int = msecs_to_jiffies(msec_int); |
659 | if (sc->wiphy_scheduler_int) | 660 | if (sc->wiphy_scheduler_int) |
660 | queue_delayed_work(sc->hw->workqueue, &sc->wiphy_work, | 661 | ieee80211_queue_delayed_work(sc->hw, &sc->wiphy_work, |
661 | sc->wiphy_scheduler_int); | 662 | sc->wiphy_scheduler_int); |
662 | } | 663 | } |
663 | 664 | ||
664 | /* caller must hold wiphy_lock */ | 665 | /* caller must hold wiphy_lock */ |
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index b7806e2ca0e1..87762da0383b 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c | |||
@@ -2063,7 +2063,7 @@ static void ath_tx_complete_poll_work(struct work_struct *work) | |||
2063 | ath_reset(sc, false); | 2063 | ath_reset(sc, false); |
2064 | } | 2064 | } |
2065 | 2065 | ||
2066 | queue_delayed_work(sc->hw->workqueue, &sc->tx_complete_work, | 2066 | ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, |
2067 | msecs_to_jiffies(ATH_TX_COMPLETE_POLL_INT)); | 2067 | msecs_to_jiffies(ATH_TX_COMPLETE_POLL_INT)); |
2068 | } | 2068 | } |
2069 | 2069 | ||
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index 3f4360ad0e4e..f985938962e3 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
@@ -1654,7 +1654,7 @@ static void b43_update_templates(struct b43_wl *wl) | |||
1654 | wl->current_beacon = beacon; | 1654 | wl->current_beacon = beacon; |
1655 | wl->beacon0_uploaded = 0; | 1655 | wl->beacon0_uploaded = 0; |
1656 | wl->beacon1_uploaded = 0; | 1656 | wl->beacon1_uploaded = 0; |
1657 | queue_work(wl->hw->workqueue, &wl->beacon_update_trigger); | 1657 | ieee80211_queue_work(wl->hw, &wl->beacon_update_trigger); |
1658 | } | 1658 | } |
1659 | 1659 | ||
1660 | static void b43_set_beacon_int(struct b43_wldev *dev, u16 beacon_int) | 1660 | static void b43_set_beacon_int(struct b43_wldev *dev, u16 beacon_int) |
@@ -2914,7 +2914,7 @@ out_requeue: | |||
2914 | delay = msecs_to_jiffies(50); | 2914 | delay = msecs_to_jiffies(50); |
2915 | else | 2915 | else |
2916 | delay = round_jiffies_relative(HZ * 15); | 2916 | delay = round_jiffies_relative(HZ * 15); |
2917 | queue_delayed_work(wl->hw->workqueue, &dev->periodic_work, delay); | 2917 | ieee80211_queue_delayed_work(wl->hw, &dev->periodic_work, delay); |
2918 | out: | 2918 | out: |
2919 | mutex_unlock(&wl->mutex); | 2919 | mutex_unlock(&wl->mutex); |
2920 | } | 2920 | } |
@@ -2925,7 +2925,7 @@ static void b43_periodic_tasks_setup(struct b43_wldev *dev) | |||
2925 | 2925 | ||
2926 | dev->periodic_state = 0; | 2926 | dev->periodic_state = 0; |
2927 | INIT_DELAYED_WORK(work, b43_periodic_work_handler); | 2927 | INIT_DELAYED_WORK(work, b43_periodic_work_handler); |
2928 | queue_delayed_work(dev->wl->hw->workqueue, work, 0); | 2928 | ieee80211_queue_delayed_work(dev->wl->hw, work, 0); |
2929 | } | 2929 | } |
2930 | 2930 | ||
2931 | /* Check if communication with the device works correctly. */ | 2931 | /* Check if communication with the device works correctly. */ |
@@ -4871,7 +4871,7 @@ void b43_controller_restart(struct b43_wldev *dev, const char *reason) | |||
4871 | if (b43_status(dev) < B43_STAT_INITIALIZED) | 4871 | if (b43_status(dev) < B43_STAT_INITIALIZED) |
4872 | return; | 4872 | return; |
4873 | b43info(dev->wl, "Controller RESET (%s) ...\n", reason); | 4873 | b43info(dev->wl, "Controller RESET (%s) ...\n", reason); |
4874 | queue_work(dev->wl->hw->workqueue, &dev->restart_work); | 4874 | ieee80211_queue_work(dev->wl->hw, &dev->restart_work); |
4875 | } | 4875 | } |
4876 | 4876 | ||
4877 | #ifdef CONFIG_PM | 4877 | #ifdef CONFIG_PM |
diff --git a/drivers/net/wireless/b43/phy_common.c b/drivers/net/wireless/b43/phy_common.c index 6d241622210e..f537bfef690a 100644 --- a/drivers/net/wireless/b43/phy_common.c +++ b/drivers/net/wireless/b43/phy_common.c | |||
@@ -352,7 +352,7 @@ void b43_phy_txpower_check(struct b43_wldev *dev, unsigned int flags) | |||
352 | 352 | ||
353 | /* We must adjust the transmission power in hardware. | 353 | /* We must adjust the transmission power in hardware. |
354 | * Schedule b43_phy_txpower_adjust_work(). */ | 354 | * Schedule b43_phy_txpower_adjust_work(). */ |
355 | queue_work(dev->wl->hw->workqueue, &dev->wl->txpower_adjust_work); | 355 | ieee80211_queue_work(dev->wl->hw, &dev->wl->txpower_adjust_work); |
356 | } | 356 | } |
357 | 357 | ||
358 | int b43_phy_shm_tssi_read(struct b43_wldev *dev, u16 shm_offset) | 358 | int b43_phy_shm_tssi_read(struct b43_wldev *dev, u16 shm_offset) |
diff --git a/drivers/net/wireless/b43/pio.c b/drivers/net/wireless/b43/pio.c index 69138e8c1db6..73c047d8de40 100644 --- a/drivers/net/wireless/b43/pio.c +++ b/drivers/net/wireless/b43/pio.c | |||
@@ -783,7 +783,7 @@ void b43_pio_rx(struct b43_pio_rxqueue *q) | |||
783 | { | 783 | { |
784 | /* Due to latency issues we must run the RX path in | 784 | /* Due to latency issues we must run the RX path in |
785 | * a workqueue to be able to schedule between packets. */ | 785 | * a workqueue to be able to schedule between packets. */ |
786 | queue_work(q->dev->wl->hw->workqueue, &q->rx_work); | 786 | ieee80211_queue_work(q->dev->wl->hw, &q->rx_work); |
787 | } | 787 | } |
788 | 788 | ||
789 | static void b43_pio_tx_suspend_queue(struct b43_pio_txqueue *q) | 789 | static void b43_pio_tx_suspend_queue(struct b43_pio_txqueue *q) |
diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c index c4973c1942bf..b1435594921a 100644 --- a/drivers/net/wireless/b43legacy/main.c +++ b/drivers/net/wireless/b43legacy/main.c | |||
@@ -1252,7 +1252,7 @@ static void b43legacy_update_templates(struct b43legacy_wl *wl) | |||
1252 | wl->current_beacon = beacon; | 1252 | wl->current_beacon = beacon; |
1253 | wl->beacon0_uploaded = 0; | 1253 | wl->beacon0_uploaded = 0; |
1254 | wl->beacon1_uploaded = 0; | 1254 | wl->beacon1_uploaded = 0; |
1255 | queue_work(wl->hw->workqueue, &wl->beacon_update_trigger); | 1255 | ieee80211_queue_work(wl->hw, &wl->beacon_update_trigger); |
1256 | } | 1256 | } |
1257 | 1257 | ||
1258 | static void b43legacy_set_beacon_int(struct b43legacy_wldev *dev, | 1258 | static void b43legacy_set_beacon_int(struct b43legacy_wldev *dev, |
@@ -2300,7 +2300,7 @@ out_requeue: | |||
2300 | delay = msecs_to_jiffies(50); | 2300 | delay = msecs_to_jiffies(50); |
2301 | else | 2301 | else |
2302 | delay = round_jiffies_relative(HZ * 15); | 2302 | delay = round_jiffies_relative(HZ * 15); |
2303 | queue_delayed_work(wl->hw->workqueue, &dev->periodic_work, delay); | 2303 | ieee80211_queue_delayed_work(wl->hw, &dev->periodic_work, delay); |
2304 | out: | 2304 | out: |
2305 | mutex_unlock(&wl->mutex); | 2305 | mutex_unlock(&wl->mutex); |
2306 | } | 2306 | } |
@@ -2311,7 +2311,7 @@ static void b43legacy_periodic_tasks_setup(struct b43legacy_wldev *dev) | |||
2311 | 2311 | ||
2312 | dev->periodic_state = 0; | 2312 | dev->periodic_state = 0; |
2313 | INIT_DELAYED_WORK(work, b43legacy_periodic_work_handler); | 2313 | INIT_DELAYED_WORK(work, b43legacy_periodic_work_handler); |
2314 | queue_delayed_work(dev->wl->hw->workqueue, work, 0); | 2314 | ieee80211_queue_delayed_work(dev->wl->hw, work, 0); |
2315 | } | 2315 | } |
2316 | 2316 | ||
2317 | /* Validate access to the chip (SHM) */ | 2317 | /* Validate access to the chip (SHM) */ |
@@ -3885,7 +3885,7 @@ void b43legacy_controller_restart(struct b43legacy_wldev *dev, | |||
3885 | if (b43legacy_status(dev) < B43legacy_STAT_INITIALIZED) | 3885 | if (b43legacy_status(dev) < B43legacy_STAT_INITIALIZED) |
3886 | return; | 3886 | return; |
3887 | b43legacyinfo(dev->wl, "Controller RESET (%s) ...\n", reason); | 3887 | b43legacyinfo(dev->wl, "Controller RESET (%s) ...\n", reason); |
3888 | queue_work(dev->wl->hw->workqueue, &dev->restart_work); | 3888 | ieee80211_queue_work(dev->wl->hw, &dev->restart_work); |
3889 | } | 3889 | } |
3890 | 3890 | ||
3891 | #ifdef CONFIG_PM | 3891 | #ifdef CONFIG_PM |
diff --git a/drivers/net/wireless/p54/led.c b/drivers/net/wireless/p54/led.c index c00115b206d4..9575ac033630 100644 --- a/drivers/net/wireless/p54/led.c +++ b/drivers/net/wireless/p54/led.c | |||
@@ -61,7 +61,7 @@ static void p54_update_leds(struct work_struct *work) | |||
61 | wiphy_name(priv->hw->wiphy), err); | 61 | wiphy_name(priv->hw->wiphy), err); |
62 | 62 | ||
63 | if (rerun) | 63 | if (rerun) |
64 | queue_delayed_work(priv->hw->workqueue, &priv->led_work, | 64 | ieee80211_queue_delayed_work(priv->hw, &priv->led_work, |
65 | msecs_to_jiffies(blink_delay)); | 65 | msecs_to_jiffies(blink_delay)); |
66 | } | 66 | } |
67 | 67 | ||
@@ -78,8 +78,7 @@ static void p54_led_brightness_set(struct led_classdev *led_dev, | |||
78 | 78 | ||
79 | if ((brightness) && (led->registered)) { | 79 | if ((brightness) && (led->registered)) { |
80 | led->toggled++; | 80 | led->toggled++; |
81 | queue_delayed_work(priv->hw->workqueue, &priv->led_work, | 81 | ieee80211_queue_delayed_work(priv->hw, &priv->led_work, HZ/10); |
82 | HZ/10); | ||
83 | } | 82 | } |
84 | } | 83 | } |
85 | 84 | ||
diff --git a/drivers/net/wireless/p54/main.c b/drivers/net/wireless/p54/main.c index 955f6d7ec16a..a0d0e726bc4e 100644 --- a/drivers/net/wireless/p54/main.c +++ b/drivers/net/wireless/p54/main.c | |||
@@ -180,7 +180,7 @@ static int p54_start(struct ieee80211_hw *dev) | |||
180 | goto out; | 180 | goto out; |
181 | } | 181 | } |
182 | 182 | ||
183 | queue_delayed_work(dev->workqueue, &priv->work, 0); | 183 | ieee80211_queue_delayed_work(dev, &priv->work, 0); |
184 | 184 | ||
185 | priv->softled_state = 0; | 185 | priv->softled_state = 0; |
186 | err = p54_set_leds(priv); | 186 | err = p54_set_leds(priv); |
diff --git a/drivers/net/wireless/p54/p54spi.c b/drivers/net/wireless/p54/p54spi.c index eef532987d05..05458d9249ce 100644 --- a/drivers/net/wireless/p54/p54spi.c +++ b/drivers/net/wireless/p54/p54spi.c | |||
@@ -391,7 +391,7 @@ static irqreturn_t p54spi_interrupt(int irq, void *config) | |||
391 | struct spi_device *spi = config; | 391 | struct spi_device *spi = config; |
392 | struct p54s_priv *priv = dev_get_drvdata(&spi->dev); | 392 | struct p54s_priv *priv = dev_get_drvdata(&spi->dev); |
393 | 393 | ||
394 | queue_work(priv->hw->workqueue, &priv->work); | 394 | ieee80211_queue_work(priv->hw, &priv->work); |
395 | 395 | ||
396 | return IRQ_HANDLED; | 396 | return IRQ_HANDLED; |
397 | } | 397 | } |
@@ -479,7 +479,7 @@ static void p54spi_op_tx(struct ieee80211_hw *dev, struct sk_buff *skb) | |||
479 | list_add_tail(&di->tx_list, &priv->tx_pending); | 479 | list_add_tail(&di->tx_list, &priv->tx_pending); |
480 | spin_unlock_irqrestore(&priv->tx_lock, flags); | 480 | spin_unlock_irqrestore(&priv->tx_lock, flags); |
481 | 481 | ||
482 | queue_work(priv->hw->workqueue, &priv->work); | 482 | ieee80211_queue_work(priv->hw, &priv->work); |
483 | } | 483 | } |
484 | 484 | ||
485 | static void p54spi_work(struct work_struct *work) | 485 | static void p54spi_work(struct work_struct *work) |
diff --git a/drivers/net/wireless/p54/txrx.c b/drivers/net/wireless/p54/txrx.c index c32a0d2fa1f7..704685fab177 100644 --- a/drivers/net/wireless/p54/txrx.c +++ b/drivers/net/wireless/p54/txrx.c | |||
@@ -380,7 +380,7 @@ static int p54_rx_data(struct p54_common *priv, struct sk_buff *skb) | |||
380 | 380 | ||
381 | ieee80211_rx_irqsafe(priv->hw, skb); | 381 | ieee80211_rx_irqsafe(priv->hw, skb); |
382 | 382 | ||
383 | queue_delayed_work(priv->hw->workqueue, &priv->work, | 383 | ieee80211_queue_delayed_work(priv->hw, &priv->work, |
384 | msecs_to_jiffies(P54_STATISTICS_UPDATE)); | 384 | msecs_to_jiffies(P54_STATISTICS_UPDATE)); |
385 | 385 | ||
386 | return -1; | 386 | return -1; |
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index 658a63bfb761..b717afbf3f38 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
@@ -215,7 +215,7 @@ void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev) | |||
215 | rt2x00lib_beacondone_iter, | 215 | rt2x00lib_beacondone_iter, |
216 | rt2x00dev); | 216 | rt2x00dev); |
217 | 217 | ||
218 | queue_work(rt2x00dev->hw->workqueue, &rt2x00dev->intf_work); | 218 | ieee80211_queue_work(rt2x00dev->hw, &rt2x00dev->intf_work); |
219 | } | 219 | } |
220 | EXPORT_SYMBOL_GPL(rt2x00lib_beacondone); | 220 | EXPORT_SYMBOL_GPL(rt2x00lib_beacondone); |
221 | 221 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2x00link.c b/drivers/net/wireless/rt2x00/rt2x00link.c index 79915687e744..917831689ccd 100644 --- a/drivers/net/wireless/rt2x00/rt2x00link.c +++ b/drivers/net/wireless/rt2x00/rt2x00link.c | |||
@@ -351,8 +351,8 @@ void rt2x00link_start_tuner(struct rt2x00_dev *rt2x00dev) | |||
351 | 351 | ||
352 | rt2x00link_reset_tuner(rt2x00dev, false); | 352 | rt2x00link_reset_tuner(rt2x00dev, false); |
353 | 353 | ||
354 | queue_delayed_work(rt2x00dev->hw->workqueue, | 354 | ieee80211_queue_delayed_work(rt2x00dev->hw, |
355 | &link->work, LINK_TUNE_INTERVAL); | 355 | &link->work, LINK_TUNE_INTERVAL); |
356 | } | 356 | } |
357 | 357 | ||
358 | void rt2x00link_stop_tuner(struct rt2x00_dev *rt2x00dev) | 358 | void rt2x00link_stop_tuner(struct rt2x00_dev *rt2x00dev) |
@@ -461,8 +461,8 @@ static void rt2x00link_tuner(struct work_struct *work) | |||
461 | * Increase tuner counter, and reschedule the next link tuner run. | 461 | * Increase tuner counter, and reschedule the next link tuner run. |
462 | */ | 462 | */ |
463 | link->count++; | 463 | link->count++; |
464 | queue_delayed_work(rt2x00dev->hw->workqueue, | 464 | ieee80211_queue_delayed_work(rt2x00dev->hw, |
465 | &link->work, LINK_TUNE_INTERVAL); | 465 | &link->work, LINK_TUNE_INTERVAL); |
466 | } | 466 | } |
467 | 467 | ||
468 | void rt2x00link_register(struct rt2x00_dev *rt2x00dev) | 468 | void rt2x00link_register(struct rt2x00_dev *rt2x00dev) |
diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c index e92c8f99d695..81febdfd6639 100644 --- a/drivers/net/wireless/rt2x00/rt2x00mac.c +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c | |||
@@ -431,7 +431,7 @@ void rt2x00mac_configure_filter(struct ieee80211_hw *hw, | |||
431 | if (!test_bit(DRIVER_REQUIRE_SCHEDULED, &rt2x00dev->flags)) | 431 | if (!test_bit(DRIVER_REQUIRE_SCHEDULED, &rt2x00dev->flags)) |
432 | rt2x00dev->ops->lib->config_filter(rt2x00dev, *total_flags); | 432 | rt2x00dev->ops->lib->config_filter(rt2x00dev, *total_flags); |
433 | else | 433 | else |
434 | queue_work(rt2x00dev->hw->workqueue, &rt2x00dev->filter_work); | 434 | ieee80211_queue_work(rt2x00dev->hw, &rt2x00dev->filter_work); |
435 | } | 435 | } |
436 | EXPORT_SYMBOL_GPL(rt2x00mac_configure_filter); | 436 | EXPORT_SYMBOL_GPL(rt2x00mac_configure_filter); |
437 | 437 | ||
diff --git a/drivers/net/wireless/rtl818x/rtl8187_dev.c b/drivers/net/wireless/rtl818x/rtl8187_dev.c index c9b9dbe584c6..53f57dc52226 100644 --- a/drivers/net/wireless/rtl818x/rtl8187_dev.c +++ b/drivers/net/wireless/rtl818x/rtl8187_dev.c | |||
@@ -220,7 +220,7 @@ static void rtl8187_tx_cb(struct urb *urb) | |||
220 | * reading a register in the device. We are in interrupt mode | 220 | * reading a register in the device. We are in interrupt mode |
221 | * here, thus queue the skb and finish on a work queue. */ | 221 | * here, thus queue the skb and finish on a work queue. */ |
222 | skb_queue_tail(&priv->b_tx_status.queue, skb); | 222 | skb_queue_tail(&priv->b_tx_status.queue, skb); |
223 | queue_delayed_work(hw->workqueue, &priv->work, 0); | 223 | ieee80211_queue_delayed_work(hw, &priv->work, 0); |
224 | } | 224 | } |
225 | } | 225 | } |
226 | 226 | ||
diff --git a/drivers/net/wireless/rtl818x/rtl8187_leds.c b/drivers/net/wireless/rtl818x/rtl8187_leds.c index cf9f899fe0e6..a6cfb7e77994 100644 --- a/drivers/net/wireless/rtl818x/rtl8187_leds.c +++ b/drivers/net/wireless/rtl818x/rtl8187_leds.c | |||
@@ -108,11 +108,11 @@ static void rtl8187_led_brightness_set(struct led_classdev *led_dev, | |||
108 | struct rtl8187_priv *priv = hw->priv; | 108 | struct rtl8187_priv *priv = hw->priv; |
109 | 109 | ||
110 | if (brightness == LED_OFF) { | 110 | if (brightness == LED_OFF) { |
111 | queue_delayed_work(hw->workqueue, &priv->led_off, 0); | 111 | ieee80211_queue_delayed_work(hw, &priv->led_off, 0); |
112 | /* The LED is off for 1/20 sec so that it just blinks. */ | 112 | /* The LED is off for 1/20 sec so that it just blinks. */ |
113 | queue_delayed_work(hw->workqueue, &priv->led_on, HZ / 20); | 113 | ieee80211_queue_delayed_work(hw, &priv->led_on, HZ / 20); |
114 | } else | 114 | } else |
115 | queue_delayed_work(hw->workqueue, &priv->led_on, 0); | 115 | ieee80211_queue_delayed_work(hw, &priv->led_on, 0); |
116 | } | 116 | } |
117 | 117 | ||
118 | static int rtl8187_register_led(struct ieee80211_hw *dev, | 118 | static int rtl8187_register_led(struct ieee80211_hw *dev, |
@@ -193,7 +193,7 @@ void rtl8187_leds_init(struct ieee80211_hw *dev, u16 custid) | |||
193 | err = rtl8187_register_led(dev, &priv->led_rx, name, | 193 | err = rtl8187_register_led(dev, &priv->led_rx, name, |
194 | ieee80211_get_rx_led_name(dev), ledpin); | 194 | ieee80211_get_rx_led_name(dev), ledpin); |
195 | if (!err) { | 195 | if (!err) { |
196 | queue_delayed_work(dev->workqueue, &priv->led_on, 0); | 196 | ieee80211_queue_delayed_work(dev, &priv->led_on, 0); |
197 | return; | 197 | return; |
198 | } | 198 | } |
199 | /* registration of RX LED failed - unregister TX */ | 199 | /* registration of RX LED failed - unregister TX */ |
@@ -209,7 +209,7 @@ void rtl8187_leds_exit(struct ieee80211_hw *dev) | |||
209 | struct rtl8187_priv *priv = dev->priv; | 209 | struct rtl8187_priv *priv = dev->priv; |
210 | 210 | ||
211 | /* turn the LED off before exiting */ | 211 | /* turn the LED off before exiting */ |
212 | queue_delayed_work(dev->workqueue, &priv->led_off, 0); | 212 | ieee80211_queue_delayed_work(dev, &priv->led_off, 0); |
213 | cancel_delayed_work_sync(&priv->led_off); | 213 | cancel_delayed_work_sync(&priv->led_off); |
214 | cancel_delayed_work_sync(&priv->led_on); | 214 | cancel_delayed_work_sync(&priv->led_on); |
215 | rtl8187_unregister_led(&priv->led_rx); | 215 | rtl8187_unregister_led(&priv->led_rx); |
diff --git a/drivers/net/wireless/zd1211rw/zd_mac.c b/drivers/net/wireless/zd1211rw/zd_mac.c index 9600b72495da..54abdd0c0045 100644 --- a/drivers/net/wireless/zd1211rw/zd_mac.c +++ b/drivers/net/wireless/zd1211rw/zd_mac.c | |||
@@ -698,7 +698,7 @@ int zd_mac_rx(struct ieee80211_hw *hw, const u8 *buffer, unsigned int length) | |||
698 | && !mac->pass_ctrl) | 698 | && !mac->pass_ctrl) |
699 | return 0; | 699 | return 0; |
700 | 700 | ||
701 | fc = *(__le16 *)buffer; | 701 | fc = get_unaligned((__le16*)buffer); |
702 | need_padding = ieee80211_is_data_qos(fc) ^ ieee80211_has_a4(fc); | 702 | need_padding = ieee80211_is_data_qos(fc) ^ ieee80211_has_a4(fc); |
703 | 703 | ||
704 | skb = dev_alloc_skb(length + (need_padding ? 2 : 0)); | 704 | skb = dev_alloc_skb(length + (need_padding ? 2 : 0)); |