On Sun, 31 Aug 2008, Wolfgang Denk wrote:

> 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.

This union replaces the typedef env_t, which was also defined in fw_env.c. 
Thus I was not fixing the issue you describe above, which I fully agree 
with - the tool and u-boot should ideally use the same definition from a 
common header. I just did not address this issue in this patch series.

> 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").

Would be good, yes, the question is - do we want to do this now and do we 
want to do this in the scope of this patch series?

> > +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.

My understanding until now, that U-Boot follows the same coding style as 
the Linux kernel with only one exception - a space between a function name 
and the opening parenthesis. This is also stated here:

http://www.denx.de/wiki/U-Boot/CodingStyle

and Linux explicitly discourages typedef. They also produce warnings by 
checkpatch.sh. If this is also different in U-Boot, no problem, can change 
back.

> > -   /* 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.

I think, CRC is always at offset 0, then follows the (optional) flag byte, 
and then comes the data. I also see this with binary dumps of the 
environment. Otherwise what takes the first four bytes? Or did you mean 
the data which CRC is calculated is at offset 4 or 5? I think, the comment 
is correct.

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

That's exactly the reason - the comment explains, that the crc is at the 
same location, so, you can access it using single.crc in both cases.

> 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.

I need it to be able to copy the whole environment image, including the 
crc and the optional flag with one read / write / memcpy operation. And 
this is also an advantage even on NOR - no need for two or three syscalls, 
the whole image is read / written with one syscall.

Thanks
Guennadi
---
Guennadi Liakhovetski, Ph.D.

DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-0 Fax: +49-8142-66989-80  Email: [EMAIL PROTECTED]
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to