From 9d364af23ea26414afd09152e85d62a0d950a50d Mon Sep 17 00:00:00 2001 From: Fiach Antaw Date: Wed, 25 Jan 2017 18:53:12 +1000 Subject: [PATCH] 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 Reviewed-by: Tom Rini --- common/env_mmc.c | 42 ++++++------------------------------------ common/env_nand.c | 45 ++++++++------------------------------------- common/env_ubi.c | 39 ++------------------------------------- 3 files changed, 16 insertions(+), 110 deletions(-) diff --git a/common/env_mmc.c b/common/env_mmc.c index 88b043ec35..bb760a00ed 100644 --- a/common/env_mmc.c +++ b/common/env_mmc.c @@ -160,10 +160,6 @@ static inline int write_env(struct mmc *mmc, unsigned long size, return (n == blk_cnt) ? 0 : -1; } -#ifdef CONFIG_ENV_OFFSET_REDUND -static unsigned char env_flags; -#endif - int saveenv(void) { ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1); @@ -184,8 +180,6 @@ int saveenv(void) goto fini; #ifdef CONFIG_ENV_OFFSET_REDUND - env_new->flags = ++env_flags; /* increase the serial */ - if (gd->env_valid == 1) copy = 1; #endif @@ -236,8 +230,6 @@ void env_relocate_spec(void) struct mmc *mmc; u32 offset1, offset2; int read1_fail = 0, read2_fail = 0; - int crc1_ok = 0, crc2_ok = 0; - env_t *ep; int ret; int dev = mmc_get_env_dev(); const char *errmsg = NULL; @@ -268,42 +260,20 @@ 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) { + if (read1_fail && read2_fail) { errmsg = "!bad CRC"; ret = 1; goto fini; - } 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); ret = 0; fini: diff --git a/common/env_nand.c b/common/env_nand.c index 133ecfbb8e..760f6859e3 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); diff --git a/common/env_ubi.c b/common/env_ubi.c index 0ac2f65f0b..95b527ddca 100644 --- a/common/env_ubi.c +++ b/common/env_ubi.c @@ -33,8 +33,6 @@ int env_init(void) #ifdef CONFIG_CMD_SAVEENV #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT -static unsigned char env_flags; - int saveenv(void) { ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1); @@ -50,8 +48,6 @@ int saveenv(void) return 1; } - env_new->flags = ++env_flags; /* increase the serial */ - if (gd->env_valid == 1) { puts("Writing to redundant UBI... "); if (ubi_volume_write(CONFIG_ENV_UBI_VOLUME_REDUND, @@ -112,8 +108,7 @@ void env_relocate_spec(void) { ALLOC_CACHE_ALIGN_BUFFER(char, env1_buf, CONFIG_ENV_SIZE); ALLOC_CACHE_ALIGN_BUFFER(char, env2_buf, CONFIG_ENV_SIZE); - int crc1_ok = 0, crc2_ok = 0; - env_t *ep, *tmp_env1, *tmp_env2; + env_t *tmp_env1, *tmp_env2; /* * In case we have restarted u-boot there is a chance that buffer @@ -148,37 +143,7 @@ void env_relocate_spec(void) CONFIG_ENV_UBI_PART, CONFIG_ENV_UBI_VOLUME_REDUND); } - crc1_ok = crc32(0, tmp_env1->data, ENV_SIZE) == tmp_env1->crc; - crc2_ok = crc32(0, tmp_env2->data, ENV_SIZE) == tmp_env2->crc; - - if (!crc1_ok && !crc2_ok) { - set_default_env("!bad CRC"); - return; - } else if (crc1_ok && !crc2_ok) { - gd->env_valid = 1; - } else if (!crc1_ok && crc2_ok) { - gd->env_valid = 2; - } 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; - } - - if (gd->env_valid == 1) - ep = tmp_env1; - else - ep = tmp_env2; - - env_flags = ep->flags; - env_import((char *)ep, 0); + env_import_redund((char *)tmp_env1, (char *)tmp_env2); } #else /* ! CONFIG_SYS_REDUNDAND_ENVIRONMENT */ void env_relocate_spec(void) -- 2.39.5