Blame view
common/env_nand.c
9.6 KB
13a5695b7 Patch by Jian Zha... |
1 |
/* |
ea882baf9 New implementatio... |
2 3 4 |
* (C) Copyright 2000-2010 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. * |
cc49cadee env_nand.c: Added... |
5 6 7 |
* (C) Copyright 2008 * Stuart Wood, Lab X Technologies <stuart.wood@labxtechnologies.com> * |
13a5695b7 Patch by Jian Zha... |
8 9 |
* (C) Copyright 2004 * Jian Zhang, Texas Instruments, jzhang@ti.com. |
13a5695b7 Patch by Jian Zha... |
10 11 12 |
* * (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH <www.elinos.com> * Andreas Heppel <aheppel@sysgo.de> |
ea882baf9 New implementatio... |
13 |
* |
3765b3e7b Coding Style clea... |
14 |
* SPDX-License-Identifier: GPL-2.0+ |
13a5695b7 Patch by Jian Zha... |
15 |
*/ |
13a5695b7 Patch by Jian Zha... |
16 |
#include <common.h> |
13a5695b7 Patch by Jian Zha... |
17 18 19 |
#include <command.h> #include <environment.h> #include <linux/stddef.h> |
e443c944c Support for redun... |
20 |
#include <malloc.h> |
addb2e165 Re-factoring the ... |
21 |
#include <nand.h> |
ea882baf9 New implementatio... |
22 23 |
#include <search.h> #include <errno.h> |
13a5695b7 Patch by Jian Zha... |
24 |
|
bdab39d35 rename CONFIG_CMD... |
25 |
#if defined(CONFIG_CMD_SAVEENV) && defined(CONFIG_CMD_NAND) |
13a5695b7 Patch by Jian Zha... |
26 |
#define CMD_SAVEENV |
0e8d15866 rename CFG_ENV ma... |
27 |
#elif defined(CONFIG_ENV_OFFSET_REDUND) |
de152b9bf env: clean env_na... |
28 |
#error CONFIG_ENV_OFFSET_REDUND must have CONFIG_CMD_SAVEENV & CONFIG_CMD_NAND |
13a5695b7 Patch by Jian Zha... |
29 |
#endif |
de152b9bf env: clean env_na... |
30 31 |
#if defined(CONFIG_ENV_SIZE_REDUND) && \ (CONFIG_ENV_SIZE_REDUND != CONFIG_ENV_SIZE) |
0e8d15866 rename CFG_ENV ma... |
32 |
#error CONFIG_ENV_SIZE_REDUND should be the same as CONFIG_ENV_SIZE |
13a5695b7 Patch by Jian Zha... |
33 |
#endif |
0e8d15866 rename CFG_ENV ma... |
34 35 |
#ifndef CONFIG_ENV_RANGE #define CONFIG_ENV_RANGE CONFIG_ENV_SIZE |
cc49cadee env_nand.c: Added... |
36 |
#endif |
ea882baf9 New implementatio... |
37 |
char *env_name_spec = "NAND"; |
13a5695b7 Patch by Jian Zha... |
38 |
|
b74ab7373 nand_spl: read en... |
39 |
#if defined(ENV_IS_EMBEDDED) |
994bc671c env: move extern ... |
40 |
env_t *env_ptr = &environment; |
b74ab7373 nand_spl: read en... |
41 42 |
#elif defined(CONFIG_NAND_ENV_DST) env_t *env_ptr = (env_t *)CONFIG_NAND_ENV_DST; |
13a5695b7 Patch by Jian Zha... |
43 |
#else /* ! ENV_IS_EMBEDDED */ |
de152b9bf env: clean env_na... |
44 |
env_t *env_ptr; |
13a5695b7 Patch by Jian Zha... |
45 |
#endif /* ENV_IS_EMBEDDED */ |
d87080b72 GCC-4.x fixes: cl... |
46 |
DECLARE_GLOBAL_DATA_PTR; |
13a5695b7 Patch by Jian Zha... |
47 |
|
ea882baf9 New implementatio... |
48 49 50 51 52 53 |
/* * This is called before nand_init() so we can't read NAND to * validate env data. * * Mark it OK for now. env_relocate() in env_common.c will call our * relocate function which does the real validation. |
d12ae8088 Add NAND environm... |
54 55 |
* * When using a NAND boot image (like sequoia_nand), the environment |
ea882baf9 New implementatio... |
56 57 58 |
* can be embedded or attached to the U-Boot image in NAND flash. * This way the SPL loads not only the U-Boot image from NAND but * also the environment. |
13a5695b7 Patch by Jian Zha... |
59 60 61 |
*/ int env_init(void) { |
b74ab7373 nand_spl: read en... |
62 |
#if defined(ENV_IS_EMBEDDED) || defined(CONFIG_NAND_ENV_DST) |
d12ae8088 Add NAND environm... |
63 |
int crc1_ok = 0, crc2_ok = 0; |
b74ab7373 nand_spl: read en... |
64 65 66 67 |
env_t *tmp_env1; #ifdef CONFIG_ENV_OFFSET_REDUND env_t *tmp_env2; |
d12ae8088 Add NAND environm... |
68 |
|
0e8d15866 rename CFG_ENV ma... |
69 |
tmp_env2 = (env_t *)((ulong)env_ptr + CONFIG_ENV_SIZE); |
de152b9bf env: clean env_na... |
70 |
crc2_ok = crc32(0, tmp_env2->data, ENV_SIZE) == tmp_env2->crc; |
b74ab7373 nand_spl: read en... |
71 |
#endif |
b74ab7373 nand_spl: read en... |
72 |
tmp_env1 = env_ptr; |
de152b9bf env: clean env_na... |
73 |
crc1_ok = crc32(0, tmp_env1->data, ENV_SIZE) == tmp_env1->crc; |
d12ae8088 Add NAND environm... |
74 |
|
b74ab7373 nand_spl: read en... |
75 |
if (!crc1_ok && !crc2_ok) { |
de152b9bf env: clean env_na... |
76 77 |
gd->env_addr = 0; gd->env_valid = 0; |
b74ab7373 nand_spl: read en... |
78 79 80 |
return 0; } else if (crc1_ok && !crc2_ok) { |
d12ae8088 Add NAND environm... |
81 |
gd->env_valid = 1; |
b74ab7373 nand_spl: read en... |
82 83 84 |
} #ifdef CONFIG_ENV_OFFSET_REDUND else if (!crc1_ok && crc2_ok) { |
d12ae8088 Add NAND environm... |
85 |
gd->env_valid = 2; |
b74ab7373 nand_spl: read en... |
86 |
} else { |
d12ae8088 Add NAND environm... |
87 |
/* both ok - check serial */ |
de152b9bf env: clean env_na... |
88 |
if (tmp_env1->flags == 255 && tmp_env2->flags == 0) |
d12ae8088 Add NAND environm... |
89 |
gd->env_valid = 2; |
de152b9bf env: clean env_na... |
90 |
else if (tmp_env2->flags == 255 && tmp_env1->flags == 0) |
d12ae8088 Add NAND environm... |
91 |
gd->env_valid = 1; |
de152b9bf env: clean env_na... |
92 |
else if (tmp_env1->flags > tmp_env2->flags) |
d12ae8088 Add NAND environm... |
93 |
gd->env_valid = 1; |
de152b9bf env: clean env_na... |
94 |
else if (tmp_env2->flags > tmp_env1->flags) |
d12ae8088 Add NAND environm... |
95 96 97 98 |
gd->env_valid = 2; else /* flags are equal - almost impossible */ gd->env_valid = 1; } |
b74ab7373 nand_spl: read en... |
99 100 101 102 |
if (gd->env_valid == 2) env_ptr = tmp_env2; else #endif |
d12ae8088 Add NAND environm... |
103 104 |
if (gd->env_valid == 1) env_ptr = tmp_env1; |
b74ab7373 nand_spl: read en... |
105 106 107 108 |
gd->env_addr = (ulong)env_ptr->data; #else /* ENV_IS_EMBEDDED || CONFIG_NAND_ENV_DST */ |
de152b9bf env: clean env_na... |
109 110 |
gd->env_addr = (ulong)&default_environment[0]; gd->env_valid = 1; |
b74ab7373 nand_spl: read en... |
111 |
#endif /* ENV_IS_EMBEDDED || CONFIG_NAND_ENV_DST */ |
13a5695b7 Patch by Jian Zha... |
112 |
|
de152b9bf env: clean env_na... |
113 |
return 0; |
13a5695b7 Patch by Jian Zha... |
114 115 116 |
} #ifdef CMD_SAVEENV |
addb2e165 Re-factoring the ... |
117 118 119 120 |
/* * The legacy NAND code saved the environment in the first NAND device i.e., * nand_dev_desc + 0. This is also the behaviour using the new NAND code. */ |
cc49cadee env_nand.c: Added... |
121 122 |
int writeenv(size_t offset, u_char *buf) { |
0e8d15866 rename CFG_ENV ma... |
123 |
size_t end = offset + CONFIG_ENV_RANGE; |
cc49cadee env_nand.c: Added... |
124 |
size_t amount_saved = 0; |
c3db8c649 NAND: Do not writ... |
125 |
size_t blocksize, len; |
cc49cadee env_nand.c: Added... |
126 127 128 |
u_char *char_ptr; blocksize = nand_info[0].erasesize; |
0e8d15866 rename CFG_ENV ma... |
129 |
len = min(blocksize, CONFIG_ENV_SIZE); |
cc49cadee env_nand.c: Added... |
130 |
|
0e8d15866 rename CFG_ENV ma... |
131 |
while (amount_saved < CONFIG_ENV_SIZE && offset < end) { |
cc49cadee env_nand.c: Added... |
132 133 134 135 |
if (nand_block_isbad(&nand_info[0], offset)) { offset += blocksize; } else { char_ptr = &buf[amount_saved]; |
de152b9bf env: clean env_na... |
136 |
if (nand_write(&nand_info[0], offset, &len, char_ptr)) |
cc49cadee env_nand.c: Added... |
137 |
return 1; |
de152b9bf env: clean env_na... |
138 |
|
cc49cadee env_nand.c: Added... |
139 |
offset += blocksize; |
c3db8c649 NAND: Do not writ... |
140 |
amount_saved += len; |
cc49cadee env_nand.c: Added... |
141 142 |
} } |
0e8d15866 rename CFG_ENV ma... |
143 |
if (amount_saved != CONFIG_ENV_SIZE) |
cc49cadee env_nand.c: Added... |
144 145 146 147 |
return 1; return 0; } |
eef1d7199 NAND: env: rememb... |
148 |
|
2b26201a2 env_nand.c: suppo... |
149 150 151 152 |
struct env_location { const char *name; const nand_erase_options_t erase_opts; }; |
eef1d7199 NAND: env: rememb... |
153 |
|
2b26201a2 env_nand.c: suppo... |
154 155 |
static int erase_and_write_env(const struct env_location *location, u_char *env_new) |
13a5695b7 Patch by Jian Zha... |
156 |
{ |
2b26201a2 env_nand.c: suppo... |
157 |
int ret = 0; |
cc49cadee env_nand.c: Added... |
158 |
|
2b26201a2 env_nand.c: suppo... |
159 160 161 |
printf("Erasing %s... ", location->name); if (nand_erase_opts(&nand_info[0], &location->erase_opts)) |
cc49cadee env_nand.c: Added... |
162 |
return 1; |
ea882baf9 New implementatio... |
163 |
|
2b26201a2 env_nand.c: suppo... |
164 165 166 167 168 |
printf("Writing to %s... ", location->name); ret = writeenv(location->erase_opts.offset, env_new); puts(ret ? "FAILED! " : "OK "); |
ea882baf9 New implementatio... |
169 |
|
e443c944c Support for redun... |
170 171 |
return ret; } |
2b26201a2 env_nand.c: suppo... |
172 173 174 175 |
#ifdef CONFIG_ENV_OFFSET_REDUND static unsigned char env_flags; #endif |
e443c944c Support for redun... |
176 177 |
int saveenv(void) { |
de152b9bf env: clean env_na... |
178 |
int ret = 0; |
cd0f4fa1c Revert "env: fix ... |
179 |
ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1); |
ea882baf9 New implementatio... |
180 181 |
ssize_t len; char *res; |
2b26201a2 env_nand.c: suppo... |
182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
int env_idx = 0; static const struct env_location location[] = { { .name = "NAND", .erase_opts = { .length = CONFIG_ENV_RANGE, .offset = CONFIG_ENV_OFFSET, }, }, #ifdef CONFIG_ENV_OFFSET_REDUND { .name = "redundant NAND", .erase_opts = { .length = CONFIG_ENV_RANGE, .offset = CONFIG_ENV_OFFSET_REDUND, }, }, #endif }; |
e093a2476 Coding Style Cleanup |
201 |
|
cc49cadee env_nand.c: Added... |
202 |
|
0e8d15866 rename CFG_ENV ma... |
203 |
if (CONFIG_ENV_RANGE < CONFIG_ENV_SIZE) |
cc49cadee env_nand.c: Added... |
204 |
return 1; |
ea882baf9 New implementatio... |
205 |
|
cd0f4fa1c Revert "env: fix ... |
206 |
res = (char *)&env_new->data; |
be11235ab env: Hide '.' var... |
207 |
len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL); |
ea882baf9 New implementatio... |
208 209 210 211 212 |
if (len < 0) { error("Cannot export environment: errno = %d ", errno); return 1; } |
2b26201a2 env_nand.c: suppo... |
213 214 215 216 217 |
env_new->crc = crc32(0, env_new->data, ENV_SIZE); #ifdef CONFIG_ENV_OFFSET_REDUND env_new->flags = ++env_flags; /* increase the serial */ env_idx = (gd->env_valid == 1); #endif |
13a5695b7 Patch by Jian Zha... |
218 |
|
2b26201a2 env_nand.c: suppo... |
219 220 221 222 223 224 |
ret = erase_and_write_env(&location[env_idx], (u_char *)env_new); #ifdef CONFIG_ENV_OFFSET_REDUND if (!ret) { /* preset other copy for next write */ gd->env_valid = gd->env_valid == 2 ? 1 : 2; return ret; |
cc49cadee env_nand.c: Added... |
225 |
} |
13a5695b7 Patch by Jian Zha... |
226 |
|
2b26201a2 env_nand.c: suppo... |
227 228 229 230 231 232 233 |
env_idx = (env_idx + 1) & 1; ret = erase_and_write_env(&location[env_idx], (u_char *)env_new); if (!ret) printf("Warning: primary env write failed," " redundancy is lost! "); #endif |
addb2e165 Re-factoring the ... |
234 |
return ret; |
13a5695b7 Patch by Jian Zha... |
235 236 |
} #endif /* CMD_SAVEENV */ |
de152b9bf env: clean env_na... |
237 |
int readenv(size_t offset, u_char *buf) |
cc49cadee env_nand.c: Added... |
238 |
{ |
0e8d15866 rename CFG_ENV ma... |
239 |
size_t end = offset + CONFIG_ENV_RANGE; |
cc49cadee env_nand.c: Added... |
240 |
size_t amount_loaded = 0; |
c3db8c649 NAND: Do not writ... |
241 |
size_t blocksize, len; |
cc49cadee env_nand.c: Added... |
242 243 244 |
u_char *char_ptr; blocksize = nand_info[0].erasesize; |
962ad59e2 env_nand: return ... |
245 246 |
if (!blocksize) return 1; |
de152b9bf env: clean env_na... |
247 |
|
0e8d15866 rename CFG_ENV ma... |
248 |
len = min(blocksize, CONFIG_ENV_SIZE); |
cc49cadee env_nand.c: Added... |
249 |
|
0e8d15866 rename CFG_ENV ma... |
250 |
while (amount_loaded < CONFIG_ENV_SIZE && offset < end) { |
cc49cadee env_nand.c: Added... |
251 252 253 254 |
if (nand_block_isbad(&nand_info[0], offset)) { offset += blocksize; } else { char_ptr = &buf[amount_loaded]; |
de152b9bf env: clean env_na... |
255 |
if (nand_read_skip_bad(&nand_info[0], offset, |
c39d6a0ea nand: Extend nand... |
256 257 |
&len, NULL, nand_info[0].size, char_ptr)) |
cc49cadee env_nand.c: Added... |
258 |
return 1; |
de152b9bf env: clean env_na... |
259 |
|
cc49cadee env_nand.c: Added... |
260 |
offset += blocksize; |
c3db8c649 NAND: Do not writ... |
261 |
amount_loaded += len; |
cc49cadee env_nand.c: Added... |
262 263 |
} } |
de152b9bf env: clean env_na... |
264 |
|
0e8d15866 rename CFG_ENV ma... |
265 |
if (amount_loaded != CONFIG_ENV_SIZE) |
cc49cadee env_nand.c: Added... |
266 267 268 269 |
return 1; return 0; } |
c9f7351b5 NAND: environment... |
270 271 272 273 |
#ifdef CONFIG_ENV_OFFSET_OOB int get_nand_env_oob(nand_info_t *nand, unsigned long *result) { struct mtd_oob_ops ops; |
de152b9bf env: clean env_na... |
274 |
uint32_t oob_buf[ENV_OFFSET_SIZE / sizeof(uint32_t)]; |
c9f7351b5 NAND: environment... |
275 |
int ret; |
de152b9bf env: clean env_na... |
276 277 278 279 280 |
ops.datbuf = NULL; ops.mode = MTD_OOB_AUTO; ops.ooboffs = 0; ops.ooblen = ENV_OFFSET_SIZE; ops.oobbuf = (void *)oob_buf; |
c9f7351b5 NAND: environment... |
281 282 |
ret = nand->read_oob(nand, ENV_OFFSET_SIZE, &ops); |
53504a278 NAND: formatting ... |
283 284 285 286 287 |
if (ret) { printf("error reading OOB block 0 "); return ret; } |
c9f7351b5 NAND: environment... |
288 |
|
53504a278 NAND: formatting ... |
289 290 291 292 |
if (oob_buf[0] == ENV_OOB_MARKER) { *result = oob_buf[1] * nand->erasesize; } else if (oob_buf[0] == ENV_OOB_MARKER_OLD) { *result = oob_buf[1]; |
c9f7351b5 NAND: environment... |
293 |
} else { |
53504a278 NAND: formatting ... |
294 295 296 |
printf("No dynamic environment marker in OOB block 0 "); return -ENOENT; |
c9f7351b5 NAND: environment... |
297 |
} |
53504a278 NAND: formatting ... |
298 299 |
return 0; |
c9f7351b5 NAND: environment... |
300 301 |
} #endif |
0e8d15866 rename CFG_ENV ma... |
302 |
#ifdef CONFIG_ENV_OFFSET_REDUND |
ea882baf9 New implementatio... |
303 |
void env_relocate_spec(void) |
e443c944c Support for redun... |
304 305 |
{ #if !defined(ENV_IS_EMBEDDED) |
b76a147b7 env_nand.c: clari... |
306 |
int read1_fail = 0, read2_fail = 0; |
2770bcb21 Merge with http:/... |
307 |
int crc1_ok = 0, crc2_ok = 0; |
ea882baf9 New implementatio... |
308 |
env_t *ep, *tmp_env1, *tmp_env2; |
e443c944c Support for redun... |
309 |
|
ea882baf9 New implementatio... |
310 311 |
tmp_env1 = (env_t *)malloc(CONFIG_ENV_SIZE); tmp_env2 = (env_t *)malloc(CONFIG_ENV_SIZE); |
de152b9bf env: clean env_na... |
312 |
if (tmp_env1 == NULL || tmp_env2 == NULL) { |
15b86c3d6 env_nand.c: print... |
313 314 |
puts("Can't allocate buffers for environment "); |
ea882baf9 New implementatio... |
315 |
set_default_env("!malloc() failed"); |
de152b9bf env: clean env_na... |
316 |
goto done; |
15b86c3d6 env_nand.c: print... |
317 |
} |
b76a147b7 env_nand.c: clari... |
318 319 |
read1_fail = readenv(CONFIG_ENV_OFFSET, (u_char *) tmp_env1); read2_fail = readenv(CONFIG_ENV_OFFSET_REDUND, (u_char *) tmp_env2); |
ea882baf9 New implementatio... |
320 |
|
b76a147b7 env_nand.c: clari... |
321 322 323 324 325 326 327 |
if (read1_fail && read2_fail) puts("*** Error - No Valid Environment Area found "); else if (read1_fail || read2_fail) puts("*** Warning - some problems detected " "reading environment; recovered successfully "); |
e443c944c Support for redun... |
328 |
|
a1eac57a2 common/env_nand.c... |
329 330 331 332 |
crc1_ok = !read1_fail && (crc32(0, tmp_env1->data, ENV_SIZE) == tmp_env1->crc); crc2_ok = !read2_fail && (crc32(0, tmp_env2->data, ENV_SIZE) == tmp_env2->crc); |
e443c944c Support for redun... |
333 |
|
ea882baf9 New implementatio... |
334 |
if (!crc1_ok && !crc2_ok) { |
ea882baf9 New implementatio... |
335 |
set_default_env("!bad CRC"); |
de152b9bf env: clean env_na... |
336 |
goto done; |
ea882baf9 New implementatio... |
337 |
} else if (crc1_ok && !crc2_ok) { |
e443c944c Support for redun... |
338 |
gd->env_valid = 1; |
ea882baf9 New implementatio... |
339 |
} else if (!crc1_ok && crc2_ok) { |
e443c944c Support for redun... |
340 |
gd->env_valid = 2; |
ea882baf9 New implementatio... |
341 |
} else { |
e443c944c Support for redun... |
342 |
/* both ok - check serial */ |
ea882baf9 New implementatio... |
343 |
if (tmp_env1->flags == 255 && tmp_env2->flags == 0) |
e443c944c Support for redun... |
344 |
gd->env_valid = 2; |
ea882baf9 New implementatio... |
345 |
else if (tmp_env2->flags == 255 && tmp_env1->flags == 0) |
e443c944c Support for redun... |
346 |
gd->env_valid = 1; |
ea882baf9 New implementatio... |
347 |
else if (tmp_env1->flags > tmp_env2->flags) |
e443c944c Support for redun... |
348 |
gd->env_valid = 1; |
ea882baf9 New implementatio... |
349 |
else if (tmp_env2->flags > tmp_env1->flags) |
e443c944c Support for redun... |
350 351 352 |
gd->env_valid = 2; else /* flags are equal - almost impossible */ gd->env_valid = 1; |
e443c944c Support for redun... |
353 354 355 |
} free(env_ptr); |
ea882baf9 New implementatio... |
356 357 358 359 360 |
if (gd->env_valid == 1) ep = tmp_env1; else ep = tmp_env2; |
eef1d7199 NAND: env: rememb... |
361 |
env_flags = ep->flags; |
ea882baf9 New implementatio... |
362 |
env_import((char *)ep, 0); |
de152b9bf env: clean env_na... |
363 |
done: |
ea882baf9 New implementatio... |
364 365 |
free(tmp_env1); free(tmp_env2); |
e443c944c Support for redun... |
366 367 368 |
#endif /* ! ENV_IS_EMBEDDED */ } |
0e8d15866 rename CFG_ENV ma... |
369 |
#else /* ! CONFIG_ENV_OFFSET_REDUND */ |
addb2e165 Re-factoring the ... |
370 |
/* |
ea882baf9 New implementatio... |
371 372 373 |
* The legacy NAND code saved the environment in the first NAND * device i.e., nand_dev_desc + 0. This is also the behaviour using * the new NAND code. |
addb2e165 Re-factoring the ... |
374 |
*/ |
de152b9bf env: clean env_na... |
375 |
void env_relocate_spec(void) |
13a5695b7 Patch by Jian Zha... |
376 377 |
{ #if !defined(ENV_IS_EMBEDDED) |
d52fb7e3d Some code cleanup... |
378 |
int ret; |
cd0f4fa1c Revert "env: fix ... |
379 |
ALLOC_CACHE_ALIGN_BUFFER(char, buf, CONFIG_ENV_SIZE); |
13a5695b7 Patch by Jian Zha... |
380 |
|
c9f7351b5 NAND: environment... |
381 382 |
#if defined(CONFIG_ENV_OFFSET_OOB) ret = get_nand_env_oob(&nand_info[0], &nand_env_oob_offset); |
ea882baf9 New implementatio... |
383 384 |
/* * If unable to read environment offset from NAND OOB then fall through |
c9f7351b5 NAND: environment... |
385 386 |
* to the normal environment reading code below */ |
ea882baf9 New implementatio... |
387 |
if (!ret) { |
c9f7351b5 NAND: environment... |
388 389 |
printf("Found Environment offset in OOB.. "); |
ea882baf9 New implementatio... |
390 391 392 393 |
} else { set_default_env("!no env offset in OOB"); return; } |
c9f7351b5 NAND: environment... |
394 |
#endif |
cd0f4fa1c Revert "env: fix ... |
395 |
ret = readenv(CONFIG_ENV_OFFSET, (u_char *)buf); |
ea882baf9 New implementatio... |
396 397 398 399 |
if (ret) { set_default_env("!readenv() failed"); return; } |
13a5695b7 Patch by Jian Zha... |
400 |
|
cd0f4fa1c Revert "env: fix ... |
401 |
env_import(buf, 1); |
13a5695b7 Patch by Jian Zha... |
402 |
#endif /* ! ENV_IS_EMBEDDED */ |
13a5695b7 Patch by Jian Zha... |
403 |
} |
0e8d15866 rename CFG_ENV ma... |
404 |
#endif /* CONFIG_ENV_OFFSET_REDUND */ |