Camaleón wrote:

> Update: I've been running kernel 3.2.2-1 over 4 days (since last
> Saturday until today) and still haven't experienced any disconnection.

Interesting.  I wonder if the workaround in f96b08a7e6f6 (brcmsmac:
fix tx queue flush infinite loop, 2012-01-17) has too short a timeout
and is backfiring.

How about this patch, for 3.2.y kernels?  I suggest the following
steps for testing:

 0. prerequisites:

        apt-get install git build-essential

 1. get the kernel history, if you do not already have it:

        git clone \
          git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

 2. add point releases:

        cd linux
        git remote add stable \
          git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
        git fetch stable

 3. configure, build, test:

        git checkout stable/linux-3.2.y
        cp /boot/config-$(uname -r) .config; # current configuration
        scripts/config --disable DEBUG_INFO
        make localmodconfig; # optional: minimize configuration
        make deb-pkg; # optionally with -j<num> for parallel build
        dpkg -i ../<name of package>; # as root
        reboot
        ... test test test ...

    Hopefully it reproduces the disconnection.  So

 4. try the patch:

        cd linux
        git revert f96b08a7e6f6
        make deb-pkg; # maybe with -j4
        dpkg -i ../<name of package>; # as root
        reboot
        ... test test test ...
From: Jonathan Nieder <jrnie...@gmail.com>
Date: Tue, 19 Jun 2012 12:57:27 -0500
Subject: Revert "brcmsmac: fix tx queue flush infinite loop"

This reverts commit f96b08a7e6f69c0f0a576554df3df5b1b519c479.
Just testing something, nothing deeper to see here.
---
 drivers/net/wireless/brcm80211/brcmsmac/main.c | 10 +---------
 1 file changed, 1 insertion(+), 9 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c 
b/drivers/net/wireless/brcm80211/brcmsmac/main.c
index 833cbefcbfd2..364200cfb21c 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
@@ -8225,21 +8225,13 @@ int brcms_c_get_curband(struct brcms_c_info *wlc)
 
 void brcms_c_wait_for_tx_completion(struct brcms_c_info *wlc, bool drop)
 {
-       int timeout = 20;
-
        /* flush packet queue when requested */
        if (drop)
                brcmu_pktq_flush(&wlc->pkt_queue->q, false, NULL, NULL);
 
        /* wait for queue and DMA fifos to run dry */
-       while (!pktq_empty(&wlc->pkt_queue->q) || brcms_txpktpendtot(wlc) > 0) {
+       while (!pktq_empty(&wlc->pkt_queue->q) || brcms_txpktpendtot(wlc) > 0)
                brcms_msleep(wlc->wl, 1);
-
-               if (--timeout == 0)
-                       break;
-       }
-
-       WARN_ON_ONCE(timeout == 0);
 }
 
 void brcms_c_set_beacon_listen_interval(struct brcms_c_info *wlc, u8 interval)
-- 
1.7.11.rc3

Reply via email to