X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/6c4398bc6add362d5b399ba361720cf1afd7176b..8b4aee843bbd9d4e87e2c63b9c6d9d34c142a272:/package/broadcom-diag/src/diag.c diff --git a/package/broadcom-diag/src/diag.c b/package/broadcom-diag/src/diag.c index 8e7ffa6cc..4ac271e5c 100644 --- a/package/broadcom-diag/src/diag.c +++ b/package/broadcom-diag/src/diag.c @@ -53,12 +53,17 @@ enum { WRTSL54GS, WRT54G3G, WRT54G3GV2_VF, - WRT160N, + WRT150NV1, + WRT150NV11, + WRT160NV1, + WRT160NV3, WRT300NV11, WRT350N, WRT600N, WRT600NV11, WRT610N, + WRT610NV2, + E3000V1, /* ASUS */ WLHDD, @@ -74,6 +79,7 @@ enum { WL520GU, ASUS_4702, WL700GE, + RTN16, /* Buffalo */ WBR2_G54, @@ -107,6 +113,7 @@ enum { /* Belkin */ BELKIN_UNKNOWN, + BELKIN_F7D4301, /* Netgear */ WGT634U, @@ -149,9 +156,9 @@ static void __init bcm4780_init(void) { /* Enables GPIO 3 that controls HDD and led power on ASUS WL-700gE */ printk(MODULE_NAME ": Spinning up HDD and enabling leds\n"); - ssb_gpio_outen(&ssb_bcm47xx, pin, pin); - ssb_gpio_control(&ssb_bcm47xx, pin, 0); - ssb_gpio_out(&ssb_bcm47xx, pin, pin); + gpio_outen(pin, pin); + gpio_control(pin, 0); + gpio_out(pin, pin); /* Wait 5s, so the HDD can spin up */ set_current_state(TASK_INTERRUPTIBLE); @@ -161,14 +168,14 @@ static void __init bcm4780_init(void) { static void __init NetCenter_init(void) { /* unset pin 6 (+12V) */ int pin = 1 << 6; - ssb_gpio_outen(&ssb_bcm47xx, pin, pin); - ssb_gpio_control(&ssb_bcm47xx, pin, 0); - ssb_gpio_out(&ssb_bcm47xx, pin, pin); + gpio_outen(pin, pin); + gpio_control(pin, 0); + gpio_out(pin, pin); /* unset pin 1 (turn off red led, blue will light alone if +5V comes up) */ pin = 1 << 1; - ssb_gpio_outen(&ssb_bcm47xx, pin, pin); - ssb_gpio_control(&ssb_bcm47xx, pin, 0); - ssb_gpio_out(&ssb_bcm47xx, pin, pin); + gpio_outen(pin, pin); + gpio_control(pin, 0); + gpio_out(pin, pin); /* unset pin 3 (+5V) and wait 5 seconds (harddisk spin up) */ bcm4780_init(); } @@ -177,9 +184,9 @@ static void __init bcm57xx_init(void) { int pin = 1 << 2; /* FIXME: switch comes up, but port mappings/vlans not right */ - ssb_gpio_outen(&ssb_bcm47xx, pin, pin); - ssb_gpio_control(&ssb_bcm47xx, pin, 0); - ssb_gpio_out(&ssb_bcm47xx, pin, pin); + gpio_outen(pin, pin); + gpio_control(pin, 0); + gpio_out(pin, pin); } static struct platform_t __initdata platforms[] = { @@ -279,8 +286,32 @@ static struct platform_t __initdata platforms[] = { { .name = "3g_blue", .gpio = 1 << 3, .polarity = NORMAL }, }, }, - [WRT160N] = { - .name = "Linksys WRT160N", + [WRT150NV1] = { + .name = "Linksys WRT150N V1", + .buttons = { + { .name = "reset", .gpio = 1 << 6 }, + { .name = "ses", .gpio = 1 << 4 }, + }, + .leds = { + { .name = "power", .gpio = 1 << 1, .polarity = NORMAL }, + { .name = "ses_green", .gpio = 1 << 5, .polarity = REVERSE }, + { .name = "ses_amber", .gpio = 1 << 3, .polarity = REVERSE }, + }, + }, + [WRT150NV11] = { + .name = "Linksys WRT150N V1.1", + .buttons = { + { .name = "reset", .gpio = 1 << 6 }, + { .name = "ses", .gpio = 1 << 4 }, + }, + .leds = { + { .name = "power", .gpio = 1 << 1, .polarity = NORMAL }, + { .name = "ses_green", .gpio = 1 << 5, .polarity = REVERSE }, + { .name = "ses_amber", .gpio = 1 << 3, .polarity = REVERSE }, + }, + }, + [WRT160NV1] = { + .name = "Linksys WRT160N v1.x", .buttons = { { .name = "reset", .gpio = 1 << 6 }, { .name = "ses", .gpio = 1 << 4 }, @@ -291,6 +322,18 @@ static struct platform_t __initdata platforms[] = { { .name = "ses_orange", .gpio = 1 << 3, .polarity = REVERSE }, }, }, + [WRT160NV3] = { + .name = "Linksys WRT160N V3", + .buttons = { + { .name = "reset", .gpio = 1 << 6 }, + { .name = "ses", .gpio = 1 << 5 }, + }, + .leds = { + { .name = "power", .gpio = 1 << 1, .polarity = NORMAL }, + { .name = "ses_blue", .gpio = 1 << 4, .polarity = REVERSE }, + { .name = "ses_orange", .gpio = 1 << 2, .polarity = REVERSE }, + }, + }, [WRT300NV11] = { .name = "Linksys WRT300N V1.1", .buttons = { @@ -364,6 +407,34 @@ static struct platform_t __initdata platforms[] = { { .name = "ses_blue", .gpio = 1 << 9, .polarity = REVERSE }, // WiFi protected setup LED blue }, }, + [WRT610NV2] = { + .name = "Linksys WRT610N V2", + .buttons = { + { .name = "reset", .gpio = 1 << 6 }, + { .name = "ses", .gpio = 1 << 4 }, + }, + .leds = { + { .name = "power", .gpio = 1 << 5, .polarity = NORMAL }, // Power LED + { .name = "usb", .gpio = 1 << 7, .polarity = NORMAL }, // USB LED + { .name = "ses_amber", .gpio = 1 << 0, .polarity = REVERSE }, // WiFi protected setup LED amber + { .name = "ses_blue", .gpio = 1 << 3, .polarity = REVERSE }, // WiFi protected setup LED blue + { .name = "wlan", .gpio = 1 << 1, .polarity = NORMAL }, // Wireless LED + }, + }, + [E3000V1] = { + .name = "Linksys E3000 V1", + .buttons = { + { .name = "reset", .gpio = 1 << 6 }, + { .name = "ses", .gpio = 1 << 4 }, + }, + .leds = { + { .name = "power", .gpio = 1 << 5, .polarity = NORMAL }, // Power LED + { .name = "usb", .gpio = 1 << 7, .polarity = NORMAL }, // USB LED + { .name = "ses_amber", .gpio = 1 << 0, .polarity = REVERSE }, // WiFi protected setup LED amber + { .name = "ses_blue", .gpio = 1 << 3, .polarity = REVERSE }, // WiFi protected setup LED blue + { .name = "wlan", .gpio = 1 << 1, .polarity = NORMAL }, // Wireless LED + }, + }, /* Asus */ [WLHDD] = { .name = "ASUS WL-HDD", @@ -503,6 +574,17 @@ static struct platform_t __initdata platforms[] = { }, .platform_init = bcm4780_init, }, + [RTN16] = { + .name = "ASUS RT-N16", + .buttons = { + { .name = "reset", .gpio = 1 << 8 }, + { .name = "ses", .gpio = 1 << 5 }, + }, + .leds = { + { .name = "power", .gpio = 1 << 1, .polarity = REVERSE }, + { .name = "wlan", .gpio = 1 << 7, .polarity = NORMAL }, + }, + }, /* Buffalo */ [WHR_G54S] = { .name = "Buffalo WHR-G54S", @@ -749,6 +831,19 @@ static struct platform_t __initdata platforms[] = { { .name = "connected", .gpio = 1 << 0, .polarity = NORMAL }, }, }, + [BELKIN_F7D4301] = { + .name = "Belkin PlayMax F7D4301", + .buttons = { + { .name = "reset", .gpio = 1 << 6 }, + { .name = "wps", .gpio = 1 << 8 }, + }, + .leds = { + { .name = "power", .gpio = 1 << 11, .polarity = REVERSE }, + { .name = "wlan", .gpio = 1 << 13, .polarity = REVERSE }, + { .name = "led0", .gpio = 1 << 14, .polarity = REVERSE }, + { .name = "led1", .gpio = 1 << 15, .polarity = REVERSE }, + }, + }, /* Netgear */ [WGT634U] = { .name = "Netgear WGT634U", @@ -962,6 +1057,10 @@ static struct platform_t __init *platform_detect(void) return &platforms[WL520GU]; if (startswith(buf,"WL330GE-")) /* WL330GE-* */ return &platforms[WL330GE]; + if (startswith(buf,"RT-N16-")) /* RT-N16-* */ + return &platforms[RTN16]; + if (startswith(buf,"F7D4301")) /* F7D4301* */ + return &platforms[BELKIN_F7D4301]; } /* Based on "ModelId" */ @@ -1011,6 +1110,19 @@ static struct platform_t __init *platform_detect(void) return &platforms[WRT600N]; } + /* + * Normally, these would go inside the "CFE based - newer hardware" block below; however, during early init, the + * "pmon_ver" variable is not available on the E3000v1 (and probably the WRT610Nv2 also). Until this is figured out, + * these will need to remain here in order for platform detection to work. + */ + if (!strcmp(boardnum, "42")) { /* Linksys */ + if (!strcmp(boardtype, "0x04cf") && !strcmp(getvar("boot_hw_model"), "E300") && !strcmp(getvar("boot_hw_ver"), "1.0")) + return &platforms[E3000V1]; + + if (!strcmp(boardtype, "0x04cf") && !strcmp(getvar("boot_hw_model"), "WRT610N") && !strcmp(getvar("boot_hw_ver"), "2.0")) + return &platforms[WRT610NV2]; + } + if (startswith(getvar("pmon_ver"), "CFE")) { /* CFE based - newer hardware */ if (!strcmp(boardnum, "42")) { /* Linksys */ @@ -1029,8 +1141,18 @@ static struct platform_t __init *platform_detect(void) if (!strcmp(getvar("et1phyaddr"),"5") && !strcmp(getvar("et1mdcport"), "1")) return &platforms[WRTSL54GS]; - if (!strcmp(boardtype, "0x0472")) - return &platforms[WRT160N]; + if (!strcmp(boardtype, "0x0472")) { + if(!strcmp(getvar("boot_hw_model"), "WRT150N")) + if(!strcmp(getvar("boot_hw_ver"), "1")) + return &platforms[WRT150NV1]; + else if(!strcmp(getvar("boot_hw_ver"), "1.1")) + return &platforms[WRT150NV11]; + else if(!strcmp(getvar("boot_hw_model"), "WRT160N")) + if(!strcmp(getvar("boot_hw_ver"), "1.0")) + return &platforms[WRT160NV1]; + else if(!strcmp(getvar("boot_hw_ver"), "3.0")) + return &platforms[WRT160NV3]; + } /* default to WRT54G */ return &platforms[WRT54G]; @@ -1166,18 +1288,18 @@ static void register_buttons(struct button_t *b) platform.button_mask &= ~gpiomask; - ssb_gpio_outen(&ssb_bcm47xx, platform.button_mask, 0); - ssb_gpio_control(&ssb_bcm47xx, platform.button_mask, 0); - platform.button_polarity = ssb_gpio_in(&ssb_bcm47xx, ~0) & platform.button_mask; - ssb_gpio_polarity(&ssb_bcm47xx, platform.button_mask, platform.button_polarity); - ssb_gpio_intmask(&ssb_bcm47xx, platform.button_mask, platform.button_mask); + gpio_outen(platform.button_mask, 0); + gpio_control(platform.button_mask, 0); + platform.button_polarity = gpio_in() & platform.button_mask; + gpio_intpolarity(platform.button_mask, platform.button_polarity); + gpio_setintmask(platform.button_mask, platform.button_mask); gpio_set_irqenable(1, button_handler); } static void unregister_buttons(struct button_t *b) { - ssb_gpio_intmask(&ssb_bcm47xx, platform.button_mask, 0); + gpio_setintmask(platform.button_mask, 0); gpio_set_irqenable(0, button_handler); } @@ -1237,12 +1359,12 @@ static irqreturn_t button_handler(int irq, void *dev_id) struct button_t *b; u32 in, changed; - in = ssb_gpio_in(&ssb_bcm47xx, ~0) & platform.button_mask; - ssb_gpio_polarity(&ssb_bcm47xx, platform.button_mask, in); + in = gpio_in() & platform.button_mask; + gpio_intpolarity(platform.button_mask, in); changed = platform.button_polarity ^ in; platform.button_polarity = in; - changed &= ~ssb_gpio_outen(&ssb_bcm47xx, 0, 0); + changed &= ~gpio_outen(0, 0); for (b = platform.buttons; b->name; b++) { struct event_t *event; @@ -1298,10 +1420,10 @@ static void register_leds(struct led_t *l) } } - ssb_gpio_outen(&ssb_bcm47xx, mask, oe_mask); - ssb_gpio_control(&ssb_bcm47xx, mask, 0); - ssb_gpio_out(&ssb_bcm47xx, mask, val); - ssb_gpio_intmask(&ssb_bcm47xx, mask, 0); + gpio_outen(mask, oe_mask); + gpio_control(mask, 0); + gpio_out(mask, val); + gpio_setintmask(mask, 0); } static void unregister_leds(struct led_t *l) @@ -1336,11 +1458,11 @@ static void led_flash(unsigned long dummy) { mask &= ~gpiomask; if (mask) { - u32 val = ~ssb_gpio_in(&ssb_bcm47xx, ~0); + u32 val = ~gpio_in(); - ssb_gpio_outen(&ssb_bcm47xx, mask, mask); - ssb_gpio_control(&ssb_bcm47xx, mask, 0); - ssb_gpio_out(&ssb_bcm47xx, mask, val); + gpio_outen(mask, mask); + gpio_control(mask, 0); + gpio_out(mask, val); } if (mask || extif_blink) { mod_timer(&led_timer, jiffies + FLASH_TIME); @@ -1367,7 +1489,7 @@ static ssize_t diag_proc_read(struct file *file, char *buf, size_t count, loff_t if (led->gpio & GPIO_TYPE_EXTIF) { len = sprintf(page, "%d\n", led->state); } else { - u32 in = (ssb_gpio_in(&ssb_bcm47xx, ~0) & led->gpio ? 1 : 0); + u32 in = (gpio_in() & led->gpio ? 1 : 0); u8 p = (led->polarity == NORMAL ? 0 : 1); len = sprintf(page, "%d\n", ((in ^ p) ? 1 : 0)); } @@ -1431,9 +1553,9 @@ static ssize_t diag_proc_write(struct file *file, const char *buf, size_t count, led->state = p ^ ((page[0] == '1') ? 1 : 0); set_led_extif(led); } else { - ssb_gpio_outen(&ssb_bcm47xx, led->gpio, led->gpio); - ssb_gpio_control(&ssb_bcm47xx, led->gpio, 0); - ssb_gpio_out(&ssb_bcm47xx, led->gpio, ((p ^ (page[0] == '1')) ? led->gpio : 0)); + gpio_outen(led->gpio, led->gpio); + gpio_control(led->gpio, 0); + gpio_out(led->gpio, ((p ^ (page[0] == '1')) ? led->gpio : 0)); } } break; @@ -1464,13 +1586,6 @@ static int __init diag_init(void) static struct proc_dir_entry *p; static struct platform_t *detected; -#ifdef CONFIG_BCM47XX_SSB - if (bcm47xx_active_bus_type != BCM47XX_BUS_TYPE_SSB) { - printk(MODULE_NAME ": bcma bus is not supported.\n"); - return -ENODEV; - } -#endif - detected = platform_detect(); if (!detected) { printk(MODULE_NAME ": Router model not detected.\n");