kernel: add 2.6.33 patches
[openwrt/openwrt.git] / target / linux / generic-2.6 / patches-2.6.33 / 071-redboot_boardconfig.patch
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: