Index: linux-3.1.9/drivers/mtd/mtdpart.c =================================================================== --- linux-3.1.9.orig/drivers/mtd/mtdpart.c 2012-01-29 22:55:30.295904157 +0100 +++ linux-3.1.9/drivers/mtd/mtdpart.c 2012-01-29 22:55:30.395904294 +0100 @@ -899,6 +899,38 @@ return le32_to_cpu(temp) == SQUASHFS_MAGIC; } +static unsigned long find_brnimage_size(struct mtd_info *mtd, + unsigned long offset) +{ + unsigned long buf[4]; + // Assume at most 2MB of kernel image + unsigned long end = offset + (2 << 20); + unsigned long ptr = offset + 0x400 - 12; + size_t len; + int ret; + + while (ptr < end) { + long size_min = ptr - 0x400 - 12 - offset; + long size_max = ptr + 12 - offset; + ret = mtd->read(mtd, ptr, 16, &len, (void *)buf); + if (ret || len != 16) + return 0; + + if (le32_to_cpu(buf[0]) < size_min || + le32_to_cpu(buf[0]) > size_max) { + ptr += 0x400; + continue; + } + + if (le32_to_cpu(buf[3]) == SQUASHFS_MAGIC) + return ptr + 12 - offset; + + ptr += 0x400; + } + + return 0; +} + static int split_uimage(struct mtd_info *mtd, const struct mtd_partition *part) { @@ -916,8 +948,11 @@ split_partitions[0].size = find_uimage_size(mtd, part->offset); if (!split_partitions[0].size) { - printk(KERN_NOTICE "no uImage found in linux partition\n"); - return -1; + split_partitions[0].size = find_brnimage_size(mtd, part->offset); + if (!split_partitions[0].size) { + printk(KERN_NOTICE "no uImage or brnImage found in linux partition\n"); + return -1; + } } if (!detect_squashfs_partition(mtd, Index: linux-3.1.9/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h =================================================================== --- linux-3.1.9.orig/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h 2012-01-29 22:55:30.195904014 +0100 +++ linux-3.1.9/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h 2012-01-29 22:55:30.395904294 +0100 @@ -149,6 +149,7 @@ extern __iomem void *ltq_ebu_membase; extern __iomem void *ltq_cgu_membase; +extern long ltq_brn_boot; /* request a non-gpio and set the PIO config */ extern int ltq_gpio_request(unsigned int pin, unsigned int alt0, Index: linux-3.1.9/arch/mips/lantiq/setup.c =================================================================== --- linux-3.1.9.orig/arch/mips/lantiq/setup.c 2012-01-29 22:55:30.095903875 +0100 +++ linux-3.1.9/arch/mips/lantiq/setup.c 2012-01-29 22:59:28.686237119 +0100 @@ -20,6 +20,8 @@ /* assume 16M as default incase uboot fails to pass proper ramsize */ unsigned long physical_memsize = 16L; +/* set to 1 if the bootloader is BRN-BOOT instead of u-boot */ +unsigned long ltq_brn_boot = 0; void __init plat_mem_setup(void) { @@ -39,6 +41,10 @@ if (strict_strtoul(e, 0, &physical_memsize)) pr_warn("bad memsize specified\n"); } + if (!strncmp(e, "BRN-BOOT", 8)){ + pr_info("Found BRN-BOOT instead of u-boot\n"); + ltq_brn_boot = 1; + } envp++; } physical_memsize *= 1024 * 1024;