
On Tue, May 27, 2008 at 10:01:14AM -0400, Stuart Wood wrote:
Hi All, This is my first attempt at submitting a change so please be patient and kind. This change allows for the environment variables to be stored in a rand of nand flash. If the first block is bad then the environment is stored in the next one, and so on. It introduces CFG_ENV_RANGE to define the size of the area that way contain the environment data. This will allow the environment to be loaded over an area with bad blocks from the factory without a problem.
This will break any board that doesn't define CFG_ENV_RANGE... it should default to CFG_ENV_SIZE if unset.
if(gd->env_valid == 1) {
puts ("Erasing redundant Nand...");
if (nand_erase(&nand_info[0],
CFG_ENV_OFFSET_REDUND, CFG_ENV_SIZE))
puts ("Erasing redundant Nand...\n");
for (offset = CFG_ENV_OFFSET_REDUND; offset <
CFG_ENV_OFFSET_REDUND + CFG_ENV_RANGE; )
{
if (nand_erase(&nand_info[0],
offset, CFG_ENV_SIZE)) {
offset += CFG_ENV_SIZE;
} else {
break;
}
}
Please factor this code out instead of duplicating it for both environment instances.
It'd also be nicer as something like this:
offset = CFG_ENV_REDUND; end = offset + CFG_ENV_RANGE;
while (offset < end && nand_erase(&nand_info[0], offset, CFG_ENV_SIZE)) offset += CFG_ENV_SIZE;
@@ -189,15 +215,30 @@ int saveenv(void) int saveenv(void) { size_t total;
- size_t offset; int ret = 0;
- puts ("Erasing Nand...");
- if (nand_erase(&nand_info[0], CFG_ENV_OFFSET, CFG_ENV_SIZE))
- if (CFG_ENV_RANGE < CFG_ENV_SIZE) return 1;
- puts ("Erasing Nand...\n");
- for (offset = CFG_ENV_OFFSET; offset <
CFG_ENV_OFFSET + CFG_ENV_RANGE; )
- {
if (nand_erase(&nand_info[0],
offset, CFG_ENV_SIZE)) {
offset += CFG_ENV_SIZE;
} else {
break;
}
- }
- if (offset >= CFG_ENV_OFFSET + CFG_ENV_RANGE) {
puts ("Nand area is completely bad!\n");
return 1;
- }
It'd be nice if we could reduce the duplication between the two versions of saveenv() as well.
- for (offset = CFG_ENV_OFFSET; offset < CFG_ENV_OFFSET + CFG_ENV_RANGE ; ) {
if (nand_block_isbad (&nand_info[0], offset)) {
offset += CFG_ENV_SIZE;
} else {
nand_read(&nand_info[0], offset, &total,
(u_char*) tmp_env1);
break;
}
- }
- for (offset = CFG_ENV_OFFSET_REDUND; offset <
CFG_ENV_OFFSET_REDUND + CFG_ENV_RANGE ; ) {
if (nand_block_isbad (&nand_info[0], offset)) {
offset += CFG_ENV_SIZE;
} else {
nand_read(&nand_info[0], offset, &total,
(u_char*) tmp_env2);
break;
}
- }
Same comments as saveenv().
-Scott