[U-Boot] [PATCH v2 11/17] usb: Add support for data alignment

Remy Bohmer linux at bohmer.net
Sun Dec 4 12:13:20 CET 2011


Hi,

2011/12/3 Simon Glass <sjg at chromium.org>:
> CONFIG_USB_EHCI_DATA_ALIGN sets the required alignment of data for
> USB packets (e.g. 4 means word-aligned). This is required for Tegra
> to operate.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
> Changes in v2:
> - Tidy code style in USB buffer alignment code
> - Display prominent warning when alignment code is triggered
>
>  README                      |    6 ++++++
>  drivers/usb/host/ehci-hcd.c |   29 +++++++++++++++++++++++++++++
>  2 files changed, 35 insertions(+), 0 deletions(-)
>
> diff --git a/README b/README
> index fda0190..3194846 100644
> --- a/README
> +++ b/README
> @@ -1096,6 +1096,12 @@ The following options need to be configured:
>                                May be defined to allow interrupt polling
>                                instead of using asynchronous interrupts
>
> +               CONFIG_USB_EHCI_DATA_ALIGN sets the required alignment of
> +               data for USB packets (e.g. 4 means word-aligned). This is
> +               required for Tegra to operate. Since we want all callers to
> +               align data for us, we display a warning when the alignment
> +               code is triggered.
> +
>  - USB Device:
>                Define the below if you wish to use the USB console.
>                Once firmware is rebuilt from a serial console issue the
> diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
> index 2197119..23458b6 100644
> --- a/drivers/usb/host/ehci-hcd.c
> +++ b/drivers/usb/host/ehci-hcd.c
> @@ -322,6 +322,24 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
>        int timeout;
>        int ret = 0;
>
> +#ifdef CONFIG_USB_EHCI_DATA_ALIGN
> +       /* In case ehci host requires alignment for buffers */
> +       void *align_buf = NULL;
> +       void *orig_buf = buffer;
> +       int unaligned = (int)buffer & (CONFIG_USB_EHCI_DATA_ALIGN - 1);
> +
> +       if (unaligned) {
> +               printf("EHCI: Unaligned buffer: performance will suffer\n");
> +               align_buf = malloc(length + CONFIG_USB_EHCI_DATA_ALIGN);
> +               if (!align_buf)
> +                       return -1;
> +               buffer = (void *)(((ulong)align_buf +
> +                       CONFIG_USB_EHCI_DATA_ALIGN - 1) &
> +                               ~(CONFIG_USB_EHCI_DATA_ALIGN - 1));
> +               if (usb_pipeout(pipe))
> +                       memcpy(buffer, orig_buf, length);
> +       }

I do not really like this solution. Maybe we can introduce something
like an usbbuf_alloc() function that takes care of the alignment.
This saves the memcpy() for every transmit. I know it has more impact
if we do it like that, but I think it is cleaner.

Kind regards,

Remy


More information about the U-Boot mailing list