aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
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
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')
-rw-r--r--drivers/net/wireless/at76c50x-usb.c10
-rw-r--r--drivers/net/wireless/ath/ar9170/led.c11
-rw-r--r--drivers/net/wireless/ath/ar9170/main.c26
-rw-r--r--drivers/net/wireless/ath/ath9k/main.c15
-rw-r--r--drivers/net/wireless/ath/ath9k/virtual.c17
-rw-r--r--drivers/net/wireless/ath/ath9k/xmit.c2
-rw-r--r--drivers/net/wireless/b43/main.c8
-rw-r--r--drivers/net/wireless/b43/phy_common.c2
-rw-r--r--drivers/net/wireless/b43/pio.c2
-rw-r--r--drivers/net/wireless/b43legacy/main.c8
-rw-r--r--drivers/net/wireless/p54/led.c5
-rw-r--r--drivers/net/wireless/p54/main.c2
-rw-r--r--drivers/net/wireless/p54/p54spi.c4
-rw-r--r--drivers/net/wireless/p54/txrx.c2
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00dev.c2
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00link.c8
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00mac.c2
-rw-r--r--drivers/net/wireless/rtl818x/rtl8187_dev.c2
-rw-r--r--drivers/net/wireless/rtl818x/rtl8187_leds.c10
-rw-r--r--drivers/net/wireless/zd1211rw/zd_mac.c2
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
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,
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
98static void ar9170_led_brightness_set(struct led_classdev *led, 101static 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
116static int ar9170_register_led(struct ar9170 *ar, int i, char *name, 119static 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
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,
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
1977mutex_unlock: 1978mutex_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
373static void ath9k_pause_iter(void *data, u8 *mac, struct ieee80211_vif *vif) 373static 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
655void ath9k_wiphy_set_scheduler(struct ath_softc *sc, unsigned int msec_int) 656void 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
1660static void b43_set_beacon_int(struct b43_wldev *dev, u16 beacon_int) 1660static 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);
2918out: 2918out:
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
358int b43_phy_shm_tssi_read(struct b43_wldev *dev, u16 shm_offset) 358int 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
789static void b43_pio_tx_suspend_queue(struct b43_pio_txqueue *q) 789static 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
1258static void b43legacy_set_beacon_int(struct b43legacy_wldev *dev, 1258static 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);
2304out: 2304out:
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
485static void p54spi_work(struct work_struct *work) 485static 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}
220EXPORT_SYMBOL_GPL(rt2x00lib_beacondone); 220EXPORT_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
358void rt2x00link_stop_tuner(struct rt2x00_dev *rt2x00dev) 358void 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
468void rt2x00link_register(struct rt2x00_dev *rt2x00dev) 468void 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}
436EXPORT_SYMBOL_GPL(rt2x00mac_configure_filter); 436EXPORT_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
118static int rtl8187_register_led(struct ieee80211_hw *dev, 118static 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));