On Mon, Apr 13, 2009 at 06:34:52PM +0530, apgmoorthy wrote: > + /* Protect boot-loader and environment variables from badblock testing > */ > + while (start < CONFIG_SYS_MONITOR_LEN + CONFIG_ENV_SIZE + badblocklen) { > + if (mtd->block_isbad(&onenand_mtd, start)) > + badblocklen += blocksize; > + start += blocksize; > + }
You need to start at zero to determine the number of bad blocks used by the boot image -- otherwise, if start points in the middle of the image, it is assuming that there were no bad blocks prior to that location. Plus, if "start" was not block-aligned (is that allowed?), this should round up to the next block rather than jumping to the middle of the next block. > +#define ONENAND_ENV_END (CONFIG_SYS_MONITOR_LEN + CONFIG_ENV_SIZE) > + > char *env_name_spec = "OneNAND"; > > #ifdef ENV_IS_EMBEDDED > @@ -58,23 +68,31 @@ uchar env_get_char_spec(int index) > > void env_relocate_spec(void) > { > - unsigned long env_addr; > - int use_default = 0; > + unsigned long env_addr = CONFIG_SYS_MONITOR_LEN; As above, you have to check for bad blocks from the beginning. You do this in saveenv... > + int use_default = 1; > size_t retlen; > + int blocksize = onenand_mtd.erasesize; > > - env_addr = CONFIG_ENV_ADDR; > + /* Find environment block. */ > + while (onenand_mtd.writesize && (env_addr < ONENAND_ENV_END)) { > + if (onenand_block_isbad(&onenand_mtd, env_addr)) { > + printf("Skip bad block at 0x%x\n", (u32)env_addr); Why not just use %lx? > + /* update crc */ > + env_ptr->crc = > + crc32(0, env_ptr->data, ONENAND_ENV_SIZE(onenand_mtd)); There's an extra space in the above indent. > + return 0; Here too. <record state="broken"> Any consolidation we can do between env_nand and env_onenand would be appreciated... even if they don't share code yet, let's keep the logic similar. </record> -Scott _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot