Skip to content
  • Stefan Althoefer's avatar
    USB: descriptor handling · d2776827
    Stefan Althoefer authored
    
    
    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: default avatarStefan Althoefer <stefan.althoefer@web.de>
    Signed-off-by: default avatarRemy Böhmer <linux@bohmer.net>
    d2776827