brcm47xx: add some more partition parser fixes by Rafał Miłecki
[openwrt/svn-archive/archive.git] / target / linux / brcm47xx / patches-3.8 / 025-mtd-bcm47xxpart-look-for-NVRAM-at-the-end-of-device.patch
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 (file)
index 0000000..1f82c92
--- /dev/null
@@ -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);
+       /*