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