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

Reply via email to