David,
David Woodhouse wrote:
> I figured if people were going to start working more on the mac80211
> driver than the softmac one, I probably ought to start reporting the
> cases where it kills my machine. So I hacked up ssb_pci_{read,write}16
> to use outw instead of readw and thus get their machine checks trapped.
>
> This is what I found...
Please try the patch below to see if it fixes the machine checks. It is the
equivalent of what we
used in bcm43xx-softmac to get rid of them.
Thanks,
Larry
Index: wireless-dev/drivers/net/wireless/mac80211/bcm43xx/bcm43xx_phy.c
===================================================================
--- wireless-dev.orig/drivers/net/wireless/mac80211/bcm43xx/bcm43xx_phy.c
+++ wireless-dev/drivers/net/wireless/mac80211/bcm43xx/bcm43xx_phy.c
@@ -1362,7 +1362,7 @@ static void bcm43xx_phy_initb6(struct bc
static void bcm43xx_calc_loopback_gain(struct bcm43xx_wldev *dev)
{
struct bcm43xx_phy *phy = &dev->phy;
- u16 backup_phy[16];
+ u16 backup_phy[16] = {0};
u16 backup_radio[3];
u16 backup_bband;
u16 i, j, loop_i_max;
@@ -1373,8 +1373,10 @@ static void bcm43xx_calc_loopback_gain(s
backup_phy[1] = bcm43xx_phy_read(dev, BCM43xx_PHY_CCKBBANDCFG);
backup_phy[2] = bcm43xx_phy_read(dev, BCM43xx_PHY_RFOVER);
backup_phy[3] = bcm43xx_phy_read(dev, BCM43xx_PHY_RFOVERVAL);
- backup_phy[4] = bcm43xx_phy_read(dev, BCM43xx_PHY_ANALOGOVER);
- backup_phy[5] = bcm43xx_phy_read(dev, BCM43xx_PHY_ANALOGOVERVAL);
+ if (phy->rev != 1) {
+ backup_phy[4] = bcm43xx_phy_read(dev, BCM43xx_PHY_ANALOGOVER);
+ backup_phy[5] = bcm43xx_phy_read(dev,
BCM43xx_PHY_ANALOGOVERVAL);
+ }
backup_phy[6] = bcm43xx_phy_read(dev, BCM43xx_PHY_BASE(0x5A));
backup_phy[7] = bcm43xx_phy_read(dev, BCM43xx_PHY_BASE(0x59));
backup_phy[8] = bcm43xx_phy_read(dev, BCM43xx_PHY_BASE(0x58));
@@ -1402,14 +1404,16 @@ static void bcm43xx_calc_loopback_gain(s
bcm43xx_phy_read(dev, BCM43xx_PHY_RFOVER) | 0x0001);
bcm43xx_phy_write(dev, BCM43xx_PHY_RFOVERVAL,
bcm43xx_phy_read(dev, BCM43xx_PHY_RFOVERVAL) &
0xFFFE);
- bcm43xx_phy_write(dev, BCM43xx_PHY_ANALOGOVER,
- bcm43xx_phy_read(dev, BCM43xx_PHY_ANALOGOVER) |
0x0001);
- bcm43xx_phy_write(dev, BCM43xx_PHY_ANALOGOVERVAL,
- bcm43xx_phy_read(dev, BCM43xx_PHY_ANALOGOVERVAL) &
0xFFFE);
- bcm43xx_phy_write(dev, BCM43xx_PHY_ANALOGOVER,
- bcm43xx_phy_read(dev, BCM43xx_PHY_ANALOGOVER) |
0x0002);
- bcm43xx_phy_write(dev, BCM43xx_PHY_ANALOGOVERVAL,
- bcm43xx_phy_read(dev, BCM43xx_PHY_ANALOGOVERVAL) &
0xFFFD);
+ if (phy->rev != 1) {
+ bcm43xx_phy_write(dev, BCM43xx_PHY_ANALOGOVER,
+ bcm43xx_phy_read(dev, BCM43xx_PHY_ANALOGOVER)
| 0x0001);
+ bcm43xx_phy_write(dev, BCM43xx_PHY_ANALOGOVERVAL,
+ bcm43xx_phy_read(dev,
BCM43xx_PHY_ANALOGOVERVAL) & 0xFFFE);
+ bcm43xx_phy_write(dev, BCM43xx_PHY_ANALOGOVER,
+ bcm43xx_phy_read(dev, BCM43xx_PHY_ANALOGOVER)
| 0x0002);
+ bcm43xx_phy_write(dev, BCM43xx_PHY_ANALOGOVERVAL,
+ bcm43xx_phy_read(dev,
BCM43xx_PHY_ANALOGOVERVAL) & 0xFFFD);
+ }
bcm43xx_phy_write(dev, BCM43xx_PHY_RFOVER,
bcm43xx_phy_read(dev, BCM43xx_PHY_RFOVER) | 0x000C);
bcm43xx_phy_write(dev, BCM43xx_PHY_RFOVER,
@@ -1426,10 +1430,12 @@ static void bcm43xx_calc_loopback_gain(s
bcm43xx_phy_write(dev, BCM43xx_PHY_BASE(0x0A),
bcm43xx_phy_read(dev, BCM43xx_PHY_BASE(0x0A)) |
0x2000);
- bcm43xx_phy_write(dev, BCM43xx_PHY_ANALOGOVER,
- bcm43xx_phy_read(dev, BCM43xx_PHY_ANALOGOVER) |
0x0004);
- bcm43xx_phy_write(dev, BCM43xx_PHY_ANALOGOVERVAL,
- bcm43xx_phy_read(dev, BCM43xx_PHY_ANALOGOVERVAL) &
0xFFFB);
+ if (phy->rev != 1) {
+ bcm43xx_phy_write(dev, BCM43xx_PHY_ANALOGOVER,
+ bcm43xx_phy_read(dev, BCM43xx_PHY_ANALOGOVER)
| 0x0004);
+ bcm43xx_phy_write(dev, BCM43xx_PHY_ANALOGOVERVAL,
+ bcm43xx_phy_read(dev,
BCM43xx_PHY_ANALOGOVERVAL) & 0xFFFB);
+ }
bcm43xx_phy_write(dev, BCM43xx_PHY_BASE(0x03),
(bcm43xx_phy_read(dev, BCM43xx_PHY_BASE(0x03))
& 0xFF9F) | 0x40);
@@ -1522,8 +1528,10 @@ exit_loop1:
trsw_rx = 0x18;
exit_loop2:
- bcm43xx_phy_write(dev, BCM43xx_PHY_ANALOGOVER, backup_phy[4]);
- bcm43xx_phy_write(dev, BCM43xx_PHY_ANALOGOVERVAL, backup_phy[5]);
+ if (phy->rev != 1) {
+ bcm43xx_phy_write(dev, BCM43xx_PHY_ANALOGOVER, backup_phy[4]);
+ bcm43xx_phy_write(dev, BCM43xx_PHY_ANALOGOVERVAL,
backup_phy[5]);
+ }
bcm43xx_phy_write(dev, BCM43xx_PHY_BASE(0x5A), backup_phy[6]);
bcm43xx_phy_write(dev, BCM43xx_PHY_BASE(0x59), backup_phy[7]);
bcm43xx_phy_write(dev, BCM43xx_PHY_BASE(0x58), backup_phy[8]);
@@ -1576,7 +1584,7 @@ static void bcm43xx_phy_initg(struct bcm
bcm43xx_phy_write(dev, BCM43xx_PHY_RFOVER, 0x400);
bcm43xx_phy_write(dev, BCM43xx_PHY_PGACTL, 0xC0);
}
- if (phy->gmode) {
+ if (phy->gmode && phy->rev != 1) {
tmp = bcm43xx_phy_read(dev, BCM43xx_PHY_VERSION_OFDM);
tmp &= BCM43xx_PHYVER_VERSION;
if (tmp == 3 || tmp == 5) {
@@ -1635,7 +1643,7 @@ static void bcm43xx_phy_initg(struct bcm
else
bcm43xx_phy_write(dev, BCM43xx_PHY_BASE(0x2F), 0x202);
}
- if (phy->gmode) {
+ if (phy->gmode && phy->rev != 1) {
bcm43xx_lo_adjust(dev);
bcm43xx_phy_write(dev, BCM43xx_PHY_LO_MASK, 0x8078);
}
@@ -1649,8 +1657,8 @@ static void bcm43xx_phy_initg(struct bcm
*/
bcm43xx_nrssi_hw_update(dev, 0xFFFF);//FIXME?
bcm43xx_calc_nrssi_threshold(dev);
- } else {
- if (phy->gmode && phy->nrssi[0] == -1000) {
+ } else if (phy->gmode && phy->rev != 1) {
+ if (phy->nrssi[0] == -1000) {
assert(phy->nrssi[1] == -1000);
bcm43xx_calc_nrssi_slope(dev);
} else
---------
_______________________________________________
Bcm43xx-dev mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/bcm43xx-dev