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 | ||
