| 1 | --- a/drivers/mtd/redboot.c |
| 2 | +++ b/drivers/mtd/redboot.c |
| 3 | @@ -11,6 +11,8 @@ |
| 4 | #include <linux/mtd/mtd.h> |
| 5 | #include <linux/mtd/partitions.h> |
| 6 | |
| 7 | +#define BOARD_CONFIG_PART "boardconfig" |
| 8 | + |
| 9 | struct fis_image_desc { |
| 10 | unsigned char name[16]; // Null terminated name |
| 11 | uint32_t flash_base; // Address within FLASH of image |
| 12 | @@ -41,6 +43,7 @@ static int parse_redboot_partitions(stru |
| 13 | struct mtd_partition **pparts, |
| 14 | unsigned long fis_origin) |
| 15 | { |
| 16 | + unsigned long max_offset = 0; |
| 17 | int nrparts = 0; |
| 18 | struct fis_image_desc *buf; |
| 19 | struct mtd_partition *parts; |
| 20 | @@ -209,14 +212,14 @@ static int parse_redboot_partitions(stru |
| 21 | } |
| 22 | } |
| 23 | #endif |
| 24 | - parts = kzalloc(sizeof(*parts)*nrparts + nulllen + namelen, GFP_KERNEL); |
| 25 | + parts = kzalloc(sizeof(*parts) * (nrparts + 1) + nulllen + namelen + sizeof(BOARD_CONFIG_PART), GFP_KERNEL); |
| 26 | |
| 27 | if (!parts) { |
| 28 | ret = -ENOMEM; |
| 29 | goto out; |
| 30 | } |
| 31 | |
| 32 | - nullname = (char *)&parts[nrparts]; |
| 33 | + nullname = (char *)&parts[nrparts + 1]; |
| 34 | #ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED |
| 35 | if (nulllen > 0) { |
| 36 | strcpy(nullname, nullstring); |
| 37 | @@ -235,6 +238,8 @@ static int parse_redboot_partitions(stru |
| 38 | } |
| 39 | #endif |
| 40 | for ( ; i<nrparts; i++) { |
| 41 | + if(max_offset < buf[i].flash_base + buf[i].size) |
| 42 | + max_offset = buf[i].flash_base + buf[i].size; |
| 43 | parts[i].size = fl->img->size; |
| 44 | parts[i].offset = fl->img->flash_base; |
| 45 | parts[i].name = names; |
| 46 | @@ -268,6 +273,14 @@ static int parse_redboot_partitions(stru |
| 47 | fl = fl->next; |
| 48 | kfree(tmp_fl); |
| 49 | } |
| 50 | + if(master->size - max_offset >= master->erasesize) |
| 51 | + { |
| 52 | + parts[nrparts].size = master->size - max_offset; |
| 53 | + parts[nrparts].offset = max_offset; |
| 54 | + parts[nrparts].name = names; |
| 55 | + strcpy(names, BOARD_CONFIG_PART); |
| 56 | + nrparts++; |
| 57 | + } |
| 58 | ret = nrparts; |
| 59 | *pparts = parts; |
| 60 | out: |
| 61 | |