brcm47xx: b44 fix workaround detection on some brcm47xx boards
authorhauke <hauke@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Tue, 24 Apr 2012 20:35:46 +0000 (20:35 +0000)
committerhauke <hauke@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Tue, 24 Apr 2012 20:35:46 +0000 (20:35 +0000)
Because of api change of nvram_getenv, the workaround failed to detect the hardware.

Based on patch by b.sander

Fixes #11268.

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@31470 3c298f89-4303-0410-b956-a3cf2f4a3e73

target/linux/brcm47xx/patches-3.2/210-b44_phy_fix.patch

index d9cf29f..2d05365 100644 (file)
@@ -1,29 +1,22 @@
 --- a/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:
        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)
++static void b44_bcm47xx_workarounds(struct b44 *bp)
 +{
 +      char buf[20];
++      struct ssb_device *sdev = bp->sdev;
++
 +      /* 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) {
++      if (sdev->bus->sprom.board_num == 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 (nvram_getenv("hardware_version", buf, sizeof(buf)) >= 0 &&
++                  !strncmp(buf, "WL300-", strlen("WL300-"))) {
 +                      if (sdev->bus->sprom.et0phyaddr == 0 &&
 +                          sdev->bus->sprom.et1phyaddr == 1)
 +                              bp->phy_addr = B44_PHY_ADDR_NO_PHY;
@@ -42,7 +35,7 @@
  #endif
  
  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;
  
        b44_wap54g10_workaround(bp);
@@ -50,7 +43,7 @@
  
        if (bp->phy_addr == B44_PHY_ADDR_NO_PHY)
                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. */
        bp->phy_addr &= 0x1F;