aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ipw2x00/ipw2200.c
diff options
context:
space:
mode:
authorZhu Yi <yi.zhu@intel.com>2010-03-29 21:36:16 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-03-31 14:46:40 -0400
commite65054b64ff6b89380a7f546c9eebf862e679646 (patch)
tree9fa1800b9a2bc589b560f081979d599b52b08eac /drivers/net/wireless/ipw2x00/ipw2200.c
parent9f01a84e81d10e38daa504348217895fe414a24b (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/net/wireless/ipw2x00/ipw2200.c')
-rw-r--r--drivers/net/wireless/ipw2x00/ipw2200.c13
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) 2351static void ipw_abort_scan(struct ipw_priv *priv);
2352
2353#define IPW_SCAN_CHECK_WATCHDOG (5 * HZ)
2352 2354
2353static void ipw_scan_check(void *data) 2355static 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