X-Git-Url: http://git.rohieb.name/openwrt.git/blobdiff_plain/8e2a30f6f4baf326b0446f3d0d9978cd15e6a847..013e04a018a55287faff4ec9f5fe3305525e03cd:/openwrt/target/linux/package/switch/src/switch-robo.c diff --git a/openwrt/target/linux/package/switch/src/switch-robo.c b/openwrt/target/linux/package/switch/src/switch-robo.c index 63110d7c9..7e4c4de29 100644 --- a/openwrt/target/linux/package/switch/src/switch-robo.c +++ b/openwrt/target/linux/package/switch/src/switch-robo.c @@ -55,6 +55,7 @@ static int use_et = 0; static int is_5350 = 0; static struct ifreq ifr; static struct net_device *dev; +static unsigned char port[6] = { 0, 1, 2, 3, 4, 8 }; static int do_ioctl(int cmd, void *buf) { @@ -278,8 +279,15 @@ static int handle_vlan_port_read(void *driver, char *buf, int nr) if ((val32 & (1 << 20)) /* valid */) { for (j = 0; j < 6; j++) { if (val32 & (1 << j)) { - len += sprintf(buf + len, "%d%s\t", j, - (val32 & (1 << (j + 6))) ? (j == 5 ? "u" : "") : "t"); + len += sprintf(buf + len, "%d", j); + if (val32 & (1 << (j + 6))) { + if (j == 5) buf[len++] = 'u'; + } else { + buf[len++] = 't'; + if (robo_read16(ROBO_VLAN_PAGE, ROBO_VLAN_PORT0_DEF_TAG + (j << 1)) == nr) + buf[len++] = '*'; + } + buf[len++] = '\t'; } } len += sprintf(buf + len, "\n"); @@ -291,8 +299,15 @@ static int handle_vlan_port_read(void *driver, char *buf, int nr) if ((val16 & (1 << 14)) /* valid */) { for (j = 0; j < 6; j++) { if (val16 & (1 << j)) { - len += sprintf(buf + len, "%d%s\t", j, (val16 & (1 << (j + 7))) ? - (j == 5 ? "u" : "") : "t"); + len += sprintf(buf + len, "%d", j); + if (val16 & (1 << (j + 7))) { + if (j == 5) buf[len++] = 'u'; + } else { + buf[len++] = 't'; + if (robo_read16(ROBO_VLAN_PAGE, ROBO_VLAN_PORT0_DEF_TAG + (j << 1)) == nr) + buf[len++] = '*'; + } + buf[len++] = '\t'; } } len += sprintf(buf + len, "\n"); @@ -392,7 +407,13 @@ static int handle_reset(void *driver, char *buf, int nr) robo_write16(ROBO_VLAN_PAGE, ROBO_VLAN_WRITE, 0); robo_write16(ROBO_VLAN_PAGE, (is_5350 ? ROBO_VLAN_TABLE_ACCESS_5350 : ROBO_VLAN_TABLE_ACCESS), val16); } - + + /* reset ports to a known good state */ + for (j = 0; j < d->ports; j++) { + robo_write16(ROBO_CTRL_PAGE, port[j], 0x0000); + robo_write16(ROBO_VLAN_PAGE, ROBO_VLAN_PORT0_DEF_TAG + (j << 1), 0); + } + /* enable switching */ set_switch(1); @@ -415,7 +436,7 @@ static int __init robo_init() if (notfound) return -ENODEV; else { - switch_config main[] = { + switch_config cfg[] = { {"enable", handle_enable_read, handle_enable_write}, {"enable_vlan", handle_enable_vlan_read, handle_enable_vlan_write}, {"reset", NULL, handle_reset}, @@ -432,7 +453,7 @@ static int __init robo_init() cpuport: 5, ports: 6, vlans: 16, - driver_handlers: main, + driver_handlers: cfg, port_handlers: NULL, vlan_handlers: vlan, };