mirror of
https://github.com/u-boot/u-boot.git
synced 2024-11-24 04:34:22 +08:00
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>
This commit is contained in:
parent
76768f5f08
commit
9d364af23e
@ -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:
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user