aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStanislaw Gruszka <sgruszka@redhat.com>2010-09-13 08:46:35 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-09-14 16:08:04 -0400
commitd745d472afcbc6354ebfee008123894a7f37e97e (patch)
tree9e7fc766ff7c4cafd9d50ff5e0f2e28fd3e4e60e
parentd5926d9d6a183d109060f68c0b96ea2b33c15377 (diff)
iwlwifi: cancel scan when down the device
Always cancel scan when stooping device and scan is currently pending, we should newer have scan running after down device. To assure we start scan cancel from restart work we have to schedule abort_scan to different workqueue than priv->workqueue. Patch fix not cancel scanning when restarting firmware, what is one of the causes of wdev_cleanup_work warning (together with permanent network connection lost) 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>
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.c14
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-scan.c2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl3945-base.c16
3 files changed, 8 insertions, 24 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index 36df9a7fcbcb..d2315debd1b8 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -2892,8 +2892,9 @@ static void __iwl_down(struct iwl_priv *priv)
2892 2892
2893 IWL_DEBUG_INFO(priv, DRV_NAME " is going down\n"); 2893 IWL_DEBUG_INFO(priv, DRV_NAME " is going down\n");
2894 2894
2895 if (!exit_pending) 2895 iwl_scan_cancel_timeout(priv, 200);
2896 set_bit(STATUS_EXIT_PENDING, &priv->status); 2896
2897 exit_pending = test_and_set_bit(STATUS_EXIT_PENDING, &priv->status);
2897 2898
2898 /* Stop TX queues watchdog. We need to have STATUS_EXIT_PENDING bit set 2899 /* Stop TX queues watchdog. We need to have STATUS_EXIT_PENDING bit set
2899 * to prevent rearm timer */ 2900 * to prevent rearm timer */
@@ -3503,15 +3504,6 @@ static void iwl_mac_stop(struct ieee80211_hw *hw)
3503 3504
3504 priv->is_open = 0; 3505 priv->is_open = 0;
3505 3506
3506 if (iwl_is_ready_rf(priv) || test_bit(STATUS_SCAN_HW, &priv->status)) {
3507 /* stop mac, cancel any scan request and clear
3508 * RXON_FILTER_ASSOC_MSK BIT
3509 */
3510 mutex_lock(&priv->mutex);
3511 iwl_scan_cancel_timeout(priv, 100);
3512 mutex_unlock(&priv->mutex);
3513 }
3514
3515 iwl_down(priv); 3507 iwl_down(priv);
3516 3508
3517 flush_workqueue(priv->workqueue); 3509 flush_workqueue(priv->workqueue);
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c
index 22bdc986c03e..ea338498ee1c 100644
--- a/drivers/net/wireless/iwlwifi/iwl-scan.c
+++ b/drivers/net/wireless/iwlwifi/iwl-scan.c
@@ -71,7 +71,7 @@ int iwl_scan_cancel(struct iwl_priv *priv)
71 if (test_bit(STATUS_SCANNING, &priv->status)) { 71 if (test_bit(STATUS_SCANNING, &priv->status)) {
72 if (!test_and_set_bit(STATUS_SCAN_ABORTING, &priv->status)) { 72 if (!test_and_set_bit(STATUS_SCAN_ABORTING, &priv->status)) {
73 IWL_DEBUG_SCAN(priv, "Queuing scan abort.\n"); 73 IWL_DEBUG_SCAN(priv, "Queuing scan abort.\n");
74 queue_work(priv->workqueue, &priv->abort_scan); 74 schedule_work(&priv->abort_scan);
75 75
76 } else 76 } else
77 IWL_DEBUG_SCAN(priv, "Scan abort already in progress.\n"); 77 IWL_DEBUG_SCAN(priv, "Scan abort already in progress.\n");
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
index fc553bacef17..6cc5ba2a2e39 100644
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
@@ -2567,12 +2567,13 @@ static void iwl3945_cancel_deferred_work(struct iwl_priv *priv);
2567static void __iwl3945_down(struct iwl_priv *priv) 2567static void __iwl3945_down(struct iwl_priv *priv)
2568{ 2568{
2569 unsigned long flags; 2569 unsigned long flags;
2570 int exit_pending = test_bit(STATUS_EXIT_PENDING, &priv->status); 2570 int exit_pending;
2571 2571
2572 IWL_DEBUG_INFO(priv, DRV_NAME " is going down\n"); 2572 IWL_DEBUG_INFO(priv, DRV_NAME " is going down\n");
2573 2573
2574 if (!exit_pending) 2574 iwl_scan_cancel_timeout(priv, 200);
2575 set_bit(STATUS_EXIT_PENDING, &priv->status); 2575
2576 exit_pending = test_and_set_bit(STATUS_EXIT_PENDING, &priv->status);
2576 2577
2577 /* Stop TX queues watchdog. We need to have STATUS_EXIT_PENDING bit set 2578 /* Stop TX queues watchdog. We need to have STATUS_EXIT_PENDING bit set
2578 * to prevent rearm timer */ 2579 * to prevent rearm timer */
@@ -3172,15 +3173,6 @@ static void iwl3945_mac_stop(struct ieee80211_hw *hw)
3172 3173
3173 priv->is_open = 0; 3174 priv->is_open = 0;
3174 3175
3175 if (iwl_is_ready_rf(priv)) {
3176 /* stop mac, cancel any scan request and clear
3177 * RXON_FILTER_ASSOC_MSK BIT
3178 */
3179 mutex_lock(&priv->mutex);
3180 iwl_scan_cancel_timeout(priv, 100);
3181 mutex_unlock(&priv->mutex);
3182 }
3183
3184 iwl3945_down(priv); 3176 iwl3945_down(priv);
3185 3177
3186 flush_workqueue(priv->workqueue); 3178 flush_workqueue(priv->workqueue);