linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] USB: Wait for extra delay time after USB_PORT_FEAT_RESET for quirky hub
@ 2018-10-18  7:42 Kai-Heng Feng
  2018-10-18 14:12 ` Alan Stern
  0 siblings, 1 reply; 2+ messages in thread
From: Kai-Heng Feng @ 2018-10-18  7:42 UTC (permalink / raw)
  To: gregkh; +Cc: linux-usb, linux-kernel, Kai-Heng Feng

Devices connected under Terminus Technology Inc. Hub (1a40:0101) may
fail to work after the system resumes from suspend:
[  206.063325] usb 3-2.4: reset full-speed USB device number 4 using xhci_hcd
[  206.143691] usb 3-2.4: device descriptor read/64, error -32
[  206.351671] usb 3-2.4: device descriptor read/64, error -32

Info for this hub:
T:  Bus=03 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#=  2 Spd=480 MxCh= 4
D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=01 MxPS=64 #Cfgs=  1
P:  Vendor=1a40 ProdID=0101 Rev=01.11
S:  Product=USB 2.0 Hub
C:  #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=100mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub

Some expirements indicate that the USB devices connected to the hub are
innocent, it's the hub itself is to blame. The hub needs extra delay
time after it resets its port.

Hence wait for extra delay, if the device is connected to this quirky
hub.

Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
---
 Documentation/admin-guide/kernel-parameters.txt | 2 ++
 drivers/usb/core/hub.c                          | 5 +++++
 drivers/usb/core/quirks.c                       | 6 ++++++
 include/linux/usb/quirks.h                      | 3 +++
 4 files changed, 16 insertions(+)

diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 92eb1f42240d..626bb7892ab3 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -4683,6 +4683,8 @@
 					prevent spurious wakeup);
 				n = USB_QUIRK_DELAY_CTRL_MSG (Device needs a
 					pause after every control message);
+				o = USB_QUIRK_HUB_SLOW_RESET (Hub needs extra
+					delay after resetting its port);
 			Example: quirks=0781:5580:bk,0a5c:5834:gij
 
 	usbhid.mousepoll=
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 462ce49f683a..4d7e6f8dd40a 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -2891,6 +2891,11 @@ static int hub_port_reset(struct usb_hub *hub, int port1,
 		if (udev) {
 			struct usb_hcd *hcd = bus_to_hcd(udev->bus);
 
+			/* Hub needs extra delay after resetting its port. */
+			if (udev->parent &&
+			    udev->parent->quirks & USB_QUIRK_HUB_SLOW_RESET)
+				msleep(100);
+
 			update_devnum(udev, 0);
 			/* The xHC may think the device is already reset,
 			 * so ignore the status.
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
index 178d6c6063c0..4d7d948eae63 100644
--- a/drivers/usb/core/quirks.c
+++ b/drivers/usb/core/quirks.c
@@ -128,6 +128,9 @@ static int quirks_param_set(const char *val, const struct kernel_param *kp)
 			case 'n':
 				flags |= USB_QUIRK_DELAY_CTRL_MSG;
 				break;
+			case 'o':
+				flags |= USB_QUIRK_HUB_SLOW_RESET;
+				break;
 			/* Ignore unrecognized flag characters */
 			}
 		}
@@ -380,6 +383,9 @@ static const struct usb_device_id usb_quirk_list[] = {
 	{ USB_DEVICE(0x1a0a, 0x0200), .driver_info =
 			USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL },
 
+	/* Terminus Technology Inc. Hub */
+	{ USB_DEVICE(0x1a40, 0x0101), .driver_info = USB_QUIRK_HUB_SLOW_RESET },
+
 	/* Corsair K70 RGB */
 	{ USB_DEVICE(0x1b1c, 0x1b13), .driver_info = USB_QUIRK_DELAY_INIT },
 
diff --git a/include/linux/usb/quirks.h b/include/linux/usb/quirks.h
index b7a99ce56bc9..a1be64c9940f 100644
--- a/include/linux/usb/quirks.h
+++ b/include/linux/usb/quirks.h
@@ -66,4 +66,7 @@
 /* Device needs a pause after every control message. */
 #define USB_QUIRK_DELAY_CTRL_MSG		BIT(13)
 
+/* Hub needs extra delay after resetting its port. */
+#define USB_QUIRK_HUB_SLOW_RESET		BIT(14)
+
 #endif /* __LINUX_USB_QUIRKS_H */
-- 
2.19.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] USB: Wait for extra delay time after USB_PORT_FEAT_RESET for quirky hub
  2018-10-18  7:42 [PATCH] USB: Wait for extra delay time after USB_PORT_FEAT_RESET for quirky hub Kai-Heng Feng
@ 2018-10-18 14:12 ` Alan Stern
  0 siblings, 0 replies; 2+ messages in thread
From: Alan Stern @ 2018-10-18 14:12 UTC (permalink / raw)
  To: Kai-Heng Feng; +Cc: gregkh, linux-usb, linux-kernel

On Thu, 18 Oct 2018, Kai-Heng Feng wrote:

> Devices connected under Terminus Technology Inc. Hub (1a40:0101) may
> fail to work after the system resumes from suspend:
> [  206.063325] usb 3-2.4: reset full-speed USB device number 4 using xhci_hcd
> [  206.143691] usb 3-2.4: device descriptor read/64, error -32
> [  206.351671] usb 3-2.4: device descriptor read/64, error -32
> 
> Info for this hub:
> T:  Bus=03 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#=  2 Spd=480 MxCh= 4
> D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=01 MxPS=64 #Cfgs=  1
> P:  Vendor=1a40 ProdID=0101 Rev=01.11
> S:  Product=USB 2.0 Hub
> C:  #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=100mA
> I:  If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub
> 
> Some expirements indicate that the USB devices connected to the hub are
> innocent, it's the hub itself is to blame. The hub needs extra delay
> time after it resets its port.
> 
> Hence wait for extra delay, if the device is connected to this quirky
> hub.

> --- a/drivers/usb/core/hub.c
> +++ b/drivers/usb/core/hub.c
> @@ -2891,6 +2891,11 @@ static int hub_port_reset(struct usb_hub *hub, int port1,
>  		if (udev) {
>  			struct usb_hcd *hcd = bus_to_hcd(udev->bus);
>  
> +			/* Hub needs extra delay after resetting its port. */
> +			if (udev->parent &&
> +			    udev->parent->quirks & USB_QUIRK_HUB_SLOW_RESET)

There's no need to test udev->parent, or even to put this code under
the "if (udev)" test.  You should simply use hub->hdev instead; it will
always be defined.

Alan Stern

> +				msleep(100);
> +
>  			update_devnum(udev, 0);
>  			/* The xHC may think the device is already reset,
>  			 * so ignore the status.


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2018-10-18 14:12 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-18  7:42 [PATCH] USB: Wait for extra delay time after USB_PORT_FEAT_RESET for quirky hub Kai-Heng Feng
2018-10-18 14:12 ` Alan Stern

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).