[PATCH] usb: host: ehci-generic: check for companion controller

Marek Vasut marex at denx.de
Fri Sep 1 12:00:05 CEST 2023


On 9/1/23 11:49, Fabrice Gasnier wrote:
> 
> 
> On 8/30/23 17:12, Marek Vasut wrote:
>> On 8/30/23 10:00, Fabrice Gasnier wrote:
>>> EHCI is usually used with companion controller (like OHCI) as companion
>>> controller. This information on the companion is missing currently in
>>> companion drivers.
>>> So, if the usb-uclass isn't aware, it may scan busses in any order: OHCI
>>> first, then EHCI.
>>> This is seen on STM32MP1 where DT probing makes the probe order to occur
>>> by increasing address (OHCI address < EHCI address).
>>>
>>> When a low speed or full-speed device is plugged in, it's not detected as
>>> EHCI should first detect it, and give ownership (handover) to OHCI.
>>>
>>> Current situation on STM32MP1 (with a low speed device plugged-in)
>>> STM32MP> usb start
>>> starting USB...
>>> Bus usb at 5800c000: USB OHCI 1.0
>>> Bus usb at 5800d000: USB EHCI 1.00
>>> scanning bus usb at 5800c000 for devices... 1 USB Device(s) found
>>> scanning bus usb at 5800d000 for devices... 1 USB Device(s) found
>>>          scanning usb for storage devices... 0 Storage Device(s) found
>>>
>>> The "companion" property in the device tree allow to retrieve companion
>>> controller information, from the EHCI node. This allow marking the
>>> companion driver as such.
>>>
>>> With this patch (same low speed device plugged in):
>>> STM32MP> usb start
>>> starting USB...
>>> Bus usb at 5800c000: USB OHCI 1.0
>>> Bus usb at 5800d000: USB EHCI 1.00
>>> scanning bus usb at 5800d000 for devices... 1 USB Device(s) found
>>> scanning bus usb at 5800c000 for devices... 2 USB Device(s) found
>>>          scanning usb for storage devices... 0 Storage Device(s) found
>>> STM32MP> usb tree
>>> USB device tree:
>>>     1  Hub (12 Mb/s, 0mA)
>>>     |   U-Boot Root Hub
>>>     |
>>>     +-2  Human Interface (1.5 Mb/s, 100mA)
>>>          HP HP USB 1000dpi Laser Mouse
>>>
>>>     1  Hub (480 Mb/s, 0mA)
>>>        u-boot EHCI Host Controller
>>>
>>> This also optimize bus scan when a High speed device is plugged in, as
>>> the usb-uclass skips OHCI in this case:
>>>
>>> STM32MP> usb reset
>>> resetting USB...
>>> Bus usb at 5800c000: USB OHCI 1.0
>>> Bus usb at 5800d000: USB EHCI 1.00
>>> scanning bus usb at 5800d000 for devices... 2 USB Device(s) found
>>>          scanning usb for storage devices... 1 Storage Device(s) found
>>> STM32MP> usb tree
>>> USB device tree:
>>>     1  Hub (480 Mb/s, 0mA)
>>>     |  u-boot EHCI Host Controller
>>>     |
>>>     +-2  Mass Storage (480 Mb/s, 200mA)
>>>          SanDisk Cruzer Blade 03003432021922011407
>>>
>>> Signed-off-by: Fabrice Gasnier <fabrice.gasnier at foss.st.com>
>>> ---
>>>
>>>    drivers/usb/host/ehci-generic.c | 24 ++++++++++++++++++++++++
>>
>> More of a design question -- shouldn't the usb-uclass handle this
>> property ad manipulate with private data of "remote" devices instead ?
> 
> Hi Marek,
> 
> That's an option I haven't really explored earlier. I was a bit confused
> when I figured out the usb-uclass was able to manage the companion
> controller, by using the "companion" flag. But I couldn't find any
> driver that was actually using this flag :-O.
> 
> So I had a look at the git log, and I found out:
> - Companion has been introduced in:
> b6de4d1093d3 dm: usb: Add support for companion controllers
> 
> - First user for this flag was introduced in same series:
> 6a72e804a2b2 sunxi: ohci: Add ohci usb host controller support
> e.g. drivers/usb/host/ohci-sunxi.c
> 
> So, in the original design, the flag was set in OHCI controller driver
> side. This is why I implemented this in controller driver, but in EHCI
> generic driver, because it has the companion property (not in OHCI node).
> 
> - Later this driver has been dropped in, to use the generic OHCI driver
> instead: 543049ab5906 usb: host: Drop [e-o]hci-sunxi drivers
> 
> It looks like that setting the companion flag has been missed when
> moving to OHCI generic driver. I admit the strange thing with current
> approach is: implementation is done in EHCI driver, to impact OHCI
> private struct.
> 
> I'll send a v2, to handle this in usb-uclass as you suggest. This makes
> sense.

Thank you ! Esp. for digging in properly and solving this properly.


More information about the U-Boot mailing list