From 54088f2940d5e768919f4cbb6c1791a679577c9e Mon Sep 17 00:00:00 2001 From: Stanislaw Gruszka Date: Mon, 13 Sep 2010 14:46:39 +0200 Subject: [PATCH] --- yaml --- r: 214655 b: refs/heads/master c: f5354c17dc29681c241f2774f3ef9478fb586673 h: refs/heads/master i: 214653: 68bbf9bb51366f7923e194b65284df336804d134 214651: ed7a7ea08f8417eb54a12f3658aaaff10be7454f 214647: d92a82d9002367e3c68592fea7be09188c8a469e 214639: 4752c88f7539ff6301b8a599965b0a41a83942bc 214623: 4bee609afb23f5b5dec89ce4b49ed16c1b8119de 214591: 062c0460869e5f70973439febc15ba7d0554bfc4 214527: 28ce22c8619e065e2e1eaf3035bfb9fea95a688d v: v3 --- [refs] | 2 +- trunk/drivers/net/wireless/iwlwifi/iwl-core.c | 15 +++----------- trunk/drivers/net/wireless/iwlwifi/iwl-scan.c | 20 ++++++++++++++----- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/[refs] b/[refs] index c21ee7383b37..c3f68865aeaa 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 02d8c14b590f583fd6e8c16fe779f845845effd9 +refs/heads/master: f5354c17dc29681c241f2774f3ef9478fb586673 diff --git a/trunk/drivers/net/wireless/iwlwifi/iwl-core.c b/trunk/drivers/net/wireless/iwlwifi/iwl-core.c index c9c523b2883f..b04a4f81ee97 100644 --- a/trunk/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/trunk/drivers/net/wireless/iwlwifi/iwl-core.c @@ -2081,7 +2081,6 @@ void iwl_mac_remove_interface(struct ieee80211_hw *hw, { struct iwl_priv *priv = hw->priv; struct iwl_rxon_context *ctx = iwl_rxon_ctx_from_vif(vif); - bool scan_completed = false; IWL_DEBUG_MAC80211(priv, "enter\n"); @@ -2090,18 +2089,13 @@ void iwl_mac_remove_interface(struct ieee80211_hw *hw, WARN_ON(ctx->vif != vif); ctx->vif = NULL; - iwl_scan_cancel_timeout(priv, 100); + if (priv->scan_vif == vif) + iwl_scan_cancel_timeout(priv, 100); iwl_set_mode(priv, vif); if (!ctx->always_active) ctx->is_active = false; - if (priv->scan_vif == vif) { - scan_completed = true; - priv->scan_vif = NULL; - priv->scan_request = NULL; - } - /* * When removing the IBSS interface, overwrite the * BT traffic load with the stored one from the last @@ -2115,9 +2109,6 @@ void iwl_mac_remove_interface(struct ieee80211_hw *hw, memset(priv->bssid, 0, ETH_ALEN); mutex_unlock(&priv->mutex); - if (scan_completed) - ieee80211_scan_completed(priv->hw, true); - IWL_DEBUG_MAC80211(priv, "leave\n"); } @@ -2298,6 +2289,7 @@ void iwl_mac_reset_tsf(struct ieee80211_hw *hw) spin_unlock_irqrestore(&priv->lock, flags); + iwl_scan_cancel_timeout(priv, 100); if (!iwl_is_ready_rf(priv)) { IWL_DEBUG_MAC80211(priv, "leave - not ready\n"); mutex_unlock(&priv->mutex); @@ -2307,7 +2299,6 @@ void iwl_mac_reset_tsf(struct ieee80211_hw *hw) /* we are restarting association process * clear RXON_FILTER_ASSOC_MSK bit */ - iwl_scan_cancel_timeout(priv, 100); ctx->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK; iwlcore_commit_rxon(priv, ctx); diff --git a/trunk/drivers/net/wireless/iwlwifi/iwl-scan.c b/trunk/drivers/net/wireless/iwlwifi/iwl-scan.c index e65a98d5d07f..ce605e0aadfe 100644 --- a/trunk/drivers/net/wireless/iwlwifi/iwl-scan.c +++ b/trunk/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);