diff options
Diffstat (limited to 'common/env_dataflash.c')
| -rw-r--r-- | common/env_dataflash.c | 50 | 
1 files changed, 18 insertions, 32 deletions
| diff --git a/common/env_dataflash.c b/common/env_dataflash.c index 5f21d5c38..b53b87e95 100644 --- a/common/env_dataflash.c +++ b/common/env_dataflash.c @@ -29,11 +29,25 @@ uchar env_get_char_spec(int index)  void env_relocate_spec(void)  { +	ulong crc, new = 0; +	unsigned off;  	char buf[CONFIG_ENV_SIZE]; +	/* Read old CRC */ +	read_dataflash(CONFIG_ENV_ADDR + offsetof(env_t, crc), +		       sizeof(ulong), (char *)&crc); + +	/* Read whole environment */  	read_dataflash(CONFIG_ENV_ADDR, CONFIG_ENV_SIZE, buf); -	env_import(buf, 1); +	/* Calculate the CRC */ +	off = offsetof(env_t, data); +	new = crc32(new, (unsigned char *)(buf + off), ENV_SIZE); + +	if (crc == new) +		env_import(buf, 1); +	else +		set_default_env("!bad CRC");  }  #ifdef CONFIG_ENV_OFFSET_REDUND @@ -67,37 +81,9 @@ int saveenv(void)   */  int env_init(void)  { -	ulong crc, len = ENV_SIZE, new = 0; -	unsigned off; -	uchar buf[64]; - -	if (gd->env_valid) -		return 0; - -	AT91F_DataflashInit();	/* prepare for DATAFLASH read/write */ - -	/* read old CRC */ -	read_dataflash(CONFIG_ENV_ADDR + offsetof(env_t, crc), -		sizeof(ulong), (char *)&crc); - -	off = offsetof(env_t, data); -	while (len > 0) { -		int n = (len > sizeof(buf)) ? sizeof(buf) : len; - -		read_dataflash(CONFIG_ENV_ADDR + off, n, (char *)buf); - -		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	= (ulong)&default_environment[0]; -		gd->env_valid	= 0; -	} +	/* use default */ +	gd->env_addr = (ulong)&default_environment[0]; +	gd->env_valid = 1;  	return 0;  } |