summaryrefslogtreecommitdiffstats
path: root/target/linux/brcm47xx/files
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/brcm47xx/files')
-rw-r--r--target/linux/brcm47xx/files/drivers/mtd/maps/bcm47xx-flash.c40
1 files changed, 37 insertions, 3 deletions
diff --git a/target/linux/brcm47xx/files/drivers/mtd/maps/bcm47xx-flash.c b/target/linux/brcm47xx/files/drivers/mtd/maps/bcm47xx-flash.c
index 3ceec403c..61605d3f4 100644
--- a/target/linux/brcm47xx/files/drivers/mtd/maps/bcm47xx-flash.c
+++ b/target/linux/brcm47xx/files/drivers/mtd/maps/bcm47xx-flash.c
@@ -222,6 +222,37 @@ static int erase_write (struct mtd_info *mtd, unsigned long pos,
}
+static int __init
+find_dual_image_off (struct mtd_info *mtd, size_t size)
+{
+ struct trx_header trx;
+ int off, blocksize;
+ size_t len;
+
+ blocksize = mtd->erasesize;
+ if (blocksize < 0x10000)
+ blocksize = 0x10000;
+
+ for (off = (128*1024); off < size; off += blocksize) {
+ memset(&trx, 0xe5, sizeof(trx));
+ /*
+ * Read into buffer
+ */
+ if (mtd->read(mtd, off, sizeof(trx), &len, (char *) &trx) ||
+ len != sizeof(trx))
+ continue;
+ /* found last TRX header */
+ if (le32_to_cpu(trx.magic) == TRX_MAGIC){
+ if (le32_to_cpu(trx.flag_version >> 16)==2){
+ printk("dual image TRX header found\n");
+ return size/2;
+ } else {
+ return 0;
+ }
+ }
+ }
+ return 0;
+}
static int __init
@@ -232,7 +263,6 @@ find_root(struct mtd_info *mtd, size_t size, struct mtd_partition *part)
int off, blocksize;
u32 i, crc = ~0;
size_t len;
- struct squashfs_super_block *sb = (struct squashfs_super_block *) buf;
blocksize = mtd->erasesize;
if (blocksize < 0x10000)
@@ -318,6 +348,7 @@ struct mtd_partition * __init
init_mtd_partitions(struct mtd_info *mtd, size_t size)
{
int cfe_size;
+ int dual_image_offset = 0;
if ((cfe_size = find_cfe_size(mtd,size)) < 0)
return NULL;
@@ -336,10 +367,13 @@ init_mtd_partitions(struct mtd_info *mtd, size_t size)
bcm47xx_parts[3].size = ROUNDUP(NVRAM_SPACE, mtd->erasesize);
}
+ /* dual image offset*/
+ printk("Looking for dual image\n");
+ dual_image_offset=find_dual_image_off(mtd,size);
/* linux (kernel and rootfs) */
if (cfe_size != 384 * 1024) {
bcm47xx_parts[1].offset = bcm47xx_parts[0].size;
- bcm47xx_parts[1].size = bcm47xx_parts[3].offset -
+ bcm47xx_parts[1].size = bcm47xx_parts[3].offset - dual_image_offset -
bcm47xx_parts[1].offset;
} else {
/* do not count the elf loader, which is on one block */
@@ -353,7 +387,7 @@ init_mtd_partitions(struct mtd_info *mtd, size_t size)
/* find and size rootfs */
find_root(mtd,size,&bcm47xx_parts[2]);
- bcm47xx_parts[2].size = size - bcm47xx_parts[2].offset - bcm47xx_parts[3].size;
+ bcm47xx_parts[2].size = size - dual_image_offset - bcm47xx_parts[2].offset - bcm47xx_parts[3].size;
return bcm47xx_parts;
}