[U-Boot] [PATCH v2] usb: fix usb_stor_read/write on DM
Marek Vasut
marex at denx.de
Fri Jul 14 11:50:15 UTC 2017
On 07/14/2017 01:03 PM, Masahiro Yamada wrote:
> 2017-07-14 19:07 GMT+09:00 Marek Vasut <marex at denx.de>:
>> On 07/14/2017 04:31 AM, Masahiro Yamada wrote:
>>> Prior to DM, we could not enable different types of USB controllers
>>> at the same time. DM was supposed to loosen the limitation. It is
>>> true that we can compile drivers, but they do not work.
>>>
>>> For example, if EHCI is enabled, xHCI fails as follows:
>>>
>>> => usb read 82000000 0 2000
>>>
>>> USB read: device 0 block # 0, count 8192 ... WARN halted endpoint, queueing URB anyway.
>>> Unexpected XHCI event TRB, skipping... (3fb54010 00000001 13000000 01008401)
>>> BUG: failure at drivers/usb/host/xhci-ring.c:489/abort_td()!
>>> BUG!
>>> ### ERROR ### Please RESET the board ###
>>>
>>> The cause of the error seems the following code:
>>>
>>> #ifdef CONFIG_USB_EHCI_HCD
>>> /*
>>> * The U-Boot EHCI driver can handle any transfer length as long as there is
>>> * enough free heap space left, but the SCSI READ(10) and WRITE(10) commands are
>>> * limited to 65535 blocks.
>>> */
>>> #define USB_MAX_XFER_BLK 65535
>>> #else
>>> #define USB_MAX_XFER_BLK 20
>>> #endif
>>>
>>> To fix the problem, choose the chunk size at run-time for CONFIG_BLK.
>>
>> What happens if CONFIG_BLK is not set ?
>
> USB_MAX_XFER_BLK is chosen.
And can we fix that even for non-CONFIG_BLK ?
>> Why is it 20 for XHCI anyway ?
>
> You are the maintainer.
> (I hope) you have better knowledge with this.
Heh, way to deflect the question. I seem to remember some discussion
about the DMA (?) limitation on XHCI, but I'd have to dig through the ML
archives myself.
> Looks like the following commit was picked up by you.
5 years ago, way before DM was what it is today .
> commit cffcc503580907d733e694d505e12ff6ec6c679a
> Author: Benoît Thébaudeau <benoit.thebaudeau at advansee.com>
> AuthorDate: Fri Aug 10 18:26:50 2012 +0200
> Commit: Marek Vasut <marex at denx.de>
> CommitDate: Sat Sep 1 16:21:52 2012 +0200
>
> usb_storage: Restore non-EHCI support
>
> The commit 5dd95cf made the MSC driver EHCI-specific. This patch restores a
> basic support of non-EHCI HCDs, like before that commit.
>
> The fallback transfer size is certainly not optimal, but at least
> it should work
> like before.
>
> Signed-off-by: Benoît Thébaudeau <benoit.thebaudeau at advansee.com>
> Cc: Marek Vasut <marex at denx.de>
> Cc: Ilya Yanok <ilya.yanok at cogentembedded.com>
> Cc: Stefan Herbrechtsmeier <stefan at herbrechtsmeier.net>
>
> diff --git a/common/usb_storage.c b/common/usb_storage.c
> index bdc306f587fd..0cd6399a3c42 100644
> --- a/common/usb_storage.c
> +++ b/common/usb_storage.c
> @@ -155,11 +155,15 @@ struct us_data {
> trans_cmnd transport; /* transport routine */
> };
>
> +#ifdef CONFIG_USB_EHCI
> /*
> * The U-Boot EHCI driver cannot handle more than 5 page aligned buffers
> * of 4096 bytes in a transfer without running itself out of qt_buffers
> */
> #define USB_MAX_XFER_BLK(start, blksz) (((4096 * 5) - (start % 4096)) / blksz)
> +#else
> +#define USB_MAX_XFER_BLK(start, blksz) 20
> +#endif
>
> static struct us_data usb_stor[USB_MAX_STOR_DEV];
>
>
>
>
>
>
>
--
Best regards,
Marek Vasut
More information about the U-Boot
mailing list