diff mbox series

[U-Boot] usb: ehci: add ehci max xfer size ehci config entry

Message ID 20191025143015.10102-1-gilles.doffe@savoirfairelinux.com
State New
Delegated to: Marek Vasut
Headers show
Series [U-Boot] usb: ehci: add ehci max xfer size ehci config entry | expand

Commit Message

Gilles Doffe Oct. 25, 2019, 2:30 p.m. UTC
Some USB sticks cannot handle SIZE_MAX bytes (65535) blocks transfer,
leading to 'EHCI timed out on TD' errors.
As it is hardly predictable, this commit adds a configuration option
to easily reduce this EHCI max transfer size. The default value is 65535
which corresponds to size_t max value (SIZE_MAX).

Signed-off-by: Gilles DOFFE <gilles.doffe@savoirfairelinux.com>
---
 drivers/usb/host/Kconfig    | 7 +++++++
 drivers/usb/host/ehci-hcd.c | 2 +-
 2 files changed, 8 insertions(+), 1 deletion(-)

Comments

Robert Hancock Oct. 28, 2019, 5:35 p.m. UTC | #1
On 2019-10-25 8:30 a.m., Gilles DOFFE wrote:
> Some USB sticks cannot handle SIZE_MAX bytes (65535) blocks transfer,
> leading to 'EHCI timed out on TD' errors.
> As it is hardly predictable, this commit adds a configuration option
> to easily reduce this EHCI max transfer size. The default value is 65535
> which corresponds to size_t max value (SIZE_MAX).

This doesn't seem like an ideal solution, as one would have to rebuild
U-Boot to cope with such a device. Do you know how the Linux kernel EHCI
driver deals with this problem?

> 
> Signed-off-by: Gilles DOFFE <gilles.doffe@savoirfairelinux.com>
> ---
>  drivers/usb/host/Kconfig    | 7 +++++++
>  drivers/usb/host/ehci-hcd.c | 2 +-
>  2 files changed, 8 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
> index 30c6b69be8..62054c9c7a 100644
> --- a/drivers/usb/host/Kconfig
> +++ b/drivers/usb/host/Kconfig
> @@ -222,6 +222,13 @@ config USB_EHCI_FSL
>  	select  CONFIG_EHCI_HCD_INIT_AFTER_RESET
>  	---help---
>  	  Enables support for the on-chip EHCI controller on FSL chips.
> +
> +config USB_EHCI_MAX_XFER_SIZE
> +    int "USB EHCI max transfer size. The default value is 65535 which
> +    corresponds to size_t max value (SIZE_MAX)."
> +    default 65535
> +    range 1 65535
> +
>  endif # USB_EHCI_HCD
>  
>  config USB_OHCI_HCD
> diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
> index 61a61abb21..8be1319079 100644
> --- a/drivers/usb/host/ehci-hcd.c
> +++ b/drivers/usb/host/ehci-hcd.c
> @@ -1614,7 +1614,7 @@ static int ehci_get_max_xfer_size(struct udevice *dev, size_t *size)
>  	 * EHCD can handle any transfer length as long as there is enough
>  	 * free heap space left, hence set the theoretical max number here.
>  	 */
> -	*size = SIZE_MAX;
> +	*size = CONFIG_USB_EHCI_MAX_XFER_SIZE;
>  
>  	return 0;
>  }
>
Marek Vasut Oct. 28, 2019, 10:46 p.m. UTC | #2
On 10/28/19 6:35 PM, Robert Hancock wrote:
> On 2019-10-25 8:30 a.m., Gilles DOFFE wrote:
>> Some USB sticks cannot handle SIZE_MAX bytes (65535) blocks transfer,
>> leading to 'EHCI timed out on TD' errors.
>> As it is hardly predictable, this commit adds a configuration option
>> to easily reduce this EHCI max transfer size. The default value is 65535
>> which corresponds to size_t max value (SIZE_MAX).
> 
> This doesn't seem like an ideal solution, as one would have to rebuild
> U-Boot to cope with such a device. Do you know how the Linux kernel EHCI
> driver deals with this problem?

I presume this is already fixed in u-boot-usb/next by:
https://gitlab.denx.de/u-boot/custodians/u-boot-usb/commit/78d49f89e1dd9bdfa891389343bc3016bcaaeee4
https://gitlab.denx.de/u-boot/custodians/u-boot-usb/commit/b43c016256a5eb1070fbca24309e0e66590b7771
https://gitlab.denx.de/u-boot/custodians/u-boot-usb/commit/4bf7e8b7ad6231cf161fcf95d5c3cc6f1de9fff9
Gilles Doffe Nov. 13, 2019, 8:58 a.m. UTC | #3
----- Le 28 Oct 19, à 23:46, Marek Vasut marex@denx.de a écrit :

> On 10/28/19 6:35 PM, Robert Hancock wrote:
>> On 2019-10-25 8:30 a.m., Gilles DOFFE wrote:
>>> Some USB sticks cannot handle SIZE_MAX bytes (65535) blocks transfer,
>>> leading to 'EHCI timed out on TD' errors.
>>> As it is hardly predictable, this commit adds a configuration option
>>> to easily reduce this EHCI max transfer size. The default value is 65535
>>> which corresponds to size_t max value (SIZE_MAX).
>> 
>> This doesn't seem like an ideal solution, as one would have to rebuild
>> U-Boot to cope with such a device. Do you know how the Linux kernel EHCI
>> driver deals with this problem?
> 
> I presume this is already fixed in u-boot-usb/next by:
> https://gitlab.denx.de/u-boot/custodians/u-boot-usb/commit/78d49f89e1dd9bdfa891389343bc3016bcaaeee4
> https://gitlab.denx.de/u-boot/custodians/u-boot-usb/commit/b43c016256a5eb1070fbca24309e0e66590b7771
> https://gitlab.denx.de/u-boot/custodians/u-boot-usb/commit/4bf7e8b7ad6231cf161fcf95d5c3cc6f1de9fff9

Indeed it could solve the problem.
I was not aware of this repo, so I missed it.
Thanks for pointing me on it. I'll give it a try.
Marek Vasut Nov. 13, 2019, 9:01 a.m. UTC | #4
On 11/13/19 9:58 AM, Gilles Doffe wrote:
[...]

>>>> Some USB sticks cannot handle SIZE_MAX bytes (65535) blocks transfer,
>>>> leading to 'EHCI timed out on TD' errors.
>>>> As it is hardly predictable, this commit adds a configuration option
>>>> to easily reduce this EHCI max transfer size. The default value is 65535
>>>> which corresponds to size_t max value (SIZE_MAX).
>>>
>>> This doesn't seem like an ideal solution, as one would have to rebuild
>>> U-Boot to cope with such a device. Do you know how the Linux kernel EHCI
>>> driver deals with this problem?
>>
>> I presume this is already fixed in u-boot-usb/next by:
>> https://gitlab.denx.de/u-boot/custodians/u-boot-usb/commit/78d49f89e1dd9bdfa891389343bc3016bcaaeee4
>> https://gitlab.denx.de/u-boot/custodians/u-boot-usb/commit/b43c016256a5eb1070fbca24309e0e66590b7771
>> https://gitlab.denx.de/u-boot/custodians/u-boot-usb/commit/4bf7e8b7ad6231cf161fcf95d5c3cc6f1de9fff9
> 
> Indeed it could solve the problem.
> I was not aware of this repo, so I missed it.

It's a downstream custodian repository. The patches are now in U-Boot
master as well, so you can again forget about this repository.

> Thanks for pointing me on it. I'll give it a try.

Great, thanks. Please let me know how it went.
diff mbox series

Patch

diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
index 30c6b69be8..62054c9c7a 100644
--- a/drivers/usb/host/Kconfig
+++ b/drivers/usb/host/Kconfig
@@ -222,6 +222,13 @@  config USB_EHCI_FSL
 	select  CONFIG_EHCI_HCD_INIT_AFTER_RESET
 	---help---
 	  Enables support for the on-chip EHCI controller on FSL chips.
+
+config USB_EHCI_MAX_XFER_SIZE
+    int "USB EHCI max transfer size. The default value is 65535 which
+    corresponds to size_t max value (SIZE_MAX)."
+    default 65535
+    range 1 65535
+
 endif # USB_EHCI_HCD
 
 config USB_OHCI_HCD
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 61a61abb21..8be1319079 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -1614,7 +1614,7 @@  static int ehci_get_max_xfer_size(struct udevice *dev, size_t *size)
 	 * EHCD can handle any transfer length as long as there is enough
 	 * free heap space left, hence set the theoretical max number here.
 	 */
-	*size = SIZE_MAX;
+	*size = CONFIG_USB_EHCI_MAX_XFER_SIZE;
 
 	return 0;
 }