Since we want to have multiple environments, we will need to initialise
all the environments since we don't know at init time what drivers might
fail when calling load.

Let's init all of them, and only consider for further operations the ones
that have not reported any errors at init time.

Signed-off-by: Maxime Ripard <maxime.rip...@free-electrons.com>
---
 env/env.c                         | 19 ++++++++++++-------
 include/asm-generic/global_data.h |  1 +
 2 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/env/env.c b/env/env.c
index 5176700133d3..b4d8886e7a69 100644
--- a/env/env.c
+++ b/env/env.c
@@ -112,6 +112,9 @@ int env_get_char(int index)
                if (!drv->get_char)
                        continue;
 
+               if (!(gd->env_has_init & BIT(drv->location)))
+                       continue;
+
                ret = drv->get_char(index);
                if (!ret)
                        return 0;
@@ -134,6 +137,9 @@ int env_load(void)
                if (!drv->load)
                        continue;
 
+               if (!(gd->env_has_init & BIT(drv->location)))
+                       continue;
+
                printf("Loading Environment from %s... ", drv->name);
                ret = drv->load();
                printf("%s\n", ret ? "Failed" : "OK");
@@ -155,6 +161,9 @@ int env_save(void)
                if (!drv->save)
                        continue;
 
+               if (!(gd->env_has_init & BIT(drv->location)))
+                       continue;
+
                printf("Saving Environment to %s... ", drv->name);
                ret = drv->save();
                printf("%s\n", ret ? "Failed" : "OK");
@@ -175,14 +184,10 @@ int env_init(void)
        int prio;
 
        for (prio = 0; (drv = env_driver_lookup(ENVO_INIT, prio)); prio++) {
-               if (!drv->init)
-                       continue;
-
-               ret = drv->init();
-               if (!ret)
-                       return 0;
+               if (!drv->init || !drv->init())
+                       gd->env_has_init |= BIT(drv->location);
 
-               debug("%s: Environment %s failed to init (err=%d)\n", __func__,
+               debug("%s: Environment %s init done (ret=%d)\n", __func__,
                      drv->name, ret);
        }
 
diff --git a/include/asm-generic/global_data.h 
b/include/asm-generic/global_data.h
index 944f58195caf..1d0611fe9498 100644
--- a/include/asm-generic/global_data.h
+++ b/include/asm-generic/global_data.h
@@ -50,6 +50,7 @@ typedef struct global_data {
 #endif
        unsigned long env_addr;         /* Address  of Environment struct */
        unsigned long env_valid;        /* Environment valid? enum env_valid */
+       unsigned long env_has_init;     /* Bitmask of boolean of struct 
env_location offsets */
 
        unsigned long ram_top;          /* Top address of RAM used by U-Boot */
        unsigned long relocaddr;        /* Start address of U-Boot in RAM */
-- 
git-series 0.9.1
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to