[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#664767: Brcmsmac driver woes, possible regression?



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 <jrnieder@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 to: