mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-09-28 23:50:26 +09: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;
|
return (n == blk_cnt) ? 0 : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_ENV_OFFSET_REDUND
|
|
||||||
static unsigned char env_flags;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int saveenv(void)
|
int saveenv(void)
|
||||||
{
|
{
|
||||||
ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1);
|
ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1);
|
||||||
@ -184,8 +180,6 @@ int saveenv(void)
|
|||||||
goto fini;
|
goto fini;
|
||||||
|
|
||||||
#ifdef CONFIG_ENV_OFFSET_REDUND
|
#ifdef CONFIG_ENV_OFFSET_REDUND
|
||||||
env_new->flags = ++env_flags; /* increase the serial */
|
|
||||||
|
|
||||||
if (gd->env_valid == 1)
|
if (gd->env_valid == 1)
|
||||||
copy = 1;
|
copy = 1;
|
||||||
#endif
|
#endif
|
||||||
@ -236,8 +230,6 @@ void env_relocate_spec(void)
|
|||||||
struct mmc *mmc;
|
struct mmc *mmc;
|
||||||
u32 offset1, offset2;
|
u32 offset1, offset2;
|
||||||
int read1_fail = 0, read2_fail = 0;
|
int read1_fail = 0, read2_fail = 0;
|
||||||
int crc1_ok = 0, crc2_ok = 0;
|
|
||||||
env_t *ep;
|
|
||||||
int ret;
|
int ret;
|
||||||
int dev = mmc_get_env_dev();
|
int dev = mmc_get_env_dev();
|
||||||
const char *errmsg = NULL;
|
const char *errmsg = NULL;
|
||||||
@ -268,42 +260,20 @@ void env_relocate_spec(void)
|
|||||||
puts("*** Warning - some problems detected "
|
puts("*** Warning - some problems detected "
|
||||||
"reading environment; recovered successfully\n");
|
"reading environment; recovered successfully\n");
|
||||||
|
|
||||||
crc1_ok = !read1_fail &&
|
if (read1_fail && read2_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) {
|
|
||||||
errmsg = "!bad CRC";
|
errmsg = "!bad CRC";
|
||||||
ret = 1;
|
ret = 1;
|
||||||
goto fini;
|
goto fini;
|
||||||
} else if (crc1_ok && !crc2_ok) {
|
} else if (!read1_fail && read2_fail) {
|
||||||
gd->env_valid = 1;
|
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;
|
gd->env_valid = 2;
|
||||||
|
env_import((char *)tmp_env2, 1);
|
||||||
} else {
|
} else {
|
||||||
/* both ok - check serial */
|
env_import_redund((char *)tmp_env1, (char *)tmp_env2);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
ret = 0;
|
||||||
|
|
||||||
fini:
|
fini:
|
||||||
|
@ -184,10 +184,6 @@ static int erase_and_write_env(const struct env_location *location,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_ENV_OFFSET_REDUND
|
|
||||||
static unsigned char env_flags;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int saveenv(void)
|
int saveenv(void)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
@ -221,7 +217,6 @@ int saveenv(void)
|
|||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
#ifdef CONFIG_ENV_OFFSET_REDUND
|
#ifdef CONFIG_ENV_OFFSET_REDUND
|
||||||
env_new->flags = ++env_flags; /* increase the serial */
|
|
||||||
env_idx = (gd->env_valid == 1);
|
env_idx = (gd->env_valid == 1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -324,8 +319,7 @@ void env_relocate_spec(void)
|
|||||||
{
|
{
|
||||||
#if !defined(ENV_IS_EMBEDDED)
|
#if !defined(ENV_IS_EMBEDDED)
|
||||||
int read1_fail = 0, read2_fail = 0;
|
int read1_fail = 0, read2_fail = 0;
|
||||||
int crc1_ok = 0, crc2_ok = 0;
|
env_t *tmp_env1, *tmp_env2;
|
||||||
env_t *ep, *tmp_env1, *tmp_env2;
|
|
||||||
|
|
||||||
tmp_env1 = (env_t *)malloc(CONFIG_ENV_SIZE);
|
tmp_env1 = (env_t *)malloc(CONFIG_ENV_SIZE);
|
||||||
tmp_env2 = (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 "
|
puts("*** Warning - some problems detected "
|
||||||
"reading environment; recovered successfully\n");
|
"reading environment; recovered successfully\n");
|
||||||
|
|
||||||
crc1_ok = !read1_fail &&
|
if (read1_fail && read2_fail) {
|
||||||
(crc32(0, tmp_env1->data, ENV_SIZE) == tmp_env1->crc);
|
set_default_env("!bad env area");
|
||||||
crc2_ok = !read2_fail &&
|
|
||||||
(crc32(0, tmp_env2->data, ENV_SIZE) == tmp_env2->crc);
|
|
||||||
|
|
||||||
if (!crc1_ok && !crc2_ok) {
|
|
||||||
set_default_env("!bad CRC");
|
|
||||||
goto done;
|
goto done;
|
||||||
} else if (crc1_ok && !crc2_ok) {
|
} else if (!read1_fail && read2_fail) {
|
||||||
gd->env_valid = 1;
|
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;
|
gd->env_valid = 2;
|
||||||
|
env_import((char *)tmp_env2, 1);
|
||||||
} else {
|
} else {
|
||||||
/* both ok - check serial */
|
env_import_redund((char *)tmp_env1, (char *)tmp_env2);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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:
|
done:
|
||||||
free(tmp_env1);
|
free(tmp_env1);
|
||||||
free(tmp_env2);
|
free(tmp_env2);
|
||||||
|
@ -33,8 +33,6 @@ int env_init(void)
|
|||||||
|
|
||||||
#ifdef CONFIG_CMD_SAVEENV
|
#ifdef CONFIG_CMD_SAVEENV
|
||||||
#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
|
#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
|
||||||
static unsigned char env_flags;
|
|
||||||
|
|
||||||
int saveenv(void)
|
int saveenv(void)
|
||||||
{
|
{
|
||||||
ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1);
|
ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1);
|
||||||
@ -50,8 +48,6 @@ int saveenv(void)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
env_new->flags = ++env_flags; /* increase the serial */
|
|
||||||
|
|
||||||
if (gd->env_valid == 1) {
|
if (gd->env_valid == 1) {
|
||||||
puts("Writing to redundant UBI... ");
|
puts("Writing to redundant UBI... ");
|
||||||
if (ubi_volume_write(CONFIG_ENV_UBI_VOLUME_REDUND,
|
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, env1_buf, CONFIG_ENV_SIZE);
|
||||||
ALLOC_CACHE_ALIGN_BUFFER(char, env2_buf, CONFIG_ENV_SIZE);
|
ALLOC_CACHE_ALIGN_BUFFER(char, env2_buf, CONFIG_ENV_SIZE);
|
||||||
int crc1_ok = 0, crc2_ok = 0;
|
env_t *tmp_env1, *tmp_env2;
|
||||||
env_t *ep, *tmp_env1, *tmp_env2;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In case we have restarted u-boot there is a chance that buffer
|
* 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);
|
CONFIG_ENV_UBI_PART, CONFIG_ENV_UBI_VOLUME_REDUND);
|
||||||
}
|
}
|
||||||
|
|
||||||
crc1_ok = crc32(0, tmp_env1->data, ENV_SIZE) == tmp_env1->crc;
|
env_import_redund((char *)tmp_env1, (char *)tmp_env2);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
#else /* ! CONFIG_SYS_REDUNDAND_ENVIRONMENT */
|
#else /* ! CONFIG_SYS_REDUNDAND_ENVIRONMENT */
|
||||||
void env_relocate_spec(void)
|
void env_relocate_spec(void)
|
||||||
|
Loading…
Reference in New Issue
Block a user