diff options
Diffstat (limited to 'target/linux/brcm47xx/patches-3.2/210-b44_phy_fix.patch')
| -rw-r--r-- | target/linux/brcm47xx/patches-3.2/210-b44_phy_fix.patch | 61 | 
1 files changed, 61 insertions, 0 deletions
| diff --git a/target/linux/brcm47xx/patches-3.2/210-b44_phy_fix.patch b/target/linux/brcm47xx/patches-3.2/210-b44_phy_fix.patch new file mode 100644 index 000000000..d9cf29f6e --- /dev/null +++ b/target/linux/brcm47xx/patches-3.2/210-b44_phy_fix.patch @@ -0,0 +1,61 @@ +--- a/drivers/net/ethernet/broadcom/b44.c ++++ b/drivers/net/ethernet/broadcom/b44.c +@@ -410,10 +410,41 @@ static void b44_wap54g10_workaround(stru + error: + 	pr_warning("PHY: cannot reset MII transceiver isolate bit\n"); + } ++ ++static inline int startswith (const char *source, const char *cmp)  ++{  ++       return !strncmp(source,cmp,strlen(cmp));  ++} ++ ++static inline void b44_bcm47xx_workarounds(struct b44 *bp) ++{ ++	char buf[20]; ++	/* Toshiba WRC-1000, Siemens SE505 v1, Askey RT-210W, RT-220W */ ++	if (nvram_getenv("boardnum", buf, sizeof(buf)) > 0) ++		return; ++	if (simple_strtoul(buf, NULL, 0) == 100) { ++		bp->phy_addr = B44_PHY_ADDR_NO_PHY; ++	} else { ++		/* WL-HDD */ ++		struct ssb_device *sdev = bp->sdev; ++		if (nvram_getenv("hardware_version", buf, sizeof(buf)) > 0) ++			return; ++		if (startswith(buf, "WL300-")) { ++			if (sdev->bus->sprom.et0phyaddr == 0 && ++			    sdev->bus->sprom.et1phyaddr == 1) ++				bp->phy_addr = B44_PHY_ADDR_NO_PHY; ++		} ++	} ++	return; ++} + #else + static inline void b44_wap54g10_workaround(struct b44 *bp) + { + } ++ ++static inline void b44_bcm47xx_workarounds(struct b44 *bp) ++{ ++} + #endif +  + static int b44_setup_phy(struct b44 *bp) +@@ -422,6 +453,7 @@ static int b44_setup_phy(struct b44 *bp) + 	int err; +  + 	b44_wap54g10_workaround(bp); ++	b44_bcm47xx_workarounds(bp); +  + 	if (bp->phy_addr == B44_PHY_ADDR_NO_PHY) + 		return 0; +@@ -2088,6 +2120,8 @@ static int __devinit b44_get_invariants( + 	 * valid PHY address. */ + 	bp->phy_addr &= 0x1F; +  ++	b44_bcm47xx_workarounds(bp); ++ + 	memcpy(bp->dev->dev_addr, addr, 6); +  + 	if (!is_valid_ether_addr(&bp->dev->dev_addr[0])){ | 
