diff options
| author | acoul <acoul@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2010-11-08 11:12:59 +0000 | 
|---|---|---|
| committer | acoul <acoul@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2010-11-08 11:12:59 +0000 | 
| commit | 20ca544134f149b84d582332fe7c8727256fb45c (patch) | |
| tree | a1b813aa176648af05ab70ba2a69716bbac0795a /target/linux/atheros/patches-2.6.37/140-redboot_partition_scan.patch | |
| parent | 0d9d3d7398dbce0cb634eaf297ff75add16cae0e (diff) | |
linux/atheros: add preliminary 2.6.37 kernel support (thank you nbd, florian)
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@23928 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/atheros/patches-2.6.37/140-redboot_partition_scan.patch')
| -rw-r--r-- | target/linux/atheros/patches-2.6.37/140-redboot_partition_scan.patch | 54 | 
1 files changed, 54 insertions, 0 deletions
diff --git a/target/linux/atheros/patches-2.6.37/140-redboot_partition_scan.patch b/target/linux/atheros/patches-2.6.37/140-redboot_partition_scan.patch new file mode 100644 index 000000000..a09271a06 --- /dev/null +++ b/target/linux/atheros/patches-2.6.37/140-redboot_partition_scan.patch @@ -0,0 +1,54 @@ +--- a/drivers/mtd/redboot.c ++++ b/drivers/mtd/redboot.c +@@ -78,31 +78,32 @@ 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 (master->block_isbad &&  ++		while (master->block_isbad && + 		       master->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; + 		} + 	} else { + 		offset = directory * master->erasesize; +-		while (master->block_isbad &&  ++		while (master->block_isbad && + 		       master->block_isbad(master, offset)) { + 			offset += master->erasesize; + 			if (offset == master->size) + 				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); +  +@@ -174,6 +175,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;  | 
