--- a/drivers/mtd/bcm47xxpart.c +++ b/drivers/mtd/bcm47xxpart.c @@ -68,6 +68,7 @@ static int bcm47xxpart_parse(struct mtd_ int trx_part = -1; int last_trx_part = -1; int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, }; + bool found_nvram = false; if (blocksize <= 0x10000) blocksize = 0x10000; @@ -229,12 +230,23 @@ static int bcm47xxpart_parse(struct mtd_ if (buf[0] == NVRAM_HEADER) { bcm47xxpart_add_part(&parts[curr_part++], "nvram", master->size - blocksize, 0); + found_nvram = true; break; } } kfree(buf); + if (!found_nvram) { + pr_err("can not find a nvram partition reserve last block\n"); + bcm47xxpart_add_part(&parts[curr_part++], "nvram_guess", + master->size - blocksize * 2, MTD_WRITEABLE); + for (i = 0; i < curr_part; i++) { + if (parts[i].size + parts[i].offset == master->size) + parts[i].offset -= blocksize * 2; + } + } + /* * Assume that partitions end at the beginning of the one they are * followed by.