diff options
Diffstat (limited to 'env')
-rw-r--r-- | env/sf.c | 67 |
1 files changed, 8 insertions, 59 deletions
@@ -166,10 +166,8 @@ static int env_sf_save(void) static int env_sf_load(void) { int ret; - int crc1_ok = 0, crc2_ok = 0; - env_t *tmp_env1 = NULL; - env_t *tmp_env2 = NULL; - env_t *ep = NULL; + int read1_fail, read2_fail; + env_t *tmp_env1, *tmp_env2; tmp_env1 = (env_t *)memalign(ARCH_DMA_MINALIGN, CONFIG_ENV_SIZE); @@ -185,63 +183,14 @@ static int env_sf_load(void) if (ret) goto out; - ret = spi_flash_read(env_flash, CONFIG_ENV_OFFSET, - CONFIG_ENV_SIZE, tmp_env1); - if (ret) { - set_default_env("!spi_flash_read() failed"); - goto err_read; - } - - if (crc32(0, tmp_env1->data, ENV_SIZE) == tmp_env1->crc) - crc1_ok = 1; + read1_fail = spi_flash_read(env_flash, CONFIG_ENV_OFFSET, + CONFIG_ENV_SIZE, tmp_env1); + read2_fail = spi_flash_read(env_flash, CONFIG_ENV_OFFSET_REDUND, + CONFIG_ENV_SIZE, tmp_env2); - ret = spi_flash_read(env_flash, CONFIG_ENV_OFFSET_REDUND, - CONFIG_ENV_SIZE, tmp_env2); - if (!ret) { - if (crc32(0, tmp_env2->data, ENV_SIZE) == tmp_env2->crc) - crc2_ok = 1; - } + ret = env_import_redund((char *)tmp_env1, read1_fail, (char *)tmp_env2, + read2_fail); - if (!crc1_ok && !crc2_ok) { - set_default_env("!bad CRC"); - ret = -EIO; - goto err_read; - } else if (crc1_ok && !crc2_ok) { - gd->env_valid = ENV_VALID; - } else if (!crc1_ok && crc2_ok) { - gd->env_valid = ENV_REDUND; - } else if (tmp_env1->flags == ACTIVE_FLAG && - tmp_env2->flags == OBSOLETE_FLAG) { - gd->env_valid = ENV_VALID; - } else if (tmp_env1->flags == OBSOLETE_FLAG && - tmp_env2->flags == ACTIVE_FLAG) { - gd->env_valid = ENV_REDUND; - } else if (tmp_env1->flags == tmp_env2->flags) { - gd->env_valid = ENV_VALID; - } else if (tmp_env1->flags == 0xFF) { - gd->env_valid = ENV_VALID; - } else if (tmp_env2->flags == 0xFF) { - gd->env_valid = ENV_REDUND; - } else { - /* - * this differs from code in env_flash.c, but I think a sane - * default path is desirable. - */ - gd->env_valid = ENV_VALID; - } - - if (gd->env_valid == ENV_VALID) - ep = tmp_env1; - else - ep = tmp_env2; - - ret = env_import((char *)ep, 0); - if (ret) { - pr_err("Cannot import environment: errno = %d\n", errno); - set_default_env("!env_import failed"); - } - -err_read: spi_flash_free(env_flash); env_flash = NULL; out: |