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>
diff --git a/common/env_eeprom.c b/common/env_eeprom.c
index 905d39a..eea169d 100644
--- a/common/env_eeprom.c
+++ b/common/env_eeprom.c
@@ -82,17 +82,117 @@
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 @@
* 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