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/net/wireless/p54 | |
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/net/wireless/p54')
-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 |
4 files changed, 6 insertions, 7 deletions
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; |