[U-Boot] [PATCH 05/20] usb: hub: Update handling connect status/change in usb_scan_port()

Marek Vasut marex at denx.de
Fri Jun 16 14:19:02 UTC 2017


On 06/16/2017 03:31 PM, Bin Meng wrote:
> It was observed that on Intel MinnowMax board, when xHCI is enabled
> in the BayTrail SoC, with a USB 3.0 device connected to the bottom
> USB 3.0 port (mapped to xHCI root port #7), its PORTSC register is
> always 0x201203 (CCS = 1, CSC = 0). The root cause of such behavior
> is unknown yet. Connect status change bit is set on the same port
> with a USB 2.0 device (mapped to xHCI port #1, which is a different
> port on the root hub).
> 
> With current logic in usb_scan_port(), the enumeration process will
> abort if it does not detect a connect status change on a hub port.
> However since a device connection status is correctly reported, the
> enumeration process can still continue.
> 
> With this change, USB device connected to the bottom blue port on
> MinnowMax board can be enumerated under either SS or HS mode.
> 
> Signed-off-by: Bin Meng <bmeng.cn at gmail.com>

I'd be slightly concerned this can break some other controllers, like
the DWC2 . CCing Dinh, maybe he can test it on SoCFPGA.

> ---
> 
>  common/usb_hub.c | 15 +++++++++------
>  1 file changed, 9 insertions(+), 6 deletions(-)
> 
> diff --git a/common/usb_hub.c b/common/usb_hub.c
> index ff9cd50..8279e5c 100644
> --- a/common/usb_hub.c
> +++ b/common/usb_hub.c
> @@ -408,8 +408,15 @@ static int usb_scan_port(struct usb_device_scan *usb_scan)
>  	portchange = le16_to_cpu(portsts->wPortChange);
>  	debug("Port %d Status %X Change %X\n", i + 1, portstatus, portchange);
>  
> -	/* No connection change happened, wait a bit more. */
> -	if (!(portchange & USB_PORT_STAT_C_CONNECTION)) {
> +	/*
> +	 * No connection change happened, wait a bit more.
> +	 *
> +	 * For some situation, the hub reports no connection change but a
> +	 * device is connected to the port (eg: CCS bit is set but CSC is not
> +	 * in the PORTSC register of a root hub), ignore such case.
> +	 */
> +	if (!(portchange & USB_PORT_STAT_C_CONNECTION) &&
> +	    !(portstatus & USB_PORT_STAT_CONNECTION)) {
>  		if (get_timer(0) >= hub->connect_timeout) {
>  			debug("devnum=%d port=%d: timeout\n",
>  			      dev->devnum, i + 1);
> @@ -421,10 +428,6 @@ static int usb_scan_port(struct usb_device_scan *usb_scan)
>  		return 0;
>  	}
>  
> -	/* Test if the connection came up, and if not exit */
> -	if (!(portstatus & USB_PORT_STAT_CONNECTION))
> -		return 0;
> -
>  	/* A new USB device is ready at this point */
>  	debug("devnum=%d port=%d: USB dev found\n", dev->devnum, i + 1);
>  
> 


-- 
Best regards,
Marek Vasut


More information about the U-Boot mailing list