1 --- a/drivers/mtd/parsers/redboot.c
2 +++ b/drivers/mtd/parsers/redboot.c
3 @@ -71,6 +71,22 @@ static void parse_redboot_of(struct mtd_
7 +static uint32_t mtd_get_offset_erasesize(struct mtd_info *mtd, uint64_t offset)
9 + struct mtd_erase_region_info *regions = mtd->eraseregions;
12 + for (i = 0; i < mtd->numeraseregions; i++) {
13 + if (regions[i].offset +
14 + regions[i].numblocks * regions[i].erasesize <= offset)
17 + return regions[i].erasesize;
20 + return mtd->erasesize;
23 static int parse_redboot_partitions(struct mtd_info *master,
24 const struct mtd_partition **pparts,
25 struct mtd_part_parser_data *data)
26 @@ -87,6 +103,7 @@ static int parse_redboot_partitions(stru
32 #ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
33 static char nullstring[] = "unallocated";
34 @@ -134,7 +151,9 @@ nogood:
37 numslots = (master->erasesize / sizeof(struct fis_image_desc));
38 - for (i = 0; i < numslots; i++) {
39 + first_slot = (buf[i].flash_base & (master->erasesize - 1)) /
40 + sizeof(struct fis_image_desc);
41 + for (i = first_slot; i < first_slot + numslots; i++) {
42 if (!memcmp(buf[i].name, "FIS directory", 14)) {
43 /* This is apparently the FIS directory entry for the
44 * FIS directory itself. The FIS directory size is
45 @@ -200,7 +219,10 @@ nogood:
49 - for (i = 0; i < numslots; i++) {
50 + first_slot = (buf[i].flash_base & (master->erasesize - 1)) /
51 + sizeof(struct fis_image_desc);
53 + for (i = first_slot; i < first_slot + numslots; i++) {
54 struct fis_list *new_fl, **prev;
56 if (buf[i].name[0] == 0xff) {
57 @@ -275,12 +297,13 @@ nogood:
60 for ( ; i < nrparts; i++) {
61 - if (max_offset < buf[i].flash_base + buf[i].size)
62 - max_offset = buf[i].flash_base + buf[i].size;
63 parts[i].size = fl->img->size;
64 parts[i].offset = fl->img->flash_base;
65 parts[i].name = names;
67 + if (max_offset < parts[i].offset + parts[i].size)
68 + max_offset = parts[i].offset + parts[i].size;
70 strcpy(names, fl->img->name);
71 #ifdef CONFIG_MTD_REDBOOT_PARTS_READONLY
72 if (!memcmp(names, "RedBoot", 8) ||
73 @@ -310,7 +333,9 @@ nogood:
77 - if (master->size - max_offset >= master->erasesize) {
79 + if (master->size - max_offset >=
80 + mtd_get_offset_erasesize(master, max_offset)) {
81 parts[nrparts].size = master->size - max_offset;
82 parts[nrparts].offset = max_offset;
83 parts[nrparts].name = names;