diff options
author | Fiach Antaw <fiach.antaw@uqconnect.edu.au> | 2017-01-25 08:53:12 (GMT) |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2017-07-22 19:36:17 (GMT) |
commit | 9d364af23ea26414afd09152e85d62a0d950a50d (patch) | |
tree | 5fd910d02642adfde2be9cdf23b99fe90b29a529 /common/env_nand.c | |
parent | 76768f5f080316d33c25f96e4aaa50d0144f990a (diff) | |
download | u-boot-9d364af23ea26414afd09152e85d62a0d950a50d.tar.xz |
env: Switch env_nand, env_mmc and env_ubi to env_import_redund
The env_nand, env_mmc and env_ubi implementations all implement
redundancy using an identical serial-number scheme. This commit
migrates them to use the implementation in env_common, which is
functionally identical.
Signed-off-by: Fiach Antaw <fiach.antaw@uqconnect.edu.au>
Reviewed-by: Tom Rini <trini@konsulko.com>
Diffstat (limited to 'common/env_nand.c')
-rw-r--r-- | common/env_nand.c | 45 |
1 files changed, 8 insertions, 37 deletions
diff --git a/common/env_nand.c b/common/env_nand.c index 133ecfb..760f685 100644 --- a/common/env_nand.c +++ b/common/env_nand.c @@ -184,10 +184,6 @@ static int erase_and_write_env(const struct env_location *location, return ret; } -#ifdef CONFIG_ENV_OFFSET_REDUND -static unsigned char env_flags; -#endif - int saveenv(void) { int ret = 0; @@ -221,7 +217,6 @@ int saveenv(void) return ret; #ifdef CONFIG_ENV_OFFSET_REDUND - env_new->flags = ++env_flags; /* increase the serial */ env_idx = (gd->env_valid == 1); #endif @@ -324,8 +319,7 @@ void env_relocate_spec(void) { #if !defined(ENV_IS_EMBEDDED) int read1_fail = 0, read2_fail = 0; - int crc1_ok = 0, crc2_ok = 0; - env_t *ep, *tmp_env1, *tmp_env2; + env_t *tmp_env1, *tmp_env2; tmp_env1 = (env_t *)malloc(CONFIG_ENV_SIZE); tmp_env2 = (env_t *)malloc(CONFIG_ENV_SIZE); @@ -344,42 +338,19 @@ void env_relocate_spec(void) puts("*** Warning - some problems detected " "reading environment; recovered successfully\n"); - 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); - - if (!crc1_ok && !crc2_ok) { - set_default_env("!bad CRC"); + if (read1_fail && read2_fail) { + set_default_env("!bad env area"); goto done; - } else if (crc1_ok && !crc2_ok) { + } else if (!read1_fail && read2_fail) { gd->env_valid = 1; - } else if (!crc1_ok && crc2_ok) { + env_import((char *)tmp_env1, 1); + } else if (read1_fail && !read2_fail) { gd->env_valid = 2; + env_import((char *)tmp_env2, 1); } else { - /* both ok - check serial */ - if (tmp_env1->flags == 255 && tmp_env2->flags == 0) - gd->env_valid = 2; - else if (tmp_env2->flags == 255 && tmp_env1->flags == 0) - gd->env_valid = 1; - else if (tmp_env1->flags > tmp_env2->flags) - gd->env_valid = 1; - else if (tmp_env2->flags > tmp_env1->flags) - gd->env_valid = 2; - else /* flags are equal - almost impossible */ - gd->env_valid = 1; + env_import_redund((char *)tmp_env1, (char *)tmp_env2); } - free(env_ptr); - - if (gd->env_valid == 1) - ep = tmp_env1; - else - ep = tmp_env2; - - env_flags = ep->flags; - env_import((char *)ep, 0); - done: free(tmp_env1); free(tmp_env2); |