make etehrent work on wrt350n, thx sn9
authorJohn Crispin <john@openwrt.org>
Thu, 29 Oct 2009 21:26:36 +0000 (21:26 +0000)
committerJohn Crispin <john@openwrt.org>
Thu, 29 Oct 2009 21:26:36 +0000 (21:26 +0000)
SVN-Revision: 18214

package/switch/src/switch-robo.c
target/linux/brcm-2.4/base-files/etc/preinit.arch

index 206359d07bd5511f66f8842a8b91a876fc7b9bd5..481bb76a5b5b21b95769daf018a5761c6cddb8ea 100644 (file)
@@ -58,6 +58,7 @@
 #define  ROBO_DEVICE_ID_5395   0x95
 #define  ROBO_DEVICE_ID_5397   0x97
 #define  ROBO_DEVICE_ID_5398   0x98
+#define  ROBO_DEVICE_ID_53115  0x3115
 
 /* Private et.o ioctls */
 #define SIOCGETCPHYRD           (SIOCDEVPRIVATE + 9)
@@ -297,6 +298,7 @@ static void robo_switch_reset(void)
            (robo.devid == ROBO_DEVICE_ID_5398)) {
                /* Trigger a software reset. */
                robo_write16(ROBO_CTRL_PAGE, 0x79, 0x83);
+               mdelay(500);
                robo_write16(ROBO_CTRL_PAGE, 0x79, 0);
        }
 }
@@ -367,7 +369,8 @@ static int robo_probe(char *devname)
        if (err)
                return err;
 
-       printk("found!\n");
+       printk("found a 5%s%x!%s\n", robo.devid & 0xff00 ? "" : "3", robo.devid,
+               robo.is_5350 ? " It's a 5350." : "");
        return 0;
 }
 
@@ -445,6 +448,17 @@ static int handle_vlan_port_write(void *driver, char *buf, int nr)
        }
 
        /* write config now */
+
+       if (robo.devid != ROBO_DEVICE_ID_5325) {
+               __u8 regoff = ((robo.devid == ROBO_DEVICE_ID_5395) ||
+                       (robo.devid == ROBO_DEVICE_ID_53115)) ? 0x20 : 0;
+
+               robo_write32(ROBO_ARLIO_PAGE, 0x63 + regoff, (c->untag << 9) | c->port);
+               robo_write16(ROBO_ARLIO_PAGE, 0x61 + regoff, nr);
+               robo_write16(ROBO_ARLIO_PAGE, 0x60 + regoff, 1 << 7);
+               return 0;
+       }
+
        val16 = (nr) /* vlan */ | (1 << 12) /* write */ | (1 << 13) /* enable */;
        if (robo.is_5350) {
                robo_write32(ROBO_VLAN_PAGE, ROBO_VLAN_WRITE_5350,
@@ -486,7 +500,12 @@ static int handle_enable_vlan_write(void *driver, char *buf, int nr)
        robo_write16(ROBO_VLAN_PAGE, ROBO_VLAN_CTRL0, disable ? 0 :
                (1 << 7) /* 802.1Q VLAN */ | (3 << 5) /* mac check and hash */);
        robo_write16(ROBO_VLAN_PAGE, ROBO_VLAN_CTRL1, disable ? 0 :
-               (1 << 1) | (1 << 2) | (1 << 3) /* RSV multicast */);
+               (robo.devid == ROBO_DEVICE_ID_5325 ? (1 << 1) : 0) | /* RSV multicast */
+               robo_read16(ROBO_VLAN_PAGE, ROBO_VLAN_CTRL0) | (1 << 2) | (1 << 3));
+
+       if (robo.devid != ROBO_DEVICE_ID_5325)
+               return 0;
+
        robo_write16(ROBO_VLAN_PAGE, ROBO_VLAN_CTRL4, disable ? 0 :
                (1 << 6) /* drop invalid VID frames */);
        robo_write16(ROBO_VLAN_PAGE, ROBO_VLAN_CTRL5, disable ? 0 :
@@ -585,6 +604,10 @@ static int __init robo_init(void)
                        .port_handlers          = NULL,
                        .vlan_handlers          = vlan,
                };
+               if (robo.devid != ROBO_DEVICE_ID_5325) {
+                       driver.ports = 9;
+                       driver.cpuport = 8;
+               }
 
                return switch_register_driver(&driver);
        }
index 25d11d96ab417b69c79aace5a233f47a6d856ac1..a90d314e256ec13743506e45b2d750780ecaf711 100755 (executable)
@@ -37,8 +37,6 @@ case "$(cat /proc/diag/model)" in
        "Sitecom WL-105b") ifname=eth1;;
 esac
 
-failsafe_ip
-
 check_module () {
   module="$1"; shift; params="$*"
 
@@ -48,11 +46,14 @@ check_module () {
   return $?
 }
 
+check_module tg3
 insmod switch-core
 check_module switch-robo || check_module switch-adm  || { 
   check_module bcm57xx activate_gpio=0x4 && cpu_port="8u*"
 } || rmmod switch-core
 
+failsafe_ip
+
 [ -d /proc/switch/eth0 ] && {
        echo 1 > /proc/switch/eth0/reset