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;
|
struct trx_header *trx;
|
||||||
int trx_part = -1;
|
int trx_part = -1;
|
||||||
int last_trx_part = -1;
|
int last_trx_part = -1;
|
||||||
|
int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, };
|
||||||
|
|
||||||
if (blocksize <= 0x10000)
|
if (blocksize <= 0x10000)
|
||||||
blocksize = 0x10000;
|
blocksize = 0x10000;
|
||||||
|
@ -99,13 +100,6 @@ static int bcm47xxpart_parse(struct mtd_info *master,
|
||||||
continue;
|
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,
|
* board_data starts with board_id which differs across boards,
|
||||||
* but we can use 'MPFR' (hopefully) magic at 0x100
|
* but we can use 'MPFR' (hopefully) magic at 0x100
|
||||||
|
@ -174,6 +168,30 @@ static int bcm47xxpart_parse(struct mtd_info *master,
|
||||||
continue;
|
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);
|
kfree(buf);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue