summaryrefslogtreecommitdiff
path: root/drivers/net/wireless/iwlwifi/iwl-scan.c
diff options
context:
space:
mode:
authorStanislaw Gruszka <sgruszka@redhat.com>2010-09-13 14:46:39 +0200
committerJohn W. Linville <linville@tuxdriver.com>2010-09-14 16:13:26 -0400
commitf5354c17dc29681c241f2774f3ef9478fb586673 (patch)
tree7960a2d0b24396b890c0a5d2412675c6513680de /drivers/net/wireless/iwlwifi/iwl-scan.c
parent02d8c14b590f583fd6e8c16fe779f845845effd9 (diff)
iwlwifi: force scan complete after timeout
If we do not get notification from hardware about scan complete, after timeout do mac80211 scan completion anyway. This assure we end scan in case of firmware hung. Patch fix one of the causes of wdev_cleanup_work warning reported at https://bugzilla.redhat.com/show_bug.cgi?id=593566 Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> Acked-by: Wey-Yi W Guy <wey-yi.w.guy@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-scan.c')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-scan.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c
index e65a98d5d07f..ce605e0aadfe 100644
--- a/drivers/net/wireless/iwlwifi/iwl-scan.c
+++ b/drivers/net/wireless/iwlwifi/iwl-scan.c
@@ -106,6 +106,15 @@ static void iwl_complete_scan(struct iwl_priv *priv, bool aborted)
priv->scan_request = NULL;
}
+static void iwl_force_scan_end(struct iwl_priv *priv)
+{
+ IWL_DEBUG_SCAN(priv, "Forcing scan end\n");
+ clear_bit(STATUS_SCANNING, &priv->status);
+ clear_bit(STATUS_SCAN_HW, &priv->status);
+ clear_bit(STATUS_SCAN_ABORTING, &priv->status);
+ iwl_complete_scan(priv, true);
+}
+
static void iwl_do_scan_abort(struct iwl_priv *priv)
{
int ret;
@@ -125,10 +134,7 @@ static void iwl_do_scan_abort(struct iwl_priv *priv)
ret = iwl_send_scan_abort(priv);
if (ret) {
IWL_DEBUG_SCAN(priv, "Send scan abort failed %d\n", ret);
- clear_bit(STATUS_SCANNING, &priv->status);
- clear_bit(STATUS_SCAN_HW, &priv->status);
- clear_bit(STATUS_SCAN_ABORTING, &priv->status);
- iwl_complete_scan(priv, true);
+ iwl_force_scan_end(priv);
} else
IWL_DEBUG_SCAN(priv, "Sucessfully send scan abort\n");
}
@@ -151,6 +157,7 @@ EXPORT_SYMBOL(iwl_scan_cancel);
*/
int iwl_scan_cancel_timeout(struct iwl_priv *priv, unsigned long ms)
{
+ int ret;
unsigned long timeout = jiffies + msecs_to_jiffies(ms);
lockdep_assert_held(&priv->mutex);
@@ -165,7 +172,10 @@ int iwl_scan_cancel_timeout(struct iwl_priv *priv, unsigned long ms)
msleep(20);
}
- return test_bit(STATUS_SCAN_HW, &priv->status);
+ ret = test_bit(STATUS_SCAN_HW, &priv->status);
+ if (ret)
+ iwl_force_scan_end(priv);
+ return ret;
}
EXPORT_SYMBOL(iwl_scan_cancel_timeout);