[U-Boot] [PATCH] usb_storage: fix ehci driver max transfer size

Marek Vasut marex at denx.de
Tue Jul 3 20:10:44 CEST 2012


Dear Stefan Herbrechtsmeier,

> The commit 5dd95cf93dfffa1d19a1928990852aac9f55b9d9 'usb_storage:
> Fix EHCI "out of buffer pointers" with CD-ROM' introduce a bug in
> usb_storage as it wrongly assumes that every transfer can use 4k
> per qt_buffer. This is wrong if the start address of the data
> is not 4k aligned and leads to 'EHCI timed out on TD' messages
> because of 'out of buffer pointers' in ehci_td_buffer function.
> 
> Cc: Marek Vasut <marex at denx.de>
> Signed-off-by: Stefan Herbrechtsmeier <stefan at herbrechtsmeier.net>

Ok, first I have to admit I broke my promise to look into this ASAP, sorry about 
it :-(

Just curious, but shouldn't it be ((4096 * 5) / dev_desc->blk_sz) - 1 ?

> ---
>  common/usb_storage.c |    6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/common/usb_storage.c b/common/usb_storage.c
> index faad237..612a553 100644
> --- a/common/usb_storage.c
> +++ b/common/usb_storage.c
> @@ -1416,10 +1416,10 @@ int usb_stor_get_info(struct usb_device *dev,
> struct us_data *ss, USB_STOR_PRINTF("partype: %d\n", dev_desc->part_type);
> 
>  	/*
> -	 * The U-Boot EHCI driver cannot handle more than 4096 * 5 bytes in a
> -	 * transfer without running itself out of qt_buffers.
> +	 * The U-Boot EHCI driver cannot handle more than 4096 * 4 bytes in a
> +	 * unaligned transfer without running itself out of qt_buffers.
>  	 */
> -	ss->max_xfer_blk = (4096 * 5) / dev_desc->blksz;
> +	ss->max_xfer_blk = (4096 * 4) / dev_desc->blksz;
> 
>  	init_part(dev_desc);

Best regards,
Marek Vasut


More information about the U-Boot mailing list