return 0;
 }
 
+/* Emport the environment and generate CRC for it. */
+int env_export(env_t *env_out)
+{
+       char *res;
+       ssize_t len;
+
+       res = (char *)env_out->data;
+       len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
+       if (len < 0) {
+               error("Cannot export environment: errno = %d\n", errno);
+               return 1;
+       }
+       env_out->crc = crc32(0, env_out->data, ENV_SIZE);
+
+       return 0;
+}
+
 void env_relocate(void)
 {
 #if defined(CONFIG_NEEDS_MANUAL_RELOC)
 
 
 int saveenv(void)
 {
-       env_t   env_new;
-       ssize_t len;
-       char    *res;
-
-       res = (char *)&env_new.data;
-       len = hexport_r(&env_htab, '\0', 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_t env_new;
+       int ret;
+
+       ret = env_export(&env_new);
+       if (ret)
+               return ret;
 
        return write_dataflash(CONFIG_ENV_ADDR,
                                (unsigned long)&env_new,
 
 int saveenv(void)
 {
        env_t   env_new;
-       ssize_t len;
-       char    *res;
        int     rc;
        unsigned int off        = CONFIG_ENV_OFFSET;
 #ifdef CONFIG_ENV_OFFSET_REDUND
 
        BUG_ON(env_ptr != NULL);
 
-       res = (char *)&env_new.data;
-       len = hexport_r(&env_htab, '\0', 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);
+       rc = env_export(&env_new);
+       if (rc)
+               return rc;
 
 #ifdef CONFIG_ENV_OFFSET_REDUND
        if (gd->env_valid == 1) {
 
 int saveenv(void)
 {
        env_t   env_new;
-       ssize_t len;
-       char    *res;
        block_dev_desc_t *dev_desc = NULL;
        int dev = FAT_ENV_DEVICE;
        int part = FAT_ENV_PART;
        int err;
 
-       res = (char *)&env_new.data;
-       len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
-       if (len < 0) {
-               error("Cannot export environment: errno = %d\n", errno);
-               return 1;
-       }
+       err = env_export(&env_new);
+       if (err)
+               return err;
 
 #ifdef CONFIG_MMC
        if (strcmp(FAT_ENV_INTERFACE, "mmc") == 0) {
                return 1;
        }
 
-       env_new.crc = crc32(0, env_new.data, ENV_SIZE);
        err = file_fat_write(FAT_ENV_FILE, (void *)&env_new, sizeof(env_t));
        if (err == -1) {
                printf("\n** Unable to write \"%s\" from %s%d:%d **\n",
 
 int saveenv(void)
 {
        env_t   env_new;
-       ssize_t len;
-       char    *res, *saved_data = NULL;
+       char    *saved_data = NULL;
        char    flag = OBSOLETE_FLAG, new_flag = ACTIVE_FLAG;
        int     rc = 1;
 #if CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE
        if (flash_sect_protect(0, (ulong)flash_addr_new, end_addr_new))
                goto done;
 
-       res = (char *)&env_new.data;
-       len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
-       if (len < 0) {
-               error("Cannot export environment: errno = %d\n", errno);
-               goto done;
-       }
-       env_new.crc     = crc32(0, env_new.data, ENV_SIZE);
+       rc = env_export(&env_new);
+       if (rc)
+               return rc;
        env_new.flags   = new_flag;
 
 #if CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE
        if (flash_sect_protect(0, (long)flash_addr, end_addr))
                goto done;
 
-       res = (char *)&env_new.data;
-       len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
-       if (len < 0) {
-               error("Cannot export environment: errno = %d\n", errno);
+       rc = env_export(&env_new);
+       if (rc)
                goto done;
-       }
-       env_new.crc = crc32(0, env_new.data, ENV_SIZE);
 
        puts("Erasing Flash...");
        if (flash_sect_erase((long)flash_addr, end_addr))
 
 int saveenv(void)
 {
        ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1);
-       ssize_t len;
-       char    *res;
        struct mmc *mmc = find_mmc_device(CONFIG_SYS_MMC_ENV_DEV);
        u32     offset;
        int     ret, copy = 0;
        if (init_mmc_for_env(mmc))
                return 1;
 
-       res = (char *)&env_new->data;
-       len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
-       if (len < 0) {
-               error("Cannot export environment: errno = %d\n", errno);
-               ret = 1;
+       ret = env_export(env_new);
+       if (ret)
                goto fini;
-       }
-
-       env_new->crc = crc32(0, &env_new->data[0], ENV_SIZE);
 
 #ifdef CONFIG_ENV_OFFSET_REDUND
        env_new->flags  = ++env_flags; /* increase the serial */
 
 {
        int     ret = 0;
        ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1);
-       ssize_t len;
-       char    *res;
        int     env_idx = 0;
        static const struct env_location location[] = {
                {
        if (CONFIG_ENV_RANGE < CONFIG_ENV_SIZE)
                return 1;
 
-       res = (char *)&env_new->data;
-       len = hexport_r(&env_htab, '\0', 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);
+       ret = env_export(env_new);
+       if (ret)
+               return ret;
+
 #ifdef CONFIG_ENV_OFFSET_REDUND
        env_new->flags = ++env_flags; /* increase the serial */
        env_idx = (gd->env_valid == 1);
 
 int saveenv(void)
 {
        env_t   env_new;
-       ssize_t len;
-       char    *res;
        int     rcode = 0;
 
-       res = (char *)&env_new.data;
-       len = hexport_r(&env_htab, '\0', 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);
+       rcode = env_export(&env_new);
+       if (rcode)
+               return rcode;
 
 #ifdef CONFIG_SYS_NVRAM_ACCESS_ROUTINE
        nvram_write(CONFIG_ENV_ADDR, &env_new, CONFIG_ENV_SIZE);
 
 int saveenv(void)
 {
        env_t   env_new;
-       ssize_t len;
-       char    *res;
+       int ret;
        struct mtd_info *mtd = &onenand_mtd;
 #ifdef CONFIG_ENV_ADDR_FLEX
        struct onenand_chip *this = &onenand_chip;
                .callback       = NULL,
        };
 
-       res = (char *)&env_new.data;
-       len = hexport_r(&env_htab, '\0', 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);
+       ret = env_export(&env_new);
+       if (ret)
+               return ret;
 
        instr.len = CONFIG_ENV_SIZE;
 #ifdef CONFIG_ENV_ADDR_FLEX
 
 int saveenv(void)
 {
        env_t   env_new;
-       ssize_t len;
-       char    *res, *saved_buffer = NULL, flag = OBSOLETE_FLAG;
+       char    *saved_buffer = NULL, flag = OBSOLETE_FLAG;
        u32     saved_size, saved_offset, sector = 1;
        int     ret;
 
                }
        }
 
-       res = (char *)&env_new.data;
-       len = hexport_r(&env_htab, '\0', 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);
+       ret = env_export(&env_new);
+       if (ret)
+               return ret;
        env_new.flags   = ACTIVE_FLAG;
 
        if (gd->env_valid == 1) {
 int saveenv(void)
 {
        u32     saved_size, saved_offset, sector = 1;
-       char    *res, *saved_buffer = NULL;
+       char    *saved_buffer = NULL;
        int     ret = 1;
        env_t   env_new;
-       ssize_t len;
 
        if (!env_flash) {
                env_flash = spi_flash_probe(CONFIG_ENV_SPI_BUS,
                        sector++;
        }
 
-       res = (char *)&env_new.data;
-       len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
-       if (len < 0) {
-               error("Cannot export environment: errno = %d\n", errno);
+       ret = env_export(&env_new);
+       if (ret)
                goto done;
-       }
-       env_new.crc = crc32(0, env_new.data, ENV_SIZE);
 
        puts("Erasing SPI flash...");
        ret = spi_flash_erase(env_flash, CONFIG_ENV_OFFSET,
 
 int saveenv(void)
 {
        ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1);
-       ssize_t len;
-       char *res;
+       int ret;
 
-       res = (char *)&env_new->data;
-       len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
-       if (len < 0) {
-               error("Cannot export environment: errno = %d\n", errno);
-               return 1;
-       }
+       ret = env_export(env_new);
+       if (ret)
+               return ret;
 
        if (ubi_part(CONFIG_ENV_UBI_PART, NULL)) {
                printf("\n** Cannot find mtd partition \"%s\"\n",
                return 1;
        }
 
-       env_new->crc = crc32(0, env_new->data, ENV_SIZE);
        env_new->flags = ++env_flags; /* increase the serial */
 
        if (gd->env_valid == 1) {
 int saveenv(void)
 {
        ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1);
-       ssize_t len;
-       char *res;
+       int ret;
 
-       res = (char *)&env_new->data;
-       len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
-       if (len < 0) {
-               error("Cannot export environment: errno = %d\n", errno);
-               return 1;
-       }
+       ret = env_export(env_new);
+       if (ret)
+               return ret;
 
        if (ubi_part(CONFIG_ENV_UBI_PART, NULL)) {
                printf("\n** Cannot find mtd partition \"%s\"\n",
                return 1;
        }
 
-       env_new->crc = crc32(0, env_new->data, ENV_SIZE);
-
        if (ubi_volume_write(CONFIG_ENV_UBI_VOLUME, (void *)env_new,
                             CONFIG_ENV_SIZE)) {
                printf("\n** Unable to write env to %s:%s **\n",
 
 /* Import from binary representation into hash table */
 int env_import(const char *buf, int check);
 
+/* Export from hash table into binary representation */
+int env_export(env_t *env_out);
+
 #endif /* DO_DEPS_ONLY */
 
 #endif /* _ENVIRONMENT_H_ */