[U-Boot] usb: align usb_endpoint_descriptor to 16-bit boundary

Submitted by Stefan Kristiansson on Oct. 20, 2011, 7:25 p.m.

Details

Message ID 1319138737-10443-1-git-send-email-stefan.kristiansson@saunalahti.fi
State Accepted
Headers show

Commit Message

Stefan Kristiansson Oct. 20, 2011, 7:25 p.m.
The usb_endpoint_descriptor struct is 7 bytes large and is
defined as an array (ep_desc[USB_MAXENDPOINTS])
in the usb_interface struct in include/usb.h

This fact will result in that every odd index in that
array will start at an uneven address, this in
turn makes accesses to u16 wMaxPacketSize unaligned.
Such accesses are illegal on the OpenRISC architecture
(as well as other architectures) and will render a bus error.

Setting the aligned(2) attribute on usb_endpoint_descriptor
will force wMaxPacketSize to a 16-bit boundary.

Signed-off-by: Stefan Kristiansson <stefan.kristiansson@saunalahti.fi>
---
 include/usbdescriptors.h |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

Comments

Remy Bohmer Nov. 26, 2011, 10:33 p.m.
Hi,

2011/10/20 Stefan Kristiansson <stefan.kristiansson@saunalahti.fi>:
> The usb_endpoint_descriptor struct is 7 bytes large and is
> defined as an array (ep_desc[USB_MAXENDPOINTS])
> in the usb_interface struct in include/usb.h
>
> This fact will result in that every odd index in that
> array will start at an uneven address, this in
> turn makes accesses to u16 wMaxPacketSize unaligned.
> Such accesses are illegal on the OpenRISC architecture
> (as well as other architectures) and will render a bus error.
>
> Setting the aligned(2) attribute on usb_endpoint_descriptor
> will force wMaxPacketSize to a 16-bit boundary.
>
> Signed-off-by: Stefan Kristiansson <stefan.kristiansson@saunalahti.fi>

Applied to u-boot-usb.

Kind regards,

Remy

Patch hide | download patch | download mbox

diff --git a/include/usbdescriptors.h b/include/usbdescriptors.h
index 2dec3b9..392fcf5 100644
--- a/include/usbdescriptors.h
+++ b/include/usbdescriptors.h
@@ -199,7 +199,7 @@  struct usb_endpoint_descriptor {
 	u8 bmAttributes;
 	u16 wMaxPacketSize;
 	u8 bInterval;
-} __attribute__ ((packed));
+} __attribute__ ((packed)) __attribute__ ((aligned(2)));
 
 struct usb_interface_descriptor {
 	u8 bLength;