Commit 7c99e0bf authored by Tejun Heo's avatar Tejun Heo

ipw2x00: simplify scan_event handling

* Drop unnesssary delayd_work_pending() tests.

* Unify scan_event_{now|later} by using mod_delayed_work() w/ 0 delay
  for scan_event_now.

* Make ipw2200 scan_event handling match ipw2100 - use
  mod_delayed_work() w/ 0 delay for immediate scanning.

Only compile tested.
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Acked-by: default avatarStanislav Yakovlev <stas.yakovlev@gmail.com>
Cc: linux-wireless@vger.kernel.org
parent 7d0315a2
...@@ -2181,9 +2181,10 @@ static void isr_indicate_rf_kill(struct ipw2100_priv *priv, u32 status) ...@@ -2181,9 +2181,10 @@ static void isr_indicate_rf_kill(struct ipw2100_priv *priv, u32 status)
mod_delayed_work(system_wq, &priv->rf_kill, round_jiffies_relative(HZ)); mod_delayed_work(system_wq, &priv->rf_kill, round_jiffies_relative(HZ));
} }
static void send_scan_event(void *data) static void ipw2100_scan_event(struct work_struct *work)
{ {
struct ipw2100_priv *priv = data; struct ipw2100_priv *priv = container_of(work, struct ipw2100_priv,
scan_event.work);
union iwreq_data wrqu; union iwreq_data wrqu;
wrqu.data.length = 0; wrqu.data.length = 0;
...@@ -2191,18 +2192,6 @@ static void send_scan_event(void *data) ...@@ -2191,18 +2192,6 @@ static void send_scan_event(void *data)
wireless_send_event(priv->net_dev, SIOCGIWSCAN, &wrqu, NULL); wireless_send_event(priv->net_dev, SIOCGIWSCAN, &wrqu, NULL);
} }
static void ipw2100_scan_event_later(struct work_struct *work)
{
send_scan_event(container_of(work, struct ipw2100_priv,
scan_event_later.work));
}
static void ipw2100_scan_event_now(struct work_struct *work)
{
send_scan_event(container_of(work, struct ipw2100_priv,
scan_event_now));
}
static void isr_scan_complete(struct ipw2100_priv *priv, u32 status) static void isr_scan_complete(struct ipw2100_priv *priv, u32 status)
{ {
IPW_DEBUG_SCAN("scan complete\n"); IPW_DEBUG_SCAN("scan complete\n");
...@@ -2212,13 +2201,11 @@ static void isr_scan_complete(struct ipw2100_priv *priv, u32 status) ...@@ -2212,13 +2201,11 @@ static void isr_scan_complete(struct ipw2100_priv *priv, u32 status)
/* Only userspace-requested scan completion events go out immediately */ /* Only userspace-requested scan completion events go out immediately */
if (!priv->user_requested_scan) { if (!priv->user_requested_scan) {
if (!delayed_work_pending(&priv->scan_event_later)) schedule_delayed_work(&priv->scan_event,
schedule_delayed_work(&priv->scan_event_later, round_jiffies_relative(msecs_to_jiffies(4000)));
round_jiffies_relative(msecs_to_jiffies(4000)));
} else { } else {
priv->user_requested_scan = 0; priv->user_requested_scan = 0;
cancel_delayed_work(&priv->scan_event_later); mod_delayed_work(system_wq, &priv->scan_event, 0);
schedule_work(&priv->scan_event_now);
} }
} }
...@@ -4459,8 +4446,7 @@ static void ipw2100_kill_works(struct ipw2100_priv *priv) ...@@ -4459,8 +4446,7 @@ static void ipw2100_kill_works(struct ipw2100_priv *priv)
cancel_delayed_work_sync(&priv->wx_event_work); cancel_delayed_work_sync(&priv->wx_event_work);
cancel_delayed_work_sync(&priv->hang_check); cancel_delayed_work_sync(&priv->hang_check);
cancel_delayed_work_sync(&priv->rf_kill); cancel_delayed_work_sync(&priv->rf_kill);
cancel_work_sync(&priv->scan_event_now); cancel_delayed_work_sync(&priv->scan_event);
cancel_delayed_work_sync(&priv->scan_event_later);
} }
static int ipw2100_tx_allocate(struct ipw2100_priv *priv) 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,8 +6181,7 @@ static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev,
INIT_DELAYED_WORK(&priv->wx_event_work, ipw2100_wx_event_work); INIT_DELAYED_WORK(&priv->wx_event_work, ipw2100_wx_event_work);
INIT_DELAYED_WORK(&priv->hang_check, ipw2100_hang_check); INIT_DELAYED_WORK(&priv->hang_check, ipw2100_hang_check);
INIT_DELAYED_WORK(&priv->rf_kill, ipw2100_rf_kill); INIT_DELAYED_WORK(&priv->rf_kill, ipw2100_rf_kill);
INIT_WORK(&priv->scan_event_now, ipw2100_scan_event_now); INIT_DELAYED_WORK(&priv->scan_event, ipw2100_scan_event);
INIT_DELAYED_WORK(&priv->scan_event_later, ipw2100_scan_event_later);
tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long)) tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long))
ipw2100_irq_tasklet, (unsigned long)priv); ipw2100_irq_tasklet, (unsigned long)priv);
......
...@@ -577,8 +577,7 @@ struct ipw2100_priv { ...@@ -577,8 +577,7 @@ struct ipw2100_priv {
struct delayed_work wx_event_work; struct delayed_work wx_event_work;
struct delayed_work hang_check; struct delayed_work hang_check;
struct delayed_work rf_kill; struct delayed_work rf_kill;
struct work_struct scan_event_now; struct delayed_work scan_event;
struct delayed_work scan_event_later;
int user_requested_scan; int user_requested_scan;
......
...@@ -4480,18 +4480,11 @@ static void handle_scan_event(struct ipw_priv *priv) ...@@ -4480,18 +4480,11 @@ static void handle_scan_event(struct ipw_priv *priv)
{ {
/* Only userspace-requested scan completion events go out immediately */ /* Only userspace-requested scan completion events go out immediately */
if (!priv->user_requested_scan) { if (!priv->user_requested_scan) {
if (!delayed_work_pending(&priv->scan_event)) schedule_delayed_work(&priv->scan_event,
schedule_delayed_work(&priv->scan_event, round_jiffies_relative(msecs_to_jiffies(4000)));
round_jiffies_relative(msecs_to_jiffies(4000)));
} else { } else {
union iwreq_data wrqu;
priv->user_requested_scan = 0; priv->user_requested_scan = 0;
cancel_delayed_work(&priv->scan_event); mod_delayed_work(system_wq, &priv->scan_event, 0);
wrqu.data.length = 0;
wrqu.data.flags = 0;
wireless_send_event(priv->net_dev, SIOCGIWSCAN, &wrqu, NULL);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment