ar71xx: refresh patches
[openwrt.git] / target / linux / ar71xx / patches-3.6 / 408-mtd-redboot_partition_scan.patch
1 --- a/drivers/mtd/redboot.c
2 +++ b/drivers/mtd/redboot.c
3 @@ -76,12 +76,18 @@ static int parse_redboot_partitions(stru
4         static char nullstring[] = "unallocated";
5  #endif
6  
7 +       buf = vmalloc(master->erasesize);
8 +       if (!buf)
9 +               return -ENOMEM;
10 +
11 + restart:
12         if ( directory < 0 ) {
13                 offset = master->size + directory * master->erasesize;
14                 while (mtd_block_isbad(master, offset)) {
15                         if (!offset) {
16                         nogood:
17                                 printk(KERN_NOTICE "Failed to find a non-bad block to check for RedBoot partition table\n");
18 +                               vfree(buf);
19                                 return -EIO;
20                         }
21                         offset -= master->erasesize;
22 @@ -94,10 +100,6 @@ static int parse_redboot_partitions(stru
23                                 goto nogood;
24                 }
25         }
26 -       buf = vmalloc(master->erasesize);
27 -
28 -       if (!buf)
29 -               return -ENOMEM;
30  
31         printk(KERN_NOTICE "Searching for RedBoot partition table in %s at offset 0x%lx\n",
32                master->name, offset);
33 @@ -170,6 +172,11 @@ static int parse_redboot_partitions(stru
34         }
35         if (i == numslots) {
36                 /* Didn't find it */
37 +               if (offset + master->erasesize < master->size) {
38 +                       /* not at the end of the flash yet, maybe next block :) */
39 +                       directory++;
40 +                       goto restart;
41 +               }
42                 printk(KERN_NOTICE "No RedBoot partition table detected in %s\n",
43                        master->name);
44                 ret = 0;