
Hello Stefan,
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.
Nice catch!
/* 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));
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.
Hmm, I count 9 bytes instead of 7...
As writing is only needed on big endian ARM (for data swapping) this issue has been undetected up to now. Either wMaxPacket size must be accessed with special code, or it must be aligned to modulo-2 address.
I suggest:
diff --git a/include/usb.h b/include/usb.h index 9a2e72c..b36272b 100644 --- a/include/usb.h +++ b/include/usb.h @@ -93,8 +93,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 { unsigned char bLength;
I agree, but this patch seems to be whitespace/tab broken...
With this change memory stick is identied correctly. I can do "fatls", but I cannot read data correctly from the disk. But might be something completely different issue ....
I tested it, and fatls/fatload still works on ARM (at91), no regression detected with this patch so far.
Kind regards,
Remy