From: Aneesh V <aneesh@ti.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] OMAP4 u-boot broken (was [PATCH] usb: align usb_endpoint_descriptor to 16-bit boundary)
Date: Tue, 13 Dec 2011 18:59:45 +0530 [thread overview]
Message-ID: <4EE75349.1060802@ti.com> (raw)
In-Reply-To: <1319138737-10443-1-git-send-email-stefan.kristiansson@saunalahti.fi>
Hi Kristiansson,
On Friday 21 October 2011 12:55 AM, Stefan Kristiansson wrote:
> 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>
> ---
OMAP4 U-Boot is broken in the mainline. U-Boot wouldn't boot up on any
OMAP4 platforms. I suspect this will be the case with any ARM platform
that has enabled USB tty code. I git-bisected the issue to this patch.
I did some analysis on it and here are my findings.
aligned(2) indeed makes the sizeof(struct usb_endpoint_descriptor) ==
8. But that doesn't seem to be enough. struct acm_config_desc embeds
fields of type usb_endpoint_descriptor and has the attribute 'packed'.
As a result, these usb_endpoint_descriptor structures in
acm_config_desc may have odd addresses and consequently wMaxPacketSize
also has odd address. As far as I can see, this is not a new issue. But
your patch fortunately or unfortunately brought it out. Here is how:
When 'usb_endpoint_descriptor' didn't have the 'aligned' attribute,
compiler took extra care while accessing wMaxPacketSize. It did it
using two byte reads and combining them to make a 16-bit half-word.
When aligned was added compiler replaced it with a 'ldrh' (load
half-word) instruction that resulted in an abort due the odd address.
Now, I am not sure how to solve this problem. I tried the following and
the boot issue is gone.
diff --git a/drivers/serial/usbtty.c b/drivers/serial/usbtty.c
index e2e87fe..2a961e9 100644
--- a/drivers/serial/usbtty.c
+++ b/drivers/serial/usbtty.c
@@ -151,7 +151,7 @@ struct acm_config_desc {
/* Slave Interface */
struct usb_interface_descriptor data_class_interface;
struct usb_endpoint_descriptor data_endpoints[NUM_ENDPOINTS-1];
-} __attribute__((packed));
+};
static struct acm_config_desc
acm_configuration_descriptors[NUM_CONFIGS] = {
{
I am not a USB expert, so not sure whether this works. Does that
structure really have to be 'packed'? It will be great if USB experts
can look into this and come up with a permanent solution at the
earliest because quite a few platforms will be broken until then.
> include/usbdescriptors.h | 2 +-
> 1 files changed, 1 insertions(+), 1 deletions(-)
>
> 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;
next prev parent reply other threads:[~2011-12-13 13:29 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-20 19:25 [U-Boot] [PATCH] usb: align usb_endpoint_descriptor to 16-bit boundary Stefan Kristiansson
2011-11-26 22:33 ` Remy Bohmer
2011-12-13 13:29 ` Aneesh V [this message]
2011-12-13 20:15 ` [U-Boot] OMAP4 u-boot broken (was [PATCH] usb: align usb_endpoint_descriptor to 16-bit boundary) Stefan Kristiansson
2011-12-14 10:24 ` Aneesh V
2011-12-14 14:24 ` Tom Rini
2011-12-14 20:25 ` Tom Rini
2011-12-14 10:12 ` Michael Jones
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4EE75349.1060802@ti.com \
--to=aneesh@ti.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox