diff mbox series

usb: hub: try old enumeration scheme first for high speed devices

Message ID 1533913304-15737-1-git-send-email-prime.zeng@hisilicon.com
State Superseded
Headers show
Series usb: hub: try old enumeration scheme first for high speed devices | expand

Commit Message

Zeng Tao Aug. 10, 2018, 3:01 p.m. UTC
The new scheme is required just to support legacy low and full-speed
devices. For high speed devices, it will slower the enumeration speed.
So in this patch we try the "old" enumeration scheme first for high speed
devices.

Signed-off-by: Zeng Tao <prime.zeng@hisilicon.com>

---
 drivers/usb/core/hub.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

-- 
2.7.4

Comments

Zeng Tao Aug. 14, 2018, 7:33 a.m. UTC | #1
Hi Roger:

Thank you for review

>-----Original Message-----

>From: Roger Quadros [mailto:rogerq@ti.com]

>Sent: Friday, August 10, 2018 6:51 PM

>To: Zengtao (B) <prime.zeng@hisilicon.com>; gregkh@linuxfoundation.org;

>stern@rowland.harvard.edu; mathias.nyman@linux.intel.com;

>drinkcat@chromium.org; felipe.balbi@linux.intel.com; drake@endlessm.com;

>mike.looijmans@topic.nl; joe@perches.com

>Cc: linux-usb@vger.kernel.org; linux-kernel@vger.kernel.org

>Subject: Re: [PATCH] usb: hub: try old enumeration scheme first for high speed

>devices

>

>Hi,

>

>On 10/08/18 18:01, Zeng Tao wrote:

>> The new scheme is required just to support legacy low and full-speed

>> devices. For high speed devices, it will slower the enumeration speed.

>> So in this patch we try the "old" enumeration scheme first for high

>> speed devices.

>

>How slow does it get? Is it significant?

>Do we risk breaking existing HS devices that work? I don't think we can be sure

>till we run this through testing.

>


We added the new scheme because this is what the windows did , and mainly for 
legacy low and full speed devices.
Now for new windows version(8.1 and later), the second port reset has already been
removed for high speed devices for better enumeration speed.
And In this patch if use_both_schemes is true, it will fallback to new scheme if the old
scheme fails.

So I think it's reasonable to follow the windows behavior again.

>>

>> Signed-off-by: Zeng Tao <prime.zeng@hisilicon.com>

>> ---

>>  drivers/usb/core/hub.c | 5 ++++-

>>  1 file changed, 4 insertions(+), 1 deletion(-)

>>

>> diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index

>> 1fb2668..d265b19 100644

>> --- a/drivers/usb/core/hub.c

>> +++ b/drivers/usb/core/hub.c

>> @@ -2661,10 +2661,13 @@ static bool use_new_scheme(struct usb_device

>*udev, int retry,

>>  	int old_scheme_first_port =

>>  		port_dev->quirks & USB_PORT_QUIRK_OLD_SCHEME;

>>

>> +	int quick_enumeration = (udev->speed == USB_SPEED_HIGH);

>> +

>>  	if (udev->speed >= USB_SPEED_SUPER)

>>  		return false;

>

>how about replacing the above if with

>

>	if (udev->speed >= USB_SPEED_HIGH)

>		return false;


No, for SS device, only use old scheme, but for speed device, we can fallback to new 
scheme if the old fails.

>>

>> -	return USE_NEW_SCHEME(retry, old_scheme_first_port ||

>old_scheme_first);

>> +	return USE_NEW_SCHEME(retry, old_scheme_first_port ||

>old_scheme_first

>> +			      || quick_enumeration);

>>  }

>

>Now we no longer respect the "old_scheme_first" parameter for most of the

>devices.

>

>It should be clarified in Documentation/admin/kernel-parameters.txt that

>"old_scheme_first" is only applicable to LOW/FULL speed devices.

>


On the contrary, new scheme is only applicable for LOW/FULL speed devices? 

>>

>>  /* Is a USB 3.0 port in the Inactive or Compliance Mode state?

>>

>

>--

>Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.

>Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
diff mbox series

Patch

diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 1fb2668..d265b19 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -2661,10 +2661,13 @@  static bool use_new_scheme(struct usb_device *udev, int retry,
 	int old_scheme_first_port =
 		port_dev->quirks & USB_PORT_QUIRK_OLD_SCHEME;
 
+	int quick_enumeration = (udev->speed == USB_SPEED_HIGH);
+
 	if (udev->speed >= USB_SPEED_SUPER)
 		return false;
 
-	return USE_NEW_SCHEME(retry, old_scheme_first_port || old_scheme_first);
+	return USE_NEW_SCHEME(retry, old_scheme_first_port || old_scheme_first
+			      || quick_enumeration);
 }
 
 /* Is a USB 3.0 port in the Inactive or Compliance Mode state?