summaryrefslogtreecommitdiff
path: root/drivers/mtd/redboot.c
diff options
context:
space:
mode:
authorDavid Woodhouse <dwmw2@infradead.org>2007-02-10 09:58:31 +0000
committerDavid Woodhouse <dwmw2@infradead.org>2007-02-10 09:58:31 +0000
commit7ca353a428ecbaf77b651fbacfcb2f2f6d813879 (patch)
tree94e8338e3fdec701e2d9d6ce2ad38089dbf78ab4 /drivers/mtd/redboot.c
parent11192146e57bc8e58865e7d9c2497f66a4f7e6e7 (diff)
[MTD] Improve heuristic for detecting wrong-endian RedBoot partition table
Also limit the amount we scan to one eraseblock. Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Diffstat (limited to 'drivers/mtd/redboot.c')
-rw-r--r--drivers/mtd/redboot.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/mtd/redboot.c b/drivers/mtd/redboot.c
index a459ffa1e676..a61351f88ec0 100644
--- a/drivers/mtd/redboot.c
+++ b/drivers/mtd/redboot.c
@@ -94,7 +94,16 @@ static int parse_redboot_partitions(struct mtd_info *master,
* (NOTE: this is 'size' not 'data_length'; size is
* the full size of the entry.)
*/
- if (swab32(buf[i].size) == master->erasesize) {
+
+ /* RedBoot can combine the FIS directory and
+ config partitions into a single eraseblock;
+ we assume wrong-endian if either the swapped
+ 'size' matches the eraseblock size precisely,
+ or if the swapped size actually fits in an
+ eraseblock while the unswapped size doesn't. */
+ if (swab32(buf[i].size) == master->erasesize ||
+ (buf[i].size > master->erasesize
+ && swab32(buf[i].size) < master->erasesize)) {
int j;
/* Update numslots based on actual FIS directory size */
numslots = swab32(buf[i].size) / sizeof (struct fis_image_desc);
@@ -122,7 +131,7 @@ static int parse_redboot_partitions(struct mtd_info *master,
swab32s(&buf[j].desc_cksum);
swab32s(&buf[j].file_cksum);
}
- } else {
+ } else if (buf[i].size < master->erasesize) {
/* Update numslots based on actual FIS directory size */
numslots = buf[i].size / sizeof(struct fis_image_desc);
}