Skip to contentSkip to conversation

b43: Fix for broken transmission

PATCH In review Michael Buesch 4 participants 6 messages Dec 11, 2007 – Dec 12, 2007 Networking drivers (wireless)

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 b43: Fix for broken transmission

This patch fixes the transmission problems introduced by commit f04b3787bbce4567e28069a9ec97dcd804626ac7

It depends on
[PATCH] b43: Fix ofdmtab write regression

I'm not sure if the dummy read is really required.
The old code does it. I think it can't hurt and can possibly fix some write posting problems (hardware bugs or whatever. Who knows).

Please test this.

drivers/net/wireless/b43/wa.c +13 -6
Index: wireless-2.6/drivers/net/wireless/b43/wa.c
===================================================================
@@ -123,10 +123,16 @@ static void b43_wa_rssi_lt(struct b43_wl
 {
 	int i;
 
+#if 0
 	for (i = 0; i < 8; i++)
 		b43_ofdmtab_write16(dev, B43_OFDMTAB_RSSI, i, i + 8);
 	for (i = 8; i < 16; i++)
 		b43_ofdmtab_write16(dev, B43_OFDMTAB_RSSI, i, i - 8);
+#endif
+	/* FIXME: Current specs are wrong. The following loop matches the
+	 * old specs, which works great on my device. --mb */
+	for (i = 0; i < 64; i++)
+		b43_ofdmtab_write16(dev, B43_OFDMTAB_RSSI, i, i);
 }
 
 static void b43_wa_analog(struct b43_wldev *dev)
@@ -306,16 +312,16 @@ static void b43_wa_crs_ed(struct b43_wld
 	struct b43_phy *phy = &dev->phy;
 
 	if (phy->rev == 1) {
-		b43_phy_write(dev, B43_PHY_CRSTHRES1, 0x4F19);
+		b43_phy_write(dev, B43_PHY_CRSTHRES1_R1, 0x4F19);
 	} else if (phy->rev == 2) {
-		b43_phy_write(dev, B43_PHY_CRSTHRES1_R1, 0x1861);
-		b43_phy_write(dev, B43_PHY_CRSTHRES2_R1, 0x1861);
+		b43_phy_write(dev, B43_PHY_CRSTHRES1, 0x1861);
+		b43_phy_write(dev, B43_PHY_CRSTHRES2, 0x0271);
 		b43_phy_write(dev, B43_PHY_ANTDWELL,
 				  b43_phy_read(dev, B43_PHY_ANTDWELL)
 				  | 0x0800);
 	} else {
-		b43_phy_write(dev, B43_PHY_CRSTHRES1_R1, 0x0098);
-		b43_phy_write(dev, B43_PHY_CRSTHRES2_R1, 0x0070);
+		b43_phy_write(dev, B43_PHY_CRSTHRES1, 0x0098);
+		b43_phy_write(dev, B43_PHY_CRSTHRES2, 0x0070);
 		b43_phy_write(dev, B43_PHY_OFDM(0xC9), 0x0080);
 		b43_phy_write(dev, B43_PHY_ANTDWELL,
 				  b43_phy_read(dev, B43_PHY_ANTDWELL)
@@ -441,7 +447,7 @@ static void b43_wa_altagc(struct b43_wld
 		}
 	}
 	b43_phy_write(dev, B43_PHY_DIVSRCHIDX,
-		(b43_phy_read(dev, B43_PHY_DIVSRCHIDX) & 0x7F7F) | 0x7874);
+		(b43_phy_read(dev, B43_PHY_DIVSRCHIDX) & 0x8080) | 0x7874);
 	b43_phy_write(dev, B43_PHY_OFDM(0x8E), 0x1C00);
 	if (phy->rev == 1) {
 		b43_phy_write(dev, B43_PHY_DIVP1P2GAIN,
@@ -466,6 +472,7 @@ static void b43_wa_altagc(struct b43_wld
 		b43_phy_write(dev, B43_PHY_OFDM(0x26),
 			b43_phy_read(dev, B43_PHY_OFDM(0x26)) & ~0x1000);
 	}
+	b43_phy_read(dev, B43_PHY_VERSION_OFDM); /* Dummy read */
 }
 
 static void b43_wa_tr_ltov(struct b43_wldev *dev) /* TR Lookup Table Original Values */
drivers/net/wireless/b43/phy.h +3 -3
Index: wireless-2.6/drivers/net/wireless/b43/phy.h
===================================================================
@@ -25,7 +25,7 @@ struct b43_phy;
 #define  B43_PHY_BBANDCFG_RXANT		0x180	/* RX Antenna selection */
 #define  B43_PHY_BBANDCFG_RXANT_SHIFT	7
 #define B43_PHY_PWRDOWN			B43_PHY_OFDM(0x03)	/* Powerdown */
-#define B43_PHY_CRSTHRES1		B43_PHY_OFDM(0x06)	/* CRS Threshold 1 */
+#define B43_PHY_CRSTHRES1_R1		B43_PHY_OFDM(0x06)	/* CRS Threshold 1 (phy.rev 1 only) */
 #define B43_PHY_LNAHPFCTL		B43_PHY_OFDM(0x1C)	/* LNA/HPF control */
 #define B43_PHY_LPFGAINCTL		B43_PHY_OFDM(0x20)	/* LPF Gain control */
 #define B43_PHY_ADIVRELATED		B43_PHY_OFDM(0x27)	/* FIXME rename */
@@ -69,8 +69,8 @@ struct b43_phy;
 #define B43_PHY_DIVP1P2GAIN		B43_PHY_OFDM(0xAB)
 #define B43_PHY_DIVSRCHGAINBACK		B43_PHY_OFDM(0xAD)	/* Divider search gain back */
 #define B43_PHY_DIVSRCHGAINCHNG		B43_PHY_OFDM(0xAE)	/* Divider search gain change */
-#define B43_PHY_CRSTHRES1_R1		B43_PHY_OFDM(0xC0)	/* CRS Threshold 1 (rev 1 only) */
-#define B43_PHY_CRSTHRES2_R1		B43_PHY_OFDM(0xC1)	/* CRS Threshold 2 (rev 1 only) */
+#define B43_PHY_CRSTHRES1		B43_PHY_OFDM(0xC0)	/* CRS Threshold 1 (phy.rev >= 2 only) */
+#define B43_PHY_CRSTHRES2		B43_PHY_OFDM(0xC1)	/* CRS Threshold 2 (phy.rev >= 2 only) */
 #define B43_PHY_TSSIP_LTBASE		B43_PHY_OFDM(0x380)	/* TSSI power lookup table base */
 #define B43_PHY_DC_LTBASE		B43_PHY_OFDM(0x3A0)	/* DC lookup table base */
 #define B43_PHY_GAIN_LTBASE		B43_PHY_OFDM(0x3C0)	/* Gain lookup table base */
drivers/net/wireless/b43/tables.c +1 -1
Index: wireless-2.6/drivers/net/wireless/b43/tables.c
===================================================================
@@ -403,7 +403,7 @@ void b43_ofdmtab_write16(struct b43_wlde
 
 	addr = table + offset;
 	if ((phy->ofdmtab_addr_direction != B43_OFDMTAB_DIRECTION_WRITE) ||
-	    (addr -1 != phy->ofdmtab_addr)) {
+	    (addr - 1 != phy->ofdmtab_addr)) {
 		/* The hardware has a different address in memory. Update it. */
 		b43_phy_write(dev, B43_PHY_OTABLECTL, addr);
 		phy->ofdmtab_addr_direction = B43_OFDMTAB_DIRECTION_WRITE;
Signature · 1 line
Greetings Michael.
#1 lore raw
Quoted 6 lines · On Tuesday 11 December 2007 13:43:50 Michael Buesch wrote:

This patch fixes the transmission problems introduced by commit f04b3787bbce4567e28069a9ec97dcd804626ac7

It depends on
[PATCH] b43: Fix ofdmtab write regression

Quoted 7 lines

I'm not sure if the dummy read is really required.
The old code does it. I think it can't hurt and can possibly fix some write posting problems (hardware bugs or whatever. Who knows).

Please test this.

Here's an updated version that should fix even more bugs:
http://bu3sch.de/patches/wireless-2.6/20071211-1622/patches/005-b43-fix-init-rewrite-breakage.patch

Signature · 1 line
Greetings Michael.
#2 lore raw
Quoted 11 lines · Michael Buesch
Quoted 10 lines · On Tuesday 11 December 2007 13:43:50 Michael Buesch wrote:

This patch fixes the transmission problems introduced by commit f04b3787bbce4567e28069a9ec97dcd804626ac7

It depends on
[PATCH] b43: Fix ofdmtab write regression

I'm not sure if the dummy read is really required.
The old code does it. I think it can't hurt and can possibly fix some write posting problems (hardware bugs or whatever. Who knows).

Quoted 6 lines
Quoted 3 lines

Please test this.

Here's an updated version that should fix even more bugs:
http://bu3sch.de/patches/wireless-2.6/20071211-1622/patches/005-b43-fix-init-rewrite-breakage.patch

This patch (and its predecessor) seem to make transmission at the OFDM rates a bit more reliable on my BCM4311/2 card.

Larry

#3 lore raw

Quoting Larry Finger <[email protected]>:

Quoted 3 lines
Quoted 2 lines · Michael Buesch

Here's an updated version that should fix even more bugs:
http://bu3sch.de/patches/wireless-2.6/20071211-1622/patches/005-b43-fix-init-rewrite-breakage.patch

I had to omit the last part (for tables.c) - it's unrelated, cosmetic and doesn't apply to wireless-2.6/everything.

Quoted 2 lines

This patch (and its predecessor) seem to make transmission at the OFDM rates a bit more reliable on my BCM4311/2 card.

It's working fine on BCM4318 on PowerPC. I haven't done any specific comparisons, but it used to disconnect a lot (at least one an hour) with a small antenna, so I installed a bigger antenna, but then gave up and switched to using another wireless device (rtl8185).

Right now, it's been working for over 2 hours with a small antenna (although it's a different antenna borrowed from rtl8185) and no disconnects. Scanning finds 5 APs, which is the most I have seen here.

Signature · 2 lines
Regards,
Pavel Roskin
#4 lore raw
Quoted 8 lines · On Wednesday 12 December 2007 09:21:26 Pavel Roskin wrote:

Quoting Larry Finger <[email protected]>:

Quoted 3 lines
Quoted 2 lines · Michael Buesch

Here's an updated version that should fix even more bugs:
http://bu3sch.de/patches/wireless-2.6/20071211-1622/patches/005-b43-fix-init-rewrite-breakage.patch

I had to omit the last part (for tables.c) - it's unrelated, cosmetic and doesn't apply to wireless-2.6/everything.

This patch depends on
[PATCH] b43: Fix ofdmtab write regression
And that is not just cosmetic.

Quoted 4 lines
Quoted 3 lines

This patch (and its predecessor) seem to make transmission at the OFDM rates a bit more reliable on
my BCM4311/2 card.

Quoted 8 lines

It's working fine on BCM4318 on PowerPC. I haven't done any specific comparisons, but it used to disconnect a lot (at least one an hour) with a small antenna, so I installed a bigger antenna, but then gave up and switched to using another wireless device (rtl8185).

Right now, it's been working for over 2 hours with a small antenna (although it's a different antenna borrowed from rtl8185) and no disconnects. Scanning finds 5 APs, which is the most I have seen here.

Cool, thanks.

Signature · 1 line
Greetings Michael.
#5 lore raw
In reply to Michael Buesch

Citando Michael Buesch <[email protected]>:

Quoted 11 lines · On Tuesday 11 December 2007 13:43:50 Michael Buesch wrote:
Quoted 10 lines

This patch fixes the transmission problems introduced by commit f04b3787bbce4567e28069a9ec97dcd804626ac7

It depends on
[PATCH] b43: Fix ofdmtab write regression

I'm not sure if the dummy read is really required.
The old code does it. I think it can't hurt and can possibly fix some write posting problems (hardware bugs or whatever. Who knows).

Quoted 6 lines
Quoted 3 lines

Please test this.

Here's an updated version that should fix even more bugs:
http://bu3sch.de/patches/wireless-2.6/20071211-1622/patches/005-b43-fix-init-rewrite-breakage.patch

It completely fixes my 4309. Thank you for fixing my obnoxious regression. John, I think that this should go into the tree as soon as possible (well, as soon as Michael sign it off).

--
Ciao
Stefano