Update kernel configuration and add profiles and per-profile kernel configuration...
[openwrt.git] / target / linux / brcm-2.4 / files / drivers / mtd / maps / bcm947xx-flash.c
index ee02563..eea7f13 100644 (file)
@@ -56,7 +56,6 @@
 #include <typedefs.h>
 #include <osl.h>
 #include <bcmnvram.h>
-#include <bcmutils.h>
 #include <sbconfig.h>
 #include <sbchipc.h>
 #include <sbutils.h>
@@ -158,6 +157,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: "rootfs_data", offset: 0, size: 0, },
        { name: NULL, },
 };
 
@@ -321,8 +321,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 +413,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;
 }
@@ -426,7 +469,7 @@ mod_init_t init_bcm947xx_map(void)
 
        /* Check strapping option if chipcommon exists */
        if ((cc = sb_setcore(sbh, SB_CC, 0))) {
-               fltype = readl(&cc->capabilities) & CAP_FLASH_MASK;
+               fltype = readl(&cc->capabilities) & CC_CAP_FLASH_MASK;
                if (fltype == PFLASH) {
                        bcm947xx_map.map_priv_2 = 1;
                        window_addr = 0x1c000000;
This page took 0.021675 seconds and 4 git commands to generate.