ca9e6861770ab29b7794e2033716af84db7f4187
[openwrt/staging/mans0n.git] / target / linux / ath25 / patches-5.15 / 142-redboot_various_erase_size_fix.patch
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_
4 directory = dirblock;
5 }
6
7 +static uint32_t mtd_get_offset_erasesize(struct mtd_info *mtd, uint64_t offset)
8 +{
9 + struct mtd_erase_region_info *regions = mtd->eraseregions;
10 + int i;
11 +
12 + for (i = 0; i < mtd->numeraseregions; i++) {
13 + if (regions[i].offset +
14 + regions[i].numblocks * regions[i].erasesize <= offset)
15 + continue;
16 +
17 + return regions[i].erasesize;
18 + }
19 +
20 + return mtd->erasesize;
21 +}
22 +
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
27 int namelen = 0;
28 int nulllen = 0;
29 int numslots;
30 + int first_slot;
31 unsigned long offset;
32 #ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
33 static char nullstring[] = "unallocated";
34 @@ -134,7 +151,9 @@ nogood:
35 }
36
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:
46 goto out;
47 }
48
49 - for (i = 0; i < numslots; i++) {
50 + first_slot = (buf[i].flash_base & (master->erasesize - 1)) /
51 + sizeof(struct fis_image_desc);
52 +
53 + for (i = first_slot; i < first_slot + numslots; i++) {
54 struct fis_list *new_fl, **prev;
55
56 if (buf[i].name[0] == 0xff) {
57 @@ -275,12 +297,13 @@ nogood:
58 }
59 #endif
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;
66
67 + if (max_offset < parts[i].offset + parts[i].size)
68 + max_offset = parts[i].offset + parts[i].size;
69 +
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:
74 fl = fl->next;
75 kfree(tmp_fl);
76 }
77 - if (master->size - max_offset >= master->erasesize) {
78 +
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;