Blame view
env/nand.c
9.07 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> |
cf92e05c0 Move ALLOC_CACHE_... |
21 |
#include <memalign.h> |
addb2e165 Re-factoring the ... |
22 |
#include <nand.h> |
ea882baf9 New implementatio... |
23 24 |
#include <search.h> #include <errno.h> |
13a5695b7 Patch by Jian Zha... |
25 |
|
4415f1d1f env: Create a loc... |
26 27 |
#if defined(CONFIG_CMD_SAVEENV) && defined(CONFIG_CMD_NAND) && \ !defined(CONFIG_SPL_BUILD) |
13a5695b7 Patch by Jian Zha... |
28 |
#define CMD_SAVEENV |
0e8d15866 rename CFG_ENV ma... |
29 |
#elif defined(CONFIG_ENV_OFFSET_REDUND) |
de152b9bf env: clean env_na... |
30 |
#error CONFIG_ENV_OFFSET_REDUND must have CONFIG_CMD_SAVEENV & CONFIG_CMD_NAND |
13a5695b7 Patch by Jian Zha... |
31 |
#endif |
de152b9bf env: clean env_na... |
32 33 |
#if defined(CONFIG_ENV_SIZE_REDUND) && \ (CONFIG_ENV_SIZE_REDUND != CONFIG_ENV_SIZE) |
0e8d15866 rename CFG_ENV ma... |
34 |
#error CONFIG_ENV_SIZE_REDUND should be the same as CONFIG_ENV_SIZE |
13a5695b7 Patch by Jian Zha... |
35 |
#endif |
0e8d15866 rename CFG_ENV ma... |
36 37 |
#ifndef CONFIG_ENV_RANGE #define CONFIG_ENV_RANGE CONFIG_ENV_SIZE |
cc49cadee env_nand.c: Added... |
38 |
#endif |
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 |
*/ |
e5bce247b env: Switch over ... |
60 |
static int env_nand_init(void) |
13a5695b7 Patch by Jian Zha... |
61 |
{ |
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 |
gd->env_addr = 0; |
2d7cb5b42 env: Replace all ... |
77 |
gd->env_valid = ENV_INVALID; |
b74ab7373 nand_spl: read en... |
78 79 80 |
return 0; } else if (crc1_ok && !crc2_ok) { |
203e94f6c env: Add an enum ... |
81 |
gd->env_valid = ENV_VALID; |
b74ab7373 nand_spl: read en... |
82 83 84 |
} #ifdef CONFIG_ENV_OFFSET_REDUND else if (!crc1_ok && crc2_ok) { |
203e94f6c env: Add an enum ... |
85 |
gd->env_valid = ENV_REDUND; |
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) |
203e94f6c env: Add an enum ... |
89 |
gd->env_valid = ENV_REDUND; |
de152b9bf env: clean env_na... |
90 |
else if (tmp_env2->flags == 255 && tmp_env1->flags == 0) |
203e94f6c env: Add an enum ... |
91 |
gd->env_valid = ENV_VALID; |
de152b9bf env: clean env_na... |
92 |
else if (tmp_env1->flags > tmp_env2->flags) |
203e94f6c env: Add an enum ... |
93 |
gd->env_valid = ENV_VALID; |
de152b9bf env: clean env_na... |
94 |
else if (tmp_env2->flags > tmp_env1->flags) |
203e94f6c env: Add an enum ... |
95 |
gd->env_valid = ENV_REDUND; |
d12ae8088 Add NAND environm... |
96 |
else /* flags are equal - almost impossible */ |
203e94f6c env: Add an enum ... |
97 |
gd->env_valid = ENV_VALID; |
d12ae8088 Add NAND environm... |
98 |
} |
203e94f6c env: Add an enum ... |
99 |
if (gd->env_valid == ENV_REDUND) |
b74ab7373 nand_spl: read en... |
100 101 102 |
env_ptr = tmp_env2; else #endif |
203e94f6c env: Add an enum ... |
103 |
if (gd->env_valid == ENV_VALID) |
d12ae8088 Add NAND environm... |
104 |
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 |
gd->env_addr = (ulong)&default_environment[0]; |
203e94f6c env: Add an enum ... |
110 |
gd->env_valid = ENV_VALID; |
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. */ |
45f08d359 env_nand: make lo... |
121 |
static int writeenv(size_t offset, u_char *buf) |
cc49cadee env_nand.c: Added... |
122 |
{ |
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; |
a94a26193 common: env_nand:... |
126 |
struct mtd_info *mtd; |
cc49cadee env_nand.c: Added... |
127 |
u_char *char_ptr; |
a94a26193 common: env_nand:... |
128 129 130 131 132 |
mtd = get_nand_dev_by_index(0); if (!mtd) return 1; blocksize = mtd->erasesize; |
b41411954 linux/kernel.h: s... |
133 |
len = min(blocksize, (size_t)CONFIG_ENV_SIZE); |
cc49cadee env_nand.c: Added... |
134 |
|
0e8d15866 rename CFG_ENV ma... |
135 |
while (amount_saved < CONFIG_ENV_SIZE && offset < end) { |
a94a26193 common: env_nand:... |
136 |
if (nand_block_isbad(mtd, offset)) { |
cc49cadee env_nand.c: Added... |
137 138 139 |
offset += blocksize; } else { char_ptr = &buf[amount_saved]; |
a94a26193 common: env_nand:... |
140 |
if (nand_write(mtd, offset, &len, char_ptr)) |
cc49cadee env_nand.c: Added... |
141 |
return 1; |
de152b9bf env: clean env_na... |
142 |
|
cc49cadee env_nand.c: Added... |
143 |
offset += blocksize; |
c3db8c649 NAND: Do not writ... |
144 |
amount_saved += len; |
cc49cadee env_nand.c: Added... |
145 146 |
} } |
0e8d15866 rename CFG_ENV ma... |
147 |
if (amount_saved != CONFIG_ENV_SIZE) |
cc49cadee env_nand.c: Added... |
148 149 150 151 |
return 1; return 0; } |
eef1d7199 NAND: env: rememb... |
152 |
|
42a8180d1 env: Rename nand ... |
153 |
struct nand_env_location { |
2b26201a2 env_nand.c: suppo... |
154 155 156 |
const char *name; const nand_erase_options_t erase_opts; }; |
eef1d7199 NAND: env: rememb... |
157 |
|
42a8180d1 env: Rename nand ... |
158 |
static int erase_and_write_env(const struct nand_env_location *location, |
2b26201a2 env_nand.c: suppo... |
159 |
u_char *env_new) |
13a5695b7 Patch by Jian Zha... |
160 |
{ |
a94a26193 common: env_nand:... |
161 |
struct mtd_info *mtd; |
2b26201a2 env_nand.c: suppo... |
162 |
int ret = 0; |
cc49cadee env_nand.c: Added... |
163 |
|
a94a26193 common: env_nand:... |
164 165 |
mtd = get_nand_dev_by_index(0); if (!mtd) |
4cc9699be common: env_nand:... |
166 |
return 1; |
2b26201a2 env_nand.c: suppo... |
167 168 |
printf("Erasing %s... ", location->name); |
a94a26193 common: env_nand:... |
169 |
if (nand_erase_opts(mtd, &location->erase_opts)) |
cc49cadee env_nand.c: Added... |
170 |
return 1; |
ea882baf9 New implementatio... |
171 |
|
2b26201a2 env_nand.c: suppo... |
172 173 174 175 176 |
printf("Writing to %s... ", location->name); ret = writeenv(location->erase_opts.offset, env_new); puts(ret ? "FAILED! " : "OK "); |
ea882baf9 New implementatio... |
177 |
|
e443c944c Support for redun... |
178 179 |
return ret; } |
2b26201a2 env_nand.c: suppo... |
180 |
|
e5bce247b env: Switch over ... |
181 |
static int env_nand_save(void) |
e443c944c Support for redun... |
182 |
{ |
de152b9bf env: clean env_na... |
183 |
int ret = 0; |
cd0f4fa1c Revert "env: fix ... |
184 |
ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1); |
2b26201a2 env_nand.c: suppo... |
185 |
int env_idx = 0; |
42a8180d1 env: Rename nand ... |
186 |
static const struct nand_env_location location[] = { |
2b26201a2 env_nand.c: suppo... |
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 |
{ .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 |
204 |
|
cc49cadee env_nand.c: Added... |
205 |
|
0e8d15866 rename CFG_ENV ma... |
206 |
if (CONFIG_ENV_RANGE < CONFIG_ENV_SIZE) |
cc49cadee env_nand.c: Added... |
207 |
return 1; |
ea882baf9 New implementatio... |
208 |
|
7ce1526ed env: Add env_expo... |
209 210 211 |
ret = env_export(env_new); if (ret) return ret; |
2b26201a2 env_nand.c: suppo... |
212 |
#ifdef CONFIG_ENV_OFFSET_REDUND |
203e94f6c env: Add an enum ... |
213 |
env_idx = (gd->env_valid == ENV_VALID); |
2b26201a2 env_nand.c: suppo... |
214 |
#endif |
13a5695b7 Patch by Jian Zha... |
215 |
|
2b26201a2 env_nand.c: suppo... |
216 217 218 219 |
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 */ |
203e94f6c env: Add an enum ... |
220 221 |
gd->env_valid = gd->env_valid == ENV_REDUND ? ENV_VALID : ENV_REDUND; |
2b26201a2 env_nand.c: suppo... |
222 |
return ret; |
cc49cadee env_nand.c: Added... |
223 |
} |
13a5695b7 Patch by Jian Zha... |
224 |
|
2b26201a2 env_nand.c: suppo... |
225 226 227 228 229 230 231 |
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 ... |
232 |
return ret; |
13a5695b7 Patch by Jian Zha... |
233 234 |
} #endif /* CMD_SAVEENV */ |
9e2056022 env_nand: use nan... |
235 236 237 238 239 240 |
#if defined(CONFIG_SPL_BUILD) static int readenv(size_t offset, u_char *buf) { return nand_spl_load_image(offset, CONFIG_ENV_SIZE, buf); } #else |
45f08d359 env_nand: make lo... |
241 |
static int readenv(size_t offset, u_char *buf) |
cc49cadee env_nand.c: Added... |
242 |
{ |
0e8d15866 rename CFG_ENV ma... |
243 |
size_t end = offset + CONFIG_ENV_RANGE; |
cc49cadee env_nand.c: Added... |
244 |
size_t amount_loaded = 0; |
c3db8c649 NAND: Do not writ... |
245 |
size_t blocksize, len; |
a94a26193 common: env_nand:... |
246 |
struct mtd_info *mtd; |
cc49cadee env_nand.c: Added... |
247 |
u_char *char_ptr; |
a94a26193 common: env_nand:... |
248 249 |
mtd = get_nand_dev_by_index(0); if (!mtd) |
962ad59e2 env_nand: return ... |
250 |
return 1; |
de152b9bf env: clean env_na... |
251 |
|
a94a26193 common: env_nand:... |
252 |
blocksize = mtd->erasesize; |
b41411954 linux/kernel.h: s... |
253 |
len = min(blocksize, (size_t)CONFIG_ENV_SIZE); |
cc49cadee env_nand.c: Added... |
254 |
|
0e8d15866 rename CFG_ENV ma... |
255 |
while (amount_loaded < CONFIG_ENV_SIZE && offset < end) { |
a94a26193 common: env_nand:... |
256 |
if (nand_block_isbad(mtd, offset)) { |
cc49cadee env_nand.c: Added... |
257 258 259 |
offset += blocksize; } else { char_ptr = &buf[amount_loaded]; |
a94a26193 common: env_nand:... |
260 |
if (nand_read_skip_bad(mtd, offset, |
c39d6a0ea nand: Extend nand... |
261 |
&len, NULL, |
a94a26193 common: env_nand:... |
262 |
mtd->size, char_ptr)) |
cc49cadee env_nand.c: Added... |
263 |
return 1; |
de152b9bf env: clean env_na... |
264 |
|
cc49cadee env_nand.c: Added... |
265 |
offset += blocksize; |
c3db8c649 NAND: Do not writ... |
266 |
amount_loaded += len; |
cc49cadee env_nand.c: Added... |
267 268 |
} } |
de152b9bf env: clean env_na... |
269 |
|
0e8d15866 rename CFG_ENV ma... |
270 |
if (amount_loaded != CONFIG_ENV_SIZE) |
cc49cadee env_nand.c: Added... |
271 272 273 274 |
return 1; return 0; } |
9e2056022 env_nand: use nan... |
275 |
#endif /* #if defined(CONFIG_SPL_BUILD) */ |
cc49cadee env_nand.c: Added... |
276 |
|
c9f7351b5 NAND: environment... |
277 |
#ifdef CONFIG_ENV_OFFSET_OOB |
151c06ec6 mtd: nand: Remove... |
278 |
int get_nand_env_oob(struct mtd_info *mtd, unsigned long *result) |
c9f7351b5 NAND: environment... |
279 280 |
{ struct mtd_oob_ops ops; |
de152b9bf env: clean env_na... |
281 |
uint32_t oob_buf[ENV_OFFSET_SIZE / sizeof(uint32_t)]; |
c9f7351b5 NAND: environment... |
282 |
int ret; |
de152b9bf env: clean env_na... |
283 284 285 286 287 |
ops.datbuf = NULL; ops.mode = MTD_OOB_AUTO; ops.ooboffs = 0; ops.ooblen = ENV_OFFSET_SIZE; ops.oobbuf = (void *)oob_buf; |
c9f7351b5 NAND: environment... |
288 |
|
151c06ec6 mtd: nand: Remove... |
289 |
ret = mtd->read_oob(mtd, ENV_OFFSET_SIZE, &ops); |
53504a278 NAND: formatting ... |
290 291 292 293 294 |
if (ret) { printf("error reading OOB block 0 "); return ret; } |
c9f7351b5 NAND: environment... |
295 |
|
53504a278 NAND: formatting ... |
296 |
if (oob_buf[0] == ENV_OOB_MARKER) { |
c59519919 env: Adjust the l... |
297 |
*result = ovoid ob_buf[1] * mtd->erasesize; |
53504a278 NAND: formatting ... |
298 299 |
} else if (oob_buf[0] == ENV_OOB_MARKER_OLD) { *result = oob_buf[1]; |
c9f7351b5 NAND: environment... |
300 |
} else { |
53504a278 NAND: formatting ... |
301 302 303 |
printf("No dynamic environment marker in OOB block 0 "); return -ENOENT; |
c9f7351b5 NAND: environment... |
304 |
} |
53504a278 NAND: formatting ... |
305 306 |
return 0; |
c9f7351b5 NAND: environment... |
307 308 |
} #endif |
0e8d15866 rename CFG_ENV ma... |
309 |
#ifdef CONFIG_ENV_OFFSET_REDUND |
c59519919 env: Adjust the l... |
310 |
static int env_nand_load(void) |
e443c944c Support for redun... |
311 |
{ |
c59519919 env: Adjust the l... |
312 313 314 |
#if defined(ENV_IS_EMBEDDED) return 0; #else |
31f044bd9 env: move more co... |
315 |
int read1_fail, read2_fail; |
9d364af23 env: Switch env_n... |
316 |
env_t *tmp_env1, *tmp_env2; |
c59519919 env: Adjust the l... |
317 |
int ret = 0; |
e443c944c Support for redun... |
318 |
|
ea882baf9 New implementatio... |
319 320 |
tmp_env1 = (env_t *)malloc(CONFIG_ENV_SIZE); tmp_env2 = (env_t *)malloc(CONFIG_ENV_SIZE); |
de152b9bf env: clean env_na... |
321 |
if (tmp_env1 == NULL || tmp_env2 == NULL) { |
15b86c3d6 env_nand.c: print... |
322 323 |
puts("Can't allocate buffers for environment "); |
ea882baf9 New implementatio... |
324 |
set_default_env("!malloc() failed"); |
c59519919 env: Adjust the l... |
325 |
ret = -EIO; |
de152b9bf env: clean env_na... |
326 |
goto done; |
15b86c3d6 env_nand.c: print... |
327 |
} |
b76a147b7 env_nand.c: clari... |
328 329 |
read1_fail = readenv(CONFIG_ENV_OFFSET, (u_char *) tmp_env1); read2_fail = readenv(CONFIG_ENV_OFFSET_REDUND, (u_char *) tmp_env2); |
ea882baf9 New implementatio... |
330 |
|
31f044bd9 env: move more co... |
331 332 |
ret = env_import_redund((char *)tmp_env1, read1_fail, (char *)tmp_env2, read2_fail); |
e443c944c Support for redun... |
333 |
|
de152b9bf env: clean env_na... |
334 |
done: |
ea882baf9 New implementatio... |
335 336 |
free(tmp_env1); free(tmp_env2); |
e443c944c Support for redun... |
337 |
|
c59519919 env: Adjust the l... |
338 |
return ret; |
e443c944c Support for redun... |
339 340 |
#endif /* ! ENV_IS_EMBEDDED */ } |
0e8d15866 rename CFG_ENV ma... |
341 |
#else /* ! CONFIG_ENV_OFFSET_REDUND */ |
addb2e165 Re-factoring the ... |
342 |
/* |
ea882baf9 New implementatio... |
343 344 345 |
* 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 ... |
346 |
*/ |
c59519919 env: Adjust the l... |
347 |
static int env_nand_load(void) |
13a5695b7 Patch by Jian Zha... |
348 349 |
{ #if !defined(ENV_IS_EMBEDDED) |
d52fb7e3d Some code cleanup... |
350 |
int ret; |
cd0f4fa1c Revert "env: fix ... |
351 |
ALLOC_CACHE_ALIGN_BUFFER(char, buf, CONFIG_ENV_SIZE); |
13a5695b7 Patch by Jian Zha... |
352 |
|
c9f7351b5 NAND: environment... |
353 |
#if defined(CONFIG_ENV_OFFSET_OOB) |
a94a26193 common: env_nand:... |
354 |
struct mtd_info *mtd = get_nand_dev_by_index(0); |
ea882baf9 New implementatio... |
355 356 |
/* * If unable to read environment offset from NAND OOB then fall through |
c9f7351b5 NAND: environment... |
357 358 |
* to the normal environment reading code below */ |
a94a26193 common: env_nand:... |
359 |
if (mtd && !get_nand_env_oob(mtd, &nand_env_oob_offset)) { |
c9f7351b5 NAND: environment... |
360 361 |
printf("Found Environment offset in OOB.. "); |
ea882baf9 New implementatio... |
362 363 364 365 |
} else { set_default_env("!no env offset in OOB"); return; } |
c9f7351b5 NAND: environment... |
366 |
#endif |
cd0f4fa1c Revert "env: fix ... |
367 |
ret = readenv(CONFIG_ENV_OFFSET, (u_char *)buf); |
ea882baf9 New implementatio... |
368 369 |
if (ret) { set_default_env("!readenv() failed"); |
c59519919 env: Adjust the l... |
370 |
return -EIO; |
ea882baf9 New implementatio... |
371 |
} |
13a5695b7 Patch by Jian Zha... |
372 |
|
2166ebf78 env: make env dri... |
373 |
return env_import(buf, 1); |
13a5695b7 Patch by Jian Zha... |
374 |
#endif /* ! ENV_IS_EMBEDDED */ |
c59519919 env: Adjust the l... |
375 376 |
return 0; |
13a5695b7 Patch by Jian Zha... |
377 |
} |
0e8d15866 rename CFG_ENV ma... |
378 |
#endif /* CONFIG_ENV_OFFSET_REDUND */ |
4415f1d1f env: Create a loc... |
379 380 381 |
U_BOOT_ENV_LOCATION(nand) = { .location = ENVL_NAND, |
ac358beb8 env: Drop the env... |
382 |
ENV_NAME("NAND") |
e5bce247b env: Switch over ... |
383 |
.load = env_nand_load, |
4415f1d1f env: Create a loc... |
384 |
#if defined(CMD_SAVEENV) |
e5bce247b env: Switch over ... |
385 |
.save = env_save_ptr(env_nand_save), |
4415f1d1f env: Create a loc... |
386 |
#endif |
e5bce247b env: Switch over ... |
387 |
.init = env_nand_init, |
4415f1d1f env: Create a loc... |
388 |
}; |