aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/p54
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/p54
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/p54')
-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
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
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;