• Sam Protsenko's avatar
    env: Fix saving environment to "bad CRC" location · 293a172b
    Sam Protsenko authored
    In case when the environment on some location is malformed (CRC isn't
    matching), there is a chance we won't be able to save the environment to
    that location. For example, consider the case when we only have the
    environment on eMMC, but it's zeroed out. In that case, we won't be able
    to "env save" to it, because of "bad CRC" error. That's happening
    because in env_load() function we consider malformed environment as
    incorrect one, and  defaulting to the location with highest (0)
    priority, which can be different from one we are dealing with right now
    (e.g., highest priority can be ENV_FAT on SD card, which is not
    inserted, but we want to use ENV_MMC on eMMC, where we were booted
    from).
    
    This issue began to reproduce after commit d30ba231 ("u-boot: remove
    driver lookup loop from env_save()") on BeagleBone Black, but that
    commit didn't introduce the wrong logic, it just changed the behavior
    for default location to use, merely revealing this issue.
    
    To fix that, let's implement next logic in env_load():
      1. Try to find out correct environment; if found -- use it
      2. If working environment wasn't found, but we found malformed one
         (with bad CRC), let's use it for further "env save". But make sure
         to use malformed environment location with highest priority.
      3. If neither correct nor malformed environment was found, let's
         default to environment location with highest priority (0)
    
    Steps to reproduce mentioned issue on BeagleBone Black (fixed in this
    patch):
    
    1. Boot from SD card and erase eMMC in U-Boot shell:
       => mmc dev 1
       => mmc erase 0 100000
       => gpt write mmc 1 $partitions
    2. Write new SPL and U-Boot to eMMC; the rest of eMMC will stay filled
       with zeroes
    3. Boot from eMMC; try to do:
       => env save
    4. Observe the error (incorrect behavior). Correct behavior: environment
       should be stored correctly on eMMC, in spite of it has "bad CRC"
    
    Fixes: d30ba231 ("u-boot: remove driver lookup loop from env_save()")
    Signed-off-by: default avatarSam Protsenko <semen.protsenko@linaro.org>
    Reviewed-by: default avatarSimon Goldschmidt <simon.k.r.goldschmidt@gmail.com>
    293a172b