Commit c5951991942330c129f3b181e94969d7c01e9abb

Authored by Simon Glass
Committed by Tom Rini
1 parent 21f639446d

env: Adjust the load() method to return an error

The load() methods have inconsistent behaviour on error. Some of them load
an empty default environment. Some load an environment containing an error
message. Others do nothing.

As a step in the right direction, have the method return an error code.
Then the caller could handle this itself in a consistent way.

Signed-off-by: Simon Glass <sjg@chromium.org>

Showing 14 changed files with 83 additions and 42 deletions Side-by-side Diff

... ... @@ -23,7 +23,7 @@
23 23 return c;
24 24 }
25 25  
26   -static void env_dataflash_load(void)
  26 +static int env_dataflash_load(void)
27 27 {
28 28 ulong crc, new = 0;
29 29 unsigned off;
... ... @@ -44,6 +44,8 @@
44 44 env_import(buf, 1);
45 45 else
46 46 set_default_env("!bad CRC");
  47 +
  48 + return 0;
47 49 }
48 50  
49 51 #ifdef CONFIG_ENV_OFFSET_REDUND
... ... @@ -76,7 +76,7 @@
76 76 return c;
77 77 }
78 78  
79   -static void env_eeprom_load(void)
  79 +static int env_eeprom_load(void)
80 80 {
81 81 char buf_env[CONFIG_ENV_SIZE];
82 82 unsigned int off = CONFIG_ENV_OFFSET;
... ... @@ -182,6 +182,8 @@
182 182 off, (uchar *)buf_env, CONFIG_ENV_SIZE);
183 183  
184 184 env_import(buf_env, 1);
  185 +
  186 + return 0;
185 187 }
186 188  
187 189 static int env_eeprom_save(void)
... ... @@ -75,7 +75,7 @@
75 75 }
76 76 #endif /* CONFIG_CMD_SAVEENV */
77 77  
78   -static void env_ext4_load(void)
  78 +static int env_ext4_load(void)
79 79 {
80 80 ALLOC_CACHE_ALIGN_BUFFER(char, buf, CONFIG_ENV_SIZE);
81 81 struct blk_desc *dev_desc = NULL;
82 82  
... ... @@ -109,10 +109,12 @@
109 109 }
110 110  
111 111 env_import(buf, 1);
112   - return;
  112 + return 0;
113 113  
114 114 err_env_relocate:
115 115 set_default_env(NULL);
  116 +
  117 + return -EIO;
116 118 }
117 119  
118 120 U_BOOT_ENV_LOCATION(ext4) = {
... ... @@ -74,7 +74,7 @@
74 74 #endif /* CMD_SAVEENV */
75 75  
76 76 #ifdef LOADENV
77   -static void env_fat_load(void)
  77 +static int env_fat_load(void)
78 78 {
79 79 ALLOC_CACHE_ALIGN_BUFFER(char, buf, CONFIG_ENV_SIZE);
80 80 struct blk_desc *dev_desc = NULL;
81 81  
... ... @@ -103,10 +103,12 @@
103 103 }
104 104  
105 105 env_import(buf, 1);
106   - return;
  106 + return 0;
107 107  
108 108 err_env_relocate:
109 109 set_default_env(NULL);
  110 +
  111 + return -EIO;
110 112 }
111 113 #endif /* LOADENV */
112 114  
... ... @@ -308,7 +308,7 @@
308 308 #endif /* CONFIG_ENV_ADDR_REDUND */
309 309  
310 310 #ifdef LOADENV
311   -static void env_flash_load(void)
  311 +static int env_flash_load(void)
312 312 {
313 313 #ifdef CONFIG_ENV_ADDR_REDUND
314 314 if (gd->env_addr != (ulong)&(flash_addr->data)) {
... ... @@ -352,6 +352,8 @@
352 352 #endif /* CONFIG_ENV_ADDR_REDUND */
353 353  
354 354 env_import((char *)flash_addr, 1);
  355 +
  356 + return 0;
355 357 }
356 358 #endif /* LOADENV */
357 359  
... ... @@ -207,7 +207,7 @@
207 207 }
208 208  
209 209 #ifdef CONFIG_ENV_OFFSET_REDUND
210   -static void env_mmc_load(void)
  210 +static int env_mmc_load(void)
211 211 {
212 212 #if !defined(ENV_IS_EMBEDDED)
213 213 struct mmc *mmc;
214 214  
... ... @@ -224,13 +224,13 @@
224 224  
225 225 errmsg = init_mmc_for_env(mmc);
226 226 if (errmsg) {
227   - ret = 1;
  227 + ret = -EIO;
228 228 goto err;
229 229 }
230 230  
231 231 if (mmc_get_env_addr(mmc, 0, &offset1) ||
232 232 mmc_get_env_addr(mmc, 1, &offset2)) {
233   - ret = 1;
  233 + ret = -EIO;
234 234 goto fini;
235 235 }
236 236  
... ... @@ -245,7 +245,7 @@
245 245  
246 246 if (read1_fail && read2_fail) {
247 247 errmsg = "!bad CRC";
248   - ret = 1;
  248 + ret = -EIO;
249 249 goto fini;
250 250 } else if (!read1_fail && read2_fail) {
251 251 gd->env_valid = ENV_VALID;
252 252  
253 253  
... ... @@ -264,10 +264,12 @@
264 264 err:
265 265 if (ret)
266 266 set_default_env(errmsg);
  267 +
267 268 #endif
  269 + return ret;
268 270 }
269 271 #else /* ! CONFIG_ENV_OFFSET_REDUND */
270   -static void env_mmc_load(void)
  272 +static int env_mmc_load(void)
271 273 {
272 274 #if !defined(ENV_IS_EMBEDDED)
273 275 ALLOC_CACHE_ALIGN_BUFFER(char, buf, CONFIG_ENV_SIZE);
274 276  
275 277  
... ... @@ -281,18 +283,18 @@
281 283  
282 284 errmsg = init_mmc_for_env(mmc);
283 285 if (errmsg) {
284   - ret = 1;
  286 + ret = -EIO;
285 287 goto err;
286 288 }
287 289  
288 290 if (mmc_get_env_addr(mmc, 0, &offset)) {
289   - ret = 1;
  291 + ret = -EIO;
290 292 goto fini;
291 293 }
292 294  
293 295 if (read_env(mmc, CONFIG_ENV_SIZE, offset, buf)) {
294 296 errmsg = "!read failed";
295   - ret = 1;
  297 + ret = -EIO;
296 298 goto fini;
297 299 }
298 300  
... ... @@ -305,6 +307,7 @@
305 307 if (ret)
306 308 set_default_env(errmsg);
307 309 #endif
  310 + return ret;
308 311 }
309 312 #endif /* CONFIG_ENV_OFFSET_REDUND */
310 313  
... ... @@ -302,7 +302,7 @@
302 302 }
303 303  
304 304 if (oob_buf[0] == ENV_OOB_MARKER) {
305   - *result = oob_buf[1] * mtd->erasesize;
  305 + *result = ovoid ob_buf[1] * mtd->erasesize;
306 306 } else if (oob_buf[0] == ENV_OOB_MARKER_OLD) {
307 307 *result = oob_buf[1];
308 308 } else {
309 309  
310 310  
311 311  
... ... @@ -315,17 +315,21 @@
315 315 #endif
316 316  
317 317 #ifdef CONFIG_ENV_OFFSET_REDUND
318   -static void env_nand_load(void)
  318 +static int env_nand_load(void)
319 319 {
320   -#if !defined(ENV_IS_EMBEDDED)
  320 +#if defined(ENV_IS_EMBEDDED)
  321 + return 0;
  322 +#else
321 323 int read1_fail = 0, read2_fail = 0;
322 324 env_t *tmp_env1, *tmp_env2;
  325 + int ret = 0;
323 326  
324 327 tmp_env1 = (env_t *)malloc(CONFIG_ENV_SIZE);
325 328 tmp_env2 = (env_t *)malloc(CONFIG_ENV_SIZE);
326 329 if (tmp_env1 == NULL || tmp_env2 == NULL) {
327 330 puts("Can't allocate buffers for environment\n");
328 331 set_default_env("!malloc() failed");
  332 + ret = -EIO;
329 333 goto done;
330 334 }
331 335  
... ... @@ -355,6 +359,7 @@
355 359 free(tmp_env1);
356 360 free(tmp_env2);
357 361  
  362 + return ret;
358 363 #endif /* ! ENV_IS_EMBEDDED */
359 364 }
360 365 #else /* ! CONFIG_ENV_OFFSET_REDUND */
... ... @@ -363,7 +368,7 @@
363 368 * device i.e., nand_dev_desc + 0. This is also the behaviour using
364 369 * the new NAND code.
365 370 */
366   -static void env_nand_load(void)
  371 +static int env_nand_load(void)
367 372 {
368 373 #if !defined(ENV_IS_EMBEDDED)
369 374 int ret;
370 375  
... ... @@ -386,11 +391,13 @@
386 391 ret = readenv(CONFIG_ENV_OFFSET, (u_char *)buf);
387 392 if (ret) {
388 393 set_default_env("!readenv() failed");
389   - return;
  394 + return -EIO;
390 395 }
391 396  
392 397 env_import(buf, 1);
393 398 #endif /* ! ENV_IS_EMBEDDED */
  399 +
  400 + return 0;
394 401 }
395 402 #endif /* CONFIG_ENV_OFFSET_REDUND */
396 403  
... ... @@ -51,7 +51,7 @@
51 51 }
52 52 #endif
53 53  
54   -static void env_nvram_load(void)
  54 +static int env_nvram_load(void)
55 55 {
56 56 char buf[CONFIG_ENV_SIZE];
57 57  
... ... @@ -61,6 +61,8 @@
61 61 memcpy(buf, (void *)CONFIG_ENV_ADDR, CONFIG_ENV_SIZE);
62 62 #endif
63 63 env_import(buf, 1);
  64 +
  65 + return 0;
64 66 }
65 67  
66 68 static int env_nvram_save(void)
... ... @@ -26,7 +26,7 @@
26 26  
27 27 DECLARE_GLOBAL_DATA_PTR;
28 28  
29   -static void env_onenand_load(void)
  29 +static int env_onenand_load(void)
30 30 {
31 31 struct mtd_info *mtd = &onenand_mtd;
32 32 #ifdef CONFIG_ENV_ADDR_FLEX
... ... @@ -59,6 +59,8 @@
59 59 rc = env_import(buf, 1);
60 60 if (rc)
61 61 gd->env_valid = ENV_VALID;
  62 +
  63 + return rc ? 0 : -EIO;
62 64 }
63 65  
64 66 static int env_onenand_save(void)
... ... @@ -46,11 +46,13 @@
46 46 }
47 47 #endif /* CONFIG_CMD_SAVEENV */
48 48  
49   -static void env_remote_load(void)
  49 +static int env_remote_load(void)
50 50 {
51 51 #ifndef ENV_IS_EMBEDDED
52 52 env_import((char *)env_ptr, 1);
53 53 #endif
  54 +
  55 + return 0;
54 56 }
55 57  
56 58 U_BOOT_ENV_LOCATION(remote) = {
... ... @@ -98,21 +98,24 @@
98 98 int env_sata;
99 99  
100 100 if (sata_initialize())
101   - return;
  101 + return -EIO;
102 102  
103 103 env_sata = sata_get_env_dev();
104 104  
105 105 sata = sata_get_dev(env_sata);
106 106 if (sata == NULL) {
107   - printf("Unknown SATA(%d) device for environment!\n",
108   - env_sata);
109   - return;
  107 + printf("Unknown SATA(%d) device for environment!\n", env_sata);
  108 + return -EIO;
110 109 }
111 110  
112   - if (read_env(sata, CONFIG_ENV_SIZE, CONFIG_ENV_OFFSET, buf))
113   - return set_default_env(NULL);
  111 + if (read_env(sata, CONFIG_ENV_SIZE, CONFIG_ENV_OFFSET, buf)) {
  112 + set_default_env(NULL);
  113 + return -EIO;
  114 + }
114 115  
115 116 env_import(buf, 1);
  117 +
  118 + return 0;
116 119 }
117 120  
118 121 U_BOOT_ENV_LOCATION(sata) = {
... ... @@ -61,7 +61,7 @@
61 61 0, 0, &new);
62 62 if (ret) {
63 63 set_default_env("!spi_flash_probe_bus_cs() failed");
64   - return 1;
  64 + return ret;
65 65 }
66 66  
67 67 env_flash = dev_get_uclass_priv(new);
... ... @@ -73,7 +73,7 @@
73 73 CONFIG_ENV_SPI_MAX_HZ, CONFIG_ENV_SPI_MODE);
74 74 if (!env_flash) {
75 75 set_default_env("!spi_flash_probe() failed");
76   - return 1;
  76 + return -EIO;
77 77 }
78 78 }
79 79 #endif
... ... @@ -95,7 +95,7 @@
95 95  
96 96 ret = env_export(&env_new);
97 97 if (ret)
98   - return ret;
  98 + return -EIO;
99 99 env_new.flags = ACTIVE_FLAG;
100 100  
101 101 if (gd->env_valid == ENV_VALID) {
... ... @@ -112,7 +112,7 @@
112 112 saved_offset = env_new_offset + CONFIG_ENV_SIZE;
113 113 saved_buffer = memalign(ARCH_DMA_MINALIGN, saved_size);
114 114 if (!saved_buffer) {
115   - ret = 1;
  115 + ret = -ENOMEM;
116 116 goto done;
117 117 }
118 118 ret = spi_flash_read(env_flash, saved_offset,
... ... @@ -162,7 +162,7 @@
162 162 }
163 163 #endif /* CMD_SAVEENV */
164 164  
165   -static void env_sf_load(void)
  165 +static int env_sf_load(void)
166 166 {
167 167 int ret;
168 168 int crc1_ok = 0, crc2_ok = 0;
... ... @@ -176,6 +176,7 @@
176 176 CONFIG_ENV_SIZE);
177 177 if (!tmp_env1 || !tmp_env2) {
178 178 set_default_env("!malloc() failed");
  179 + ret = -EIO;
179 180 goto out;
180 181 }
181 182  
... ... @@ -202,6 +203,7 @@
202 203  
203 204 if (!crc1_ok && !crc2_ok) {
204 205 set_default_env("!bad CRC");
  206 + ret = -EIO;
205 207 goto err_read;
206 208 } else if (crc1_ok && !crc2_ok) {
207 209 gd->env_valid = ENV_VALID;
... ... @@ -244,6 +246,8 @@
244 246 out:
245 247 free(tmp_env1);
246 248 free(tmp_env2);
  249 +
  250 + return ret;
247 251 }
248 252 #else
249 253 #ifdef CMD_SAVEENV
... ... @@ -308,7 +312,7 @@
308 312 }
309 313 #endif /* CMD_SAVEENV */
310 314  
311   -static void env_sf_load(void)
  315 +static int env_sf_load(void)
312 316 {
313 317 int ret;
314 318 char *buf = NULL;
... ... @@ -316,7 +320,7 @@
316 320 buf = (char *)memalign(ARCH_DMA_MINALIGN, CONFIG_ENV_SIZE);
317 321 if (!buf) {
318 322 set_default_env("!malloc() failed");
319   - return;
  323 + return -EIO;
320 324 }
321 325  
322 326 ret = setup_flash_device();
... ... @@ -339,6 +343,8 @@
339 343 env_flash = NULL;
340 344 out:
341 345 free(buf);
  346 +
  347 + return ret;
342 348 }
343 349 #endif
344 350  
... ... @@ -91,7 +91,7 @@
91 91 #endif /* CONFIG_CMD_SAVEENV */
92 92  
93 93 #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
94   -static void env_ubi_load(void)
  94 +static int env_ubi_load(void)
95 95 {
96 96 ALLOC_CACHE_ALIGN_BUFFER(char, env1_buf, CONFIG_ENV_SIZE);
97 97 ALLOC_CACHE_ALIGN_BUFFER(char, env2_buf, CONFIG_ENV_SIZE);
... ... @@ -115,7 +115,7 @@
115 115 printf("\n** Cannot find mtd partition \"%s\"\n",
116 116 CONFIG_ENV_UBI_PART);
117 117 set_default_env(NULL);
118   - return;
  118 + return -EIO;
119 119 }
120 120  
121 121 if (ubi_volume_read(CONFIG_ENV_UBI_VOLUME, (void *)tmp_env1,
122 122  
... ... @@ -131,9 +131,11 @@
131 131 }
132 132  
133 133 env_import_redund((char *)tmp_env1, (char *)tmp_env2);
  134 +
  135 + return 0;
134 136 }
135 137 #else /* ! CONFIG_SYS_REDUNDAND_ENVIRONMENT */
136   -static void env_ubi_load(void)
  138 +static int env_ubi_load(void)
137 139 {
138 140 ALLOC_CACHE_ALIGN_BUFFER(char, buf, CONFIG_ENV_SIZE);
139 141  
140 142  
141 143  
... ... @@ -151,17 +153,19 @@
151 153 printf("\n** Cannot find mtd partition \"%s\"\n",
152 154 CONFIG_ENV_UBI_PART);
153 155 set_default_env(NULL);
154   - return;
  156 + return -EIO;
155 157 }
156 158  
157 159 if (ubi_volume_read(CONFIG_ENV_UBI_VOLUME, buf, CONFIG_ENV_SIZE)) {
158 160 printf("\n** Unable to read env from %s:%s **\n",
159 161 CONFIG_ENV_UBI_PART, CONFIG_ENV_UBI_VOLUME);
160 162 set_default_env(NULL);
161   - return;
  163 + return -EIO;
162 164 }
163 165  
164 166 env_import(buf, 1);
  167 +
  168 + return 0;
165 169 }
166 170 #endif /* CONFIG_SYS_REDUNDAND_ENVIRONMENT */
167 171  
include/environment.h
... ... @@ -236,8 +236,10 @@
236 236 *
237 237 * This method is optional. If not provided, no environment will be
238 238 * loaded.
  239 + *
  240 + * @return 0 if OK, -ve on error
239 241 */
240   - void (*load)(void);
  242 + int (*load)(void);
241 243  
242 244 /**
243 245 * save() - Save the environment to storage