mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-02-26 04:17:09 +00:00
env: move more common code to env_import_redund
There is more common code in mmc, nand and ubi env drivers that can be shared by moving to env_import_redund. For this, a status/error value whether the buffers were loaded are passed as additional parameters to env_import_redund. Ideally, these are already returned to the env driver by the storage driver. This is the case for mmc, nand and ubi, so for this change, code deduplicated. Signed-off-by: Simon Goldschmidt <sgoldschmidt@de.pepperl-fuchs.com> Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>
This commit is contained in:
parent
42a1820bbc
commit
31f044bd91
5 changed files with 36 additions and 51 deletions
21
env/common.c
vendored
21
env/common.c
vendored
|
@ -138,7 +138,8 @@ int env_import(const char *buf, int check)
|
||||||
#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
|
#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
|
||||||
static unsigned char env_flags;
|
static unsigned char env_flags;
|
||||||
|
|
||||||
int env_import_redund(const char *buf1, const char *buf2)
|
int env_import_redund(const char *buf1, int buf1_read_fail,
|
||||||
|
const char *buf2, int buf2_read_fail)
|
||||||
{
|
{
|
||||||
int crc1_ok, crc2_ok;
|
int crc1_ok, crc2_ok;
|
||||||
env_t *ep, *tmp_env1, *tmp_env2;
|
env_t *ep, *tmp_env1, *tmp_env2;
|
||||||
|
@ -146,6 +147,24 @@ int env_import_redund(const char *buf1, const char *buf2)
|
||||||
tmp_env1 = (env_t *)buf1;
|
tmp_env1 = (env_t *)buf1;
|
||||||
tmp_env2 = (env_t *)buf2;
|
tmp_env2 = (env_t *)buf2;
|
||||||
|
|
||||||
|
if (buf1_read_fail && buf2_read_fail) {
|
||||||
|
puts("*** Error - No Valid Environment Area found\n");
|
||||||
|
} else if (buf1_read_fail || buf2_read_fail) {
|
||||||
|
puts("*** Warning - some problems detected ");
|
||||||
|
puts("reading environment; recovered successfully\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buf1_read_fail && buf2_read_fail) {
|
||||||
|
set_default_env("!bad env area");
|
||||||
|
return -EIO;
|
||||||
|
} else if (!buf1_read_fail && buf2_read_fail) {
|
||||||
|
gd->env_valid = ENV_VALID;
|
||||||
|
return env_import((char *)tmp_env1, 1);
|
||||||
|
} else if (buf1_read_fail && !buf2_read_fail) {
|
||||||
|
gd->env_valid = ENV_REDUND;
|
||||||
|
return env_import((char *)tmp_env2, 1);
|
||||||
|
}
|
||||||
|
|
||||||
crc1_ok = crc32(0, tmp_env1->data, ENV_SIZE) ==
|
crc1_ok = crc32(0, tmp_env1->data, ENV_SIZE) ==
|
||||||
tmp_env1->crc;
|
tmp_env1->crc;
|
||||||
crc2_ok = crc32(0, tmp_env2->data, ENV_SIZE) ==
|
crc2_ok = crc32(0, tmp_env2->data, ENV_SIZE) ==
|
||||||
|
|
23
env/mmc.c
vendored
23
env/mmc.c
vendored
|
@ -290,27 +290,8 @@ static int env_mmc_load(void)
|
||||||
read1_fail = read_env(mmc, CONFIG_ENV_SIZE, offset1, tmp_env1);
|
read1_fail = read_env(mmc, CONFIG_ENV_SIZE, offset1, tmp_env1);
|
||||||
read2_fail = read_env(mmc, CONFIG_ENV_SIZE, offset2, tmp_env2);
|
read2_fail = read_env(mmc, CONFIG_ENV_SIZE, offset2, tmp_env2);
|
||||||
|
|
||||||
if (read1_fail && read2_fail)
|
ret = env_import_redund((char *)tmp_env1, read1_fail, (char *)tmp_env2,
|
||||||
puts("*** Error - No Valid Environment Area found\n");
|
read2_fail);
|
||||||
else if (read1_fail || read2_fail)
|
|
||||||
puts("*** Warning - some problems detected "
|
|
||||||
"reading environment; recovered successfully\n");
|
|
||||||
|
|
||||||
if (read1_fail && read2_fail) {
|
|
||||||
errmsg = "!bad CRC";
|
|
||||||
ret = -EIO;
|
|
||||||
goto fini;
|
|
||||||
} else if (!read1_fail && read2_fail) {
|
|
||||||
gd->env_valid = ENV_VALID;
|
|
||||||
env_import((char *)tmp_env1, 1);
|
|
||||||
} else if (read1_fail && !read2_fail) {
|
|
||||||
gd->env_valid = ENV_REDUND;
|
|
||||||
env_import((char *)tmp_env2, 1);
|
|
||||||
} else {
|
|
||||||
env_import_redund((char *)tmp_env1, (char *)tmp_env2);
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = 0;
|
|
||||||
|
|
||||||
fini:
|
fini:
|
||||||
fini_mmc_for_env(mmc);
|
fini_mmc_for_env(mmc);
|
||||||
|
|
22
env/nand.c
vendored
22
env/nand.c
vendored
|
@ -320,7 +320,7 @@ static int env_nand_load(void)
|
||||||
#if defined(ENV_IS_EMBEDDED)
|
#if defined(ENV_IS_EMBEDDED)
|
||||||
return 0;
|
return 0;
|
||||||
#else
|
#else
|
||||||
int read1_fail = 0, read2_fail = 0;
|
int read1_fail, read2_fail;
|
||||||
env_t *tmp_env1, *tmp_env2;
|
env_t *tmp_env1, *tmp_env2;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
@ -336,24 +336,8 @@ static int env_nand_load(void)
|
||||||
read1_fail = readenv(CONFIG_ENV_OFFSET, (u_char *) tmp_env1);
|
read1_fail = readenv(CONFIG_ENV_OFFSET, (u_char *) tmp_env1);
|
||||||
read2_fail = readenv(CONFIG_ENV_OFFSET_REDUND, (u_char *) tmp_env2);
|
read2_fail = readenv(CONFIG_ENV_OFFSET_REDUND, (u_char *) tmp_env2);
|
||||||
|
|
||||||
if (read1_fail && read2_fail)
|
ret = env_import_redund((char *)tmp_env1, read1_fail, (char *)tmp_env2,
|
||||||
puts("*** Error - No Valid Environment Area found\n");
|
read2_fail);
|
||||||
else if (read1_fail || read2_fail)
|
|
||||||
puts("*** Warning - some problems detected "
|
|
||||||
"reading environment; recovered successfully\n");
|
|
||||||
|
|
||||||
if (read1_fail && read2_fail) {
|
|
||||||
set_default_env("!bad env area");
|
|
||||||
goto done;
|
|
||||||
} else if (!read1_fail && read2_fail) {
|
|
||||||
gd->env_valid = ENV_VALID;
|
|
||||||
env_import((char *)tmp_env1, 1);
|
|
||||||
} else if (read1_fail && !read2_fail) {
|
|
||||||
gd->env_valid = ENV_REDUND;
|
|
||||||
env_import((char *)tmp_env2, 1);
|
|
||||||
} else {
|
|
||||||
env_import_redund((char *)tmp_env1, (char *)tmp_env2);
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
done:
|
||||||
free(tmp_env1);
|
free(tmp_env1);
|
||||||
|
|
18
env/ubi.c
vendored
18
env/ubi.c
vendored
|
@ -95,6 +95,7 @@ static int env_ubi_load(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 read1_fail, read2_fail;
|
||||||
env_t *tmp_env1, *tmp_env2;
|
env_t *tmp_env1, *tmp_env2;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -118,21 +119,20 @@ static int env_ubi_load(void)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ubi_volume_read(CONFIG_ENV_UBI_VOLUME, (void *)tmp_env1,
|
read1_fail = ubi_volume_read(CONFIG_ENV_UBI_VOLUME, (void *)tmp_env1,
|
||||||
CONFIG_ENV_SIZE)) {
|
CONFIG_ENV_SIZE);
|
||||||
|
if (read1_fail)
|
||||||
printf("\n** Unable to read env from %s:%s **\n",
|
printf("\n** Unable to read env from %s:%s **\n",
|
||||||
CONFIG_ENV_UBI_PART, CONFIG_ENV_UBI_VOLUME);
|
CONFIG_ENV_UBI_PART, CONFIG_ENV_UBI_VOLUME);
|
||||||
}
|
|
||||||
|
|
||||||
if (ubi_volume_read(CONFIG_ENV_UBI_VOLUME_REDUND, (void *)tmp_env2,
|
read2_fail = ubi_volume_read(CONFIG_ENV_UBI_VOLUME_REDUND,
|
||||||
CONFIG_ENV_SIZE)) {
|
(void *)tmp_env2, CONFIG_ENV_SIZE);
|
||||||
|
if (read2_fail)
|
||||||
printf("\n** Unable to read redundant env from %s:%s **\n",
|
printf("\n** Unable to read redundant env from %s:%s **\n",
|
||||||
CONFIG_ENV_UBI_PART, CONFIG_ENV_UBI_VOLUME_REDUND);
|
CONFIG_ENV_UBI_PART, CONFIG_ENV_UBI_VOLUME_REDUND);
|
||||||
}
|
|
||||||
|
|
||||||
env_import_redund((char *)tmp_env1, (char *)tmp_env2);
|
return env_import_redund((char *)tmp_env1, read1_fail, (char *)tmp_env2,
|
||||||
|
read2_fail);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
#else /* ! CONFIG_SYS_REDUNDAND_ENVIRONMENT */
|
#else /* ! CONFIG_SYS_REDUNDAND_ENVIRONMENT */
|
||||||
static int env_ubi_load(void)
|
static int env_ubi_load(void)
|
||||||
|
|
|
@ -297,7 +297,8 @@ int env_export(env_t *env_out);
|
||||||
|
|
||||||
#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
|
#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
|
||||||
/* Select and import one of two redundant environments */
|
/* Select and import one of two redundant environments */
|
||||||
int env_import_redund(const char *buf1, const char *buf2);
|
int env_import_redund(const char *buf1, int buf1_status,
|
||||||
|
const char *buf2, int buf2_status);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Reference in a new issue