X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/3814202702cc6ab529c1a0977ea5615c87ce48a8..ad43258cc7f1a0094cb61ea6df1cef590926a173:/package/switch/src/switch-robo.c diff --git a/package/switch/src/switch-robo.c b/package/switch/src/switch-robo.c index 5bcd85bd1..a0051a32f 100644 --- a/package/switch/src/switch-robo.c +++ b/package/switch/src/switch-robo.c @@ -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 */ @@ -62,6 +63,18 @@ #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 + +/* Only available on brcm-2.4/brcm47xx */ +#ifdef BROADCOM +extern char *nvram_get(const char *name); +#define getvar(str) (nvram_get(str)?:"") +#else +#define getvar(str) "" +#endif /* Data structure for a Roboswitch device. */ struct robo_switch { @@ -266,8 +279,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 +306,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 +328,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 +343,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 +539,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]--;