brcm47xx: b44 fix workaround detection on some brcm47xx boards

Because of api change of nvram_getenv, the workaround failed to detect the hardware.

Based on patch by b.sander

Fixes #11268.

SVN-Revision: 31470
This commit is contained in:
Hauke Mehrtens 2012-04-24 20:35:46 +00:00
parent 1f489e4084
commit b07998cf11

View file

@ -1,29 +1,22 @@
--- a/drivers/net/ethernet/broadcom/b44.c --- a/drivers/net/ethernet/broadcom/b44.c
+++ b/drivers/net/ethernet/broadcom/b44.c +++ b/drivers/net/ethernet/broadcom/b44.c
@@ -410,10 +410,41 @@ static void b44_wap54g10_workaround(stru @@ -410,10 +410,34 @@ static void b44_wap54g10_workaround(stru
error: error:
pr_warning("PHY: cannot reset MII transceiver isolate bit\n"); pr_warning("PHY: cannot reset MII transceiver isolate bit\n");
} }
+ +
+static inline int startswith (const char *source, const char *cmp) +static void b44_bcm47xx_workarounds(struct b44 *bp)
+{
+ return !strncmp(source,cmp,strlen(cmp));
+}
+
+static inline void b44_bcm47xx_workarounds(struct b44 *bp)
+{ +{
+ char buf[20]; + char buf[20];
+ struct ssb_device *sdev = bp->sdev;
+
+ /* Toshiba WRC-1000, Siemens SE505 v1, Askey RT-210W, RT-220W */ + /* Toshiba WRC-1000, Siemens SE505 v1, Askey RT-210W, RT-220W */
+ if (nvram_getenv("boardnum", buf, sizeof(buf)) > 0) + if (sdev->bus->sprom.board_num == 100) {
+ return;
+ if (simple_strtoul(buf, NULL, 0) == 100) {
+ bp->phy_addr = B44_PHY_ADDR_NO_PHY; + bp->phy_addr = B44_PHY_ADDR_NO_PHY;
+ } else { + } else {
+ /* WL-HDD */ + /* WL-HDD */
+ struct ssb_device *sdev = bp->sdev; + if (nvram_getenv("hardware_version", buf, sizeof(buf)) >= 0 &&
+ if (nvram_getenv("hardware_version", buf, sizeof(buf)) > 0) + !strncmp(buf, "WL300-", strlen("WL300-"))) {
+ return;
+ if (startswith(buf, "WL300-")) {
+ if (sdev->bus->sprom.et0phyaddr == 0 && + if (sdev->bus->sprom.et0phyaddr == 0 &&
+ sdev->bus->sprom.et1phyaddr == 1) + sdev->bus->sprom.et1phyaddr == 1)
+ bp->phy_addr = B44_PHY_ADDR_NO_PHY; + bp->phy_addr = B44_PHY_ADDR_NO_PHY;
@ -42,7 +35,7 @@
#endif #endif
static int b44_setup_phy(struct b44 *bp) static int b44_setup_phy(struct b44 *bp)
@@ -422,6 +453,7 @@ static int b44_setup_phy(struct b44 *bp) @@ -422,6 +446,7 @@ static int b44_setup_phy(struct b44 *bp)
int err; int err;
b44_wap54g10_workaround(bp); b44_wap54g10_workaround(bp);
@ -50,7 +43,7 @@
if (bp->phy_addr == B44_PHY_ADDR_NO_PHY) if (bp->phy_addr == B44_PHY_ADDR_NO_PHY)
return 0; return 0;
@@ -2088,6 +2120,8 @@ static int __devinit b44_get_invariants( @@ -2088,6 +2113,8 @@ static int __devinit b44_get_invariants(
* valid PHY address. */ * valid PHY address. */
bp->phy_addr &= 0x1F; bp->phy_addr &= 0x1F;