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)
|
||||
{
|
||||
char buf[CONFIG_ENV_SIZE];
|
||||
char buf_env[CONFIG_ENV_SIZE];
|
||||
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
|
||||
if (gd->env_valid == 2)
|
||||
off = CONFIG_ENV_OFFSET_REDUND;
|
||||
#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)
|
||||
@ -144,121 +244,9 @@ int saveenv(void)
|
||||
* We are still running from ROM, so data use is limited.
|
||||
* Use a (moderately small) buffer on the stack
|
||||
*/
|
||||
#ifdef CONFIG_ENV_OFFSET_REDUND
|
||||
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_valid = 1;
|
||||
#endif
|
||||
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