aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/ipw2x00/ipw2100.c31
-rw-r--r--drivers/net/wireless/ipw2x00/ipw2100.h3
-rw-r--r--drivers/net/wireless/ipw2x00/ipw2200.c13
3 files changed, 12 insertions, 35 deletions
diff --git a/drivers/net/wireless/ipw2x00/ipw2100.c b/drivers/net/wireless/ipw2x00/ipw2100.c
index d92b21a8e597..b3ab7b7becae 100644
--- a/drivers/net/wireless/ipw2x00/ipw2100.c
+++ b/drivers/net/wireless/ipw2x00/ipw2100.c
@@ -2181,9 +2181,10 @@ static void isr_indicate_rf_kill(struct ipw2100_priv *priv, u32 status)
2181 mod_delayed_work(system_wq, &priv->rf_kill, round_jiffies_relative(HZ)); 2181 mod_delayed_work(system_wq, &priv->rf_kill, round_jiffies_relative(HZ));
2182} 2182}
2183 2183
2184static void send_scan_event(void *data) 2184static void ipw2100_scan_event(struct work_struct *work)
2185{ 2185{
2186 struct ipw2100_priv *priv = data; 2186 struct ipw2100_priv *priv = container_of(work, struct ipw2100_priv,
2187 scan_event.work);
2187 union iwreq_data wrqu; 2188 union iwreq_data wrqu;
2188 2189
2189 wrqu.data.length = 0; 2190 wrqu.data.length = 0;
@@ -2191,18 +2192,6 @@ static void send_scan_event(void *data)
2191 wireless_send_event(priv->net_dev, SIOCGIWSCAN, &wrqu, NULL); 2192 wireless_send_event(priv->net_dev, SIOCGIWSCAN, &wrqu, NULL);
2192} 2193}
2193 2194
2194static void ipw2100_scan_event_later(struct work_struct *work)
2195{
2196 send_scan_event(container_of(work, struct ipw2100_priv,
2197 scan_event_later.work));
2198}
2199
2200static void ipw2100_scan_event_now(struct work_struct *work)
2201{
2202 send_scan_event(container_of(work, struct ipw2100_priv,
2203 scan_event_now));
2204}
2205
2206static void isr_scan_complete(struct ipw2100_priv *priv, u32 status) 2195static void isr_scan_complete(struct ipw2100_priv *priv, u32 status)
2207{ 2196{
2208 IPW_DEBUG_SCAN("scan complete\n"); 2197 IPW_DEBUG_SCAN("scan complete\n");
@@ -2212,13 +2201,11 @@ static void isr_scan_complete(struct ipw2100_priv *priv, u32 status)
2212 2201
2213 /* Only userspace-requested scan completion events go out immediately */ 2202 /* Only userspace-requested scan completion events go out immediately */
2214 if (!priv->user_requested_scan) { 2203 if (!priv->user_requested_scan) {
2215 if (!delayed_work_pending(&priv->scan_event_later)) 2204 schedule_delayed_work(&priv->scan_event,
2216 schedule_delayed_work(&priv->scan_event_later, 2205 round_jiffies_relative(msecs_to_jiffies(4000)));
2217 round_jiffies_relative(msecs_to_jiffies(4000)));
2218 } else { 2206 } else {
2219 priv->user_requested_scan = 0; 2207 priv->user_requested_scan = 0;
2220 cancel_delayed_work(&priv->scan_event_later); 2208 mod_delayed_work(system_wq, &priv->scan_event, 0);
2221 schedule_work(&priv->scan_event_now);
2222 } 2209 }
2223} 2210}
2224 2211
@@ -4459,8 +4446,7 @@ static void ipw2100_kill_works(struct ipw2100_priv *priv)
4459 cancel_delayed_work_sync(&priv->wx_event_work); 4446 cancel_delayed_work_sync(&priv->wx_event_work);
4460 cancel_delayed_work_sync(&priv->hang_check); 4447 cancel_delayed_work_sync(&priv->hang_check);
4461 cancel_delayed_work_sync(&priv->rf_kill); 4448 cancel_delayed_work_sync(&priv->rf_kill);
4462 cancel_work_sync(&priv->scan_event_now); 4449 cancel_delayed_work_sync(&priv->scan_event);
4463 cancel_delayed_work_sync(&priv->scan_event_later);
4464} 4450}
4465 4451
4466static int ipw2100_tx_allocate(struct ipw2100_priv *priv) 4452static int ipw2100_tx_allocate(struct ipw2100_priv *priv)
@@ -6195,8 +6181,7 @@ static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev,
6195 INIT_DELAYED_WORK(&priv->wx_event_work, ipw2100_wx_event_work); 6181 INIT_DELAYED_WORK(&priv->wx_event_work, ipw2100_wx_event_work);
6196 INIT_DELAYED_WORK(&priv->hang_check, ipw2100_hang_check); 6182 INIT_DELAYED_WORK(&priv->hang_check, ipw2100_hang_check);
6197 INIT_DELAYED_WORK(&priv->rf_kill, ipw2100_rf_kill); 6183 INIT_DELAYED_WORK(&priv->rf_kill, ipw2100_rf_kill);
6198 INIT_WORK(&priv->scan_event_now, ipw2100_scan_event_now); 6184 INIT_DELAYED_WORK(&priv->scan_event, ipw2100_scan_event);
6199 INIT_DELAYED_WORK(&priv->scan_event_later, ipw2100_scan_event_later);
6200 6185
6201 tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long)) 6186 tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long))
6202 ipw2100_irq_tasklet, (unsigned long)priv); 6187 ipw2100_irq_tasklet, (unsigned long)priv);
diff --git a/drivers/net/wireless/ipw2x00/ipw2100.h b/drivers/net/wireless/ipw2x00/ipw2100.h
index 5fe17cbab1f3..c6d78790cb0d 100644
--- a/drivers/net/wireless/ipw2x00/ipw2100.h
+++ b/drivers/net/wireless/ipw2x00/ipw2100.h
@@ -577,8 +577,7 @@ struct ipw2100_priv {
577 struct delayed_work wx_event_work; 577 struct delayed_work wx_event_work;
578 struct delayed_work hang_check; 578 struct delayed_work hang_check;
579 struct delayed_work rf_kill; 579 struct delayed_work rf_kill;
580 struct work_struct scan_event_now; 580 struct delayed_work scan_event;
581 struct delayed_work scan_event_later;
582 581
583 int user_requested_scan; 582 int user_requested_scan;
584 583
diff --git a/drivers/net/wireless/ipw2x00/ipw2200.c b/drivers/net/wireless/ipw2x00/ipw2200.c
index 844f201b7b70..2c2d6db0536c 100644
--- a/drivers/net/wireless/ipw2x00/ipw2200.c
+++ b/drivers/net/wireless/ipw2x00/ipw2200.c
@@ -4480,18 +4480,11 @@ static void handle_scan_event(struct ipw_priv *priv)
4480{ 4480{
4481 /* Only userspace-requested scan completion events go out immediately */ 4481 /* Only userspace-requested scan completion events go out immediately */
4482 if (!priv->user_requested_scan) { 4482 if (!priv->user_requested_scan) {
4483 if (!delayed_work_pending(&priv->scan_event)) 4483 schedule_delayed_work(&priv->scan_event,
4484 schedule_delayed_work(&priv->scan_event, 4484 round_jiffies_relative(msecs_to_jiffies(4000)));
4485 round_jiffies_relative(msecs_to_jiffies(4000)));
4486 } else { 4485 } else {
4487 union iwreq_data wrqu;
4488
4489 priv->user_requested_scan = 0; 4486 priv->user_requested_scan = 0;
4490 cancel_delayed_work(&priv->scan_event); 4487 mod_delayed_work(system_wq, &priv->scan_event, 0);
4491
4492 wrqu.data.length = 0;
4493 wrqu.data.flags = 0;
4494 wireless_send_event(priv->net_dev, SIOCGIWSCAN, &wrqu, NULL);
4495 } 4488 }
4496} 4489}
4497 4490