diff options
Diffstat (limited to 'common/env_sf.c')
-rw-r--r-- | common/env_sf.c | 76 |
1 files changed, 51 insertions, 25 deletions
diff --git a/common/env_sf.c b/common/env_sf.c index 9077d78..2f52e25 100644 --- a/common/env_sf.c +++ b/common/env_sf.c @@ -26,23 +26,21 @@ * MA 02111-1307 USA */ #include <common.h> - -#ifdef CFG_ENV_IS_IN_SPI_FLASH - #include <environment.h> +#include <malloc.h> #include <spi_flash.h> -#ifndef CFG_ENV_SPI_BUS -# define CFG_ENV_SPI_BUS 0 +#ifndef CONFIG_ENV_SPI_BUS +# define CONFIG_ENV_SPI_BUS 0 #endif -#ifndef CFG_ENV_SPI_CS -# define CFG_ENV_SPI_CS 0 +#ifndef CONFIG_ENV_SPI_CS +# define CONFIG_ENV_SPI_CS 0 #endif -#ifndef CFG_ENV_SPI_MAX_HZ -# define CFG_ENV_SPI_MAX_HZ 1000000 +#ifndef CONFIG_ENV_SPI_MAX_HZ +# define CONFIG_ENV_SPI_MAX_HZ 1000000 #endif -#ifndef CFG_ENV_SPI_MODE -# define CFG_ENV_SPI_MODE SPI_MODE_3 +#ifndef CONFIG_ENV_SPI_MODE +# define CONFIG_ENV_SPI_MODE SPI_MODE_3 #endif DECLARE_GLOBAL_DATA_PTR; @@ -63,41 +61,71 @@ uchar env_get_char_spec(int index) int saveenv(void) { + u32 saved_size, saved_offset; + char *saved_buffer = NULL; u32 sector = 1; + int ret; if (!env_flash) { puts("Environment SPI flash not initialized\n"); return 1; } - if (CFG_ENV_SIZE > CFG_ENV_SECT_SIZE) { - sector = CFG_ENV_SIZE / CFG_ENV_SECT_SIZE; - if (CFG_ENV_SIZE % CFG_ENV_SECT_SIZE) + /* Is the sector larger than the env (i.e. embedded) */ + if (CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE) { + saved_size = CONFIG_ENV_SECT_SIZE - CONFIG_ENV_SIZE; + saved_offset = CONFIG_ENV_OFFSET + CONFIG_ENV_SIZE; + saved_buffer = malloc(saved_size); + if (!saved_buffer) { + ret = 1; + goto done; + } + ret = spi_flash_read(env_flash, saved_offset, saved_size, saved_buffer); + if (ret) + goto done; + } + + if (CONFIG_ENV_SIZE > CONFIG_ENV_SECT_SIZE) { + sector = CONFIG_ENV_SIZE / CONFIG_ENV_SECT_SIZE; + if (CONFIG_ENV_SIZE % CONFIG_ENV_SECT_SIZE) sector++; } puts("Erasing SPI flash..."); - if (spi_flash_erase(env_flash, CFG_ENV_OFFSET, sector * CFG_ENV_SECT_SIZE)) - return 1; + ret = spi_flash_erase(env_flash, CONFIG_ENV_OFFSET, sector * CONFIG_ENV_SECT_SIZE); + if (ret) + goto done; puts("Writing to SPI flash..."); - if (spi_flash_write(env_flash, CFG_ENV_OFFSET, CFG_ENV_SIZE, env_ptr)) - return 1; + ret = spi_flash_write(env_flash, CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE, env_ptr); + if (ret) + goto done; + + if (CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE) { + ret = spi_flash_write(env_flash, saved_offset, saved_size, saved_buffer); + if (ret) + goto done; + } + ret = 0; puts("done\n"); - return 0; + + done: + if (saved_buffer) + free(saved_buffer); + return ret; } void env_relocate_spec(void) { int ret; - env_flash = spi_flash_probe(CFG_ENV_SPI_BUS, CFG_ENV_SPI_CS, - CFG_ENV_SPI_MAX_HZ, CFG_ENV_SPI_MODE); + env_flash = spi_flash_probe(CONFIG_ENV_SPI_BUS, CONFIG_ENV_SPI_CS, + CONFIG_ENV_SPI_MAX_HZ, CONFIG_ENV_SPI_MODE); if (!env_flash) goto err_probe; - ret = spi_flash_read(env_flash, CFG_ENV_OFFSET, CFG_ENV_SIZE, env_ptr); + ret = spi_flash_read(env_flash, CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE, env_ptr); if (ret) goto err_read; @@ -115,7 +143,7 @@ err_probe: err_crc: puts("*** Warning - bad CRC, using default environment\n\n"); - if (default_environment_size > CFG_ENV_SIZE) { + if (default_environment_size > CONFIG_ENV_SIZE) { gd->env_valid = 0; puts("*** Error - default environment is too large\n\n"); return; @@ -135,5 +163,3 @@ int env_init(void) return 0; } - -#endif /* CFG_ENV_IS_IN_SPI_FLASH */ |