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 ---