OpenWrt – Rev 1

Subversion Repositories:
Rev:
--- a/drivers/mtd/redboot.c
+++ b/drivers/mtd/redboot.c
@@ -76,12 +76,18 @@ static int parse_redboot_partitions(stru
        static char nullstring[] = "unallocated";
 #endif
 
+       buf = vmalloc(master->erasesize);
+       if (!buf)
+               return -ENOMEM;
+
+ restart:
        if ( directory < 0 ) {
                offset = master->size + directory * master->erasesize;
                while (mtd_block_isbad(master, offset)) {
                        if (!offset) {
                        nogood:
                                printk(KERN_NOTICE "Failed to find a non-bad block to check for RedBoot partition table\n");
+                               vfree(buf);
                                return -EIO;
                        }
                        offset -= master->erasesize;
@@ -94,10 +100,6 @@ static int parse_redboot_partitions(stru
                                goto nogood;
                }
        }
-       buf = vmalloc(master->erasesize);
-
-       if (!buf)
-               return -ENOMEM;
 
        printk(KERN_NOTICE "Searching for RedBoot partition table in %s at offset 0x%lx\n",
               master->name, offset);
@@ -170,6 +172,11 @@ static int parse_redboot_partitions(stru
        }
        if (i == numslots) {
                /* Didn't find it */
+               if (offset + master->erasesize < master->size) {
+                       /* not at the end of the flash yet, maybe next block :) */
+                       directory++;
+                       goto restart;
+               }
                printk(KERN_NOTICE "No RedBoot partition table detected in %s\n",
                       master->name);
                ret = 0;