revert to the previous version of the flash map driver - committed the wrong one...
authorFelix Fietkau <nbd@openwrt.org>
Sun, 6 May 2007 18:30:53 +0000 (18:30 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Sun, 6 May 2007 18:30:53 +0000 (18:30 +0000)
SVN-Revision: 7118

target/linux/brcm-2.4/files/drivers/mtd/maps/bcm947xx-flash.c

index ee02563661cbbc7bfc42d4535198ef6ffb4e4f40..3176eb0552f65c87361277972e1ecd55066f58af 100644 (file)
@@ -158,6 +158,7 @@ static struct mtd_partition bcm947xx_parts[] = {
        { name: "linux", offset: 0, size: 0, },
        { name: "rootfs", offset: 0, size: 0, },
        { name: "nvram", offset: 0, size: 0, },
+       { name: "OpenWrt", offset: 0, size: 0, },
        { name: NULL, },
 };
 
@@ -321,8 +322,24 @@ find_root(struct mtd_info *mtd, size_t size, struct mtd_partition *part)
        if (MTD_READ(mtd, part->offset, sizeof(buf), &len, buf) || len != sizeof(buf))
                return 0;
 
-       /* Move the filesystem outside of the trx */
-       part->size = 0;
+       if (*((__u32 *) buf) == SQUASHFS_MAGIC) {
+               printk(KERN_INFO "%s: Filesystem type: squashfs, size=0x%x\n", mtd->name, (u32) sb->bytes_used);
+
+               /* Update the squashfs partition size based on the superblock info */
+               part->size = sb->bytes_used;
+               len = part->offset + part->size;
+               len +=  (mtd->erasesize - 1);
+               len &= ~(mtd->erasesize - 1);
+               part->size = len - part->offset;
+       } else if (*((__u16 *) buf) == JFFS2_MAGIC_BITMASK) {
+               printk(KERN_INFO "%s: Filesystem type: jffs2\n", mtd->name);
+
+               /* Move the squashfs outside of the trx */
+               part->size = 0;
+       } else {
+               printk(KERN_INFO "%s: Filesystem type: unknown\n", mtd->name);
+               return 0;
+       }
 
        if (trx.len != part->offset + part->size - off) {
                /* Update the trx offsets and length */
@@ -397,9 +414,36 @@ init_mtd_partitions(struct mtd_info *mtd, size_t size)
                        (2*bcm947xx_parts[3].size) - 
                        mtd->erasesize;
        }
-       
-       find_root(mtd,size,&bcm947xx_parts[2]);
-       bcm947xx_parts[2].size = size - bcm947xx_parts[2].offset - bcm947xx_parts[3].size;
+
+       /* find and size rootfs */
+       if (find_root(mtd,size,&bcm947xx_parts[2])==0) {
+               /* entirely jffs2 */
+               bcm947xx_parts[4].name = NULL;
+               bcm947xx_parts[2].size = size - bcm947xx_parts[2].offset - 
+                               bcm947xx_parts[3].size;
+       } else {
+               /* legacy setup */
+               /* calculate leftover flash, and assign it to the jffs2 partition */
+               if (cfe_size != 384 * 1024) {
+                       bcm947xx_parts[4].offset = bcm947xx_parts[2].offset + 
+                               bcm947xx_parts[2].size;
+                       if ((bcm947xx_parts[4].offset % mtd->erasesize) > 0) {
+                               bcm947xx_parts[4].offset += mtd->erasesize - 
+                                       (bcm947xx_parts[4].offset % mtd->erasesize);
+                       }
+                       bcm947xx_parts[4].size = bcm947xx_parts[3].offset - 
+                               bcm947xx_parts[4].offset;
+               } else {
+                       bcm947xx_parts[4].offset = bcm947xx_parts[2].offset + 
+                               bcm947xx_parts[2].size;
+                       if ((bcm947xx_parts[4].offset % mtd->erasesize) > 0) {
+                               bcm947xx_parts[4].offset += mtd->erasesize - 
+                                       (bcm947xx_parts[4].offset % mtd->erasesize);
+                       }
+                       bcm947xx_parts[4].size = size - bcm947xx_parts[3].size - 
+                               bcm947xx_parts[4].offset;
+               }
+       }
 
        return bcm947xx_parts;
 }