diff options
| author | Stefan Althoefer <stefan.althoefer@web.de> | 2008-12-07 19:39:11 +0100 | 
|---|---|---|
| committer | Remy Böhmer <linux@bohmer.net> | 2008-12-09 21:26:45 +0100 | 
| commit | d2776827315c3d469b8cb4cec14d58877798daa2 (patch) | |
| tree | f3bd16ef6c968e1445823fc7b4237a109a718b05 /include/usb.h | |
| parent | dedacc18a8c2b3951581eb721fa055a4e0ac4845 (diff) | |
| download | olio-uboot-2014.01-d2776827315c3d469b8cb4cec14d58877798daa2.tar.xz olio-uboot-2014.01-d2776827315c3d469b8cb4cec14d58877798daa2.zip | |
USB: descriptor handling
Hi,
I found a bug when working with the u-boot USB subsystem on IXP425 processor
(big endian Xscale aka ARMv5).
I recognized that the second usb_endpoint_descriptor of the attached memory
stick was corrupted.
The reason for this are the packed structures below (either u-boot and
u-boot-usb):
--------------
/* Endpoint descriptor */
struct usb_endpoint_descriptor {
	unsigned char  bLength;
	unsigned char  bDescriptorType;
	unsigned char  bEndpointAddress;
	unsigned char  bmAttributes;
	unsigned short wMaxPacketSize;
	unsigned char  bInterval;
	unsigned char  bRefresh;
	unsigned char  bSynchAddress;
} __attribute__ ((packed));
/* Interface descriptor */
struct usb_interface_descriptor {
	unsigned char  bLength;
	unsigned char  bDescriptorType;
	unsigned char  bInterfaceNumber;
	unsigned char  bAlternateSetting;
	unsigned char  bNumEndpoints;
	unsigned char  bInterfaceClass;
	unsigned char  bInterfaceSubClass;
	unsigned char  bInterfaceProtocol;
	unsigned char  iInterface;
	unsigned char  no_of_ep;
	unsigned char  num_altsetting;
	unsigned char  act_altsetting;
	struct usb_endpoint_descriptor ep_desc[USB_MAXENDPOINTS];
} __attribute__ ((packed));
------------
As usb_endpoint_descriptor is only 7byte in length, the start of all
odd ep_desc[] structures is not word aligned. This makes wMaxPacketSize
of these structures also not word aligned.
ARMv5 Architecture however does not support non-aligned multibyte
data type (see A2.8 of ARM Architecture Reference Manual).
Signed-off-by: Stefan Althoefer <stefan.althoefer@web.de>
Signed-off-by: Remy Böhmer <linux@bohmer.net>
Diffstat (limited to 'include/usb.h')
| -rw-r--r-- | include/usb.h | 2 | 
1 files changed, 1 insertions, 1 deletions
| diff --git a/include/usb.h b/include/usb.h index 84a77b2f8..510df95d6 100644 --- a/include/usb.h +++ b/include/usb.h @@ -91,7 +91,7 @@ struct usb_endpoint_descriptor {  	unsigned char	bInterval;  	unsigned char	bRefresh;  	unsigned char	bSynchAddress; -} __attribute__ ((packed)); +} __attribute__ ((packed)) __attribute__ ((aligned(2)));  /* Interface descriptor */  struct usb_interface_descriptor { |