diff options
-rw-r--r-- | drivers/net/wireless/ipw2x00/ipw2100.c | 31 | ||||
-rw-r--r-- | drivers/net/wireless/ipw2x00/ipw2100.h | 3 | ||||
-rw-r--r-- | drivers/net/wireless/ipw2x00/ipw2200.c | 13 |
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 | ||
2184 | static void send_scan_event(void *data) | 2184 | static 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 | ||
2194 | static 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 | |||
2200 | static 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 | |||
2206 | static void isr_scan_complete(struct ipw2100_priv *priv, u32 status) | 2195 | static 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 | ||
4466 | static int ipw2100_tx_allocate(struct ipw2100_priv *priv) | 4452 | static 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 | ||