env: dataflash: fix env_init issue
authorBo Shen <voice.shen@atmel.com>
Tue, 8 Oct 2013 08:30:21 +0000 (16:30 +0800)
committerTom Rini <trini@ti.com>
Mon, 14 Oct 2013 20:06:52 +0000 (16:06 -0400)
As the SPI controller is not initialized before env_init(), it causes
reading env in dataflash failed. So, although saveenv() successfully,
it shows warning information when reboot the system as following:

  *** Warning - bad CRC, using default environment

Let the env_relocate() to check env CRC and import it.

Signed-off-by: Bo Shen <voice.shen@atmel.com>
common/env_dataflash.c

index 5f21d5c38e5b2c8eb7041c178ebe47e57420bb7e..b53b87e95874bb0c9299db2eb2d0bfab6b044aac 100644 (file)
@@ -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;
 }