patch "USB: Wait for extra delay time after USB_PORT_FEAT_RESET for quirky" added to usb-linus
Subsystems (3)
This is a note to let you know that I've just added the patch titled
USB: Wait for extra delay time after USB_PORT_FEAT_RESET for quirky
to my usb git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
in the usb-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
Quoted 1 line
From
781f0766cc41a9dd2e5d118ef4b1d5d89430257bMon Sep 17 00:00:00 2001
From: Kai-Heng Feng <[email protected]>
Date: Fri, 19 Oct 2018 16:14:50 +0800
Subject: USB: Wait for extra delay time after USB_PORT_FEAT_RESET for quirky
hub
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.
--- Documentation/admin-guide/kernel-parameters.txt | 2 ++ drivers/usb/core/hub.c | 14 +++++++++++--- drivers/usb/core/quirks.c | 6 ++++++ include/linux/usb/quirks.h | 3 +++ 4 files changed, 22 insertions(+), 3 deletions(-)
Documentation/admin-guide/kernel-parameters.txt +2 -0
@@ -4713,6 +4713,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=
drivers/usb/core/hub.c +11 -3
@@ -2794,6 +2794,7 @@ static int hub_port_reset(struct usb_hub *hub, int port1,int i, status;u16 portchange, portstatus;struct usb_port *port_dev = hub->ports[port1 -1 ]; +int reset_recovery_time;if (!hub_is_superspeed (hub->hdev)) {if (warm) {
@@ -2885,11 +2886,18 @@ static int hub_port_reset(struct usb_hub *hub, int port1, done:if (status ==0 ) { -/* TRSTRCY = 10 ms; plus some extra */ if (port_dev->quirks &USB_PORT_QUIRK_FAST_ENUM )usleep_range (10000 ,12000 ); -else -msleep (10 +40 ); +else { +/* TRSTRCY = 10 ms; plus some extra */ + reset_recovery_time =10 +40 ; + +/* Hub needs extra delay after resetting its port. */ +if (hub->hdev->quirks &USB_QUIRK_HUB_SLOW_RESET ) + reset_recovery_time +=100 ; + +msleep (reset_recovery_time); + }if (udev) {struct usb_hcd *hcd =bus_to_hcd (udev->bus);
drivers/usb/core/quirks.c +6 -0
@@ -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 },
include/linux/usb/quirks.h +3 -0
@@ -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 */
Signature · 1 line
2.19.1