On Thu, 21 Nov 2019 22:15:22 +0100 Simon Goldschmidt <simon.k.r.goldschm...@gmail.com> wrote:
> Since upgrading to gcc9, warnings are issued: > "taking address of packed member of ‘...’ may result in an unaligned > pointer value" > > Fix this by converting two functions to use unaligned access since > packed structures may be on an unaligned address, depending on USB > hardware. > > Signed-off-by: Simon Goldschmidt <simon.k.r.goldschm...@gmail.com> > --- > > Changes in v2: > - fix compiler warning "dereferencing ‘void *'" > > drivers/usb/gadget/composite.c | 25 ++++++++++++++++++------- > 1 file changed, 18 insertions(+), 7 deletions(-) > > diff --git a/drivers/usb/gadget/composite.c > b/drivers/usb/gadget/composite.c index 618a7d5016..c98a444245 100644 > --- a/drivers/usb/gadget/composite.c > +++ b/drivers/usb/gadget/composite.c > @@ -12,8 +12,16 @@ > > #define USB_BUFSIZ 4096 > > +/* Helper type for accessing packed u16 pointers */ > +typedef struct { __le16 val; } __packed __le16_packed; > + > static struct usb_composite_driver *composite; > > +static inline void le16_add_cpu_packed(__le16_packed *var, u16 val) > +{ > + var->val = cpu_to_le16(le16_to_cpu(var->val) + val); > +} > + > /** > * usb_add_function() - add a function to a configuration > * @config: the configuration > @@ -480,20 +488,21 @@ done: > * the host side. > */ > > -static void collect_langs(struct usb_gadget_strings **sp, __le16 > *buf) +static void collect_langs(struct usb_gadget_strings **sp, void > *buf) { > const struct usb_gadget_strings *s; > u16 language; > - __le16 *tmp; > + __le16_packed *tmp; > + __le16_packed *end = (buf + 252); > > while (*sp) { > s = *sp; > language = cpu_to_le16(s->language); > - for (tmp = buf; *tmp && tmp < &buf[126]; tmp++) { > - if (*tmp == language) > + for (tmp = buf; tmp->val && tmp < end; tmp++) { > + if (tmp->val == language) > goto repeat; > } > - *tmp++ = language; > + tmp->val = language; > repeat: > sp++; > } > @@ -705,7 +714,8 @@ static int bos_desc(struct usb_composite_dev > *cdev) */ > usb_ext = cdev->req->buf + le16_to_cpu(bos->wTotalLength); > bos->bNumDeviceCaps++; > - le16_add_cpu(&bos->wTotalLength, USB_DT_USB_EXT_CAP_SIZE); > + le16_add_cpu_packed((__le16_packed *)&bos->wTotalLength, > + USB_DT_USB_EXT_CAP_SIZE); > usb_ext->bLength = USB_DT_USB_EXT_CAP_SIZE; > usb_ext->bDescriptorType = USB_DT_DEVICE_CAPABILITY; > usb_ext->bDevCapabilityType = USB_CAP_TYPE_EXT; > @@ -721,7 +731,8 @@ static int bos_desc(struct usb_composite_dev > *cdev) > ss_cap = cdev->req->buf + > le16_to_cpu(bos->wTotalLength); bos->bNumDeviceCaps++; > - le16_add_cpu(&bos->wTotalLength, > USB_DT_USB_SS_CAP_SIZE); > + le16_add_cpu_packed((__le16_packed > *)&bos->wTotalLength, > + USB_DT_USB_SS_CAP_SIZE); > ss_cap->bLength = USB_DT_USB_SS_CAP_SIZE; > ss_cap->bDescriptorType = USB_DT_DEVICE_CAPABILITY; > ss_cap->bDevCapabilityType = USB_SS_CAP_TYPE; Acked-by: Lukasz Majewski <lu...@denx.de> Best regards, Lukasz Majewski -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lu...@denx.de
pgpzkndIXZrTM.pgp
Description: OpenPGP digital signature
_______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot