Received: by 2002:ac0:a582:0:0:0:0:0 with SMTP id m2-v6csp2893752imm; Fri, 19 Oct 2018 01:17:00 -0700 (PDT) X-Google-Smtp-Source: ACcGV62fJj0DD21ub0FbfDikNj68bG7tTUf4rpMK7ccncyEa2lHeex4bJeBu4KIhUyPLjduQIZ/I X-Received: by 2002:a63:da57:: with SMTP id l23-v6mr32094085pgj.179.1539937020212; Fri, 19 Oct 2018 01:17:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1539937020; cv=none; d=google.com; s=arc-20160816; b=H/+Ocp6K4JDYrzc5J7Bcb07tVn3YWBEXsMHdZ3idFk4nzRTkQsUdD7XqfIcHs56/Ur eRuHwecaj41rTTzzqlEOMXb3TcMXrfe9jdtLaqwhQhYxRuBZJdYKOg99ExFTWKtm7QaX BTTk+SpQBZuOCFEaPHbr+wwMwGdHQpNbvOoHHyiIvUJ+cOW0N3zwDNPiOuNOFpmfsWQK ZX3sk11LXH1w9xUs2tjrkyR/9pac/p7+F/DaAL0fiWoErLrYkqhWPZtjxjDLMrPMP45F W+Bnicy/HPbZf8YvikOIkH0ePn1Lw47wZfLu2kAA7+OS+OmdAWFXsmslw6J579R1zEoJ Aheg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from; bh=h4x7oFGcA3P9p5FAwSnmktm9ymt04blpOKrFmCy/v18=; b=ODjkTOUhaTT8IZC6dgP+hADS3w8Q2xX4J7Y93ObFoFzWEXgrSyMtwkISd+VNc4vCUN u9CWQWZ9KCrpZwj54Dv0pD3WtyKakXtCg20YzqGEdzUsDOIPKDUW01yvuRWVJ76geKCi jT8VyAb2fYZGJ7vQWHauKGh+QLc7XsSd05fvscg/0hqGIeJGLGILjREpNCvYZXcw9ctQ Yc1YweHZYYs4X/2geiwN0CRTbcTABhSJu07tflBDNwxLnmJeTLVD18JpzW9/MbJkz5oB +h+J4cuKriTHoPSX17Itav/YFvihmmOdDRp0x7cjM9nX1rPZrDxdW3A5xITd3ClewLds L0tg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=canonical.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a16-v6si22057107pgw.187.2018.10.19.01.16.45; Fri, 19 Oct 2018 01:17:00 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=canonical.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727178AbeJSQUJ (ORCPT + 99 others); Fri, 19 Oct 2018 12:20:09 -0400 Received: from youngberry.canonical.com ([91.189.89.112]:47290 "EHLO youngberry.canonical.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726584AbeJSQUJ (ORCPT ); Fri, 19 Oct 2018 12:20:09 -0400 Received: from 220-133-187-190.hinet-ip.hinet.net ([220.133.187.190] helo=localhost) by youngberry.canonical.com with esmtpsa (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.76) (envelope-from ) id 1gDPw1-0003st-AT; Fri, 19 Oct 2018 08:15:06 +0000 From: Kai-Heng Feng To: gregkh@linuxfoundation.org Cc: stern@rowland.harvard.edu, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Kai-Heng Feng Subject: [PATCH v2] USB: Wait for extra delay time after USB_PORT_FEAT_RESET for quirky hub Date: Fri, 19 Oct 2018 16:14:50 +0800 Message-Id: <20181019081450.21230-1-kai.heng.feng@canonical.com> X-Mailer: git-send-email 2.17.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- v2: - Use hub->hdev to check quirk. - Merge the delay with TRSTRCY. 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(-) 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..6e0823790bee 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -2791,6 +2791,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) { @@ -2882,11 +2883,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); 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.17.1