| --- a/drivers/mtd/parsers/bcm47xxpart.c |
| +++ b/drivers/mtd/parsers/bcm47xxpart.c |
| @@ -98,6 +98,7 @@ static int bcm47xxpart_parse(struct mtd_ |
| int trx_num = 0; /* Number of found TRX partitions */ |
| int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, }; |
| int err; |
| + bool found_nvram = false; |
| |
| /* |
| * Some really old flashes (like AT45DB*) had smaller erasesize-s, but |
| @@ -279,12 +280,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. |