diff options
author | Michael Buesch <mb@bu3sch.de> | 2007-12-12 16:05:18 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-28 18:05:59 -0500 |
commit | 38d1b4ce901506729f6c7f9a14f02f4327c577cc (patch) | |
tree | c7b55f18baea728ebad228b2ec5d5eeaeedb36b2 /drivers/net/wireless/b43 | |
parent | 8ed7fc48eb31e583bb31c2bcfdd3a9c557bad5d0 (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>
Diffstat (limited to 'drivers/net/wireless/b43')
-rw-r--r-- | drivers/net/wireless/b43/phy.h | 6 | ||||
-rw-r--r-- | drivers/net/wireless/b43/tables.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/b43/wa.c | 30 |
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 | ||
132 | static void b43_wa_analog(struct b43_wldev *dev) | 137 | static 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 | ||
471 | static void b43_wa_tr_ltov(struct b43_wldev *dev) /* TR Lookup Table Original Values */ | 479 | static void b43_wa_tr_ltov(struct b43_wldev *dev) /* TR Lookup Table Original Values */ |