exit(1);
        }
 
-       sprintf(&tag->rootLength[0], "%lu", 0);
+       sprintf(&tag->flashRootLength[0], "%lu", 0);
        strncpy(&tag->totalLength[0], &tag->kernelLength[0], IMAGE_LEN);
 
        imagestart = sizeof(tag);
          fprintf(stderr, "Checking current fixed status.\n");
        }
 
-       rootfslen = strntoul(&tag->rootLength[0], NULL, 10, IMAGE_LEN);
+       rootfslen = strntoul(&tag->flashRootLength[0], NULL, 10, IMAGE_LEN);
        if (rootfslen == 0) {
          if (quiet < 2) 
                fprintf(stderr, "Header already fixed, exiting\n");
          fprintf(stderr, "Setting root length to 0.\n");
        }
 
-       sprintf(&tag->rootLength[0], "%lu", 0);
+       sprintf(&tag->flashRootLength[0], "%lu", 0);
        strncpy(&tag->totalLength[0], &tag->kernelLength[0], IMAGE_LEN);
 
        if (quiet < 2) {
 
        char cfeAddress[ADDRESS_LEN];          // 72-83: Address in memory of CFE
        char cfeLength[IMAGE_LEN];             // 84-93: Size of CFE
        char flashImageStart[ADDRESS_LEN];     // 94-105: Address in memory of image start (kernel for OpenWRT, rootfs for stock firmware)
-       char rootLength[IMAGE_LEN];            // 106-115: Size of rootfs
+       char flashRootLength[IMAGE_LEN];            // 106-115: Size of rootfs for flashing
        char kernelAddress[ADDRESS_LEN];       // 116-127: Address in memory of kernel
        char kernelLength[IMAGE_LEN];          // 128-137: Size of kernel
        char dualImage[DUALFLAG_LEN];          // 138-139: Unused at present
        char imageCRC[CRC_LEN];                // 216-219: CRC32 of image less imagetag (kernel for Alice Gate)
         char rootfsCRC[CRC_LEN];               // 220-223: CRC32 of rootfs partition
         char kernelCRC[CRC_LEN];               // 224-227: CRC32 of kernel partition
-        char reserved1[8];                     // 228-235: Unused at present
+     char rootLength[4];                        // 228-231: steal from reserved1 to keep the real root length so we can use in the flash map even after we have change the rootLength to 0 to satisfy devices that check CRC on every boot
+        char reserved1[4];                     // 232-235: Unused at present
         char headerCRC[CRC_LEN];               // 236-239: CRC32 of header excluding tagVersion
         char reserved2[16];                    // 240-255: Unused at present
 };
 
 +obj-$(CONFIG_MTD_BCM963XX)    += bcm963xx-flash.o
 --- /dev/null
 +++ b/drivers/mtd/maps/bcm963xx-flash.c
-@@ -0,0 +1,314 @@
+@@ -0,0 +1,288 @@
 +/*
 + * Copyright (C) 2006-2008  Florian Fainelli <florian@openwrt.org>
 + *                        Mike Albon <malbon@openwrt.org>
 +      sscanf(buf->kernelAddress, "%u", &kerneladdr);
 +      sscanf(buf->kernelLength, "%u", &kernellen);
 +      sscanf(buf->totalLength, "%u", &totallen);
++      sscanf(buf->rootLength, "%u", &rootfslen);
 +      tagversion = &(buf->tagVersion[0]);
 +      boardid = &(buf->boardid[0]);
 +
 +        return -EINVAL;
 +      }
 +
-+      //      if (SQUASHFS_MAGIC != le32_to_cpu(sb.s_magic) ) {
-+      printk(KERN_DEBUG PFX "Squash magic %08lx: Found: %08lx\n", (long unsigned int)SQUASHFS_MAGIC, (long unsigned int)le32_to_cpu(sb.s_magic));
-+      if ((uint32_t)SQUASHFS_MAGIC != (uint32_t)le32_to_cpu(sb.s_magic) ) {
-+        /* Not a squashfs image */
-+              printk(KERN_DEBUG PFX "No squashfs image in \"%s\"\n", master->name);
-+              printk(KERN_DEBUG PFX "Jffs magic %04x: Found: %04x\n", (uint16_t)(JFFS2_MAGIC_BITMASK), *(uint16_t *)(&sb));
-+              if (*(uint16_t *)(&sb) == JFFS2_MAGIC_BITMASK) {
-+                printk(KERN_DEBUG PFX "jffs image in \"%s\"\n", master->name);
-+                /* Is JFFS2 so have rootfslen so that true length gets calculated */
-+                rootfslen = master->size - master->erasesize - offset;
-+              } else {
-+                /* We only recognize squashfs and jffs2.  If it's not either of these,
-+                       don't create a rootfs partition. */
-+                printk(KERN_INFO PFX "No known root filesystem in \"%s\"\n", master->name);
-+                rootfslen = 0;
-+              }
-+      } else {
-+        /* Is a squash image so find where the squash ends */
-+        if (le64_to_cpu((sb.bytes_used)) <= 0) {
-+              printk(KERN_ALERT PFX "split_squashfs: squashfs is empty in \"%s\"\n",
-+                         master->name);
-+              return 0;
-+        }
-+
-+        rootfslen = (u32) le64_to_cpu(sb.bytes_used);
-+      }
-+
 +      rootfslen = ( ( rootfslen % master->erasesize ) > 0 ? (((rootfslen / master->erasesize) + 1 ) * master->erasesize) : rootfslen);
 +      totallen = rootfslen + kernellen + sizeof(struct bcm_tag);
 +
 
 
        if (args->root_first_flag) {
          sprintf(tag.flashImageStart, "%lu", rootfsoff);
-         sprintf(tag.rootLength, "%lu", rootfslen);      
+         sprintf(tag.flashRootLength, "%lu", rootfslen);         
        } else {
          sprintf(tag.flashImageStart, "%lu", kerneloff);
-         sprintf(tag.rootLength, "%lu", rootfslen + sizeof(deadcode));
+         sprintf(tag.flashRootLength, "%lu", rootfslen + sizeof(deadcode));
        }
+       int2tag(tag.rootLength, rootfslen + sizeof(deadcode));
 
        if (args->rsa_signature_given) {
            strncpy(tag.rsa_signature, args->rsa_signature_arg, RSASIG_LEN);