Subject: Re: CVS commit: src/sys/dev/ic
To: None <source-changes@NetBSD.org>
From: Christian Biere <christianbiere@gmx.de>
List: source-changes
Date: 10/29/2006 15:09:23
Izumi Tsutsui wrote:
> christianbiere@gmx.de wrote:
> 
> > Don't you need at least __attribute__((__packed__)) for struct rtk_desc too?
> 
> Maybe it might be needed on machines which have 8 byte alignment
> restriction but currently I don't think there is such restriction
> even on 64 bit machines.

A similar real-life example would be

struct example {
  uint8_t a;
  uint8_t b;
};

On ARM (at least with GCC) sizeof (struct example) won't be 2.

> >  0: uint32_t rtk_cmdstat
> >  4: pad1
> >  8: uint32_t rtk_vlanctl
> > 12: pad2
> > 16: uint32_t rtk_bufaddr_lo
> > 20: pad3
> > 24: uint32_t rtk_bufaddr_hi
> > 28: pad4
> 
> The offsets of descriptor members are specified by hardware design
> of bus-master, so you can't pad it.

I'm not sure how you mean that. Since this struct rtx_desc is not
used in many places and you need endian-conversion anyway, I would
suggest using accessor functions instead of this struct. For example,
something like this:

static inline uint32_t
rtk_read_vlanctl(const char *data)
{
  uint32_t vlanctl;
  memcpy(&vlanctl, data + 4, 4);
  return le32toh(vlanctl);
}

or simpler:

static inline uint32_t
rtk_read_vlanctl(const char *data)
{
  return peek_le32(data + 4);
}

etc.

-- 
Christian