nand.c (0649cd0d4908d9b983a0361b8665938ef25701be) | nand.c (203e94f6c9ca03e260175ce240f5856507395585) |
---|---|
1/* 2 * (C) Copyright 2000-2010 3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 4 * 5 * (C) Copyright 2008 6 * Stuart Wood, Lab X Technologies <stuart.wood@labxtechnologies.com> 7 * 8 * (C) Copyright 2004 --- 70 unchanged lines hidden (view full) --- 79 crc1_ok = crc32(0, tmp_env1->data, ENV_SIZE) == tmp_env1->crc; 80 81 if (!crc1_ok && !crc2_ok) { 82 gd->env_addr = 0; 83 gd->env_valid = 0; 84 85 return 0; 86 } else if (crc1_ok && !crc2_ok) { | 1/* 2 * (C) Copyright 2000-2010 3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 4 * 5 * (C) Copyright 2008 6 * Stuart Wood, Lab X Technologies <stuart.wood@labxtechnologies.com> 7 * 8 * (C) Copyright 2004 --- 70 unchanged lines hidden (view full) --- 79 crc1_ok = crc32(0, tmp_env1->data, ENV_SIZE) == tmp_env1->crc; 80 81 if (!crc1_ok && !crc2_ok) { 82 gd->env_addr = 0; 83 gd->env_valid = 0; 84 85 return 0; 86 } else if (crc1_ok && !crc2_ok) { |
87 gd->env_valid = 1; | 87 gd->env_valid = ENV_VALID; |
88 } 89#ifdef CONFIG_ENV_OFFSET_REDUND 90 else if (!crc1_ok && crc2_ok) { | 88 } 89#ifdef CONFIG_ENV_OFFSET_REDUND 90 else if (!crc1_ok && crc2_ok) { |
91 gd->env_valid = 2; | 91 gd->env_valid = ENV_REDUND; |
92 } else { 93 /* both ok - check serial */ 94 if (tmp_env1->flags == 255 && tmp_env2->flags == 0) | 92 } else { 93 /* both ok - check serial */ 94 if (tmp_env1->flags == 255 && tmp_env2->flags == 0) |
95 gd->env_valid = 2; | 95 gd->env_valid = ENV_REDUND; |
96 else if (tmp_env2->flags == 255 && tmp_env1->flags == 0) | 96 else if (tmp_env2->flags == 255 && tmp_env1->flags == 0) |
97 gd->env_valid = 1; | 97 gd->env_valid = ENV_VALID; |
98 else if (tmp_env1->flags > tmp_env2->flags) | 98 else if (tmp_env1->flags > tmp_env2->flags) |
99 gd->env_valid = 1; | 99 gd->env_valid = ENV_VALID; |
100 else if (tmp_env2->flags > tmp_env1->flags) | 100 else if (tmp_env2->flags > tmp_env1->flags) |
101 gd->env_valid = 2; | 101 gd->env_valid = ENV_REDUND; |
102 else /* flags are equal - almost impossible */ | 102 else /* flags are equal - almost impossible */ |
103 gd->env_valid = 1; | 103 gd->env_valid = ENV_VALID; |
104 } 105 | 104 } 105 |
106 if (gd->env_valid == 2) | 106 if (gd->env_valid == ENV_REDUND) |
107 env_ptr = tmp_env2; 108 else 109#endif | 107 env_ptr = tmp_env2; 108 else 109#endif |
110 if (gd->env_valid == 1) | 110 if (gd->env_valid == ENV_VALID) |
111 env_ptr = tmp_env1; 112 113 gd->env_addr = (ulong)env_ptr->data; 114 115#else /* ENV_IS_EMBEDDED || CONFIG_NAND_ENV_DST */ 116 gd->env_addr = (ulong)&default_environment[0]; | 111 env_ptr = tmp_env1; 112 113 gd->env_addr = (ulong)env_ptr->data; 114 115#else /* ENV_IS_EMBEDDED || CONFIG_NAND_ENV_DST */ 116 gd->env_addr = (ulong)&default_environment[0]; |
117 gd->env_valid = 1; | 117 gd->env_valid = ENV_VALID; |
118#endif /* ENV_IS_EMBEDDED || CONFIG_NAND_ENV_DST */ 119 120 return 0; 121} 122 123#ifdef CMD_SAVEENV 124/* 125 * The legacy NAND code saved the environment in the first NAND device i.e., --- 86 unchanged lines hidden (view full) --- 212 if (CONFIG_ENV_RANGE < CONFIG_ENV_SIZE) 213 return 1; 214 215 ret = env_export(env_new); 216 if (ret) 217 return ret; 218 219#ifdef CONFIG_ENV_OFFSET_REDUND | 118#endif /* ENV_IS_EMBEDDED || CONFIG_NAND_ENV_DST */ 119 120 return 0; 121} 122 123#ifdef CMD_SAVEENV 124/* 125 * The legacy NAND code saved the environment in the first NAND device i.e., --- 86 unchanged lines hidden (view full) --- 212 if (CONFIG_ENV_RANGE < CONFIG_ENV_SIZE) 213 return 1; 214 215 ret = env_export(env_new); 216 if (ret) 217 return ret; 218 219#ifdef CONFIG_ENV_OFFSET_REDUND |
220 env_idx = (gd->env_valid == 1); | 220 env_idx = (gd->env_valid == ENV_VALID); |
221#endif 222 223 ret = erase_and_write_env(&location[env_idx], (u_char *)env_new); 224#ifdef CONFIG_ENV_OFFSET_REDUND 225 if (!ret) { 226 /* preset other copy for next write */ | 221#endif 222 223 ret = erase_and_write_env(&location[env_idx], (u_char *)env_new); 224#ifdef CONFIG_ENV_OFFSET_REDUND 225 if (!ret) { 226 /* preset other copy for next write */ |
227 gd->env_valid = gd->env_valid == 2 ? 1 : 2; | 227 gd->env_valid = gd->env_valid == ENV_REDUND ? ENV_VALID : 228 ENV_REDUND; |
228 return ret; 229 } 230 231 env_idx = (env_idx + 1) & 1; 232 ret = erase_and_write_env(&location[env_idx], (u_char *)env_new); 233 if (!ret) 234 printf("Warning: primary env write failed," 235 " redundancy is lost!\n"); --- 101 unchanged lines hidden (view full) --- 337 else if (read1_fail || read2_fail) 338 puts("*** Warning - some problems detected " 339 "reading environment; recovered successfully\n"); 340 341 if (read1_fail && read2_fail) { 342 set_default_env("!bad env area"); 343 goto done; 344 } else if (!read1_fail && read2_fail) { | 229 return ret; 230 } 231 232 env_idx = (env_idx + 1) & 1; 233 ret = erase_and_write_env(&location[env_idx], (u_char *)env_new); 234 if (!ret) 235 printf("Warning: primary env write failed," 236 " redundancy is lost!\n"); --- 101 unchanged lines hidden (view full) --- 338 else if (read1_fail || read2_fail) 339 puts("*** Warning - some problems detected " 340 "reading environment; recovered successfully\n"); 341 342 if (read1_fail && read2_fail) { 343 set_default_env("!bad env area"); 344 goto done; 345 } else if (!read1_fail && read2_fail) { |
345 gd->env_valid = 1; | 346 gd->env_valid = ENV_VALID; |
346 env_import((char *)tmp_env1, 1); 347 } else if (read1_fail && !read2_fail) { | 347 env_import((char *)tmp_env1, 1); 348 } else if (read1_fail && !read2_fail) { |
348 gd->env_valid = 2; | 349 gd->env_valid = ENV_REDUND; |
349 env_import((char *)tmp_env2, 1); 350 } else { 351 env_import_redund((char *)tmp_env1, (char *)tmp_env2); 352 } 353 354done: 355 free(tmp_env1); 356 free(tmp_env2); --- 39 unchanged lines hidden --- | 350 env_import((char *)tmp_env2, 1); 351 } else { 352 env_import_redund((char *)tmp_env1, (char *)tmp_env2); 353 } 354 355done: 356 free(tmp_env1); 357 free(tmp_env2); --- 39 unchanged lines hidden --- |