summaryrefslogtreecommitdiffstats
path: root/target/linux/brcm47xx/patches-3.8/025-mtd-bcm47xxpart-look-for-NVRAM-at-the-end-of-device.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/brcm47xx/patches-3.8/025-mtd-bcm47xxpart-look-for-NVRAM-at-the-end-of-device.patch')
-rw-r--r--target/linux/brcm47xx/patches-3.8/025-mtd-bcm47xxpart-look-for-NVRAM-at-the-end-of-device.patch55
1 files changed, 55 insertions, 0 deletions
diff --git a/target/linux/brcm47xx/patches-3.8/025-mtd-bcm47xxpart-look-for-NVRAM-at-the-end-of-device.patch b/target/linux/brcm47xx/patches-3.8/025-mtd-bcm47xxpart-look-for-NVRAM-at-the-end-of-device.patch
new file mode 100644
index 000000000..1f82c922c
--- /dev/null
+++ b/target/linux/brcm47xx/patches-3.8/025-mtd-bcm47xxpart-look-for-NVRAM-at-the-end-of-device.patch
@@ -0,0 +1,55 @@
+--- a/drivers/mtd/bcm47xxpart.c
++++ b/drivers/mtd/bcm47xxpart.c
+@@ -63,6 +63,7 @@ static int bcm47xxpart_parse(struct mtd_
+ 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_
+ 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_
+ 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);
+
+ /*