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