Changeset 2925


Ignore:
Timestamp:
2006-01-11T23:57:52+01:00 (12 years ago)
Author:
nbd
Message:

switch driver updates and fixes

Location:
trunk/openwrt/target/linux/package/switch/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/openwrt/target/linux/package/switch/src/switch-adm.c

    r2819 r2925  
    3333 
    3434#define DRIVER_NAME "adm6996" 
     35#define DRIVER_VERSION "0.01" 
    3536 
    3637static int eecs = 2; 
     
    5859#define adm_write32(cs, i) { uint32 val = hton32(i); adm_write(cs, (__u8 *)&val, sizeof(val)*8); } 
    5960 
    60  
    61 extern int getintvar(char **vars, char *name); 
     61#define atoi(str) simple_strtoul(((str != NULL) ? str : ""), NULL, 0) 
     62 
     63extern char *nvram_get(char *name); 
    6264 
    6365 
     
    443445 
    444446#if defined(BCMGPIO2) || defined(BCMGPIO) 
    445 #ifdef LINUX_2_4 
    446         int boardflags = getintvar(NULL, "boardflags"); 
    447 #else 
    448         extern int boardflags; 
    449 #endif 
     447        int boardflags = atoi(nvram_get("boardflags")); 
     448 
    450449        if ((boardflags & 0x80) || force) 
    451450                ret = 1; 
     
    455454        ret = 1; 
    456455#endif 
    457         if (ret == 1) { 
    458                 int i = adm_rreg(0, 0); 
    459                 if ((i == 0) || (i == 0xffff)) { 
    460                         printk("No ADM6996 chip detected.\n"); 
    461                         ret = 0; 
    462                 } 
    463         } 
    464456 
    465457        return ret; 
     
    476468        }; 
    477469        switch_config port[] = { 
    478                 {"enabled", handle_port_enable_read, handle_port_enable_write}, 
     470                {"enable", handle_port_enable_read, handle_port_enable_write}, 
    479471                {"media", handle_port_media_read, handle_port_media_write}, 
    480472                {NULL, NULL, NULL} 
     
    486478        switch_driver driver = { 
    487479                name: DRIVER_NAME, 
     480                version: DRIVER_VERSION, 
    488481                interface: "eth0", 
    489482                ports: 6, 
  • trunk/openwrt/target/linux/package/switch/src/switch-core.c

    r2819 r2925  
    132132} 
    133133 
    134 static void add_handlers(switch_driver *driver, switch_config *handlers, struct proc_dir_entry *parent, int nr) 
     134static int handle_driver_name(void *driver, char *buf, int nr) 
     135{ 
     136        char *name = ((switch_driver *) driver)->name; 
     137        return sprintf(buf, "%s\n", name); 
     138} 
     139 
     140static int handle_driver_version(void *driver, char *buf, int nr) 
     141{ 
     142        char *version = ((switch_driver *) driver)->version; 
     143        strcpy(buf, version); 
     144        return sprintf(buf, "%s\n", version); 
     145} 
     146 
     147static void add_handler(switch_driver *driver, switch_config *handler, struct proc_dir_entry *parent, int nr) 
    135148{ 
    136149        switch_priv *priv = (switch_priv *) driver->data; 
     150        struct proc_dir_entry *p; 
     151        int mode; 
     152 
    137153        switch_proc_handler *tmp; 
    138         int i, mode; 
    139         struct proc_dir_entry *p; 
     154        tmp = (switch_proc_handler *) kmalloc(sizeof(switch_proc_handler), GFP_KERNEL); 
     155        INIT_LIST_HEAD(&tmp->list); 
     156        tmp->parent = parent; 
     157        tmp->nr = nr; 
     158        tmp->driver = driver; 
     159        memcpy(&tmp->handler, handler, sizeof(switch_config)); 
     160        list_add(&tmp->list, &priv->data.list); 
     161         
     162        mode = 0; 
     163        if (handler->read != NULL) mode |= S_IRUSR; 
     164        if (handler->write != NULL) mode |= S_IWUSR; 
     165         
     166        if ((p = create_proc_entry(handler->name, mode, parent)) != NULL) { 
     167                p->data = (void *) tmp; 
     168                p->proc_fops = &switch_proc_fops; 
     169        } 
     170} 
     171 
     172static inline void add_handlers(switch_driver *driver, switch_config *handlers, struct proc_dir_entry *parent, int nr) 
     173{ 
     174        int i; 
    140175         
    141176        for (i = 0; handlers[i].name != NULL; i++) { 
    142                 tmp = kmalloc(sizeof(switch_proc_handler), GFP_KERNEL); 
    143                 INIT_LIST_HEAD(&tmp->list); 
    144                 tmp->parent = parent; 
    145                 tmp->nr = nr; 
    146                 tmp->driver = driver; 
    147                 memcpy(&tmp->handler, &(handlers[i]), sizeof(switch_config)); 
    148                 list_add(&tmp->list, &priv->data.list); 
    149                  
    150                 mode = 0; 
    151                 if (handlers[i].read != NULL) mode |= S_IRUSR; 
    152                 if (handlers[i].write != NULL) mode |= S_IWUSR; 
    153                  
    154                 if ((p = create_proc_entry(handlers[i].name, mode, parent)) != NULL) { 
    155                         p->data = (void *) tmp; 
    156                         p->proc_fops = &switch_proc_fops; 
    157                 } 
     177                add_handler(driver, &(handlers[i]), parent, nr); 
    158178        } 
    159179}                
     
    203223} 
    204224 
     225switch_config global_driver_handlers[] = { 
     226        {"driver", handle_driver_name, NULL}, 
     227        {"version", handle_driver_version, NULL}, 
     228        {NULL, NULL, NULL} 
     229}; 
     230 
    205231static int do_register(switch_driver *driver) 
    206232{ 
     
    217243        priv->nr = drv_num++; 
    218244        priv->driver_dir = proc_mkdir(driver->interface, switch_root); 
    219         if (driver->driver_handlers != NULL) 
     245        if (driver->driver_handlers != NULL) { 
    220246                add_handlers(driver, driver->driver_handlers, priv->driver_dir, 0); 
     247                add_handlers(driver, global_driver_handlers, priv->driver_dir, 0); 
     248        } 
    221249         
    222250        priv->port_dir = proc_mkdir("port", priv->driver_dir); 
  • trunk/openwrt/target/linux/package/switch/src/switch-core.h

    r2819 r2925  
    2828        struct list_head list; 
    2929        char *name; 
     30        char *version; 
    3031        char *interface; 
    3132        int cpuport; 
  • trunk/openwrt/target/linux/package/switch/src/switch-robo.c

    r2920 r2925  
    3535 
    3636#define DRIVER_NAME             "bcm53xx" 
     37#define DRIVER_VERSION  "0.01" 
    3738 
    3839#define ROBO_PHY_ADDR   0x1E    /* robo switch phy address */ 
     
    333334} 
    334335 
     336#define set_switch(state) \ 
     337        robo_write16(ROBO_CTRL_PAGE, ROBO_SWITCH_MODE, (robo_read16(ROBO_CTRL_PAGE, ROBO_SWITCH_MODE) & ~2) | (state ? 2 : 0)); 
     338 
     339static int handle_enable_read(void *driver, char *buf, int nr) 
     340{ 
     341        return sprintf(buf, "%d\n", (((robo_read16(ROBO_CTRL_PAGE, ROBO_SWITCH_MODE) & 2) == 2) ? 1 : 0)); 
     342} 
     343 
     344static int handle_enable_write(void *driver, char *buf, int nr) 
     345{ 
     346        set_switch(buf[0] == '1'); 
     347 
     348        return 0; 
     349} 
     350 
     351static int handle_enable_vlan_read(void *driver, char *buf, int nr) 
     352{ 
     353        return sprintf(buf, "%d\n", (((robo_read16(ROBO_VLAN_PAGE, ROBO_VLAN_CTRL0) & (1 << 7)) == (1 << 7)) ? 1 : 0)); 
     354} 
     355 
     356static int handle_enable_vlan_write(void *driver, char *buf, int nr) 
     357{ 
     358        int disable = ((buf[0] != '1') ? 1 : 0); 
     359         
     360        robo_write16(ROBO_VLAN_PAGE, ROBO_VLAN_CTRL0, disable ? 0 : 
     361                (1 << 7) /* 802.1Q VLAN */ | (3 << 5) /* mac check and hash */); 
     362        robo_write16(ROBO_VLAN_PAGE, ROBO_VLAN_CTRL1, disable ? 0 : 
     363                (1 << 1) | (1 << 2) | (1 << 3) /* RSV multicast */); 
     364        robo_write16(ROBO_VLAN_PAGE, ROBO_VLAN_CTRL4, disable ? 0 : 
     365                (1 << 6) /* drop invalid VID frames */); 
     366        robo_write16(ROBO_VLAN_PAGE, ROBO_VLAN_CTRL5, disable ? 0 : 
     367                (1 << 3) /* drop miss V table frames */); 
     368 
     369        return 0; 
     370} 
     371 
     372static int handle_reset(void *driver, char *buf, int nr) 
     373{ 
     374        switch_driver *d = (switch_driver *) driver; 
     375        switch_vlan_config *c = switch_parse_vlan(d, buf); 
     376        int j; 
     377        __u16 val16; 
     378         
     379        if (c == NULL) 
     380                return -EINVAL; 
     381 
     382        /* disable switching */ 
     383        set_switch(0); 
     384 
     385        /* reset vlans */ 
     386        for (j = 0; j <= (is_5350 ? VLAN_ID_MAX5350 : VLAN_ID_MAX); j++) { 
     387                /* write config now */ 
     388                val16 = (j) /* vlan */ | (1 << 12) /* write */ | (1 << 13) /* enable */; 
     389                if (is_5350) 
     390                        robo_write32(ROBO_VLAN_PAGE, ROBO_VLAN_WRITE_5350, 0); 
     391                else 
     392                        robo_write16(ROBO_VLAN_PAGE, ROBO_VLAN_WRITE, 0); 
     393                robo_write16(ROBO_VLAN_PAGE, (is_5350 ? ROBO_VLAN_TABLE_ACCESS_5350 : ROBO_VLAN_TABLE_ACCESS), val16); 
     394        } 
     395         
     396        /* enable switching */ 
     397        set_switch(1); 
     398 
     399        /* enable vlans */ 
     400        handle_enable_vlan_write(driver, "1", 0); 
     401 
     402        return 0; 
     403} 
     404 
    335405static int __init robo_init() 
    336406{ 
     
    346416                return -ENODEV; 
    347417        else { 
     418                switch_config main[] = { 
     419                        {"enable", handle_enable_read, handle_enable_write}, 
     420                        {"enable_vlan", handle_enable_vlan_read, handle_enable_vlan_write}, 
     421                        {"reset", NULL, handle_reset}, 
     422                        {NULL, NULL, NULL} 
     423                }; 
    348424                switch_config vlan[] = { 
    349425                        {"ports", handle_vlan_port_read, handle_vlan_port_write}, 
     
    352428                switch_driver driver = { 
    353429                        name: DRIVER_NAME, 
     430                        version: DRIVER_VERSION, 
    354431                        interface: device, 
    355432                        cpuport: 5, 
    356433                        ports: 6, 
    357434                        vlans: 16, 
    358                         driver_handlers: NULL, 
     435                        driver_handlers: main, 
    359436                        port_handlers: NULL, 
    360437                        vlan_handlers: vlan, 
Note: See TracChangeset for help on using the changeset viewer.