Dear Guennadi Liakhovetski,

In message <[EMAIL PROTECTED]> you wrote:
> Use a union to cover both with and without redundant environment cases.
...
> -typedef struct environment_s {
> -     ulong crc;                      /* CRC32 over data bytes    */
> -     unsigned char flags;            /* active or obsolete */
> -     char *data;
> -} env_t;
> +/* This union will occupy exactly CFG_ENV_SIZE bytes. */
> +union env_image {
> +     struct {
> +             uint32_t        crc;    /* CRC32 over data bytes    */
> +             char            data[];
> +     } single;
> +     struct {
> +             uint32_t        crc;    /* CRC32 over data bytes    */
> +             unsigned char   flags;  /* active or obsolete */
> +             char            data[];
> +     } redund;
> +};

Hm... You defione this union in the  context  of  tools/env/fw_env.c,
while  "include/environment.h" uses a different typedef. I think this
is  extremly  error-prone  because   the   connection   between   the
environment-handling  code  in  U-Boot  and that in the external tool
gets lost.

I think both sets of functions should use the same set of definitions
(yes, I am aware that  this  requires  chnages  to  "include/environ-
ment.h").

> +struct environment {
> +     union env_image *image;
> +     char            *data;  /* shortcut to data */
> +};
>  
> -static env_t environment;
> +static struct environment environment;

Omitting the typedef and then changing "env_t" into "struct
environment" makes no sense to me. It just makes for less readable
code and more typing.

Please stick with the typedef.

>  static int HaveRedundEnv = 0;
>  
> +#define ENV_FLAGS(e) e.image->redund.flags
> +
>  static unsigned char active_flag = 1;
>  static unsigned char obsolete_flag = 0;
>  
> @@ -156,7 +170,7 @@ static char default_environment[] = {
>  #ifdef  CONFIG_EXTRA_ENV_SETTINGS
>       CONFIG_EXTRA_ENV_SETTINGS
>  #endif
> -     "\0"                    /* Termimate env_t data with 2 NULs */
> +     "\0"                    /* Termimate struct environment data with 2 
> NULs */
>  };
>  
>  static int flash_io (int mode);
> @@ -382,8 +396,12 @@ int fw_setenv (int argc, char *argv[])
>  
>    WRITE_FLASH:
>  
> -     /* Update CRC */
> -     environment.crc = crc32 (0, (uint8_t*) environment.data, ENV_SIZE);
> +     /*
> +      * Update CRC: it is at the same location with and without the
> +      * redundant environment
> +      */
> +     environment.image->single.crc = crc32 (0, (uint8_t *) environment.data,
> +                                            ENV_SIZE);

The comment is wrong. Without redundant environment, the CRC is at
offset 4 from the start of the environment storage, and with
redundancy it's at offset 5. This is definitely not the same location.

Also, the code does not match the commend, since you access
"single.crc" which has no relation to redundant environment
at all.


Looking at the rest of the code I see no  improvement  in  using  the
union  versus  what  we did before - the code is even longer now, and
(slightly) less readable to me.

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: [EMAIL PROTECTED]
If A equals success, then the formula is A = X + Y + Z. X is work.  Y
is play. Z is keep your mouth shut.                 - Albert Einstein
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to