rpms/kernel/devel kernel-2.6.spec, 1.3087, 1.3088 linux-2.6-bcm43xx-mac80211-phy-rev-1-fix.patch, 1.1, 1.2
fedora-cvs-commits at redhat.com
fedora-cvs-commits at redhat.com
Wed Apr 18 18:43:51 UTC 2007
Author: linville
Update of /cvs/dist/rpms/kernel/devel
In directory cvs.devel.redhat.com:/tmp/cvs-serv12719
Modified Files:
kernel-2.6.spec linux-2.6-bcm43xx-mac80211-phy-rev-1-fix.patch
Log Message:
update bcm43xx phy rev 1 fix
Index: kernel-2.6.spec
===================================================================
RCS file: /cvs/dist/rpms/kernel/devel/kernel-2.6.spec,v
retrieving revision 1.3087
retrieving revision 1.3088
diff -u -r1.3087 -r1.3088
--- kernel-2.6.spec 18 Apr 2007 14:50:24 -0000 1.3087
+++ kernel-2.6.spec 18 Apr 2007 18:43:49 -0000 1.3088
@@ -2311,6 +2311,9 @@
# - tux.
%changelog
+* Wed Apr 18 2007 John W. Linville <linville at redhat.com>
+- Update fix for bcm43xx-mac80211 oops on ppc w/ phy rev 1
+
* Wed Apr 18 2007 Kristian Høgsberg <krh at redhat.com>
- Add missing _IOC_WRITE for create iso context ioctl code.
linux-2.6-bcm43xx-mac80211-phy-rev-1-fix.patch:
bcm43xx_main.c | 8 ++-
bcm43xx_phy.c | 128 ++++++++++++++++++++++++++++++++-------------------------
2 files changed, 78 insertions(+), 58 deletions(-)
Index: linux-2.6-bcm43xx-mac80211-phy-rev-1-fix.patch
===================================================================
RCS file: /cvs/dist/rpms/kernel/devel/linux-2.6-bcm43xx-mac80211-phy-rev-1-fix.patch,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- linux-2.6-bcm43xx-mac80211-phy-rev-1-fix.patch 11 Apr 2007 19:47:58 -0000 1.1
+++ linux-2.6-bcm43xx-mac80211-phy-rev-1-fix.patch 18 Apr 2007 18:43:49 -0000 1.2
@@ -1,6 +1,91 @@
---- linux-2.6.20.noarch/drivers/net/wireless/mac80211/bcm43xx/bcm43xx_phy.c.orig 2007-04-11 14:52:39.000000000 -0400
-+++ linux-2.6.20.noarch/drivers/net/wireless/mac80211/bcm43xx/bcm43xx_phy.c 2007-04-11 14:53:22.000000000 -0400
-@@ -1362,7 +1362,7 @@ static void bcm43xx_phy_initb6(struct bc
+--- linux-2.6.20.noarch/drivers/net/wireless/mac80211/bcm43xx/bcm43xx_main.c.orig 2007-04-18 14:31:55.000000000 -0400
++++ linux-2.6.20.noarch/drivers/net/wireless/mac80211/bcm43xx/bcm43xx_main.c 2007-04-18 14:36:09.000000000 -0400
+@@ -830,6 +830,7 @@ static void bcm43xx_switch_analog(struct
+
+ void bcm43xx_wireless_core_reset(struct bcm43xx_wldev *dev, u32 flags)
+ {
++ struct bcm43xx_phy *phy = &dev->phy;
+ u32 tmslow;
+ u32 macctl;
+
+@@ -853,10 +854,13 @@ void bcm43xx_wireless_core_reset(struct
+ /* Turn Analog ON */
+ bcm43xx_switch_analog(dev, 1);
+
+- macctl = bcm43xx_read32(dev, BCM43xx_MMIO_MACCTL);
++ macctl = bcm43xx_read32(dev, BCM43xx_MMIO_MACCTL) & ~BCM43xx_MACCTL_GMODE;
+ macctl |= BCM43xx_MACCTL_IHR_ENABLED;
+- if (flags & BCM43xx_TMSLOW_GMODE)
++ if (flags & BCM43xx_TMSLOW_GMODE) {
+ macctl |= BCM43xx_MACCTL_GMODE;
++ phy->gmode = 1;
++ } else
++ phy->gmode = 0;
+ bcm43xx_write32(dev, BCM43xx_MMIO_MACCTL, macctl);
+ }
+
+--- linux-2.6.20.noarch/drivers/net/wireless/mac80211/bcm43xx/bcm43xx_phy.c.orig 2007-04-18 14:35:13.000000000 -0400
++++ linux-2.6.20.noarch/drivers/net/wireless/mac80211/bcm43xx/bcm43xx_phy.c 2007-04-18 14:36:09.000000000 -0400
+@@ -599,16 +599,16 @@ static void bcm43xx_phy_agcsetup(struct
+ bcm43xx_phy_write(dev, 0x04A1,
+ (bcm43xx_phy_read(dev, 0x04A1)
+ & 0xF0FF) | 0x0600);
+- bcm43xx_phy_write(dev, 0x04A2,
+- (bcm43xx_phy_read(dev, 0x04A2)
++ bcm43xx_phy_write(dev, 0x0412,
++ (bcm43xx_phy_read(dev, 0x0412)
+ & 0xF0FF) | 0x0700);
+- bcm43xx_phy_write(dev, 0x04A0,
+- (bcm43xx_phy_read(dev, 0x04A0)
++ bcm43xx_phy_write(dev, 0x0410,
++ (bcm43xx_phy_read(dev, 0x0410)
+ & 0xF0FF) | 0x0100);
+
+ if (phy->rev == 1) {
+- bcm43xx_phy_write(dev, 0x04A2,
+- (bcm43xx_phy_read(dev, 0x04A2)
++ bcm43xx_phy_write(dev, 0x0412,
++ (bcm43xx_phy_read(dev, 0x0412)
+ & 0xFFF0) | 0x0007);
+ }
+
+@@ -655,7 +655,7 @@ static void bcm43xx_phy_agcsetup(struct
+ & 0xFFF0) | 0x0004);
+ }
+
+- if (phy->rev < 6) {
++ if (phy->rev >= 6) {
+ bcm43xx_phy_write(dev, 0x0422, 0x287A);
+ bcm43xx_phy_write(dev, 0x0420,
+ (bcm43xx_phy_read(dev, 0x0420)
+@@ -664,7 +664,7 @@ static void bcm43xx_phy_agcsetup(struct
+
+ bcm43xx_phy_write(dev, 0x04A8,
+ (bcm43xx_phy_read(dev, 0x04A8)
+- & 0x8080) | 0x7874);
++ & 0x7F7F) | 0x7874);
+ bcm43xx_phy_write(dev, 0x048E, 0x1C00);
+
+ offset = 0x0800;
+@@ -955,7 +955,7 @@ static void bcm43xx_phy_inita(struct bcm
+ bcm43xx_phy_setupa(dev);
+ } else {
+ bcm43xx_phy_setupg(dev);
+- if (dev->dev->bus->sprom.r1.boardflags_lo & BCM43xx_BFL_PACTRL)
++ if (phy->gmode && dev->dev->bus->sprom.r1.boardflags_lo & BCM43xx_BFL_PACTRL)
+ bcm43xx_phy_write(dev, 0x046E, 0x03CF);
+ return;
+ }
+@@ -1139,7 +1139,7 @@ static void bcm43xx_phy_initb5(struct bc
+ if (phy->radio_ver == 0x2050)
+ bcm43xx_phy_write(dev, 0x0038, 0x0667);
+
+- if (phy->type == BCM43xx_PHYTYPE_G) {
++ if (phy->gmode || phy->rev >= 2) {
+ if (phy->radio_ver == 0x2050) {
+ bcm43xx_radio_write16(dev, 0x007A,
+ bcm43xx_radio_read16(dev, 0x007A)
+@@ -1361,7 +1361,7 @@ static void bcm43xx_phy_initb6(struct bc
static void bcm43xx_calc_loopback_gain(struct bcm43xx_wldev *dev)
{
struct bcm43xx_phy *phy = &dev->phy;
@@ -9,7 +94,7 @@
u16 backup_radio[3];
u16 backup_bband;
u16 i, j, loop_i_max;
-@@ -1373,8 +1373,10 @@ static void bcm43xx_calc_loopback_gain(s
+@@ -1372,8 +1372,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);
@@ -22,7 +107,7 @@
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
+@@ -1401,14 +1403,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);
@@ -47,7 +132,7 @@
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
+@@ -1425,10 +1429,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);
@@ -64,7 +149,7 @@
bcm43xx_phy_write(dev, BCM43xx_PHY_BASE(0x03),
(bcm43xx_phy_read(dev, BCM43xx_PHY_BASE(0x03))
& 0xFF9F) | 0x40);
-@@ -1522,8 +1528,10 @@ exit_loop1:
+@@ -1521,8 +1527,10 @@ exit_loop1:
trsw_rx = 0x18;
exit_loop2:
@@ -77,32 +162,211 @@
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
+@@ -1560,7 +1568,7 @@ static void bcm43xx_phy_initg(struct bcm
+ else
+ bcm43xx_phy_initb6(dev);
+
+- if (has_loopback_gain(phy))
++ if (phy->rev >= 2 || phy->gmode)
+ bcm43xx_phy_inita(dev);
+
+ if (phy->rev >= 2) {
+@@ -1575,7 +1583,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 >= 2) {
++ if (phy->gmode || phy->rev >= 2) {
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
+@@ -1588,7 +1596,7 @@ static void bcm43xx_phy_initg(struct bcm
+ & 0x00FF) | 0x1F00);
+ }
+ }
+- if (phy->rev <= 2 && phy->gmode)
++ if ((phy->rev == 1 && phy->gmode) || phy->rev >= 2)
+ bcm43xx_phy_write(dev, BCM43xx_PHY_OFDM(0x7E), 0x78);
+ if (phy->radio_rev == 8) {
+ bcm43xx_phy_write(dev, BCM43xx_PHY_EXTG(0x01),
+@@ -1634,7 +1642,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) {
++ if (phy->gmode || phy->rev >= 2) {
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?
+@@ -2428,8 +2436,10 @@ static void bcm43xx_calc_nrssi_offset(st
+ backup[0] = bcm43xx_phy_read(dev, 0x0001);
+ backup[1] = bcm43xx_phy_read(dev, 0x0811);
+ backup[2] = bcm43xx_phy_read(dev, 0x0812);
+- backup[3] = bcm43xx_phy_read(dev, 0x0814);
+- backup[4] = bcm43xx_phy_read(dev, 0x0815);
++ if (phy->rev != 1) {
++ backup[3] = bcm43xx_phy_read(dev, 0x0814);
++ backup[4] = bcm43xx_phy_read(dev, 0x0815);
++ }
+ backup[5] = bcm43xx_phy_read(dev, 0x005A);
+ backup[6] = bcm43xx_phy_read(dev, 0x0059);
+ backup[7] = bcm43xx_phy_read(dev, 0x0058);
+@@ -2495,10 +2505,12 @@ static void bcm43xx_calc_nrssi_offset(st
+ } else {
+ bcm43xx_radio_write16(dev, 0x007A,
+ bcm43xx_radio_read16(dev, 0x007A) & 0x007F);
+- bcm43xx_phy_write(dev, 0x0814,
+- bcm43xx_phy_read(dev, 0x0814) | 0x0001);
+- bcm43xx_phy_write(dev, 0x0815,
+- bcm43xx_phy_read(dev, 0x0815) & 0xFFFE);
++ if (phy->rev != 1) {
++ bcm43xx_phy_write(dev, 0x0814,
++ bcm43xx_phy_read(dev, 0x0814) | 0x0001);
++ bcm43xx_phy_write(dev, 0x0815,
++ bcm43xx_phy_read(dev, 0x0815) & 0xFFFE);
++ }
+ bcm43xx_phy_write(dev, 0x0811,
+ bcm43xx_phy_read(dev, 0x0811) | 0x000C);
+ bcm43xx_phy_write(dev, 0x0812,
+@@ -2517,10 +2529,12 @@ static void bcm43xx_calc_nrssi_offset(st
+ bcm43xx_phy_read(dev, 0x000A)
+ | 0x2000);
+ }
+- bcm43xx_phy_write(dev, 0x0814,
+- bcm43xx_phy_read(dev, 0x0814) | 0x0004);
+- bcm43xx_phy_write(dev, 0x0815,
+- bcm43xx_phy_read(dev, 0x0815) & 0xFFFB);
++ if (phy->rev != 1) {
++ bcm43xx_phy_write(dev, 0x0814,
++ bcm43xx_phy_read(dev, 0x0814) | 0x0004);
++ bcm43xx_phy_write(dev, 0x0815,
++ bcm43xx_phy_read(dev, 0x0815) & 0xFFFB);
++ }
+ bcm43xx_phy_write(dev, 0x0003,
+ (bcm43xx_phy_read(dev, 0x0003) & 0xFF9F)
+ | 0x0040);
+@@ -2557,8 +2571,10 @@ static void bcm43xx_calc_nrssi_offset(st
+ bcm43xx_phy_write(dev, 0x080F, backup[14]);
+ bcm43xx_phy_write(dev, 0x0810, backup[15]);
+ }
+- bcm43xx_phy_write(dev, 0x0814, backup[3]);
+- bcm43xx_phy_write(dev, 0x0815, backup[4]);
++ if (phy->rev != 1) {
++ bcm43xx_phy_write(dev, 0x0814, backup[3]);
++ bcm43xx_phy_write(dev, 0x0815, backup[4]);
++ }
+ bcm43xx_phy_write(dev, 0x005A, backup[5]);
+ bcm43xx_phy_write(dev, 0x0059, backup[6]);
+ bcm43xx_phy_write(dev, 0x0058, backup[7]);
+@@ -3239,7 +3255,7 @@ bcm43xx_radio_interference_mitigation_di
+ bcm43xx_phy_read(dev, BCM43xx_PHY_G_CRS) | 0x4000);
+ break;
+ }
+- phy_stackrestore(0x0078);
++ radio_stackrestore(0x0078);
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
+ phy_stackrestore(0x0406);
+ bcm43xx_phy_write(dev, 0x042B,
+@@ -3299,7 +3315,7 @@ bcm43xx_radio_interference_mitigation_di
+ ofdmtab_stackrestore(0x1A00, 0x3);
+ }
+ phy_stackrestore(0x04A2);
+- phy_stackrestore(0x04A8);
++ phy_stackrestore(0x048A);
+ phy_stackrestore(0x042B);
+ phy_stackrestore(0x048C);
+ bcm43xx_hf_write(dev, bcm43xx_hf_read(dev) & ~BCM43xx_HF_ACIW);
+@@ -3553,7 +3569,7 @@ u16 bcm43xx_radio_init2050(struct bcm43x
+
+ bcm43xx_phy_write(dev, BCM43xx_PHY_BASE(0x30), 0xFF);
+ bcm43xx_write16(dev, 0x3EC, 0x3F3F);
+- } else if (phy->gmode) {
++ } else if (phy->gmode || phy->rev >= 2) {
+ sav.phy_rfover = bcm43xx_phy_read(dev, BCM43xx_PHY_RFOVER);
+ sav.phy_rfoverval = bcm43xx_phy_read(dev, BCM43xx_PHY_RFOVERVAL);
+ sav.phy_analogover = bcm43xx_phy_read(dev, BCM43xx_PHY_ANALOGOVER);
+@@ -3615,14 +3631,14 @@ u16 bcm43xx_radio_init2050(struct bcm43x
+
+ if (phy->type == BCM43xx_PHYTYPE_B)
+ bcm43xx_radio_write16(dev, 0x78, 0x26);
+- if (phy->gmode) {
++ if (phy->gmode || phy->rev >= 2) {
+ bcm43xx_phy_write(dev, BCM43xx_PHY_RFOVERVAL,
+ radio2050_rfover_val(dev, BCM43xx_PHY_RFOVERVAL,
+ LPD(0, 1, 1)));
+ }
+ bcm43xx_phy_write(dev, BCM43xx_PHY_PGACTL, 0xBFAF);
+ bcm43xx_phy_write(dev, BCM43xx_PHY_BASE(0x2B), 0x1403);
+- if (phy->gmode) {
++ if (phy->gmode || phy->rev >= 2) {
+ bcm43xx_phy_write(dev, BCM43xx_PHY_RFOVERVAL,
+ radio2050_rfover_val(dev, BCM43xx_PHY_RFOVERVAL,
+ LPD(0, 0, 1)));
+@@ -3645,21 +3661,21 @@ u16 bcm43xx_radio_init2050(struct bcm43x
+ bcm43xx_phy_write(dev, BCM43xx_PHY_BASE(0x5A), 0x0480);
+ bcm43xx_phy_write(dev, BCM43xx_PHY_BASE(0x59), 0xC810);
+ bcm43xx_phy_write(dev, BCM43xx_PHY_BASE(0x58), 0x000D);
+- if (phy->gmode) {
++ if (phy->gmode || phy->rev >= 2) {
+ bcm43xx_phy_write(dev, BCM43xx_PHY_RFOVERVAL,
+ radio2050_rfover_val(dev, BCM43xx_PHY_RFOVERVAL,
+ LPD(1, 0, 1)));
+ }
+ bcm43xx_phy_write(dev, BCM43xx_PHY_PGACTL, 0xAFB0);
+ udelay(10);
+- if (phy->gmode) {
++ if (phy->gmode || phy->rev >= 2) {
+ bcm43xx_phy_write(dev, BCM43xx_PHY_RFOVERVAL,
+ radio2050_rfover_val(dev, BCM43xx_PHY_RFOVERVAL,
+ LPD(1, 0, 1)));
+ }
+ bcm43xx_phy_write(dev, BCM43xx_PHY_PGACTL, 0xEFB0);
+ udelay(10);
+- if (phy->gmode) {
++ if (phy->gmode || phy->rev >= 2) {
+ bcm43xx_phy_write(dev, BCM43xx_PHY_RFOVERVAL,
+ radio2050_rfover_val(dev, BCM43xx_PHY_RFOVERVAL,
+ LPD(1, 0, 0)));
+@@ -3668,7 +3684,7 @@ u16 bcm43xx_radio_init2050(struct bcm43x
+ udelay(20);
+ tmp1 += bcm43xx_phy_read(dev, BCM43xx_PHY_LO_LEAKAGE);
+ bcm43xx_phy_write(dev, BCM43xx_PHY_BASE(0x58), 0);
+- if (phy->gmode) {
++ if (phy->gmode || phy->rev >= 2) {
+ bcm43xx_phy_write(dev, BCM43xx_PHY_RFOVERVAL,
+ radio2050_rfover_val(dev, BCM43xx_PHY_RFOVERVAL,
+ LPD(1, 0, 1)));
+@@ -3689,21 +3705,21 @@ u16 bcm43xx_radio_init2050(struct bcm43x
+ bcm43xx_phy_write(dev, BCM43xx_PHY_BASE(0x5A), 0x0D80);
+ bcm43xx_phy_write(dev, BCM43xx_PHY_BASE(0x59), 0xC810);
+ bcm43xx_phy_write(dev, BCM43xx_PHY_BASE(0x58), 0x000D);
+- if (phy->gmode) {
++ if (phy->gmode || phy->rev >= 2) {
+ bcm43xx_phy_write(dev, BCM43xx_PHY_RFOVERVAL,
+ radio2050_rfover_val(dev, BCM43xx_PHY_RFOVERVAL,
+ LPD(1, 0, 1)));
+ }
+ bcm43xx_phy_write(dev, BCM43xx_PHY_PGACTL, 0xAFB0);
+ udelay(10);
+- if (phy->gmode) {
++ if (phy->gmode || phy->rev >= 2) {
+ bcm43xx_phy_write(dev, BCM43xx_PHY_RFOVERVAL,
+ radio2050_rfover_val(dev, BCM43xx_PHY_RFOVERVAL,
+ LPD(1, 0, 1)));
+ }
+ bcm43xx_phy_write(dev, BCM43xx_PHY_PGACTL, 0xEFB0);
+ udelay(10);
+- if (phy->gmode) {
++ if (phy->gmode || phy->rev >= 2) {
+ bcm43xx_phy_write(dev, BCM43xx_PHY_RFOVERVAL,
+ radio2050_rfover_val(dev, BCM43xx_PHY_RFOVERVAL,
+ LPD(1, 0, 0)));
+@@ -3712,7 +3728,7 @@ u16 bcm43xx_radio_init2050(struct bcm43x
+ udelay(10);
+ tmp2 += bcm43xx_phy_read(dev, BCM43xx_PHY_LO_LEAKAGE);
+ bcm43xx_phy_write(dev, BCM43xx_PHY_BASE(0x58), 0);
+- if (phy->gmode) {
++ if (phy->gmode || phy->rev >= 2) {
+ bcm43xx_phy_write(dev, BCM43xx_PHY_RFOVERVAL,
+ radio2050_rfover_val(dev, BCM43xx_PHY_RFOVERVAL,
+ LPD(1, 0, 1)));
More information about the fedora-cvs-commits
mailing list