env: sf: fix init function behaviour
authorHeiko Schocher <hs@denx.de>
Tue, 3 Nov 2020 14:22:36 +0000 (15:22 +0100)
committerTom Rini <trini@konsulko.com>
Tue, 3 Nov 2020 15:04:25 +0000 (10:04 -0500)
Michael wrote:
commit 92765f45bb95 ("env: Access Environment in SPI flashes before
relocation") at least breaks the Kontron sl28 board. I guess it also
breaks others which use a (late) SPI environment.

reason is, that env_init() sets the init bit, if there
is no init function defined in an environment driver,
and use default return value -ENOENT in this case
later for setting the default environment.

Change:
Environment driver can now implement an init
function and return, if this function does nothing,
simply -ENOENT.

env_init() now handles -ENOENT correct by setting the
inited bit for the environment driver. And if there
is no other environment driver whose init function
returns 0, load than the default environment.

This prevents that each environment driver needs to set the
default environment.

Fixes: 92765f45bb95 ("env: Access Environment in SPI flashes before relocation")
Reported-by: Michael Walle <michael@walle.cc>
Tested-by: Michael Walle <michael@walle.cc> [For the SF environment]
Signed-off-by: Heiko Schocher <hs@denx.de>
env/env.c
env/sf.c

index 42c7d8155e1a5ffebf2663399cbd8eabaca29b10..37b4b54cb75f34fdb4847ae367bcb1bf1d8769c3 100644 (file)
--- a/env/env.c
+++ b/env/env.c
@@ -329,6 +329,8 @@ int env_init(void)
        for (prio = 0; (drv = env_driver_lookup(ENVOP_INIT, prio)); prio++) {
                if (!drv->init || !(ret = drv->init()))
                        env_set_inited(drv->location);
+               if (ret == -ENOENT)
+                       env_set_inited(drv->location);
 
                debug("%s: Environment %s init done (ret=%d)\n", __func__,
                      drv->name, ret);
index 2eb2de1a4eda11dcb5c790f1161600c7cf94535b..91ed2860ed1beb4eb76efe3490ee150c3a4b3c9b 100644 (file)
--- a/env/sf.c
+++ b/env/sf.c
@@ -393,10 +393,12 @@ static int env_sf_init(void)
        return env_sf_init_early();
 #endif
        /*
-        * we must return with 0 if there is nothing done,
-        * else env_set_inited() get not called in env_init()
+        * return here -ENOENT, so env_init()
+        * can set the init bit and later if no
+        * other Environment storage is defined
+        * can set the default environment
         */
-       return 0;
+       return -ENOENT;
 }
 
 U_BOOT_ENV_LOCATION(sf) = {