Commit 940b7a3a authored by Ehud Gavron's avatar Ehud Gavron Committed by John W. Linville

b43legacy: Fix to enhance TX speed

Recent changes in the specifications have improved the performance
of the BCM4306/2 devices that use b43legacy as the driver. These
"errors" in the specs have been present from the very first implementation
of bcm43xx.
Signed-off-by: default avatarEhud Gavron <gavron@wetwork.net>
Tested-by: default avatarLarry Finger <Larry.Finger@lwfinger.net>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent c6a2afda
...@@ -595,12 +595,14 @@ static void b43legacy_phy_initb5(struct b43legacy_wldev *dev) ...@@ -595,12 +595,14 @@ static void b43legacy_phy_initb5(struct b43legacy_wldev *dev)
0x0035) & 0xFFC0) | 0x0064); 0x0035) & 0xFFC0) | 0x0064);
b43legacy_phy_write(dev, 0x005D, (b43legacy_phy_read(dev, b43legacy_phy_write(dev, 0x005D, (b43legacy_phy_read(dev,
0x005D) & 0xFF80) | 0x000A); 0x005D) & 0xFF80) | 0x000A);
b43legacy_phy_write(dev, 0x5B, 0x0000);
b43legacy_phy_write(dev, 0x5C, 0x0000);
} }
if (dev->bad_frames_preempt) if (dev->bad_frames_preempt)
b43legacy_phy_write(dev, B43legacy_PHY_RADIO_BITFIELD, b43legacy_phy_write(dev, B43legacy_PHY_RADIO_BITFIELD,
b43legacy_phy_read(dev, b43legacy_phy_read(dev,
B43legacy_PHY_RADIO_BITFIELD) | (1 << 11)); B43legacy_PHY_RADIO_BITFIELD) | (1 << 12));
if (phy->analog == 1) { if (phy->analog == 1) {
b43legacy_phy_write(dev, 0x0026, 0xCE00); b43legacy_phy_write(dev, 0x0026, 0xCE00);
...@@ -753,7 +755,7 @@ static void b43legacy_phy_initb6(struct b43legacy_wldev *dev) ...@@ -753,7 +755,7 @@ static void b43legacy_phy_initb6(struct b43legacy_wldev *dev)
b43legacy_radio_write16(dev, 0x0050, 0x0020); b43legacy_radio_write16(dev, 0x0050, 0x0020);
} }
if (phy->radio_rev <= 2) { if (phy->radio_rev <= 2) {
b43legacy_radio_write16(dev, 0x007C, 0x0020); b43legacy_radio_write16(dev, 0x0050, 0x0020);
b43legacy_radio_write16(dev, 0x005A, 0x0070); b43legacy_radio_write16(dev, 0x005A, 0x0070);
b43legacy_radio_write16(dev, 0x005B, 0x007B); b43legacy_radio_write16(dev, 0x005B, 0x007B);
b43legacy_radio_write16(dev, 0x005C, 0x00B0); b43legacy_radio_write16(dev, 0x005C, 0x00B0);
...@@ -771,7 +773,7 @@ static void b43legacy_phy_initb6(struct b43legacy_wldev *dev) ...@@ -771,7 +773,7 @@ static void b43legacy_phy_initb6(struct b43legacy_wldev *dev)
b43legacy_phy_write(dev, 0x002A, 0x8AC0); b43legacy_phy_write(dev, 0x002A, 0x8AC0);
b43legacy_phy_write(dev, 0x0038, 0x0668); b43legacy_phy_write(dev, 0x0038, 0x0668);
b43legacy_radio_set_txpower_bg(dev, 0xFFFF, 0xFFFF, 0xFFFF); b43legacy_radio_set_txpower_bg(dev, 0xFFFF, 0xFFFF, 0xFFFF);
if (phy->radio_rev <= 5) if (phy->radio_rev == 4 || phy->radio_rev == 5)
b43legacy_phy_write(dev, 0x005D, (b43legacy_phy_read(dev, b43legacy_phy_write(dev, 0x005D, (b43legacy_phy_read(dev,
0x005D) & 0xFF80) | 0x0003); 0x005D) & 0xFF80) | 0x0003);
if (phy->radio_rev <= 2) if (phy->radio_rev <= 2)
...@@ -1010,7 +1012,7 @@ static void b43legacy_phy_initg(struct b43legacy_wldev *dev) ...@@ -1010,7 +1012,7 @@ static void b43legacy_phy_initg(struct b43legacy_wldev *dev)
b43legacy_phy_initb5(dev); b43legacy_phy_initb5(dev);
else else
b43legacy_phy_initb6(dev); b43legacy_phy_initb6(dev);
if (phy->rev >= 2 || phy->gmode) if (phy->rev >= 2 && phy->gmode)
b43legacy_phy_inita(dev); b43legacy_phy_inita(dev);
if (phy->rev >= 2) { if (phy->rev >= 2) {
...@@ -1025,17 +1027,21 @@ static void b43legacy_phy_initg(struct b43legacy_wldev *dev) ...@@ -1025,17 +1027,21 @@ static void b43legacy_phy_initg(struct b43legacy_wldev *dev)
b43legacy_phy_write(dev, 0x0811, 0x0400); b43legacy_phy_write(dev, 0x0811, 0x0400);
b43legacy_phy_write(dev, 0x0015, 0x00C0); b43legacy_phy_write(dev, 0x0015, 0x00C0);
} }
if (phy->rev >= 2 || phy->gmode) { if (phy->gmode) {
tmp = b43legacy_phy_read(dev, 0x0400) & 0xFF; tmp = b43legacy_phy_read(dev, 0x0400) & 0xFF;
if (tmp == 3 || tmp == 5) { if (tmp == 3) {
b43legacy_phy_write(dev, 0x04C2, 0x1816);
b43legacy_phy_write(dev, 0x04C3, 0x8606);
}
if (tmp == 4 || tmp == 5) {
b43legacy_phy_write(dev, 0x04C2, 0x1816); b43legacy_phy_write(dev, 0x04C2, 0x1816);
b43legacy_phy_write(dev, 0x04C3, 0x8006); b43legacy_phy_write(dev, 0x04C3, 0x8006);
if (tmp == 5)
b43legacy_phy_write(dev, 0x04CC, b43legacy_phy_write(dev, 0x04CC,
(b43legacy_phy_read(dev, (b43legacy_phy_read(dev,
0x04CC) & 0x00FF) | 0x04CC) & 0x00FF) |
0x1F00); 0x1F00);
} }
if (phy->rev >= 2)
b43legacy_phy_write(dev, 0x047E, 0x0078); b43legacy_phy_write(dev, 0x047E, 0x0078);
} }
if (phy->radio_rev == 8) { if (phy->radio_rev == 8) {
...@@ -1078,7 +1084,7 @@ static void b43legacy_phy_initg(struct b43legacy_wldev *dev) ...@@ -1078,7 +1084,7 @@ static void b43legacy_phy_initg(struct b43legacy_wldev *dev)
else else
b43legacy_phy_write(dev, 0x002F, 0x0202); b43legacy_phy_write(dev, 0x002F, 0x0202);
} }
if (phy->gmode || phy->rev >= 2) { if (phy->gmode) {
b43legacy_phy_lo_adjust(dev, 0); b43legacy_phy_lo_adjust(dev, 0);
b43legacy_phy_write(dev, 0x080F, 0x8078); b43legacy_phy_write(dev, 0x080F, 0x8078);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment