1 --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
2 +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
3 @@ -2965,6 +2965,374 @@ static struct board_info __initdata boar
7 +static struct board_info __initdata board_HW556 = {
9 + .expected_cpu_id = 0x6358,
19 + .caldata_offset = 0xe00000,
27 + .force_speed_100 = 1,
28 + .force_duplex_full = 1,
33 + .name = "HW556:red:message",
38 + .name = "HW556:red:hspa",
43 + .name = "HW556:red:dsl",
48 + .name = "HW556:red:power",
51 + .default_trigger = "default-on",
54 + .name = "HW556:red:all",
57 + .default_trigger = "default-on",
68 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
76 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
83 + .code = KEY_RESTART,
84 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
92 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
96 +static struct board_info __initdata board_HW556_A = {
98 + .expected_cpu_id = 0x6358,
108 + .vendor = PCI_VENDOR_ID_RALINK,
109 + .caldata_offset = 0xeffe00,
111 + .eeprom = "rt2x00.eeprom",
119 + .force_speed_100 = 1,
120 + .force_duplex_full = 1,
125 + .name = "HW556:red:message",
130 + .name = "HW556:red:hspa",
135 + .name = "HW556:red:dsl",
140 + .name = "HW556:red:power",
143 + .default_trigger = "default-on",
146 + .name = "HW556:red:all",
149 + .default_trigger = "default-on",
160 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
168 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
175 + .code = KEY_RESTART,
176 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
183 + .code = KEY_CONFIG,
184 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
188 +static struct board_info __initdata board_HW556_B = {
190 + .expected_cpu_id = 0x6358,
200 + .vendor = PCI_VENDOR_ID_ATHEROS,
201 + .caldata_offset = 0xf7e000,
212 + .force_speed_100 = 1,
213 + .force_duplex_full = 1,
218 + .name = "HW556:red:message",
223 + .name = "HW556:red:hspa",
228 + .name = "HW556:red:dsl",
233 + .name = "HW556:red:power",
236 + .default_trigger = "default-on",
239 + .name = "HW556:red:all",
242 + .default_trigger = "default-on",
253 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
261 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
268 + .code = KEY_RESTART,
269 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
276 + .code = KEY_CONFIG,
277 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
281 +static struct board_info __initdata board_HW556_C = {
283 + .expected_cpu_id = 0x6358,
293 + .vendor = PCI_VENDOR_ID_ATHEROS,
294 + .caldata_offset = 0xefe000,
305 + .force_speed_100 = 1,
306 + .force_duplex_full = 1,
311 + .name = "HW556:red:message",
316 + .name = "HW556:red:hspa",
321 + .name = "HW556:red:dsl",
326 + .name = "HW556:red:power",
329 + .default_trigger = "default-on",
332 + .name = "HW556:red:all",
335 + .default_trigger = "default-on",
346 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
354 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
361 + .code = KEY_RESTART,
362 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
369 + .code = KEY_CONFIG,
370 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
375 /* T-Home Speedport W 303V Typ B */
376 static struct board_info __initdata board_spw303v = {
377 .name = "96358-502V",
378 @@ -3393,6 +3761,10 @@ static const struct board_info __initdat
389 @@ -3458,13 +3830,37 @@ static void __init boardid_fixup(u8 *boo
390 struct bcm_tag *tag = (struct bcm_tag *)(boot_addr + CFE_OFFSET_64K);
391 char *board_name = (char *)bcm63xx_nvram_get_name();
393 - if (BCMCPU_IS_6358() && (!strcmp(board_name, "96358VW"))) {
394 - u8 *p = boot_addr + NB4_PID_OFFSET;
396 - /* Extract nb4 PID */
397 - if (!memcmp(p, "NB4-", 4)) {
398 - memcpy(board_name, p, sizeof("NB4-XXX-rX"));
400 + if (BCMCPU_IS_6358()) {
401 + if (!strcmp(board_name, "96358VW")) {
402 + u8 *p = boot_addr + NB4_PID_OFFSET;
404 + /* Extract nb4 PID */
405 + if (!memcmp(p, "NB4-", 4)) {
406 + memcpy(board_name, p, sizeof("NB4-XXX-rX"));
409 + } else if (!strcmp(board_name, "HW556")) {
411 + * HW556 has different wlan caldatas depending on
412 + * hardware version.
413 + * Detect hardware version and change board id
415 + u8 cal_data_ath9k[4] = { 0xa5, 0x5a, 0, 0 };
416 + u8 cal_data_rt3062[4] = { 0x62, 0x30, 1, 0 };
418 + if (!memcmp(boot_addr + 0xeffe00,
419 + &cal_data_rt3062, 4)) {
420 + /* Ralink 0xeffe00 */
421 + memcpy(board_name, "HW556_A", 7);
422 + } else if (!memcmp(boot_addr + 0xf7e000,
423 + &cal_data_ath9k, 4)) {
424 + /* Atheros 0xf7e000 */
425 + memcpy(board_name, "HW556_B", 7);
426 + } else if (!memcmp(boot_addr + 0xefe000,
427 + &cal_data_ath9k, 4)) {
428 + /* Atheros 0xefe000 */
429 + memcpy(board_name, "HW556_C", 7);
434 --- a/drivers/mtd/bcm63xxpart.c
435 +++ b/drivers/mtd/bcm63xxpart.c
436 @@ -93,6 +93,11 @@ static int bcm63xx_parse_cfe_partitions(
437 BCM63XX_CFE_BLOCK_SIZE);
439 cfelen = cfe_erasesize;
441 + /* Fix HW556 MX29LV128DB */
442 + if (!strncmp(bcm63xx_nvram_get_name(), "HW556", 5))
445 nvramlen = bcm63xx_nvram_get_psi_size() * 1024;
446 nvramlen = roundup(nvramlen, cfe_erasesize);
447 nvramaddr = master->size - nvramlen;