Changeset 2980


Ignore:
Timestamp:
2006-01-14T18:48:52+01:00 (12 years ago)
Author:
nbd
Message:

fix switch-adm drivers for boards with different gpio mappings, also fix #208

Location:
branches/whiterussian/openwrt/target/linux/package/switch/src
Files:
2 edited

Legend:

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

    r2924 r2980  
    3535#define DRIVER_VERSION "0.01" 
    3636 
    37 static int eecs = 2; 
    38 static int eesk = 3; 
    39 static int eedi = 5; 
    40 static int eerc = 6; 
     37static int eecs = 0; 
     38static int eesk = 0; 
     39static int eedi = 0; 
     40static int eerc = 0; 
    4141static int force = 0; 
    4242 
     
    6161#define atoi(str) simple_strtoul(((str != NULL) ? str : ""), NULL, 0) 
    6262 
     63#if defined(BCMGPIO2) || defined(BCMGPIO) 
    6364extern char *nvram_get(char *name); 
     65 
     66/* Return gpio pin number assigned to the named pin */ 
     67/* 
     68* Variable should be in format: 
     69* 
     70*       gpio<N>=pin_name 
     71* 
     72* 'def_pin' is returned if there is no such variable found. 
     73*/ 
     74static unsigned int getgpiopin(char *pin_name, unsigned int def_pin) 
     75{ 
     76        char name[] = "gpioXXXX"; 
     77        char *val; 
     78        unsigned int pin; 
     79 
     80        /* Go thru all possibilities till a match in pin name */ 
     81        for (pin = 0; pin < 16; pin ++) { 
     82                sprintf(name, "gpio%d", pin); 
     83                val = nvram_get(name); 
     84                if (val && !strcmp(val, pin_name)) 
     85                        return pin; 
     86        } 
     87        return def_pin; 
     88} 
     89#endif 
    6490 
    6591 
     
    256282                if (ports & vlan_ports[i]) { 
    257283                        c = adm_rreg(0, port_conf[i]); 
    258                         len += sprintf(buf + len, (c & (1 << 4) ? "%dt\t" : (i == 5 ? "%du\t" : "%d\t")), i); 
     284                         
     285                        len += sprintf(buf + len, "%d", i); 
     286                        if (c & (1 << 4)) { 
     287                                buf[len++] = 't'; 
     288                                if (((c & (0xf << 10)) >> 10) == nr) 
     289                                        buf[len++] = '*'; 
     290                        } else if (i == 5) 
     291                                buf[len++] = 'u'; 
     292 
     293                        buf[len++] = '\t'; 
    259294                } 
    260295        } 
     
    387422         * sequence in software. 
    388423         */ 
    389         /* Keep RC high for at least 20ms */ 
    390         adm_enout(eerc, eerc); 
    391         for (i = 0; i < 20; i ++) 
    392                 udelay(1000); 
    393         /* Keep RC low for at least 100ms */ 
    394         adm_enout(eerc, 0); 
    395         for (i = 0; i < 100; i++) 
    396                 udelay(1000); 
    397         /* Set default configuration */ 
    398         adm_enout((__u8)(eesk | eedi), eesk); 
    399         /* Keep RC high for at least 30ms */ 
    400         adm_enout(eerc, eerc); 
    401         for (i = 0; i < 30; i++) 
    402                 udelay(1000); 
    403         /* Leave RC high and disable GPIO outputs */ 
    404         adm_disout((__u8)(eecs | eesk | eedi)); 
    405  
     424        if (eerc) { 
     425                /* Keep RC high for at least 20ms */ 
     426                adm_enout(eerc, eerc); 
     427                for (i = 0; i < 20; i ++) 
     428                        udelay(1000); 
     429                /* Keep RC low for at least 100ms */ 
     430                adm_enout(eerc, 0); 
     431                for (i = 0; i < 100; i++) 
     432                        udelay(1000); 
     433                /* Set default configuration */ 
     434                adm_enout((__u8)(eesk | eedi), eesk); 
     435                /* Keep RC high for at least 30ms */ 
     436                adm_enout(eerc, eerc); 
     437                for (i = 0; i < 30; i++) 
     438                        udelay(1000); 
     439                /* Leave RC high and disable GPIO outputs */ 
     440                adm_disout((__u8)(eecs | eesk | eedi)); 
     441        } 
    406442        /* set up initial configuration for ports */ 
    407443        for (i = 0; i <= 5; i++) { 
     
    447483        int boardflags = atoi(nvram_get("boardflags")); 
    448484 
    449         if ((boardflags & 0x80) || force) 
     485        if ((boardflags & 0x80) || force) { 
    450486                ret = 1; 
    451         else  
     487 
     488                eecs = getgpiopin("adm_eecs", 2); 
     489                eesk = getgpiopin("adm_eesk", 3); 
     490                eedi = getgpiopin("adm_eedi", 4); 
     491                eerc = getgpiopin("adm_rc", 0); 
     492 
     493        } else if ((strcmp(nvram_get("boardtype"), "bcm94710dev") == 0) && 
     494                        (strncmp(nvram_get("boardnum"), "42", 2) == 0)) { 
     495                /* WRT54G v1.1 hack */ 
     496                eecs = 2; 
     497                eesk = 3; 
     498                eedi = 5; 
     499                eerc = 6; 
     500 
     501                ret = 1; 
     502        } else 
    452503                printk("BFL_ENETADM not set in boardflags. Use force=1 to ignore.\n"); 
     504                 
     505        if (eecs) 
     506                eecs = (1 << eecs); 
     507        if (eesk) 
     508                eesk = (1 << eesk); 
     509        if (eedi) 
     510                eedi = (1 << eedi); 
     511        if (eerc) 
     512                eerc = (1 << eerc); 
    453513#else 
    454514        ret = 1; 
     
    488548        }; 
    489549 
    490         eecs = (1 << eecs); 
    491         eesk = (1 << eesk); 
    492         eedi = (1 << eedi); 
    493  
    494550        if (!detect_adm()) 
    495551                return -ENODEV; 
  • branches/whiterussian/openwrt/target/linux/package/switch/src/switch-robo.c

    r2924 r2980  
    279279                        for (j = 0; j < 6; j++) { 
    280280                                if (val32 & (1 << j)) { 
    281                                         len += sprintf(buf + len, "%d%s\t", j,  
    282                                                 (val32 & (1 << (j + 6))) ? (j == 5 ? "u" : "") : "t"); 
     281                                        len += sprintf(buf + len, "%d", j); 
     282                                        if (val32 & (1 << (j + 6))) { 
     283                                                if (j == 5) buf[len++] = 'u'; 
     284                                        } else { 
     285                                                buf[len++] = 't'; 
     286                                                if (robo_read16(ROBO_VLAN_PAGE, ROBO_VLAN_PORT0_DEF_TAG + (j << 1)) == nr) 
     287                                                        buf[len++] = '*'; 
     288                                        } 
     289                                        buf[len++] = '\t'; 
    283290                                } 
    284291                        } 
     
    292299                        for (j = 0; j < 6; j++) { 
    293300                                if (val16 & (1 << j)) { 
    294                                         len += sprintf(buf + len, "%d%s\t", j, (val16 & (1 << (j + 7))) ?  
    295                                                 (j == 5 ? "u" : "") : "t"); 
     301                                        len += sprintf(buf + len, "%d", j); 
     302                                        if (val16 & (1 << (j + 7))) { 
     303                                                if (j == 5) buf[len++] = 'u'; 
     304                                        } else { 
     305                                                buf[len++] = 't'; 
     306                                                if (robo_read16(ROBO_VLAN_PAGE, ROBO_VLAN_PORT0_DEF_TAG + (j << 1)) == nr) 
     307                                                        buf[len++] = '*'; 
     308                                        } 
     309                                        buf[len++] = '\t'; 
    296310                                } 
    297311                        } 
     
    416430                return -ENODEV; 
    417431        else { 
    418                 switch_config main[] = { 
     432                switch_config cfg[] = { 
    419433                        {"enable", handle_enable_read, handle_enable_write}, 
    420434                        {"enable_vlan", handle_enable_vlan_read, handle_enable_vlan_write}, 
     
    433447                        ports: 6, 
    434448                        vlans: 16, 
    435                         driver_handlers: main, 
     449                        driver_handlers: cfg, 
    436450                        port_handlers: NULL, 
    437451                        vlan_handlers: vlan, 
Note: See TracChangeset for help on using the changeset viewer.