SOURCES: kernel-bcm43xx-combined_2.6.21.patch (NEW) - bcm43xx fixe...

matkor matkor at pld-linux.org
Tue Jul 17 09:24:56 CEST 2007


Author: matkor                       Date: Tue Jul 17 07:24:56 2007 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- bcm43xx fixes added. Release 0.2.

---- Files affected:
SOURCES:
   kernel-bcm43xx-combined_2.6.21.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/kernel-bcm43xx-combined_2.6.21.patch
diff -u /dev/null SOURCES/kernel-bcm43xx-combined_2.6.21.patch:1.1
--- /dev/null	Tue Jul 17 09:24:56 2007
+++ SOURCES/kernel-bcm43xx-combined_2.6.21.patch	Tue Jul 17 09:24:51 2007
@@ -0,0 +1,585 @@
+Index: wireless-2.6/net/ieee80211/ieee80211_module.c
+===================================================================
+--- wireless-2.6.orig/net/ieee80211/ieee80211_module.c
++++ wireless-2.6/net/ieee80211/ieee80211_module.c
+@@ -229,6 +229,7 @@ void free_ieee80211(struct net_device *d
+
+ static int debug = 0;
+ u32 ieee80211_debug_level = 0;
++EXPORT_SYMBOL_GPL(ieee80211_debug_level);
+ static struct proc_dir_entry *ieee80211_proc = NULL;
+
+ static int show_debug_level(char *page, char **start, off_t offset,
+Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_ethtool.c
+===================================================================
+--- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_ethtool.c
++++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_ethtool.c
+@@ -32,7 +32,7 @@
+ #include <linux/netdevice.h>
+ #include <linux/pci.h>
+ #include <linux/string.h>
+-#include <linux/utsrelease.h>
++#include <linux/utsname.h>
+ 
+ 
+ static void bcm43xx_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
+@@ -40,7 +40,7 @@ static void bcm43xx_get_drvinfo(struct n
+ 	struct bcm43xx_private *bcm = bcm43xx_priv(dev);
+ 
+ 	strncpy(info->driver, KBUILD_MODNAME, sizeof(info->driver));
+-	strncpy(info->version, UTS_RELEASE, sizeof(info->version));
++	strncpy(info->version, utsname()->release, sizeof(info->version));
+ 	strncpy(info->bus_info, pci_name(bcm->pci_dev), ETHTOOL_BUSINFO_LEN);
+ }
+ 
+Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx.h
+===================================================================
+--- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx.h
++++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx.h
+@@ -277,11 +277,14 @@
+ #define BCM43xx_SBTMSTATELOW_REJECT		0x02
+ #define BCM43xx_SBTMSTATELOW_CLOCK		0x10000
+ #define BCM43xx_SBTMSTATELOW_FORCE_GATE_CLOCK	0x20000
++#define BCM43xx_SBTMSTATELOW_G_MODE_ENABLE	0x20000000
+ 
+ /* sbtmstatehigh state flags */
+ #define BCM43xx_SBTMSTATEHIGH_SERROR		0x00000001
+ #define BCM43xx_SBTMSTATEHIGH_BUSY		0x00000004
+ #define BCM43xx_SBTMSTATEHIGH_TIMEOUT		0x00000020
++#define BCM43xx_SBTMSTATEHIGH_G_PHY_AVAIL	0x00010000
++#define BCM43xx_SBTMSTATEHIGH_A_PHY_AVAIL	0x00020000
+ #define BCM43xx_SBTMSTATEHIGH_COREFLAGS		0x1FFF0000
+ #define BCM43xx_SBTMSTATEHIGH_DMA64BIT		0x10000000
+ #define BCM43xx_SBTMSTATEHIGH_GATEDCLK		0x20000000
+Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_main.c
+===================================================================
+--- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_main.c
++++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_main.c
+@@ -1407,7 +1407,7 @@ void bcm43xx_wireless_core_reset(struct 
+ 				& ~(BCM43xx_SBF_MAC_ENABLED | 0x00000002));
+ 	} else {
+ 		if (connect_phy)
+-			flags |= 0x20000000;
++			flags |= BCM43xx_SBTMSTATELOW_G_MODE_ENABLE;
+ 		bcm43xx_phy_connect(bcm, connect_phy);
+ 		bcm43xx_core_enable(bcm, flags);
+ 		bcm43xx_write16(bcm, 0x03E6, 0x0000);
+@@ -2406,13 +2406,15 @@ static int bcm43xx_chip_init(struct bcm4
+ 		if (value32 == BCM43xx_IRQ_READY)
+ 			break;
+ 		i++;
+-		if (i >= BCM43xx_IRQWAIT_MAX_RETRIES) {
++		if (i >= 10 * BCM43xx_IRQWAIT_MAX_RETRIES) {
+ 			printk(KERN_ERR PFX "IRQ_READY timeout\n");
+ 			err = -ENODEV;
+ 			goto err_release_fw;
+ 		}
+ 		udelay(10);
+ 	}
++	if (i > BCM43xx_IRQWAIT_MAX_RETRIES)
++		printk(KERN_INFO PFX "CAUTION: IRQ_READY took %d tries in chip_init\n", i);
+ 	bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); /* dummy read */
+ 
+ 	value16 = bcm43xx_shm_read16(bcm, BCM43xx_SHM_SHARED,
+@@ -3604,7 +3606,7 @@ int bcm43xx_select_wireless_core(struct 
+ 		u32 sbtmstatelow;
+ 
+ 		sbtmstatelow = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATELOW);
+-		sbtmstatelow |= 0x20000000;
++		sbtmstatelow |= BCM43xx_SBTMSTATELOW_G_MODE_ENABLE;
+ 		bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow);
+ 	}
+ 	err = wireless_core_up(bcm, 1);
+Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_phy.c
+===================================================================
+--- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_phy.c
++++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_phy.c
+@@ -168,16 +168,16 @@ int bcm43xx_phy_connect(struct bcm43xx_p
+ 
+ 	flags = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATEHIGH);
+ 	if (connect) {
+-		if (!(flags & 0x00010000))
++		if (!(flags & BCM43xx_SBTMSTATEHIGH_G_PHY_AVAIL))
+ 			return -ENODEV;
+ 		flags = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATELOW);
+-		flags |= (0x800 << 18);
++		flags |= BCM43xx_SBTMSTATELOW_G_MODE_ENABLE;
+ 		bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, flags);
+ 	} else {
+-		if (!(flags & 0x00020000))
++		if (!(flags & BCM43xx_SBTMSTATEHIGH_A_PHY_AVAIL))
+ 			return -ENODEV;
+ 		flags = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATELOW);
+-		flags &= ~(0x800 << 18);
++		flags &= ~BCM43xx_SBTMSTATELOW_G_MODE_ENABLE;
+ 		bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, flags);
+ 	}
+ out:
+@@ -300,16 +300,20 @@ static void bcm43xx_phy_agcsetup(struct 
+ 
+ 	if (phy->rev > 2) {
+ 		bcm43xx_phy_write(bcm, 0x0422, 0x287A);
+-		bcm43xx_phy_write(bcm, 0x0420, (bcm43xx_phy_read(bcm, 0x0420) & 0x0FFF) | 0x3000); 
++		bcm43xx_phy_write(bcm, 0x0420, (bcm43xx_phy_read(bcm, 0x0420)
++				  & 0x0FFF) | 0x3000);
+ 	}
+ 		
+-	bcm43xx_phy_write(bcm, 0x04A8, (bcm43xx_phy_read(bcm, 0x04A8) & 0x8080) | 0x7874);
++	bcm43xx_phy_write(bcm, 0x04A8, (bcm43xx_phy_read(bcm, 0x04A8) & 0x8080)
++					| 0x7874);
+ 	bcm43xx_phy_write(bcm, 0x048E, 0x1C00);
+ 
+ 	if (phy->rev == 1) {
+-		bcm43xx_phy_write(bcm, 0x04AB, (bcm43xx_phy_read(bcm, 0x04AB) & 0xF0FF) | 0x0600);
++		bcm43xx_phy_write(bcm, 0x04AB, (bcm43xx_phy_read(bcm, 0x04AB)
++				  & 0xF0FF) | 0x0600);
+ 		bcm43xx_phy_write(bcm, 0x048B, 0x005E);
+-		bcm43xx_phy_write(bcm, 0x048C, (bcm43xx_phy_read(bcm, 0x048C) & 0xFF00) | 0x001E);
++		bcm43xx_phy_write(bcm, 0x048C, (bcm43xx_phy_read(bcm, 0x048C)
++				  & 0xFF00) | 0x001E);
+ 		bcm43xx_phy_write(bcm, 0x048D, 0x0002);
+ 	}
+ 
+@@ -335,7 +339,8 @@ static void bcm43xx_phy_setupg(struct bc
+ 	if (phy->rev == 1) {
+ 		bcm43xx_phy_write(bcm, 0x0406, 0x4F19);
+ 		bcm43xx_phy_write(bcm, BCM43xx_PHY_G_CRS,
+-				  (bcm43xx_phy_read(bcm, BCM43xx_PHY_G_CRS) & 0xFC3F) | 0x0340);
++				  (bcm43xx_phy_read(bcm, BCM43xx_PHY_G_CRS)
++				  & 0xFC3F) | 0x0340);
+ 		bcm43xx_phy_write(bcm, 0x042C, 0x005A);
+ 		bcm43xx_phy_write(bcm, 0x0427, 0x001A);
+ 
+Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_phy.h
+===================================================================
+--- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_phy.h
++++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_phy.h
+@@ -48,6 +48,10 @@ void bcm43xx_raw_phy_unlock(struct bcm43
+ 		local_irq_restore(flags);	\
+ 	} while (0)
+ 
++/* Card uses the loopback gain stuff */
++#define has_loopback_gain(phy) \
++        (((phy)->rev > 1) || ((phy)->connected))
++
+ u16 bcm43xx_phy_read(struct bcm43xx_private *bcm, u16 offset);
+ void bcm43xx_phy_write(struct bcm43xx_private *bcm, u16 offset, u16 val);
+ 
+Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_radio.c
+===================================================================
+--- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_radio.c
++++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_radio.c
+@@ -1343,11 +1343,110 @@ u16 bcm43xx_radio_calibrationvalue(struc
+ 	return ret;
+ }
+ 
++#define LPD(L, P, D)    (((L) << 2) | ((P) << 1) | ((D) << 0))
++static u16 bcm43xx_get_812_value(struct bcm43xx_private *bcm, u8 lpd)
++{
++	struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
++	struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
++	u16 loop_or = 0;
++	u16 adj_loopback_gain = phy->loopback_gain[0];
++	u8 loop;
++	u16 extern_lna_control;
++
++	if (!phy->connected)
++		return 0;
++	if (!has_loopback_gain(phy)) {
++		if (phy->rev < 7 || !(bcm->sprom.boardflags
++		    & BCM43xx_BFL_EXTLNA)) {
++			switch (lpd) {
++			case LPD(0, 1, 1):
++				return 0x0FB2;
++			case LPD(0, 0, 1):
++				return 0x00B2;
++			case LPD(1, 0, 1):
++				return 0x30B2;
++			case LPD(1, 0, 0):
++				return 0x30B3;
++			default:
++				assert(0);
++			}
++		} else {
++			switch (lpd) {
++			case LPD(0, 1, 1):
++				return 0x8FB2;
++			case LPD(0, 0, 1):
++				return 0x80B2;
++			case LPD(1, 0, 1):
++				return 0x20B2;
++			case LPD(1, 0, 0):
++				return 0x20B3;
++			default:
++				assert(0);
++			}
++		}
++	} else {
++		if (radio->revision == 8)
++			adj_loopback_gain += 0x003E;
++		else
++			adj_loopback_gain += 0x0026;
++		if (adj_loopback_gain >= 0x46) {
++			adj_loopback_gain -= 0x46;
++			extern_lna_control = 0x3000;
++		} else if (adj_loopback_gain >= 0x3A) {
++			adj_loopback_gain -= 0x3A;
++			extern_lna_control = 0x2000;
++		} else if (adj_loopback_gain >= 0x2E) {
++			adj_loopback_gain -= 0x2E;
++			extern_lna_control = 0x1000;
++		} else {
++			adj_loopback_gain -= 0x10;
++			extern_lna_control = 0x0000;
++		}
++		for (loop = 0; loop < 16; loop++) {
++			u16 tmp = adj_loopback_gain - 6 * loop;
++			if (tmp < 6)
++				break;
++		}
++
++		loop_or = (loop << 8) | extern_lna_control;
++		if (phy->rev >= 7 && bcm->sprom.boardflags
++		    & BCM43xx_BFL_EXTLNA) {
++			if (extern_lna_control)
++				loop_or |= 0x8000;
++			switch (lpd) {
++			case LPD(0, 1, 1):
++				return 0x8F92;
++			case LPD(0, 0, 1):
++				return (0x8092 | loop_or);
++			case LPD(1, 0, 1):
++				return (0x2092 | loop_or);
++			case LPD(1, 0, 0):
++				return (0x2093 | loop_or);
++			default:
++				assert(0);
++			}
++		} else {
++			switch (lpd) {
++			case LPD(0, 1, 1):
++				return 0x0F92;
++			case LPD(0, 0, 1):
++			case LPD(1, 0, 1):
++				return (0x0092 | loop_or);
++			case LPD(1, 0, 0):
++				return (0x0093 | loop_or);
++			default:
++				assert(0);
++			}
++		}
++	}
++	return 0;
++}
++
+ u16 bcm43xx_radio_init2050(struct bcm43xx_private *bcm)
+ {
+ 	struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
+ 	struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
+-	u16 backup[19] = { 0 };
++	u16 backup[21] = { 0 };
+ 	u16 ret;
+ 	u16 i, j;
+ 	u32 tmp1 = 0, tmp2 = 0;
+@@ -1373,19 +1472,36 @@ u16 bcm43xx_radio_init2050(struct bcm43x
+ 			backup[8] = bcm43xx_phy_read(bcm, BCM43xx_PHY_G_CRS);
+ 			backup[9] = bcm43xx_phy_read(bcm, 0x0802);
+ 			bcm43xx_phy_write(bcm, 0x0814,
+-			                  (bcm43xx_phy_read(bcm, 0x0814) | 0x0003));
++			                  (bcm43xx_phy_read(bcm, 0x0814)
++					  | 0x0003));
+ 			bcm43xx_phy_write(bcm, 0x0815,
+-			                  (bcm43xx_phy_read(bcm, 0x0815) & 0xFFFC));	
++			                  (bcm43xx_phy_read(bcm, 0x0815)
++					  & 0xFFFC));
+ 			bcm43xx_phy_write(bcm, BCM43xx_PHY_G_CRS,
+-			                  (bcm43xx_phy_read(bcm, BCM43xx_PHY_G_CRS) & 0x7FFF));
++			                  (bcm43xx_phy_read(bcm, BCM43xx_PHY_G_CRS)
++					  & 0x7FFF));
+ 			bcm43xx_phy_write(bcm, 0x0802,
+ 			                  (bcm43xx_phy_read(bcm, 0x0802) & 0xFFFC));
+-			bcm43xx_phy_write(bcm, 0x0811, 0x01B3);
+-			bcm43xx_phy_write(bcm, 0x0812, 0x0FB2);
++			if (phy->rev > 1) { /* loopback gain enabled */
++				backup[19] = bcm43xx_phy_read(bcm, 0x080F);
++				backup[20] = bcm43xx_phy_read(bcm, 0x0810);
++				if (phy->rev >= 3)
++					bcm43xx_phy_write(bcm, 0x080F, 0xC020);
++				else
++					bcm43xx_phy_write(bcm, 0x080F, 0x8020);
++				bcm43xx_phy_write(bcm, 0x0810, 0x0000);
++			}
++			bcm43xx_phy_write(bcm, 0x0812,
++					  bcm43xx_get_812_value(bcm, LPD(0, 1, 1)));
++			if (phy->rev < 7 || !(bcm->sprom.boardflags
++			    & BCM43xx_BFL_EXTLNA))
++				bcm43xx_phy_write(bcm, 0x0811, 0x01B3);
++			else
++				bcm43xx_phy_write(bcm, 0x0811, 0x09B3);
+ 		}
+-		bcm43xx_write16(bcm, BCM43xx_MMIO_PHY_RADIO,
+-		                (bcm43xx_read16(bcm, BCM43xx_MMIO_PHY_RADIO) | 0x8000));
+ 	}
++	bcm43xx_write16(bcm, BCM43xx_MMIO_PHY_RADIO,
++	                (bcm43xx_read16(bcm, BCM43xx_MMIO_PHY_RADIO) | 0x8000));
+ 	backup[10] = bcm43xx_phy_read(bcm, 0x0035);
+ 	bcm43xx_phy_write(bcm, 0x0035,
+ 	                  (bcm43xx_phy_read(bcm, 0x0035) & 0xFF7F));
+@@ -1397,10 +1513,12 @@ u16 bcm43xx_radio_init2050(struct bcm43x
+ 		bcm43xx_write16(bcm, 0x03E6, 0x0122);
+ 	} else {
+ 		if (phy->analog >= 2)
+-			bcm43xx_phy_write(bcm, 0x0003, (bcm43xx_phy_read(bcm, 0x0003)
+-					& 0xFFBF) | 0x0040);
++			bcm43xx_phy_write(bcm, 0x0003,
++					  (bcm43xx_phy_read(bcm, 0x0003)
++					  & 0xFFBF) | 0x0040);
+ 		bcm43xx_write16(bcm, BCM43xx_MMIO_CHANNEL_EXT,
+-		                (bcm43xx_read16(bcm, BCM43xx_MMIO_CHANNEL_EXT) | 0x2000));
++		                (bcm43xx_read16(bcm, BCM43xx_MMIO_CHANNEL_EXT)
++				| 0x2000));
+ 	}
+ 
+ 	ret = bcm43xx_radio_calibrationvalue(bcm);
+@@ -1408,16 +1526,25 @@ u16 bcm43xx_radio_init2050(struct bcm43x
+ 	if (phy->type == BCM43xx_PHYTYPE_B)
+ 		bcm43xx_radio_write16(bcm, 0x0078, 0x0026);
+ 
++	if (phy->connected)
++		bcm43xx_phy_write(bcm, 0x0812,
++				  bcm43xx_get_812_value(bcm, LPD(0, 1, 1)));
+ 	bcm43xx_phy_write(bcm, 0x0015, 0xBFAF);
+ 	bcm43xx_phy_write(bcm, 0x002B, 0x1403);
+ 	if (phy->connected)
+-		bcm43xx_phy_write(bcm, 0x0812, 0x00B2);
++		bcm43xx_phy_write(bcm, 0x0812,
++				  bcm43xx_get_812_value(bcm, LPD(0, 0, 1)));
+ 	bcm43xx_phy_write(bcm, 0x0015, 0xBFA0);
+ 	bcm43xx_radio_write16(bcm, 0x0051,
+ 	                      (bcm43xx_radio_read16(bcm, 0x0051) | 0x0004));
+-	bcm43xx_radio_write16(bcm, 0x0052, 0x0000);
+-	bcm43xx_radio_write16(bcm, 0x0043,
+-			      (bcm43xx_radio_read16(bcm, 0x0043) & 0xFFF0) | 0x0009);
++	if (radio->revision == 8)
++		bcm43xx_radio_write16(bcm, 0x0043, 0x001F);
++	else {
++		bcm43xx_radio_write16(bcm, 0x0052, 0x0000);
++		bcm43xx_radio_write16(bcm, 0x0043,
++				      (bcm43xx_radio_read16(bcm, 0x0043) & 0xFFF0)
++				      | 0x0009);
++	}
+ 	bcm43xx_phy_write(bcm, 0x0058, 0x0000);
+ 
+ 	for (i = 0; i < 16; i++) {
+@@ -1425,21 +1552,25 @@ u16 bcm43xx_radio_init2050(struct bcm43x
+ 		bcm43xx_phy_write(bcm, 0x0059, 0xC810);
+ 		bcm43xx_phy_write(bcm, 0x0058, 0x000D);
+ 		if (phy->connected)
+-			bcm43xx_phy_write(bcm, 0x0812, 0x30B2);
++			bcm43xx_phy_write(bcm, 0x0812,
++					  bcm43xx_get_812_value(bcm, LPD(1, 0, 1)));
+ 		bcm43xx_phy_write(bcm, 0x0015, 0xAFB0);
+ 		udelay(10);
+ 		if (phy->connected)
+-			bcm43xx_phy_write(bcm, 0x0812, 0x30B2);
++			bcm43xx_phy_write(bcm, 0x0812,
++					  bcm43xx_get_812_value(bcm, LPD(1, 0, 1)));
+ 		bcm43xx_phy_write(bcm, 0x0015, 0xEFB0);
+ 		udelay(10);
+ 		if (phy->connected)
+-			bcm43xx_phy_write(bcm, 0x0812, 0x30B2);
++			bcm43xx_phy_write(bcm, 0x0812,
++					  bcm43xx_get_812_value(bcm, LPD(1, 0, 0)));
+ 		bcm43xx_phy_write(bcm, 0x0015, 0xFFF0);
+-		udelay(10);
++		udelay(20);
+ 		tmp1 += bcm43xx_phy_read(bcm, 0x002D);
+ 		bcm43xx_phy_write(bcm, 0x0058, 0x0000);
+ 		if (phy->connected)
+-			bcm43xx_phy_write(bcm, 0x0812, 0x30B2);
++			bcm43xx_phy_write(bcm, 0x0812,
++					  bcm43xx_get_812_value(bcm, LPD(1, 0, 1)));
+ 		bcm43xx_phy_write(bcm, 0x0015, 0xAFB0);
+ 	}
+ 
+@@ -1457,21 +1588,29 @@ u16 bcm43xx_radio_init2050(struct bcm43x
+ 			bcm43xx_phy_write(bcm, 0x0059, 0xC810);
+ 			bcm43xx_phy_write(bcm, 0x0058, 0x000D);
+ 			if (phy->connected)
+-				bcm43xx_phy_write(bcm, 0x0812, 0x30B2);
++				bcm43xx_phy_write(bcm, 0x0812,
++						  bcm43xx_get_812_value(bcm,
++						  LPD(1, 0, 1)));
+ 			bcm43xx_phy_write(bcm, 0x0015, 0xAFB0);
+ 			udelay(10);
+ 			if (phy->connected)
+-				bcm43xx_phy_write(bcm, 0x0812, 0x30B2);
++				bcm43xx_phy_write(bcm, 0x0812,
++						  bcm43xx_get_812_value(bcm,
++						  LPD(1, 0, 1)));
+ 			bcm43xx_phy_write(bcm, 0x0015, 0xEFB0);
+ 			udelay(10);
+ 			if (phy->connected)
+-				bcm43xx_phy_write(bcm, 0x0812, 0x30B3); /* 0x30B3 is not a typo */
++				bcm43xx_phy_write(bcm, 0x0812,
++						  bcm43xx_get_812_value(bcm,
++						  LPD(1, 0, 0)));
+ 			bcm43xx_phy_write(bcm, 0x0015, 0xFFF0);
+ 			udelay(10);
+ 			tmp2 += bcm43xx_phy_read(bcm, 0x002D);
+ 			bcm43xx_phy_write(bcm, 0x0058, 0x0000);
+ 			if (phy->connected)
+-				bcm43xx_phy_write(bcm, 0x0812, 0x30B2);
++				bcm43xx_phy_write(bcm, 0x0812,
++						  bcm43xx_get_812_value(bcm,
++						  LPD(1, 0, 1)));
+ 			bcm43xx_phy_write(bcm, 0x0015, 0xAFB0);
+ 		}
+ 		tmp2++;
+@@ -1497,15 +1636,20 @@ u16 bcm43xx_radio_init2050(struct bcm43x
+ 		bcm43xx_phy_write(bcm, 0x0030, backup[2]);
+ 		bcm43xx_write16(bcm, 0x03EC, backup[3]);
+ 	} else {
+-		bcm43xx_write16(bcm, BCM43xx_MMIO_PHY_RADIO,
+-				(bcm43xx_read16(bcm, BCM43xx_MMIO_PHY_RADIO) & 0x7FFF));
+ 		if (phy->connected) {
++			bcm43xx_write16(bcm, BCM43xx_MMIO_PHY_RADIO,
++					(bcm43xx_read16(bcm,
++					BCM43xx_MMIO_PHY_RADIO) & 0x7FFF));
+ 			bcm43xx_phy_write(bcm, 0x0811, backup[4]);
+ 			bcm43xx_phy_write(bcm, 0x0812, backup[5]);
+ 			bcm43xx_phy_write(bcm, 0x0814, backup[6]);
+ 			bcm43xx_phy_write(bcm, 0x0815, backup[7]);
+ 			bcm43xx_phy_write(bcm, BCM43xx_PHY_G_CRS, backup[8]);
+ 			bcm43xx_phy_write(bcm, 0x0802, backup[9]);
++			if (phy->rev > 1) {
++				bcm43xx_phy_write(bcm, 0x080F, backup[19]);
++				bcm43xx_phy_write(bcm, 0x0810, backup[20]);
++			}
+ 		}
+ 	}
+ 	if (i >= 15)
+Index: linux-2.6/net/ieee80211/ieee80211_crypt.c
+===================================================================
+--- linux-2.6.orig/net/ieee80211/ieee80211_crypt.c
++++ linux-2.6/net/ieee80211/ieee80211_crypt.c
+@@ -1,7 +1,7 @@
+ /*
+  * Host AP crypto routines
+  *
+- * Copyright (c) 2002-2003, Jouni Malinen <jkmaline at cc.hut.fi>
++ * Copyright (c) 2002-2003, Jouni Malinen <j at w1.fi>
+  * Portions Copyright (C) 2004, Intel Corporation <jketreno at linux.intel.com>
+  *
+  * This program is free software; you can redistribute it and/or modify
+Index: linux-2.6/net/ieee80211/ieee80211_crypt_ccmp.c
+===================================================================
+--- linux-2.6.orig/net/ieee80211/ieee80211_crypt_ccmp.c
++++ linux-2.6/net/ieee80211/ieee80211_crypt_ccmp.c
+@@ -1,7 +1,7 @@
+ /*
+  * Host AP crypt: host-based CCMP encryption implementation for Host AP driver
+  *
+- * Copyright (c) 2003-2004, Jouni Malinen <jkmaline at cc.hut.fi>
++ * Copyright (c) 2003-2004, Jouni Malinen <j at w1.fi>
+  *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of the GNU General Public License version 2 as
+@@ -338,7 +338,7 @@ static int ieee80211_ccmp_decrypt(struct
+ 
+ 	if (ccmp_replay_check(pn, key->rx_pn)) {
+ 		if (net_ratelimit()) {
+-			printk(KERN_DEBUG "CCMP: replay detected: STA=" MAC_FMT
++			IEEE80211_DEBUG_DROP("CCMP: replay detected: STA=" MAC_FMT
+ 			       " previous PN %02x%02x%02x%02x%02x%02x "
+ 			       "received PN %02x%02x%02x%02x%02x%02x\n",
+ 			       MAC_ARG(hdr->addr2), MAC_ARG(key->rx_pn),
+Index: linux-2.6/net/ieee80211/ieee80211_crypt_tkip.c
+===================================================================
+--- linux-2.6.orig/net/ieee80211/ieee80211_crypt_tkip.c
++++ linux-2.6/net/ieee80211/ieee80211_crypt_tkip.c
+@@ -1,7 +1,7 @@
+ /*
+  * Host AP crypt: host-based TKIP encryption implementation for Host AP driver
+  *
+- * Copyright (c) 2003-2004, Jouni Malinen <jkmaline at cc.hut.fi>
++ * Copyright (c) 2003-2004, Jouni Malinen <j at w1.fi>
+  *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of the GNU General Public License version 2 as
+@@ -465,7 +465,7 @@ static int ieee80211_tkip_decrypt(struct
+ 
+ 	if (tkip_replay_check(iv32, iv16, tkey->rx_iv32, tkey->rx_iv16)) {
+ 		if (net_ratelimit()) {
+-			printk(KERN_DEBUG "TKIP: replay detected: STA=" MAC_FMT
++			IEEE80211_DEBUG_DROP("TKIP: replay detected: STA=" MAC_FMT
+ 			       " previous TSC %08x%04x received TSC "
+ 			       "%08x%04x\n", MAC_ARG(hdr->addr2),
+ 			       tkey->rx_iv32, tkey->rx_iv16, iv32, iv16);
+@@ -507,7 +507,7 @@ static int ieee80211_tkip_decrypt(struct
+ 			tkey->rx_phase1_done = 0;
+ 		}
+ 		if (net_ratelimit()) {
+-			printk(KERN_DEBUG "TKIP: ICV error detected: STA="
++			IEEE80211_DEBUG_DROP("TKIP: ICV error detected: STA="
+ 			       MAC_FMT "\n", MAC_ARG(hdr->addr2));
+ 		}
+ 		tkey->dot11RSNAStatsTKIPICVErrors++;
+Index: linux-2.6/net/ieee80211/ieee80211_crypt_wep.c
+===================================================================
+--- linux-2.6.orig/net/ieee80211/ieee80211_crypt_wep.c
++++ linux-2.6/net/ieee80211/ieee80211_crypt_wep.c
+@@ -1,7 +1,7 @@
+ /*
+  * Host AP crypt: host-based WEP encryption implementation for Host AP driver
+  *
+- * Copyright (c) 2002-2004, Jouni Malinen <jkmaline at cc.hut.fi>
++ * Copyright (c) 2002-2004, Jouni Malinen <j at w1.fi>
+  *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of the GNU General Public License version 2 as
+Index: linux-2.6/net/ieee80211/ieee80211_module.c
+===================================================================
+--- linux-2.6.orig/net/ieee80211/ieee80211_module.c
++++ linux-2.6/net/ieee80211/ieee80211_module.c
+@@ -5,8 +5,8 @@
+   Portions of this file are based on the WEP enablement code provided by the
+   Host AP project hostap-drivers v0.1.3
+   Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
+-  <jkmaline at cc.hut.fi>
+-  Copyright (c) 2002-2003, Jouni Malinen <jkmaline at cc.hut.fi>
++  <j at w1.fi>
++  Copyright (c) 2002-2003, Jouni Malinen <j at w1.fi>
+ 
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of version 2 of the GNU General Public License as
+Index: linux-2.6/net/ieee80211/ieee80211_rx.c
+===================================================================
+--- linux-2.6.orig/net/ieee80211/ieee80211_rx.c
++++ linux-2.6/net/ieee80211/ieee80211_rx.c
+@@ -3,8 +3,8 @@
+  * for Intersil Prism2/2.5/3 - hostap.o module, common routines
+  *
+  * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
+- * <jkmaline at cc.hut.fi>
+- * Copyright (c) 2002-2003, Jouni Malinen <jkmaline at cc.hut.fi>
++ * <j at w1.fi>
++ * Copyright (c) 2002-2003, Jouni Malinen <j at w1.fi>
+  * Copyright (c) 2004-2005, Intel Corporation
+  *
+  * This program is free software; you can redistribute it and/or modify
+Index: linux-2.6/net/ieee80211/ieee80211_wx.c
+===================================================================
+--- linux-2.6.orig/net/ieee80211/ieee80211_wx.c
++++ linux-2.6/net/ieee80211/ieee80211_wx.c
+@@ -5,8 +5,8 @@
+   Portions of this file are based on the WEP enablement code provided by the
+   Host AP project hostap-drivers v0.1.3
+   Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
+-  <jkmaline at cc.hut.fi>
+-  Copyright (c) 2002-2003, Jouni Malinen <jkmaline at cc.hut.fi>
++  <j at w1.fi>
++  Copyright (c) 2002-2003, Jouni Malinen <j at w1.fi>
+ 
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of version 2 of the GNU General Public License as
================================================================


More information about the pld-cvs-commit mailing list