[U-Boot] [PATCH 10/14] env: Initialise all the environments

Maxime Ripard
2017-11-28T12:29:24Z

On Tue, Nov 28, 2017 at 01:24:45PM +0100, Quentin Schulz wrote:
> Hi Maxime,
>
> On 28/11/2017 11:24, Maxime Ripard wrote:
> > 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.ripard@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);
>
> You're not setting ret.

Ah, right.

> And you're printing that init env is always successful

Not really. The message says that it's been done, not that it's been
done successfully.

> and that's not always the case as drv could have an init and call to
> drv->init() could return an error code.

Right, but I'm not really sure what could be done about that error
code beside printing it.

Maxime

--
Maxime Ripard, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20171128/c7a75737/attachment.sig>