[package] fix nvram_get checking on non-WGT634U (#4975)
[openwrt/svn-archive/archive.git] / package / switch / src / switch-robo.c
index 5bcd85bd158b3b2599e92e8db5f09d570832c417..21343edf0ae6f8bb3530d7cabbb87d121ea12261 100644 (file)
@@ -41,6 +41,7 @@
 
 #define ROBO_PHY_ADDR          0x1E    /* robo switch phy address */
 #define ROBO_PHY_ADDR_TG3      0x01    /* Tigon3 PHY address */
+#define ROBO_PHY_ADDR_BCM63XX  0x00    /* BCM63XX PHY address */
 
 /* MII registers */
 #define REG_MII_PAGE   0x10    /* MII Page register */
 #define SIOCGETCPHYRD           (SIOCDEVPRIVATE + 9)
 #define SIOCSETCPHYWR           (SIOCDEVPRIVATE + 10)
 
+/* linux 2.4 does not have 'bool' */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+#define bool int
+#endif
+
+
+extern char *nvram_get(const char *name);
+#define getvar(str) (nvram_get(str)?:"")
 
 /* Data structure for a Roboswitch device. */
 struct robo_switch {
@@ -266,8 +275,9 @@ static int robo_switch_enable(void)
                        robo_write16(ROBO_CTRL_PAGE, i, 0);
        }
 
-       /* WAN port LED */
-       robo_write16(ROBO_CTRL_PAGE, 0x16, 0x1F);
+       /* WAN port LED, except for Netgear WGT634U */
+       if (strcmp(getvar("nvram_type"), "cfe") != 0)
+               robo_write16(ROBO_CTRL_PAGE, 0x16, 0x1F);
 
        return 0;
 }
@@ -292,7 +302,11 @@ static int robo_probe(char *devname)
        printk(KERN_INFO PFX "Probing device %s: ", devname);
        strcpy(robo.ifr.ifr_name, devname);
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
        if ((robo.dev = dev_get_by_name(devname)) == NULL) {
+#else
+       if ((robo.dev = dev_get_by_name(&init_net, devname)) == NULL) {
+#endif
                printk("No such device\n");
                return 1;
        }
@@ -310,13 +324,14 @@ static int robo_probe(char *devname)
                /* got phy address check for robo address */
                struct mii_ioctl_data *mii = (struct mii_ioctl_data *) &robo.ifr.ifr_data;
                if ((mii->phy_id != ROBO_PHY_ADDR) &&
+                   (mii->phy_id != ROBO_PHY_ADDR_BCM63XX) &&
                    (mii->phy_id != ROBO_PHY_ADDR_TG3)) {
                        printk("Invalid phy address (%d)\n", mii->phy_id);
                        return 1;
                }
                robo.use_et = 0;
                /* The robo has a fixed PHY address that is different from the
-                * Tigon3 PHY address. */
+                * Tigon3 and BCM63xx PHY address. */
                robo.phy_addr = ROBO_PHY_ADDR;
        }
 
@@ -324,7 +339,7 @@ static int robo_probe(char *devname)
                (mdio_read(robo.phy_addr, 0x3) << 16);
 
        if (phyid == 0xffffffff || phyid == 0x55210022) {
-               printk("No Robo switch in managed mode found\n");
+               printk("No Robo switch in managed mode found, phy_id = 0x%08x\n", phyid);
                return 1;
        }
 
@@ -520,7 +535,8 @@ static int __init robo_init(void)
 
        device = strdup("ethX");
        for (device[3] = '0'; (device[3] <= '3') && notfound; device[3]++) {
-               notfound = robo_probe(device);
+               if (! switch_device_registered (device))
+                       notfound = robo_probe(device);
        }
        device[3]--;