env_eeprom.c: Correct using saved environment
The changes in ed6a5d4
unintentionally broke support for reading the
environment saved to eeprom back. To correct this the crc-check and
decision on which environment to use is now moved to env_relocate_spec.
This is done for both the "redundant env" and the "single env" case.
Signed-off-by: Ludger Dreier <ludger.dreier@keymile.com>
This commit is contained in:
parent
040ef8f565
commit
e3cc5bc582
@ -82,17 +82,117 @@ uchar env_get_char_spec(int index)
|
|||||||
|
|
||||||
void env_relocate_spec(void)
|
void env_relocate_spec(void)
|
||||||
{
|
{
|
||||||
char buf[CONFIG_ENV_SIZE];
|
char buf_env[CONFIG_ENV_SIZE];
|
||||||
unsigned int off = CONFIG_ENV_OFFSET;
|
unsigned int off = CONFIG_ENV_OFFSET;
|
||||||
|
|
||||||
|
#ifdef CONFIG_ENV_OFFSET_REDUND
|
||||||
|
ulong len, crc[2], crc_tmp;
|
||||||
|
unsigned int off_env[2];
|
||||||
|
uchar rdbuf[64], flags[2];
|
||||||
|
int i, crc_ok[2] = {0, 0};
|
||||||
|
|
||||||
|
eeprom_init(); /* prepare for EEPROM read/write */
|
||||||
|
|
||||||
|
off_env[0] = CONFIG_ENV_OFFSET;
|
||||||
|
off_env[1] = CONFIG_ENV_OFFSET_REDUND;
|
||||||
|
|
||||||
|
for (i = 0; i < 2; i++) {
|
||||||
|
/* read CRC */
|
||||||
|
eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
|
||||||
|
off_env[i] + offsetof(env_t, crc),
|
||||||
|
(uchar *)&crc[i], sizeof(ulong));
|
||||||
|
/* read FLAGS */
|
||||||
|
eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
|
||||||
|
off_env[i] + offsetof(env_t, flags),
|
||||||
|
(uchar *)&flags[i], sizeof(uchar));
|
||||||
|
|
||||||
|
crc_tmp = 0;
|
||||||
|
len = ENV_SIZE;
|
||||||
|
off = off_env[i] + offsetof(env_t, data);
|
||||||
|
while (len > 0) {
|
||||||
|
int n = (len > sizeof(rdbuf)) ? sizeof(rdbuf) : len;
|
||||||
|
|
||||||
|
eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR, off,
|
||||||
|
rdbuf, n);
|
||||||
|
|
||||||
|
crc_tmp = crc32(crc_tmp, rdbuf, n);
|
||||||
|
len -= n;
|
||||||
|
off += n;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (crc_tmp == crc[i])
|
||||||
|
crc_ok[i] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!crc_ok[0] && !crc_ok[1]) {
|
||||||
|
gd->env_addr = 0;
|
||||||
|
gd->env_valid = 0;
|
||||||
|
} else if (crc_ok[0] && !crc_ok[1]) {
|
||||||
|
gd->env_valid = 1;
|
||||||
|
} else if (!crc_ok[0] && crc_ok[1]) {
|
||||||
|
gd->env_valid = 2;
|
||||||
|
} else {
|
||||||
|
/* both ok - check serial */
|
||||||
|
if (flags[0] == ACTIVE_FLAG && flags[1] == OBSOLETE_FLAG)
|
||||||
|
gd->env_valid = 1;
|
||||||
|
else if (flags[0] == OBSOLETE_FLAG && flags[1] == ACTIVE_FLAG)
|
||||||
|
gd->env_valid = 2;
|
||||||
|
else if (flags[0] == 0xFF && flags[1] == 0)
|
||||||
|
gd->env_valid = 2;
|
||||||
|
else if (flags[1] == 0xFF && flags[0] == 0)
|
||||||
|
gd->env_valid = 1;
|
||||||
|
else /* flags are equal - almost impossible */
|
||||||
|
gd->env_valid = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gd->env_valid == 2)
|
||||||
|
gd->env_addr = off_env[1] + offsetof(env_t, data);
|
||||||
|
else if (gd->env_valid == 1)
|
||||||
|
gd->env_addr = off_env[0] + offsetof(env_t, data);
|
||||||
|
|
||||||
|
#else /* CONFIG_ENV_OFFSET_REDUND */
|
||||||
|
ulong crc, len, new;
|
||||||
|
uchar rdbuf[64];
|
||||||
|
|
||||||
|
eeprom_init(); /* prepare for EEPROM read/write */
|
||||||
|
|
||||||
|
/* read old CRC */
|
||||||
|
eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
|
||||||
|
CONFIG_ENV_OFFSET + offsetof(env_t, crc),
|
||||||
|
(uchar *)&crc, sizeof(ulong));
|
||||||
|
|
||||||
|
new = 0;
|
||||||
|
len = ENV_SIZE;
|
||||||
|
off = offsetof(env_t, data);
|
||||||
|
while (len > 0) {
|
||||||
|
int n = (len > sizeof(rdbuf)) ? sizeof(rdbuf) : len;
|
||||||
|
|
||||||
|
eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
|
||||||
|
CONFIG_ENV_OFFSET + off, rdbuf, n);
|
||||||
|
new = crc32(new, rdbuf, n);
|
||||||
|
len -= n;
|
||||||
|
off += n;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (crc == new) {
|
||||||
|
gd->env_addr = offsetof(env_t, data);
|
||||||
|
gd->env_valid = 1;
|
||||||
|
} else {
|
||||||
|
gd->env_addr = 0;
|
||||||
|
gd->env_valid = 0;
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_ENV_OFFSET_REDUND */
|
||||||
|
|
||||||
|
off = CONFIG_ENV_OFFSET;
|
||||||
#ifdef CONFIG_ENV_OFFSET_REDUND
|
#ifdef CONFIG_ENV_OFFSET_REDUND
|
||||||
if (gd->env_valid == 2)
|
if (gd->env_valid == 2)
|
||||||
off = CONFIG_ENV_OFFSET_REDUND;
|
off = CONFIG_ENV_OFFSET_REDUND;
|
||||||
#endif
|
#endif
|
||||||
eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
|
|
||||||
off, (uchar *)buf, CONFIG_ENV_SIZE);
|
|
||||||
|
|
||||||
env_import(buf, 1);
|
eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
|
||||||
|
off, (uchar *)buf_env, CONFIG_ENV_SIZE);
|
||||||
|
|
||||||
|
env_import(buf_env, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int saveenv(void)
|
int saveenv(void)
|
||||||
@ -144,121 +244,9 @@ int saveenv(void)
|
|||||||
* We are still running from ROM, so data use is limited.
|
* We are still running from ROM, so data use is limited.
|
||||||
* Use a (moderately small) buffer on the stack
|
* Use a (moderately small) buffer on the stack
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_ENV_OFFSET_REDUND
|
|
||||||
int env_init(void)
|
int env_init(void)
|
||||||
{
|
{
|
||||||
#ifdef ENV_IS_EMBEDDED
|
|
||||||
ulong len, crc[2], crc_tmp;
|
|
||||||
unsigned int off, off_env[2];
|
|
||||||
uchar buf[64], flags[2];
|
|
||||||
int i, crc_ok[2] = {0, 0};
|
|
||||||
|
|
||||||
eeprom_init(); /* prepare for EEPROM read/write */
|
|
||||||
|
|
||||||
off_env[0] = CONFIG_ENV_OFFSET;
|
|
||||||
off_env[1] = CONFIG_ENV_OFFSET_REDUND;
|
|
||||||
|
|
||||||
for (i = 0; i < 2; i++) {
|
|
||||||
/* read CRC */
|
|
||||||
eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
|
|
||||||
off_env[i] + offsetof(env_t, crc),
|
|
||||||
(uchar *)&crc[i], sizeof(ulong));
|
|
||||||
/* read FLAGS */
|
|
||||||
eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
|
|
||||||
off_env[i] + offsetof(env_t, flags),
|
|
||||||
(uchar *)&flags[i], sizeof(uchar));
|
|
||||||
|
|
||||||
crc_tmp = 0;
|
|
||||||
len = ENV_SIZE;
|
|
||||||
off = off_env[i] + offsetof(env_t, data);
|
|
||||||
while (len > 0) {
|
|
||||||
int n = (len > sizeof(buf)) ? sizeof(buf) : len;
|
|
||||||
|
|
||||||
eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR, off,
|
|
||||||
buf, n);
|
|
||||||
|
|
||||||
crc_tmp = crc32(crc_tmp, buf, n);
|
|
||||||
len -= n;
|
|
||||||
off += n;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (crc_tmp == crc[i])
|
|
||||||
crc_ok[i] = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!crc_ok[0] && !crc_ok[1]) {
|
|
||||||
gd->env_addr = 0;
|
|
||||||
gd->env_valid = 0;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
} else if (crc_ok[0] && !crc_ok[1]) {
|
|
||||||
gd->env_valid = 1;
|
|
||||||
} else if (!crc_ok[0] && crc_ok[1]) {
|
|
||||||
gd->env_valid = 2;
|
|
||||||
} else {
|
|
||||||
/* both ok - check serial */
|
|
||||||
if (flags[0] == ACTIVE_FLAG && flags[1] == OBSOLETE_FLAG)
|
|
||||||
gd->env_valid = 1;
|
|
||||||
else if (flags[0] == OBSOLETE_FLAG && flags[1] == ACTIVE_FLAG)
|
|
||||||
gd->env_valid = 2;
|
|
||||||
else if (flags[0] == 0xFF && flags[1] == 0)
|
|
||||||
gd->env_valid = 2;
|
|
||||||
else if (flags[1] == 0xFF && flags[0] == 0)
|
|
||||||
gd->env_valid = 1;
|
|
||||||
else /* flags are equal - almost impossible */
|
|
||||||
gd->env_valid = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gd->env_valid == 2)
|
|
||||||
gd->env_addr = off_env[1] + offsetof(env_t, data);
|
|
||||||
else if (gd->env_valid == 1)
|
|
||||||
gd->env_addr = off_env[0] + offsetof(env_t, data);
|
|
||||||
#else
|
|
||||||
gd->env_addr = (ulong)&default_environment[0];
|
gd->env_addr = (ulong)&default_environment[0];
|
||||||
gd->env_valid = 1;
|
gd->env_valid = 1;
|
||||||
#endif
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
int env_init(void)
|
|
||||||
{
|
|
||||||
#ifdef ENV_IS_EMBEDDED
|
|
||||||
ulong crc, len, new;
|
|
||||||
unsigned off;
|
|
||||||
uchar buf[64];
|
|
||||||
|
|
||||||
eeprom_init(); /* prepare for EEPROM read/write */
|
|
||||||
|
|
||||||
/* read old CRC */
|
|
||||||
eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
|
|
||||||
CONFIG_ENV_OFFSET + offsetof(env_t, crc),
|
|
||||||
(uchar *)&crc, sizeof(ulong));
|
|
||||||
|
|
||||||
new = 0;
|
|
||||||
len = ENV_SIZE;
|
|
||||||
off = offsetof(env_t, data);
|
|
||||||
|
|
||||||
while (len > 0) {
|
|
||||||
int n = (len > sizeof(buf)) ? sizeof(buf) : len;
|
|
||||||
|
|
||||||
eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
|
|
||||||
CONFIG_ENV_OFFSET + off, buf, n);
|
|
||||||
new = crc32(new, buf, n);
|
|
||||||
len -= n;
|
|
||||||
off += n;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (crc == new) {
|
|
||||||
gd->env_addr = offsetof(env_t, data);
|
|
||||||
gd->env_valid = 1;
|
|
||||||
} else {
|
|
||||||
gd->env_addr = 0;
|
|
||||||
gd->env_valid = 0;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
gd->env_addr = (ulong)&default_environment[0];
|
|
||||||
gd->env_valid = 1;
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
Loading…
Reference in New Issue
Block a user