diff options
-rw-r--r-- | package/broadcom-diag/src/diag.c | 210 |
1 files changed, 93 insertions, 117 deletions
diff --git a/package/broadcom-diag/src/diag.c b/package/broadcom-diag/src/diag.c index 997fbe864..823b9b7d0 100644 --- a/package/broadcom-diag/src/diag.c +++ b/package/broadcom-diag/src/diag.c @@ -32,6 +32,7 @@ #include <linux/netlink.h> #include <linux/kobject.h> #include <net/sock.h> +#include <bcm47xx_board.h> extern u64 uevent_next_seqnum(void); #include "gpio.h" @@ -1038,85 +1039,13 @@ static struct platform_t __initdata platforms[] = { }, }; -static struct platform_t __init *platform_detect(void) +static struct platform_t __init *platform_detect_legacy(void) { char *boardnum, *boardtype, *buf; if (strcmp(getvar("nvram_type"), "cfe") == 0) return &platforms[WGT634U]; - /* 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 "wsc_modelname */ - if ((buf = nvram_get("wsc_modelname"))) { - if (!strcmp(buf, "WRT610N")) - return &platforms[WRT610N]; - } - - /* Based on "model_no" */ - if ((buf = nvram_get("model_no"))) { - if (startswith(buf,"WL700")) /* WL700* */ - return &platforms[WL700GE]; - } - - /* Based on "hardware_version" */ - if ((buf = nvram_get("hardware_version"))) { - if (startswith(buf,"WL500GPV2-")) /* WL500GPV2-* */ - return &platforms[WL500GPV2]; - if (startswith(buf,"WL520GC-")) /* WL520GU-* */ - return &platforms[WL520GC]; - if (startswith(buf,"WL520GU-")) /* WL520GU-* */ - 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" */ - if ((buf = nvram_get("ModelId"))) { - if (!strcmp(buf, "WR850GP")) - return &platforms[WR850GP]; - if (!strcmp(buf, "WR850G")) - return &platforms[WR850GV2V3]; - if (!strcmp(buf, "WX-5565") && !strcmp(getvar("boardtype"),"bcm94710ap")) - return &platforms[TM2300]; /* Dell TrueMobile 2300 */ - if (startswith(buf,"WE800G")) /* 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"); @@ -1130,59 +1059,18 @@ 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 */ - if (!strcmp(boardtype, "0x478") && !strcmp(getvar("boot_hw_model"), "WRT300N") && !strcmp(getvar("boot_hw_ver"), "1.1")) - return &platforms[WRT300NV11]; - if (!strcmp(boardtype, "0x478") && !strcmp(getvar("cardbus"), "1")) return &platforms[WRT350N]; if (!strcmp(boardtype, "0x0101") && !strcmp(getvar("boot_ver"), "v3.6")) return &platforms[WRT54G3G]; - if (!strcmp(boardtype, "0x042f") && !strcmp(getvar("model_name"), "WRT54G3GV2-VF")) - return &platforms[WRT54G3GV2_VF]; - if (!strcmp(getvar("et1phyaddr"),"5") && !strcmp(getvar("et1mdcport"), "1")) return &platforms[WRTSL54GS]; - 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]; - } - } - - if (!strcmp(boardtype, "0x04cd")) { - if (!strcmp(getvar("boot_hw_model"), "E100")) { - if (!strcmp(getvar("boot_hw_ver"), "1.0")) - return &platforms[E1000V1]; - } - } - /* default to WRT54G */ return &platforms[WRT54G]; } @@ -1199,9 +1087,7 @@ static struct platform_t __init *platform_detect(void) } if (!strcmp(boardnum, "45")) { /* ASUS */ - if (!strcmp(boardtype,"0x042f")) - return &platforms[WL500GP]; - else if (!strcmp(boardtype,"0x0472")) + if (!strcmp(boardtype,"0x0472")) return &platforms[WL500W]; else if (!strcmp(boardtype,"0x467")) return &platforms[WL320GE]; @@ -1310,6 +1196,96 @@ static struct platform_t __init *platform_detect(void) return NULL; } +static struct platform_t __init *platform_detect(void) +{ + enum bcm47xx_board board; + const char *board_name; + + + board = bcm47xx_board_get(); + board_name = bcm47xx_board_get_name(); + if (board != BCM47XX_BOARD_UNKNOWN && board != BCM47XX_BOARD_NON) + printk(MODULE_NAME ": kernel found a \"%s\"\n", board_name); + + switch(board) { + case BCM47XX_BOARD_ASUS_RTN16: + return &platforms[RTN16]; + case BCM47XX_BOARD_ASUS_WL330GE: + return &platforms[WL330GE]; + case BCM47XX_BOARD_ASUS_WL500GPV1: + return &platforms[WL500GP]; + case BCM47XX_BOARD_ASUS_WL500GPV2: + return &platforms[WL500GPV2]; + case BCM47XX_BOARD_ASUS_WL520GC: + return &platforms[WL520GC]; + case BCM47XX_BOARD_ASUS_WL520GU: + return &platforms[WL520GU]; + case BCM47XX_BOARD_ASUS_WL700GE: + return &platforms[WL700GE]; + case BCM47XX_BOARD_BELKIN_F7D4301: + return &platforms[BELKIN_F7D4301]; + case BCM47XX_BOARD_BUFFALO_WBR2_G54: + return &platforms[WBR2_G54]; + case BCM47XX_BOARD_BUFFALO_WHR2_A54G54: + return &platforms[WHR2_A54G54]; + case BCM47XX_BOARD_BUFFALO_WHR_G125: + return &platforms[WHR_G125]; + case BCM47XX_BOARD_BUFFALO_WHR_G54S: + return &platforms[WHR_G54S]; + case BCM47XX_BOARD_BUFFALO_WHR_HP_G54: + return &platforms[WHR_HP_G54]; + case BCM47XX_BOARD_BUFFALO_WLA2_G54L: + return &platforms[WLA2_G54L]; + case BCM47XX_BOARD_BUFFALO_WZR_G300N: + return &platforms[WZR_G300N]; + case BCM47XX_BOARD_BUFFALO_WZR_RS_G54: + return &platforms[WZR_RS_G54]; + case BCM47XX_BOARD_BUFFALO_WZR_RS_G54HP: + return &platforms[WZR_RS_G54HP]; + case BCM47XX_BOARD_DELL_TM2300: + return &platforms[TM2300]; + case BCM47XX_BOARD_DLINK_DIR130: + return &platforms[DIR130]; + case BCM47XX_BOARD_DLINK_DIR330: + return &platforms[DIR330]; + case BCM47XX_BOARD_LINKSYS_E1000V1: + return &platforms[E1000V1]; + case BCM47XX_BOARD_LINKSYS_E3000V1: + return &platforms[E3000V1]; + case BCM47XX_BOARD_LINKSYS_WRT150NV1: + return &platforms[WRT150NV1]; + case BCM47XX_BOARD_LINKSYS_WRT150NV11: + return &platforms[WRT150NV11]; + case BCM47XX_BOARD_LINKSYS_WRT160NV1: + return &platforms[WRT160NV1]; + case BCM47XX_BOARD_LINKSYS_WRT160NV3: + return &platforms[WRT160NV3]; + case BCM47XX_BOARD_LINKSYS_WRT300NV11: + return &platforms[WRT300NV11]; + case BCM47XX_BOARD_LINKSYS_WRT54G3GV2: + return &platforms[WRT54G3GV2_VF]; + case BCM47XX_BOARD_LINKSYS_WRT610NV1: + return &platforms[WRT610N]; + case BCM47XX_BOARD_LINKSYS_WRT610NV2: + return &platforms[WRT610NV2]; + case BCM47XX_BOARD_MOTOROLA_WE800G: + return &platforms[WE800G]; + case BCM47XX_BOARD_MOTOROLA_WR850GP: + return &platforms[WR850GP]; + case BCM47XX_BOARD_MOTOROLA_WR850GV2V3: + return &platforms[WR850GV2V3]; + case BCM47XX_BOARD_UNKNOWN: + case BCM47XX_BOARD_NON: + printk(MODULE_NAME ": unknown board found, try legacy detect\n"); + printk(MODULE_NAME ": please open a ticket at https://dev.openwrt.org and attach the complete nvram\n"); + return platform_detect_legacy(); + default: + printk(MODULE_NAME ": board was detected as \"%s\", but not gpio configuration available\n", board_name); + printk(MODULE_NAME ": now trying legacy detect\n"); + return platform_detect_legacy(); + } +} + static inline void ssb_maskset32(struct ssb_device *dev, u16 offset, u32 mask, u32 set) { |