1 --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
2 +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
3 @@ -2901,6 +2901,492 @@ static struct board_info __initdata boar
7 +static struct board_info __initdata board_HW556 = {
9 + .expected_cpu_id = 0x6358,
15 + .num_usbh_ports = 2,
20 + .caldata_offset = 0xe00000,
28 + .force_speed_100 = 1,
29 + .force_duplex_full = 1,
34 + .name = "HW556:red:message",
39 + .name = "HW556:red:hspa",
44 + .name = "HW556:red:dsl",
49 + .name = "HW556:red:power",
52 + .default_trigger = "default-on",
55 + .name = "HW556:red:all",
58 + .default_trigger = "default-on",
69 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
77 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
84 + .code = KEY_RESTART,
85 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
93 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
97 +static struct board_info __initdata board_HW556_A = {
99 + .expected_cpu_id = 0x6358,
105 + .num_usbh_ports = 2,
110 + .vendor = PCI_VENDOR_ID_RALINK,
111 + .caldata_offset = 0xeffe00,
113 + .eeprom = "rt2x00.eeprom",
121 + .force_speed_100 = 1,
122 + .force_duplex_full = 1,
127 + .name = "HW556:green:lan1",
132 + .name = "HW556:green:lan2",
137 + .name = "HW556:red:dsl",
142 + .name = "HW556:red:power",
145 + .default_trigger = "default-on",
148 + .name = "HW556:red:message",
153 + .name = "HW556:red:lan1",
158 + .name = "HW556:red:hspa",
163 + .name = "HW556:red:lan2",
168 + .name = "HW556:green:lan3",
173 + .name = "HW556:red:lan3",
178 + .name = "HW556:green:lan4",
183 + .name = "HW556:red:lan4",
196 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
204 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
211 + .code = KEY_RESTART,
212 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
219 + .code = KEY_CONFIG,
220 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
224 +static struct board_info __initdata board_HW556_B = {
226 + .expected_cpu_id = 0x6358,
232 + .num_usbh_ports = 2,
237 + .vendor = PCI_VENDOR_ID_ATHEROS,
238 + .caldata_offset = 0xf7e000,
249 + .force_speed_100 = 1,
250 + .force_duplex_full = 1,
255 + .name = "HW556:red:message",
260 + .name = "HW556:red:hspa",
265 + .name = "HW556:red:dsl",
270 + .name = "HW556:red:power",
273 + .default_trigger = "default-on",
276 + .name = "HW556:red:all",
279 + .default_trigger = "default-on",
282 + .name = "HW556:green:lan1",
287 + .name = "HW556:red:lan1",
292 + .name = "HW556:green:lan2",
297 + .name = "HW556:red:lan2",
302 + .name = "HW556:green:lan3",
307 + .name = "HW556:red:lan3",
312 + .name = "HW556:green:lan4",
317 + .name = "HW556:red:lan4",
330 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
338 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
345 + .code = KEY_RESTART,
346 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
353 + .code = KEY_CONFIG,
354 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
358 +static struct board_info __initdata board_HW556_C = {
360 + .expected_cpu_id = 0x6358,
366 + .num_usbh_ports = 2,
371 + .vendor = PCI_VENDOR_ID_ATHEROS,
372 + .caldata_offset = 0xefe000,
383 + .force_speed_100 = 1,
384 + .force_duplex_full = 1,
389 + .name = "HW556:red:message",
394 + .name = "HW556:red:hspa",
399 + .name = "HW556:red:dsl",
404 + .name = "HW556:red:power",
407 + .default_trigger = "default-on",
410 + .name = "HW556:red:all",
413 + .default_trigger = "default-on",
416 + .name = "HW556:green:lan1",
421 + .name = "HW556:red:lan1",
426 + .name = "HW556:green:lan2",
431 + .name = "HW556:red:lan2",
436 + .name = "HW556:green:lan3",
441 + .name = "HW556:red:lan3",
446 + .name = "HW556:green:lan4",
451 + .name = "HW556:red:lan4",
464 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
472 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
479 + .code = KEY_RESTART,
480 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
487 + .code = KEY_CONFIG,
488 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
493 /* T-Home Speedport W 303V Typ B */
494 static struct board_info __initdata board_spw303v = {
495 .name = "96358-502V",
496 @@ -3340,6 +3826,10 @@ static const struct board_info __initcon
507 @@ -3405,13 +3895,37 @@ static void __init boardid_fixup(u8 *boo
508 struct bcm_tag *tag = (struct bcm_tag *)(boot_addr + CFE_OFFSET_64K);
509 char *board_name = (char *)bcm63xx_nvram_get_name();
511 - if (BCMCPU_IS_6358() && (!strcmp(board_name, "96358VW"))) {
512 - u8 *p = boot_addr + NB4_PID_OFFSET;
514 - /* Extract nb4 PID */
515 - if (!memcmp(p, "NB4-", 4)) {
516 - memcpy(board_name, p, sizeof("NB4-XXX-rX"));
518 + if (BCMCPU_IS_6358()) {
519 + if (!strcmp(board_name, "96358VW")) {
520 + u8 *p = boot_addr + NB4_PID_OFFSET;
522 + /* Extract nb4 PID */
523 + if (!memcmp(p, "NB4-", 4)) {
524 + memcpy(board_name, p, sizeof("NB4-XXX-rX"));
527 + } else if (!strcmp(board_name, "HW556")) {
529 + * HW556 has different wlan caldatas depending on
530 + * hardware version.
531 + * Detect hardware version and change board id
533 + u8 cal_data_ath9k[4] = { 0xa5, 0x5a, 0, 0 };
534 + u8 cal_data_rt3062[4] = { 0x62, 0x30, 1, 0 };
536 + if (!memcmp(boot_addr + 0xeffe00,
537 + &cal_data_rt3062, 4)) {
538 + /* Ralink 0xeffe00 */
539 + memcpy(board_name, "HW556_A", 7);
540 + } else if (!memcmp(boot_addr + 0xf7e000,
541 + &cal_data_ath9k, 4)) {
542 + /* Atheros 0xf7e000 */
543 + memcpy(board_name, "HW556_B", 7);
544 + } else if (!memcmp(boot_addr + 0xefe000,
545 + &cal_data_ath9k, 4)) {
546 + /* Atheros 0xefe000 */
547 + memcpy(board_name, "HW556_C", 7);
552 --- a/drivers/mtd/bcm63xxpart.c
553 +++ b/drivers/mtd/bcm63xxpart.c
554 @@ -70,6 +70,11 @@ static int bcm63xx_parse_cfe_partitions(
555 BCM63XX_CFE_BLOCK_SIZE);
557 cfelen = cfe_erasesize;
559 + /* Fix HW556 MX29LV128DB */
560 + if (!strncmp(bcm63xx_nvram_get_name(), "HW556", 5))
563 nvramlen = bcm63xx_nvram_get_psi_size();
564 nvramlen = roundup(nvramlen, cfe_erasesize);
565 nvramaddr = master->size - nvramlen;