diff options
author | Zhu Yi <yi.zhu@intel.com> | 2010-03-29 21:36:16 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-03-31 14:46:40 -0400 |
commit | e65054b64ff6b89380a7f546c9eebf862e679646 (patch) | |
tree | 9fa1800b9a2bc589b560f081979d599b52b08eac /drivers | |
parent | 9f01a84e81d10e38daa504348217895fe414a24b (diff) |
ipw2200: restart adapter only when abort_scan doesn't work
When a scan watchdog is fired, try to send abort scan command
first before restarting the adapter. This avoids reconnection for
some users when scan hang is detected.
This fixed bug https://bugzilla.kernel.org/show_bug.cgi?id=15419
Reported-by: Maurizio Avogadro <mavoga@gmail.com>
Tested-by: Maurizio Avogadro <mavoga@gmail.com>
Signed-off-by: Zhu Yi <yi.zhu@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/wireless/ipw2x00/ipw2200.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/net/wireless/ipw2x00/ipw2200.c b/drivers/net/wireless/ipw2x00/ipw2200.c index fcdbe8b00551..7fa2a3e6ebb0 100644 --- a/drivers/net/wireless/ipw2x00/ipw2200.c +++ b/drivers/net/wireless/ipw2x00/ipw2200.c | |||
@@ -2348,16 +2348,25 @@ static void ipw_bg_adapter_restart(struct work_struct *work) | |||
2348 | mutex_unlock(&priv->mutex); | 2348 | mutex_unlock(&priv->mutex); |
2349 | } | 2349 | } |
2350 | 2350 | ||
2351 | #define IPW_SCAN_CHECK_WATCHDOG (5 * HZ) | 2351 | static void ipw_abort_scan(struct ipw_priv *priv); |
2352 | |||
2353 | #define IPW_SCAN_CHECK_WATCHDOG (5 * HZ) | ||
2352 | 2354 | ||
2353 | static void ipw_scan_check(void *data) | 2355 | static void ipw_scan_check(void *data) |
2354 | { | 2356 | { |
2355 | struct ipw_priv *priv = data; | 2357 | struct ipw_priv *priv = data; |
2356 | if (priv->status & (STATUS_SCANNING | STATUS_SCAN_ABORTING)) { | 2358 | |
2359 | if (priv->status & STATUS_SCAN_ABORTING) { | ||
2357 | IPW_DEBUG_SCAN("Scan completion watchdog resetting " | 2360 | IPW_DEBUG_SCAN("Scan completion watchdog resetting " |
2358 | "adapter after (%dms).\n", | 2361 | "adapter after (%dms).\n", |
2359 | jiffies_to_msecs(IPW_SCAN_CHECK_WATCHDOG)); | 2362 | jiffies_to_msecs(IPW_SCAN_CHECK_WATCHDOG)); |
2360 | queue_work(priv->workqueue, &priv->adapter_restart); | 2363 | queue_work(priv->workqueue, &priv->adapter_restart); |
2364 | } else if (priv->status & STATUS_SCANNING) { | ||
2365 | IPW_DEBUG_SCAN("Scan completion watchdog aborting scan " | ||
2366 | "after (%dms).\n", | ||
2367 | jiffies_to_msecs(IPW_SCAN_CHECK_WATCHDOG)); | ||
2368 | ipw_abort_scan(priv); | ||
2369 | queue_delayed_work(priv->workqueue, &priv->scan_check, HZ); | ||
2361 | } | 2370 | } |
2362 | } | 2371 | } |
2363 | 2372 | ||