]> git.itanic.dy.fi Git - linux-stable/commitdiff
iwlegacy: always monitor for stuck queues
authorStanislaw Gruszka <sgruszka@redhat.com>
Wed, 4 Jul 2012 11:20:20 +0000 (13:20 +0200)
committerBen Hutchings <ben@decadent.org.uk>
Wed, 25 Jul 2012 03:11:22 +0000 (04:11 +0100)
commit c2ca7d92ed4bbd779516beb6eb226e19f7f7ab0f upstream.

This is iwlegacy version of:

commit 342bbf3fee2fa9a18147e74b2e3c4229a4564912
Author: Johannes Berg <johannes.berg@intel.com>
Date:   Sun Mar 4 08:50:46 2012 -0800

    iwlwifi: always monitor for stuck queues

    If we only monitor while associated, the following
    can happen:
     - we're associated, and the queue stuck check
       runs, setting the queue "touch" time to X
     - we disassociate, stopping the monitoring,
       which leaves the time set to X
     - almost 2s later, we associate, and enqueue
       a frame
     - before the frame is transmitted, we monitor
       for stuck queues, and find the time set to
       X, although it is now later than X + 2000ms,
       so we decide that the queue is stuck and
       erroneously restart the device

Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
[bwh: Backported to 3.2: adjust filename, function and variable names]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
drivers/net/wireless/iwlegacy/iwl-core.c

index 2bd5659310d795270abc53a07f5637bb394254c9..1bb64c9a4e75c7a8c3a39225c782da59d3219e08 100644 (file)
@@ -1884,14 +1884,12 @@ void iwl_legacy_bg_watchdog(unsigned long data)
                return;
 
        /* monitor and check for other stuck queues */
-       if (iwl_legacy_is_any_associated(priv)) {
-               for (cnt = 0; cnt < priv->hw_params.max_txq_num; cnt++) {
-                       /* skip as we already checked the command queue */
-                       if (cnt == priv->cmd_queue)
-                               continue;
-                       if (iwl_legacy_check_stuck_queue(priv, cnt))
-                               return;
-               }
+       for (cnt = 0; cnt < priv->hw_params.max_txq_num; cnt++) {
+               /* skip as we already checked the command queue */
+               if (cnt == priv->cmd_queue)
+                       continue;
+               if (iwl_legacy_check_stuck_queue(priv, cnt))
+                       return;
        }
 
        mod_timer(&priv->watchdog, jiffies +