aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Buesch <mb@bu3sch.de>2007-12-12 16:05:18 -0500
committerDavid S. Miller <davem@davemloft.net>2008-01-28 18:05:59 -0500
commit38d1b4ce901506729f6c7f9a14f02f4327c577cc (patch)
treec7b55f18baea728ebad228b2ec5d5eeaeedb36b2
parent8ed7fc48eb31e583bb31c2bcfdd3a9c557bad5d0 (diff)
b43: Fix for broken transmission
This patch fixes the transmission problems introduced by commit f04b3787bbce4567e28069a9ec97dcd804626ac7 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). Signed-off-by: Michael Buesch <mb@bu3sch.de> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/b43/phy.h6
-rw-r--r--drivers/net/wireless/b43/tables.c2
-rw-r--r--drivers/net/wireless/b43/wa.c30
3 files changed, 23 insertions, 15 deletions
diff --git a/drivers/net/wireless/b43/phy.h b/drivers/net/wireless/b43/phy.h
index 1c7eac25a302..3525f5652460 100644
--- a/drivers/net/wireless/b43/phy.h
+++ b/drivers/net/wireless/b43/phy.h
@@ -25,7 +25,7 @@ struct b43_phy;
25#define B43_PHY_BBANDCFG_RXANT 0x180 /* RX Antenna selection */ 25#define B43_PHY_BBANDCFG_RXANT 0x180 /* RX Antenna selection */
26#define B43_PHY_BBANDCFG_RXANT_SHIFT 7 26#define B43_PHY_BBANDCFG_RXANT_SHIFT 7
27#define B43_PHY_PWRDOWN B43_PHY_OFDM(0x03) /* Powerdown */ 27#define B43_PHY_PWRDOWN B43_PHY_OFDM(0x03) /* Powerdown */
28#define B43_PHY_CRSTHRES1 B43_PHY_OFDM(0x06) /* CRS Threshold 1 */ 28#define B43_PHY_CRSTHRES1_R1 B43_PHY_OFDM(0x06) /* CRS Threshold 1 (phy.rev 1 only) */
29#define B43_PHY_LNAHPFCTL B43_PHY_OFDM(0x1C) /* LNA/HPF control */ 29#define B43_PHY_LNAHPFCTL B43_PHY_OFDM(0x1C) /* LNA/HPF control */
30#define B43_PHY_LPFGAINCTL B43_PHY_OFDM(0x20) /* LPF Gain control */ 30#define B43_PHY_LPFGAINCTL B43_PHY_OFDM(0x20) /* LPF Gain control */
31#define B43_PHY_ADIVRELATED B43_PHY_OFDM(0x27) /* FIXME rename */ 31#define B43_PHY_ADIVRELATED B43_PHY_OFDM(0x27) /* FIXME rename */
@@ -69,8 +69,8 @@ struct b43_phy;
69#define B43_PHY_DIVP1P2GAIN B43_PHY_OFDM(0xAB) 69#define B43_PHY_DIVP1P2GAIN B43_PHY_OFDM(0xAB)
70#define B43_PHY_DIVSRCHGAINBACK B43_PHY_OFDM(0xAD) /* Divider search gain back */ 70#define B43_PHY_DIVSRCHGAINBACK B43_PHY_OFDM(0xAD) /* Divider search gain back */
71#define B43_PHY_DIVSRCHGAINCHNG B43_PHY_OFDM(0xAE) /* Divider search gain change */ 71#define B43_PHY_DIVSRCHGAINCHNG B43_PHY_OFDM(0xAE) /* Divider search gain change */
72#define B43_PHY_CRSTHRES1_R1 B43_PHY_OFDM(0xC0) /* CRS Threshold 1 (rev 1 only) */ 72#define B43_PHY_CRSTHRES1 B43_PHY_OFDM(0xC0) /* CRS Threshold 1 (phy.rev >= 2 only) */
73#define B43_PHY_CRSTHRES2_R1 B43_PHY_OFDM(0xC1) /* CRS Threshold 2 (rev 1 only) */ 73#define B43_PHY_CRSTHRES2 B43_PHY_OFDM(0xC1) /* CRS Threshold 2 (phy.rev >= 2 only) */
74#define B43_PHY_TSSIP_LTBASE B43_PHY_OFDM(0x380) /* TSSI power lookup table base */ 74#define B43_PHY_TSSIP_LTBASE B43_PHY_OFDM(0x380) /* TSSI power lookup table base */
75#define B43_PHY_DC_LTBASE B43_PHY_OFDM(0x3A0) /* DC lookup table base */ 75#define B43_PHY_DC_LTBASE B43_PHY_OFDM(0x3A0) /* DC lookup table base */
76#define B43_PHY_GAIN_LTBASE B43_PHY_OFDM(0x3C0) /* Gain lookup table base */ 76#define B43_PHY_GAIN_LTBASE B43_PHY_OFDM(0x3C0) /* Gain lookup table base */
diff --git a/drivers/net/wireless/b43/tables.c b/drivers/net/wireless/b43/tables.c
index fd5595ba5e8b..3f5ea06bf13c 100644
--- a/drivers/net/wireless/b43/tables.c
+++ b/drivers/net/wireless/b43/tables.c
@@ -403,7 +403,7 @@ void b43_ofdmtab_write16(struct b43_wldev *dev, u16 table,
403 403
404 addr = table + offset; 404 addr = table + offset;
405 if ((phy->ofdmtab_addr_direction != B43_OFDMTAB_DIRECTION_WRITE) || 405 if ((phy->ofdmtab_addr_direction != B43_OFDMTAB_DIRECTION_WRITE) ||
406 (addr -1 != phy->ofdmtab_addr)) { 406 (addr - 1 != phy->ofdmtab_addr)) {
407 /* The hardware has a different address in memory. Update it. */ 407 /* The hardware has a different address in memory. Update it. */
408 b43_phy_write(dev, B43_PHY_OTABLECTL, addr); 408 b43_phy_write(dev, B43_PHY_OTABLECTL, addr);
409 phy->ofdmtab_addr_direction = B43_OFDMTAB_DIRECTION_WRITE; 409 phy->ofdmtab_addr_direction = B43_OFDMTAB_DIRECTION_WRITE;
diff --git a/drivers/net/wireless/b43/wa.c b/drivers/net/wireless/b43/wa.c
index 0ba7f948bee2..e632125cb772 100644
--- a/drivers/net/wireless/b43/wa.c
+++ b/drivers/net/wireless/b43/wa.c
@@ -123,17 +123,24 @@ static void b43_wa_rssi_lt(struct b43_wldev *dev) /* RSSI lookup table */
123{ 123{
124 int i; 124 int i;
125 125
126 for (i = 0; i < 8; i++) 126 if (0 /* FIXME: For APHY.rev=2 this might be needed */) {
127 b43_ofdmtab_write16(dev, B43_OFDMTAB_RSSI, i, i + 8); 127 for (i = 0; i < 8; i++)
128 for (i = 8; i < 16; i++) 128 b43_ofdmtab_write16(dev, B43_OFDMTAB_RSSI, i, i + 8);
129 b43_ofdmtab_write16(dev, B43_OFDMTAB_RSSI, i, i - 8); 129 for (i = 8; i < 16; i++)
130 b43_ofdmtab_write16(dev, B43_OFDMTAB_RSSI, i, i - 8);
131 } else {
132 for (i = 0; i < 64; i++)
133 b43_ofdmtab_write16(dev, B43_OFDMTAB_RSSI, i, i);
134 }
130} 135}
131 136
132static void b43_wa_analog(struct b43_wldev *dev) 137static void b43_wa_analog(struct b43_wldev *dev)
133{ 138{
134 struct b43_phy *phy = &dev->phy; 139 struct b43_phy *phy = &dev->phy;
140 u16 ofdmrev;
135 141
136 if (phy->analog > 2) { 142 ofdmrev = b43_phy_read(dev, B43_PHY_VERSION_OFDM) & B43_PHYVER_VERSION;
143 if (ofdmrev > 2) {
137 if (phy->type == B43_PHYTYPE_A) 144 if (phy->type == B43_PHYTYPE_A)
138 b43_phy_write(dev, B43_PHY_PWRDOWN, 0x1808); 145 b43_phy_write(dev, B43_PHY_PWRDOWN, 0x1808);
139 else 146 else
@@ -306,16 +313,16 @@ static void b43_wa_crs_ed(struct b43_wldev *dev)
306 struct b43_phy *phy = &dev->phy; 313 struct b43_phy *phy = &dev->phy;
307 314
308 if (phy->rev == 1) { 315 if (phy->rev == 1) {
309 b43_phy_write(dev, B43_PHY_CRSTHRES1, 0x4F19); 316 b43_phy_write(dev, B43_PHY_CRSTHRES1_R1, 0x4F19);
310 } else if (phy->rev == 2) { 317 } else if (phy->rev == 2) {
311 b43_phy_write(dev, B43_PHY_CRSTHRES1_R1, 0x1861); 318 b43_phy_write(dev, B43_PHY_CRSTHRES1, 0x1861);
312 b43_phy_write(dev, B43_PHY_CRSTHRES2_R1, 0x1861); 319 b43_phy_write(dev, B43_PHY_CRSTHRES2, 0x0271);
313 b43_phy_write(dev, B43_PHY_ANTDWELL, 320 b43_phy_write(dev, B43_PHY_ANTDWELL,
314 b43_phy_read(dev, B43_PHY_ANTDWELL) 321 b43_phy_read(dev, B43_PHY_ANTDWELL)
315 | 0x0800); 322 | 0x0800);
316 } else { 323 } else {
317 b43_phy_write(dev, B43_PHY_CRSTHRES1_R1, 0x0098); 324 b43_phy_write(dev, B43_PHY_CRSTHRES1, 0x0098);
318 b43_phy_write(dev, B43_PHY_CRSTHRES2_R1, 0x0070); 325 b43_phy_write(dev, B43_PHY_CRSTHRES2, 0x0070);
319 b43_phy_write(dev, B43_PHY_OFDM(0xC9), 0x0080); 326 b43_phy_write(dev, B43_PHY_OFDM(0xC9), 0x0080);
320 b43_phy_write(dev, B43_PHY_ANTDWELL, 327 b43_phy_write(dev, B43_PHY_ANTDWELL,
321 b43_phy_read(dev, B43_PHY_ANTDWELL) 328 b43_phy_read(dev, B43_PHY_ANTDWELL)
@@ -441,7 +448,7 @@ static void b43_wa_altagc(struct b43_wldev *dev)
441 } 448 }
442 } 449 }
443 b43_phy_write(dev, B43_PHY_DIVSRCHIDX, 450 b43_phy_write(dev, B43_PHY_DIVSRCHIDX,
444 (b43_phy_read(dev, B43_PHY_DIVSRCHIDX) & 0x7F7F) | 0x7874); 451 (b43_phy_read(dev, B43_PHY_DIVSRCHIDX) & 0x8080) | 0x7874);
445 b43_phy_write(dev, B43_PHY_OFDM(0x8E), 0x1C00); 452 b43_phy_write(dev, B43_PHY_OFDM(0x8E), 0x1C00);
446 if (phy->rev == 1) { 453 if (phy->rev == 1) {
447 b43_phy_write(dev, B43_PHY_DIVP1P2GAIN, 454 b43_phy_write(dev, B43_PHY_DIVP1P2GAIN,
@@ -466,6 +473,7 @@ static void b43_wa_altagc(struct b43_wldev *dev)
466 b43_phy_write(dev, B43_PHY_OFDM(0x26), 473 b43_phy_write(dev, B43_PHY_OFDM(0x26),
467 b43_phy_read(dev, B43_PHY_OFDM(0x26)) & ~0x1000); 474 b43_phy_read(dev, B43_PHY_OFDM(0x26)) & ~0x1000);
468 } 475 }
476 b43_phy_read(dev, B43_PHY_VERSION_OFDM); /* Dummy read */
469} 477}
470 478
471static void b43_wa_tr_ltov(struct b43_wldev *dev) /* TR Lookup Table Original Values */ 479static void b43_wa_tr_ltov(struct b43_wldev *dev) /* TR Lookup Table Original Values */