[U-Boot] [PATCH 3/4] Use LINK_OFF in enviroment too

Joakim Tjernlund Joakim.Tjernlund at transmode.se
Wed Dec 30 16:08:31 CET 2009


This is the most complex change. Keep this
one as a separate commit for now.
---
 common/env_flash.c |   65 +++++++++++++++++++++++++++++++--------------------
 1 files changed, 39 insertions(+), 26 deletions(-)

diff --git a/common/env_flash.c b/common/env_flash.c
index b860c48..64882d2 100644
--- a/common/env_flash.c
+++ b/common/env_flash.c
@@ -52,27 +52,28 @@ DECLARE_GLOBAL_DATA_PTR;
 
 char * env_name_spec = "Flash";
 
+static int flash_env_swapped;
+
 #ifdef ENV_IS_EMBEDDED
 
 extern uchar environment[];
 env_t *env_ptr = (env_t *)(&environment[0]);
 
 #ifdef CMD_SAVEENV
-/* static env_t *flash_addr = (env_t *)(&environment[0]);-broken on ARM-wd-*/
-static env_t *flash_addr = (env_t *)CONFIG_ENV_ADDR;
+#define flash_addr  f_flash_addr()
 #endif
 
 #else /* ! ENV_IS_EMBEDDED */
 
 env_t *env_ptr = (env_t *)CONFIG_ENV_ADDR;
 #ifdef CMD_SAVEENV
-static env_t *flash_addr = (env_t *)CONFIG_ENV_ADDR;
+#define flash_addr f_flash_addr()
 #endif
 
 #endif /* ENV_IS_EMBEDDED */
 
 #ifdef CONFIG_ENV_ADDR_REDUND
-static env_t *flash_addr_new = (env_t *)CONFIG_ENV_ADDR_REDUND;
+#define flash_addr_new  f_flash_addr_new()
 
 /* CONFIG_ENV_ADDR is supposed to be on sector boundary */
 static ulong end_addr = CONFIG_ENV_ADDR + CONFIG_ENV_SECT_SIZE - 1;
@@ -80,10 +81,35 @@ static ulong end_addr_new = CONFIG_ENV_ADDR_REDUND + CONFIG_ENV_SECT_SIZE - 1;
 
 #define ACTIVE_FLAG   1
 #define OBSOLETE_FLAG 0
+
+static void flash_env_swap(void)
+{
+	ulong ltmp = end_addr;
+
+	flash_env_swapped = !flash_env_swapped;
+
+	end_addr = end_addr_new;
+	end_addr_new = ltmp;
+}
+
+static env_t * f_flash_addr_new(void)
+{
+	if (!*(LINK_OFF(&flash_env_swapped)))
+		return (env_t *)CONFIG_ENV_ADDR_REDUND;
+	else
+		return (env_t *)CONFIG_ENV_ADDR;
+}
 #endif /* CONFIG_ENV_ADDR_REDUND */
 
 extern uchar default_environment[];
 
+static env_t * f_flash_addr(void)
+{
+	if (!(*LINK_OFF(&flash_env_swapped)))
+		return (env_t *)CONFIG_ENV_ADDR;
+	else
+		return (env_t *)CONFIG_ENV_ADDR_REDUND;
+}
 
 uchar env_get_char_spec (int index)
 {
@@ -99,7 +125,7 @@ int  env_init(void)
 	uchar flag1 = flash_addr->flags;
 	uchar flag2 = flash_addr_new->flags;
 
-	ulong addr_default = (ulong)&default_environment[0];
+	ulong addr_default = (ulong)LINK_OFF(default_environment);
 	ulong addr1 = (ulong)&(flash_addr->data);
 	ulong addr2 = (ulong)&(flash_addr_new->data);
 
@@ -218,14 +244,7 @@ int saveenv(void)
 	}
 #endif
 	{
-		env_t * etmp = flash_addr;
-		ulong ltmp = end_addr;
-
-		flash_addr = flash_addr_new;
-		flash_addr_new = etmp;
-
-		end_addr = end_addr_new;
-		end_addr_new = ltmp;
+		flash_env_swap();
 	}
 
 	rc = 0;
@@ -245,13 +264,15 @@ Done:
 
 int  env_init(void)
 {
-	if (crc32(0, env_ptr->data, ENV_SIZE) == env_ptr->crc) {
-		gd->env_addr  = (ulong)&(env_ptr->data);
+	env_t *ep = *LINK_OFF(&env_ptr);
+
+	if (crc32(0, ep->data, ENV_SIZE) == ep->crc) {
+		gd->env_addr  = (ulong)&(ep->data);
 		gd->env_valid = 1;
 		return(0);
 	}
 
-	gd->env_addr  = (ulong)&default_environment[0];
+	gd->env_addr  = (ulong)LINK_OFF(default_environment);
 	gd->env_valid = 0;
 	return (0);
 }
@@ -334,16 +355,8 @@ void env_relocate_spec (void)
 {
 #if !defined(ENV_IS_EMBEDDED) || defined(CONFIG_ENV_ADDR_REDUND)
 #ifdef CONFIG_ENV_ADDR_REDUND
-	if (gd->env_addr != (ulong)&(flash_addr->data)) {
-		env_t * etmp = flash_addr;
-		ulong ltmp = end_addr;
-
-		flash_addr = flash_addr_new;
-		flash_addr_new = etmp;
-
-		end_addr = end_addr_new;
-		end_addr_new = ltmp;
-	}
+	if (gd->env_addr != (ulong)&(flash_addr->data))
+		flash_env_swap();
 
 	if (flash_addr_new->flags != OBSOLETE_FLAG &&
 	    crc32(0, flash_addr_new->data, ENV_SIZE) ==
-- 
1.6.4.4



More information about the U-Boot mailing list