1 --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
2 +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
3 @@ -2923,6 +2923,366 @@ static struct board_info __initdata boar
7 +static struct board_info __initdata board_HW556 = {
9 + .expected_cpu_id = 0x6358,
19 + .caldata_offset = 0xe00000,
25 + .force_speed_100 = 1,
26 + .force_duplex_full = 1,
31 + .name = "HW556:red:message",
36 + .name = "HW556:red:hspa",
41 + .name = "HW556:red:dsl",
46 + .name = "HW556:red:power",
49 + .default_trigger = "default-on",
52 + .name = "HW556:red:all",
55 + .default_trigger = "default-on",
66 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
74 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
81 + .code = KEY_RESTART,
82 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
90 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
94 +static struct board_info __initdata board_HW556_A = {
96 + .expected_cpu_id = 0x6358,
106 + .vendor = PCI_VENDOR_ID_RALINK,
107 + .caldata_offset = 0xeffe00,
109 + .eeprom = "rt2x00.eeprom",
115 + .force_speed_100 = 1,
116 + .force_duplex_full = 1,
121 + .name = "HW556:red:message",
126 + .name = "HW556:red:hspa",
131 + .name = "HW556:red:dsl",
136 + .name = "HW556:red:power",
139 + .default_trigger = "default-on",
142 + .name = "HW556:red:all",
145 + .default_trigger = "default-on",
156 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
164 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
171 + .code = KEY_RESTART,
172 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
179 + .code = KEY_CONFIG,
180 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
184 +static struct board_info __initdata board_HW556_B = {
186 + .expected_cpu_id = 0x6358,
196 + .vendor = PCI_VENDOR_ID_ATHEROS,
197 + .caldata_offset = 0xf7e000,
206 + .force_speed_100 = 1,
207 + .force_duplex_full = 1,
212 + .name = "HW556:red:message",
217 + .name = "HW556:red:hspa",
222 + .name = "HW556:red:dsl",
227 + .name = "HW556:red:power",
230 + .default_trigger = "default-on",
233 + .name = "HW556:red:all",
236 + .default_trigger = "default-on",
247 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
255 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
262 + .code = KEY_RESTART,
263 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
270 + .code = KEY_CONFIG,
271 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
275 +static struct board_info __initdata board_HW556_C = {
277 + .expected_cpu_id = 0x6358,
287 + .vendor = PCI_VENDOR_ID_ATHEROS,
288 + .caldata_offset = 0xefe000,
297 + .force_speed_100 = 1,
298 + .force_duplex_full = 1,
303 + .name = "HW556:red:message",
308 + .name = "HW556:red:hspa",
313 + .name = "HW556:red:dsl",
318 + .name = "HW556:red:power",
321 + .default_trigger = "default-on",
324 + .name = "HW556:red:all",
327 + .default_trigger = "default-on",
338 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
346 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
353 + .code = KEY_RESTART,
354 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
361 + .code = KEY_CONFIG,
362 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
367 /* T-Home Speedport W 303V Typ B */
368 static struct board_info __initdata board_spw303v = {
369 .name = "96358-502V",
370 @@ -3349,6 +3709,10 @@ static const struct board_info __initdat
381 @@ -3414,13 +3778,37 @@ static void __init boardid_fixup(u8 *boo
382 struct bcm_tag *tag = (struct bcm_tag *)(boot_addr + CFE_OFFSET_64K);
383 char *board_name = (char *)bcm63xx_nvram_get_name();
385 - if (BCMCPU_IS_6358() && (!strcmp(board_name, "96358VW"))) {
386 - u8 *p = boot_addr + NB4_PID_OFFSET;
388 - /* Extract nb4 PID */
389 - if (!memcmp(p, "NB4-", 4)) {
390 - memcpy(board_name, p, sizeof("NB4-XXX-rX"));
392 + if (BCMCPU_IS_6358()) {
393 + if (!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"));
401 + } else if (!strcmp(board_name, "HW556")) {
403 + * HW556 has different wlan caldatas depending on
404 + * hardware version.
405 + * Detect hardware version and change board id
407 + u8 cal_data_ath9k[4] = { 0xa5, 0x5a, 0, 0 };
408 + u8 cal_data_rt3062[4] = { 0x62, 0x30, 1, 0 };
410 + if (!memcmp(boot_addr + 0xeffe00,
411 + &cal_data_rt3062, 4)) {
412 + /* Ralink 0xeffe00 */
413 + memcpy(board_name, "HW556_A", 7);
414 + } else if (!memcmp(boot_addr + 0xf7e000,
415 + &cal_data_ath9k, 4)) {
416 + /* Atheros 0xf7e000 */
417 + memcpy(board_name, "HW556_B", 7);
418 + } else if (!memcmp(boot_addr + 0xefe000,
419 + &cal_data_ath9k, 4)) {
420 + /* Atheros 0xefe000 */
421 + memcpy(board_name, "HW556_C", 7);
426 --- a/drivers/mtd/bcm63xxpart.c
427 +++ b/drivers/mtd/bcm63xxpart.c
428 @@ -93,6 +93,11 @@ static int bcm63xx_parse_cfe_partitions(
429 BCM63XX_CFE_BLOCK_SIZE);
431 cfelen = cfe_erasesize;
433 + /* Fix HW556 MX29LV128DB */
434 + if (!strncmp(bcm63xx_nvram_get_name(), "HW556", 5))
437 nvramlen = bcm63xx_nvram_get_psi_size() * 1024;
438 nvramlen = roundup(nvramlen, cfe_erasesize);
439 nvramaddr = master->size - nvramlen;