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,75 +82,13 @@
 
 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
-	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);
-}
-
-int saveenv(void)
-{
-	env_t	env_new;
-	int	rc;
-	unsigned int off	= CONFIG_ENV_OFFSET;
-#ifdef CONFIG_ENV_OFFSET_REDUND
-	unsigned int off_red	= CONFIG_ENV_OFFSET_REDUND;
-	char flag_obsolete	= OBSOLETE_FLAG;
-#endif
-
-	BUG_ON(env_ptr != NULL);
-
-	rc = env_export(&env_new);
-	if (rc)
-		return rc;
-
-#ifdef CONFIG_ENV_OFFSET_REDUND
-	if (gd->env_valid == 1) {
-		off	= CONFIG_ENV_OFFSET_REDUND;
-		off_red	= CONFIG_ENV_OFFSET;
-	}
-
-	env_new.flags = ACTIVE_FLAG;
-#endif
-
-	rc = eeprom_bus_write(CONFIG_SYS_DEF_EEPROM_ADDR,
-			      off, (uchar *)&env_new, CONFIG_ENV_SIZE);
-
-#ifdef CONFIG_ENV_OFFSET_REDUND
-	if (rc == 0) {
-		eeprom_bus_write(CONFIG_SYS_DEF_EEPROM_ADDR,
-				 off_red + offsetof(env_t, flags),
-				 (uchar *)&flag_obsolete, 1);
-
-		if (gd->env_valid == 1)
-			gd->env_valid = 2;
-		else
-			gd->env_valid = 1;
-	}
-#endif
-	return rc;
-}
-
-/*
- * Initialize Environment use
- *
- * 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];
+	unsigned int off_env[2];
+	uchar rdbuf[64], flags[2];
 	int i, crc_ok[2] = {0, 0};
 
 	eeprom_init();	/* prepare for EEPROM read/write */
@@ -172,12 +110,12 @@
 		len = ENV_SIZE;
 		off = off_env[i] + offsetof(env_t, data);
 		while (len > 0) {
-			int n = (len > sizeof(buf)) ? sizeof(buf) : len;
+			int n = (len > sizeof(rdbuf)) ? sizeof(rdbuf) : len;
 
 			eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR, off,
-					buf, n);
+					rdbuf, n);
 
-			crc_tmp = crc32(crc_tmp, buf, n);
+			crc_tmp = crc32(crc_tmp, rdbuf, n);
 			len -= n;
 			off += n;
 		}
@@ -189,8 +127,6 @@
 	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]) {
@@ -213,19 +149,10 @@
 		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
+
+#else /* CONFIG_ENV_OFFSET_REDUND */
 	ulong crc, len, new;
-	unsigned off;
-	uchar buf[64];
+	uchar rdbuf[64];
 
 	eeprom_init();	/* prepare for EEPROM read/write */
 
@@ -237,13 +164,12 @@
 	new = 0;
 	len = ENV_SIZE;
 	off = offsetof(env_t, data);
-
 	while (len > 0) {
-		int n = (len > sizeof(buf)) ? sizeof(buf) : len;
+		int n = (len > sizeof(rdbuf)) ? sizeof(rdbuf) : len;
 
 		eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
-				CONFIG_ENV_OFFSET + off, buf, n);
-		new = crc32(new, buf, n);
+				CONFIG_ENV_OFFSET + off, rdbuf, n);
+		new = crc32(new, rdbuf, n);
 		len -= n;
 		off += n;
 	}
@@ -255,10 +181,72 @@
 		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_env, CONFIG_ENV_SIZE);
+
+	env_import(buf_env, 1);
+}
+
+int saveenv(void)
+{
+	env_t	env_new;
+	int	rc;
+	unsigned int off	= CONFIG_ENV_OFFSET;
+#ifdef CONFIG_ENV_OFFSET_REDUND
+	unsigned int off_red	= CONFIG_ENV_OFFSET_REDUND;
+	char flag_obsolete	= OBSOLETE_FLAG;
+#endif
+
+	BUG_ON(env_ptr != NULL);
+
+	rc = env_export(&env_new);
+	if (rc)
+		return rc;
+
+#ifdef CONFIG_ENV_OFFSET_REDUND
+	if (gd->env_valid == 1) {
+		off	= CONFIG_ENV_OFFSET_REDUND;
+		off_red	= CONFIG_ENV_OFFSET;
+	}
-#else
+
+	env_new.flags = ACTIVE_FLAG;
+#endif
+
+	rc = eeprom_bus_write(CONFIG_SYS_DEF_EEPROM_ADDR,
+			      off, (uchar *)&env_new, CONFIG_ENV_SIZE);
+
+#ifdef CONFIG_ENV_OFFSET_REDUND
+	if (rc == 0) {
+		eeprom_bus_write(CONFIG_SYS_DEF_EEPROM_ADDR,
+				 off_red + offsetof(env_t, flags),
+				 (uchar *)&flag_obsolete, 1);
+
+		if (gd->env_valid == 1)
+			gd->env_valid = 2;
+		else
+			gd->env_valid = 1;
+	}
+#endif
+	return rc;
+}
+
+/*
+ * Initialize Environment use
+ *
+ * We are still running from ROM, so data use is limited.
+ * Use a (moderately small) buffer on the stack
+ */
+int env_init(void)
+{
 	gd->env_addr = (ulong)&default_environment[0];
 	gd->env_valid = 1;
-#endif
 	return 0;
 }
-#endif