X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/1d5d64e647517cdd5bc8d0bb8c408babfec51d79..6f5d61ecf33540e235dbffa5de4a09554e953261:/package/broadcom-diag/src/diag.c diff --git a/package/broadcom-diag/src/diag.c b/package/broadcom-diag/src/diag.c index c53ff2f97..60bf61238 100644 --- a/package/broadcom-diag/src/diag.c +++ b/package/broadcom-diag/src/diag.c @@ -74,6 +74,7 @@ enum { WBR2_G54, WHR_G54S, WHR_HP_G54, + WHR_G125, WHR2_A54G54, WLA2_G54L, WZR_G300N, @@ -96,6 +97,7 @@ enum { WE800G, WR850GV1, WR850GV2V3, + WR850GP, /* Belkin */ BELKIN_UNKNOWN, @@ -112,6 +114,7 @@ enum { /* D-Link */ DIR130, DIR330, + DWL3150, }; static void __init bcm4780_init(void) { @@ -128,6 +131,14 @@ static void __init bcm4780_init(void) { schedule_timeout(HZ * 5); } +static void __init bcm57xx_init(void) { + int pin = 1 << 2; + + gpio_outen(pin, pin); + gpio_control(pin, 0); + gpio_out(pin, pin); +} + static struct platform_t __initdata platforms[] = { /* Linksys */ [WAP54GV1] = { @@ -135,7 +146,7 @@ static struct platform_t __initdata platforms[] = { .buttons = { { .name = "reset", .gpio = 1 << 0 }, }, - .leds = { + .leds = { { .name = "diag", .gpio = 1 << 3 }, { .name = "wlan", .gpio = 1 << 4 }, }, @@ -211,8 +222,12 @@ static struct platform_t __initdata platforms[] = { }, .leds = { { .name = "power", .gpio = 1 << 1, .polarity = NORMAL }, - { .name = "ses", .gpio = 1 << 3, .polarity = REVERSE }, + { .name = "ses_amber", .gpio = 1 << 3, .polarity = REVERSE }, + { .name = "ses_green", .gpio = 1 << 9, .polarity = REVERSE }, + { .name = "usb_blink", .gpio = 1 << 10, .polarity = REVERSE }, + { .name = "usb", .gpio = 1 << 11, .polarity = REVERSE }, }, + .platform_init = bcm57xx_init, }, /* Asus */ [WLHDD] = { @@ -341,6 +356,21 @@ static struct platform_t __initdata platforms[] = { { .name = "wlan", .gpio = 1 << 2, .polarity = REVERSE }, }, }, + [WHR_G125] = { + .name = "Buffalo WHR-G125", + .buttons = { + { .name = "reset", .gpio = 1 << 4 }, + { .name = "bridge", .gpio = 1 << 5 }, + { .name = "ses", .gpio = 1 << 0 }, + }, + .leds = { + { .name = "diag", .gpio = 1 << 7, .polarity = REVERSE }, + { .name = "internal", .gpio = 1 << 3, .polarity = REVERSE }, + { .name = "bridge", .gpio = 1 << 1, .polarity = REVERSE }, + { .name = "ses", .gpio = 1 << 6, .polarity = REVERSE }, + { .name = "wlan", .gpio = 1 << 2, .polarity = REVERSE }, + }, + }, [WHR2_A54G54] = { .name = "Buffalo WHR2-A54G54", .buttons = { @@ -487,6 +517,18 @@ static struct platform_t __initdata platforms[] = { .buttons = { { .name = "reset", .gpio = 1 << 5 }, }, + .leds = { + { .name = "power", .gpio = 1 << 1, .polarity = NORMAL }, + { .name = "wlan", .gpio = 1 << 0, .polarity = REVERSE }, + { .name = "wan", .gpio = 1 << 6, .polarity = INPUT }, + { .name = "diag", .gpio = 1 << 7, .polarity = REVERSE }, + }, + }, + [WR850GP] = { + .name = "Motorola WR850GP", + .buttons = { + { .name = "reset", .gpio = 1 << 5 }, + }, .leds = { { .name = "power", .gpio = 1 << 1, .polarity = NORMAL }, { .name = "wlan", .gpio = 1 << 0, .polarity = REVERSE }, @@ -494,6 +536,7 @@ static struct platform_t __initdata platforms[] = { { .name = "diag", .gpio = 1 << 7, .polarity = REVERSE }, }, }, + /* Belkin */ [BELKIN_UNKNOWN] = { .name = "Belkin (unknown)", @@ -565,20 +608,77 @@ static struct platform_t __initdata platforms[] = { { .name = "blue", .gpio = 1 << 6}, }, }, + [DWL3150] = { + .name = "D-Link DWL-3150", + .buttons = { + { .name = "reset", .gpio = 1 << 7}, + }, + .leds = { + { .name = "diag", .gpio = 1 << 2}, + { .name = "status", .gpio = 1 << 1}, + }, + }, }; static struct platform_t __init *platform_detect(void) { char *boardnum, *boardtype, *buf; - boardnum = getvar("boardnum"); - boardtype = getvar("boardtype"); - if (strcmp(getvar("nvram_type"), "cfe") == 0) return &platforms[WGT634U]; - - if (strncmp(getvar("model_no"), "WL700",5) == 0) - return &platforms[WL700GE]; + + /* Look for a model identifier */ + + /* Based on "model_name" */ + if (buf = nvram_get("model_name")) { + if (!strcmp(buf, "DIR-130")) + return &platforms[DIR130]; + if (!strcmp(buf, "DIR-330")) + return &platforms[DIR330]; + } + + /* Based on "model_no" */ + if (buf = nvram_get("model_no")) { + if (!strncmp(buf,"WL700", 5)) /* WL700* */ + return &platforms[WL700GE]; + } + + /* Based on "ModelId" */ + if (buf = nvram_get("ModelId")) { + if (!strcmp(buf, "WR850GP")) + return &platforms[WR850GP]; + if (!strcmp(buf,"WX-5565")) + return &platforms[TM2300]; + if (!strncmp(buf,"WE800G", 6)) /* WE800G* */ + return &platforms[WE800G]; + } + + /* Buffalo */ + if ((buf = (nvram_get("melco_id") ?: nvram_get("buffalo_id")))) { + /* Buffalo hardware, check id for specific hardware matches */ + if (!strcmp(buf, "29bb0332")) + return &platforms[WBR2_G54]; + if (!strcmp(buf, "29129")) + return &platforms[WLA2_G54L]; + if (!strcmp(buf, "30189")) + return &platforms[WHR_HP_G54]; + if (!strcmp(buf, "32093")) + return &platforms[WHR_G125]; + if (!strcmp(buf, "30182")) + return &platforms[WHR_G54S]; + if (!strcmp(buf, "290441dd")) + return &platforms[WHR2_A54G54]; + if (!strcmp(buf, "31120")) + return &platforms[WZR_G300N]; + if (!strcmp(buf, "30083")) + return &platforms[WZR_RS_G54]; + if (!strcmp(buf, "30103")) + return &platforms[WZR_RS_G54HP]; + } + + /* no easy model number, attempt to guess */ + boardnum = getvar("boardnum"); + boardtype = getvar("boardtype"); if (strncmp(getvar("pmon_ver"), "CFE", 3) == 0) { /* CFE based - newer hardware */ @@ -608,24 +708,10 @@ static struct platform_t __init *platform_detect(void) if (!strcmp(boardnum, "10496")) return &platforms[USR5461]; - /* D-Link */ - if (!strcmp(getvar("model_name"), "DIR-130")) - return &platforms[DIR130]; - if (!strcmp(getvar("model_name"), "DIR-330")) - return &platforms[DIR330]; - } else { /* PMON based - old stuff */ - - /* Dell TrueMobile 2300 */ - if (!strcmp(getvar("ModelId"),"WX-5565")) - return &platforms[TM2300]; - if ((simple_strtoul(getvar("GemtekPmonVer"), NULL, 0) == 9) && (simple_strtoul(getvar("et0phyaddr"), NULL, 0) == 30)) { - if (!strncmp(getvar("ModelId"),"WE800G", 6)) - return &platforms[WE800G]; - else - return &platforms[WR850GV1]; + return &platforms[WR850GV1]; } if (!strncmp(boardtype, "bcm94710dev", 11)) { if (!strcmp(boardnum, "42")) @@ -650,26 +736,6 @@ static struct platform_t __init *platform_detect(void) return &platforms[ASUS_4702]; } - if ((buf = (nvram_get("melco_id") ?: nvram_get("buffalo_id")))) { - /* Buffalo hardware, check id for specific hardware matches */ - if (!strcmp(buf, "29bb0332")) - return &platforms[WBR2_G54]; - if (!strcmp(buf, "29129")) - return &platforms[WLA2_G54L]; - if (!strcmp(buf, "30189")) - return &platforms[WHR_HP_G54]; - if (!strcmp(buf, "30182")) - return &platforms[WHR_G54S]; - if (!strcmp(buf, "290441dd")) - return &platforms[WHR2_A54G54]; - if (!strcmp(buf, "31120")) - return &platforms[WZR_G300N]; - if (!strcmp(buf, "30083")) - return &platforms[WZR_RS_G54]; - if (!strcmp(buf, "30103")) - return &platforms[WZR_RS_G54HP]; - } - if (buf || !strcmp(boardnum, "00")) {/* probably buffalo */ if (!strncmp(boardtype, "bcm94710ap", 10)) return &platforms[BUFFALO_UNKNOWN_4710]; @@ -677,19 +743,23 @@ static struct platform_t __init *platform_detect(void) return &platforms[BUFFALO_UNKNOWN]; } - if (!strcmp(getvar("CFEver"), "MotoWRv203") || + if (!strncmp(getvar("CFEver"), "MotoWRv2", 8) || + !strncmp(getvar("CFEver"), "MotoWRv3", 8) || !strcmp(getvar("MOTO_BOARD_TYPE"), "WR_FEM1")) { return &platforms[WR850GV2V3]; } - if (!strcmp(boardnum, "44")) { /* Trendware TEW-411BRP+ */ + if (!strcmp(boardnum, "44") && !strcmp(getvar("boardflags"),"0x0388")) { /* Trendware TEW-411BRP+ */ return &platforms[TEW411BRPP]; } if (!strncmp(boardnum, "04FN52", 6)) /* SimpleTech SimpleShare */ return &platforms[STI_NAS]; + if (!strcmp(getvar("boardnum"), "10") && !strcmp(getvar("boardrev"), "0x13")) /* D-Link DWL-3150 */ + return &platforms[DWL3150]; + /* not found */ return NULL; } @@ -854,6 +924,7 @@ static void register_leds(struct led_t *l) { struct proc_dir_entry *p; u32 mask = 0; + u32 oe_mask = 0; u32 val = 0; leds = proc_mkdir("led", diag); @@ -868,10 +939,13 @@ static void register_leds(struct led_t *l) l->state = 0; set_led_extif(l); } else { + if (l->polarity != INPUT) oe_mask != l->gpio; mask |= l->gpio; val |= (l->polarity == NORMAL)?0:l->gpio; } + if (l->polarity == INPUT) continue; + if ((p = create_proc_entry(l->name, S_IRUSR, leds))) { l->proc.type = PROC_LED; l->proc.ptr = l; @@ -880,7 +954,7 @@ static void register_leds(struct led_t *l) } } - gpio_outen(mask, mask); + gpio_outen(mask, oe_mask); gpio_control(mask, 0); gpio_out(mask, val); }