mtd: bcm47xxpart: find NVRAM partitions in middle blocks
authorRafał Miłecki <zajec5@gmail.com>
Mon, 18 Aug 2014 18:20:27 +0000 (20:20 +0200)
committerBrian Norris <computersforpeace@gmail.com>
Thu, 18 Sep 2014 06:15:38 +0000 (23:15 -0700)
Old devices used to have NVRAM at the very end of flash and they could
be unaligned (starting at some offset in a block).
In new devices NVRAM can be located quite randomly, however it seems to
always start at the beginning of a block. For example Netgear R6250 has
NVRAM located right after the bootloader, before the kernel partition.

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
drivers/mtd/bcm47xxpart.c

index adfa74c1bc45077e12fe78c1601b74923834fdec..8057f52a45b706b63d0311acd23eb078ed046428 100644 (file)
@@ -199,6 +199,17 @@ static int bcm47xxpart_parse(struct mtd_info *master,
                        continue;
                }
 
+               /*
+                * New (ARM?) devices may have NVRAM in some middle block. Last
+                * block will be checked later, so skip it.
+                */
+               if (offset != master->size - blocksize &&
+                   buf[0x000 / 4] == NVRAM_HEADER) {
+                       bcm47xxpart_add_part(&parts[curr_part++], "nvram",
+                                            offset, 0);
+                       continue;
+               }
+
                /* Read middle of the block */
                if (mtd_read(master, offset + 0x8000, 0x4,
                             &bytes_read, (uint8_t *)buf) < 0) {