mtd: bcm47xxpart: look for NVRAM at the end of device
NVRAM is always placed at the end of device and it does not have to start at the beginning of a block, so check few possible offsets. Signed-off-by: Rafał Miłecki <zajec5@gmail.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
This commit is contained in:
parent
5ca1088f10
commit
91d542f4dc
1 changed files with 25 additions and 7 deletions
|
@ -63,6 +63,7 @@ static int bcm47xxpart_parse(struct mtd_info *master,
|
|||
struct trx_header *trx;
|
||||
int trx_part = -1;
|
||||
int last_trx_part = -1;
|
||||
int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, };
|
||||
|
||||
if (blocksize <= 0x10000)
|
||||
blocksize = 0x10000;
|
||||
|
@ -99,13 +100,6 @@ static int bcm47xxpart_parse(struct mtd_info *master,
|
|||
continue;
|
||||
}
|
||||
|
||||
/* Standard NVRAM */
|
||||
if (buf[0x000 / 4] == NVRAM_HEADER) {
|
||||
bcm47xxpart_add_part(&parts[curr_part++], "nvram",
|
||||
offset, 0);
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* board_data starts with board_id which differs across boards,
|
||||
* but we can use 'MPFR' (hopefully) magic at 0x100
|
||||
|
@ -174,6 +168,30 @@ static int bcm47xxpart_parse(struct mtd_info *master,
|
|||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* Look for NVRAM at the end of the last block. */
|
||||
for (i = 0; i < ARRAY_SIZE(possible_nvram_sizes); i++) {
|
||||
if (curr_part > BCM47XXPART_MAX_PARTS) {
|
||||
pr_warn("Reached maximum number of partitions, scanning stopped!\n");
|
||||
break;
|
||||
}
|
||||
|
||||
offset = master->size - possible_nvram_sizes[i];
|
||||
if (mtd_read(master, offset, 0x4, &bytes_read,
|
||||
(uint8_t *)buf) < 0) {
|
||||
pr_err("mtd_read error while reading at offset 0x%X!\n",
|
||||
offset);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Standard NVRAM */
|
||||
if (buf[0] == NVRAM_HEADER) {
|
||||
bcm47xxpart_add_part(&parts[curr_part++], "nvram",
|
||||
master->size - blocksize, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
kfree(buf);
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue