Merge branch 'master' of /home/wd/git/u-boot/custodians
[oweals/u-boot.git] / common / env_nand.c
index 4e8307aa3332d67cc43dfd178ef5451e3d711377..da4d3b1df1dbd80ba698a14baf3b86f6e7894976 100644 (file)
@@ -181,7 +181,10 @@ int writeenv(size_t offset, u_char *buf)
 
        return 0;
 }
+
 #ifdef CONFIG_ENV_OFFSET_REDUND
+static unsigned char env_flags;
+
 int saveenv(void)
 {
        env_t   env_new;
@@ -190,22 +193,20 @@ int saveenv(void)
        int     ret = 0;
        nand_erase_options_t nand_erase_options;
 
+       memset(&nand_erase_options, 0, sizeof(nand_erase_options));
        nand_erase_options.length = CONFIG_ENV_RANGE;
-       nand_erase_options.quiet = 0;
-       nand_erase_options.jffs2 = 0;
-       nand_erase_options.scrub = 0;
 
        if (CONFIG_ENV_RANGE < CONFIG_ENV_SIZE)
                return 1;
 
        res = (char *)&env_new.data;
-       len = hexport('\0', &res, ENV_SIZE);
+       len = hexport_r(&env_htab, '\0', &res, ENV_SIZE, 0, NULL);
        if (len < 0) {
                error("Cannot export environment: errno = %d\n", errno);
                return 1;
        }
        env_new.crc   = crc32(0, env_new.data, ENV_SIZE);
-       env_new.flags = ACTIVE_FLAG;
+       env_new.flags = ++env_flags; /* increase the serial */
 
        if(gd->env_valid == 1) {
                puts("Erasing redundant NAND...\n");
@@ -246,17 +247,15 @@ int saveenv(void)
        char    *res;
        nand_erase_options_t nand_erase_options;
 
+       memset(&nand_erase_options, 0, sizeof(nand_erase_options));
        nand_erase_options.length = CONFIG_ENV_RANGE;
-       nand_erase_options.quiet = 0;
-       nand_erase_options.jffs2 = 0;
-       nand_erase_options.scrub = 0;
        nand_erase_options.offset = CONFIG_ENV_OFFSET;
 
        if (CONFIG_ENV_RANGE < CONFIG_ENV_SIZE)
                return 1;
 
        res = (char *)&env_new.data;
-       len = hexport('\0', &res, ENV_SIZE);
+       len = hexport_r(&env_htab, '\0', &res, ENV_SIZE, 0, NULL);
        if (len < 0) {
                error("Cannot export environment: errno = %d\n", errno);
                return 1;
@@ -297,7 +296,7 @@ int readenv(size_t offset, u_char * buf)
                        offset += blocksize;
                } else {
                        char_ptr = &buf[amount_loaded];
-                       if (nand_read(&nand_info[0], offset, &len, char_ptr))
+                       if (nand_read_skip_bad(&nand_info[0], offset, &len, char_ptr))
                                return 1;
                        offset += blocksize;
                        amount_loaded += len;
@@ -399,6 +398,7 @@ void env_relocate_spec(void)
        else
                ep = tmp_env2;
 
+       env_flags = ep->flags;
        env_import((char *)ep, 0);
 
        free(tmp_env1);