Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp298471imm; Tue, 22 May 2018 19:17:51 -0700 (PDT) X-Google-Smtp-Source: AB8JxZqYF1GVLyJ+fJWrNXak4RBNDZK5+lbwocneL4gLcBcU82+fHsMdIiR9IQUGN4hUsQwQfbO8 X-Received: by 2002:a65:4c4f:: with SMTP id l15-v6mr760480pgr.61.1527041871836; Tue, 22 May 2018 19:17:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527041871; cv=none; d=google.com; s=arc-20160816; b=HxqOGCe7SThxlL2XebM1v5If7XARCiennEVgNS9rL553V0EaIskoBdyRAEkKGLcuiC nbB3yrDYeW+oiT7A4W6Mr5J8O+XvynsP8TqokTxT+tocZmFsQh/GOR2e5pV5h5vfxccN W+AKTIvePPFlgnEAaWV18JNpcCVv+UvRhr8fiX8t6ZUygvotqaQzqCZOfuqG979lg6R/ 2x142635nDEdaC0lQ8N+k7n3tNdA27QsGzjHHnM1S7Q2LHKhf7YQpB++hIBXyqEKJgK/ 5tt9M7B+ZJ5n1MkvUocHyHcNcqCpYcBAn/gbqsvfJbRKQLN0P0a3MsEEkR8H9+m+j3DO PbMw== 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 :dkim-signature:arc-authentication-results; bh=pJtRnaElwSNW1L/gpRGgdje1rQ6IQjHi6a6o2iFaQnY=; b=XqaGcpk3LeTMTIM6oXcXLku7v5ALVOlTHKmdtN7N6zCvoXBUvA1k2hCDLdMT4JLyZZ dt1X9rQjottRoWG948twFAEVyVY6xPPVQqcb5svTeJ/IVVjDQLo6qlV6o0fK4R9rmMR/ azwH+GsfDpM/x4R5PCTPoSWtnN6RcvIHqv40Gm1GmUpLt3J8a+mgdW4Gwfli/5I2rHLi Yxz1tatzm66YHbYO4flzOZxeM8J72RmqH65+CBqiPcxpt7+PrDl7iV6eYl6OFfgPjL7s 0J282etdybCo5yapCNSF2ayPnKDmSw6URMW3plpfJs4/Aqf7j5vwfthX9ST0i2nFyCVx 7oSQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=e09gF/tl; 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=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e63-v6si17610976pfd.261.2018.05.22.19.17.37; Tue, 22 May 2018 19:17:51 -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; dkim=pass header.i=@chromium.org header.s=google header.b=e09gF/tl; 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=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753745AbeEWCR1 (ORCPT + 99 others); Tue, 22 May 2018 22:17:27 -0400 Received: from mail-pf0-f196.google.com ([209.85.192.196]:43921 "EHLO mail-pf0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753147AbeEWCR0 (ORCPT ); Tue, 22 May 2018 22:17:26 -0400 Received: by mail-pf0-f196.google.com with SMTP id j20-v6so9678997pff.10 for ; Tue, 22 May 2018 19:17:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id; bh=pJtRnaElwSNW1L/gpRGgdje1rQ6IQjHi6a6o2iFaQnY=; b=e09gF/tlQ0tGZj0vEAtCDNqHo2eD8id5ZaqhFb0dJFi5QCpeetQiAfJaazN96tfw/9 mHhN6/3+Qurfv6hB69ZpRNxoMMBVVSZxPUR9hU1p4V+woVHuEm8YqUerrfwODe0o6/S1 wX8FoOnBm2mxlRmRv4/cLHI97b0rQ6Eqk/ixA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=pJtRnaElwSNW1L/gpRGgdje1rQ6IQjHi6a6o2iFaQnY=; b=KwPxckh1/IXvv5RWm9pDQrtQTzSkBzlDBIRrkSWvBkazir25jPdqbvN/IMM1mAdWHC YURi+tf9hXyqyFkSxPhVZH8srLTRO3If/dgmzDiasmlXRZr/m4QZD8Pnzn+JtjSFzH6h LLckAM5C9ICWULitFJkckTJVil0P6+RUkI0gbnd1gpJ5tk7uxGr06Qt6sdviAX3hz/AS gQE06zkR5cYpO03WoeRreMc4sSw/cR1xHkY/dcBC8hDLOIKlCtPAAk58ltza/Vy7QjFe JxTCvoG4R8edKdkAUfJHV+oeGtacEYxLp3vTi/plpy6Hv+5lG0r1D4oyHR5VAIqGvzo9 OVpg== X-Gm-Message-State: ALKqPwcqgDxgoS9pw8/n/H11xkKTYNHM6SrPBf0jOIDZU48QJLbsP8Ua nE+2lz8e3dQLMQJr0EuC1uXKrg== X-Received: by 2002:a65:5b4d:: with SMTP id y13-v6mr762721pgr.152.1527041845485; Tue, 22 May 2018 19:17:25 -0700 (PDT) Received: from drinkcat.tpe.corp.google.com ([2401:fa00:1:b:9ba:cd16:d555:bacf]) by smtp.gmail.com with ESMTPSA id r130-v6sm4648671pgr.87.2018.05.22.19.17.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 22 May 2018 19:17:24 -0700 (PDT) From: Nicolas Boichat To: linux-usb@vger.kernel.org Cc: Greg Kroah-Hartman , Alan Stern , Mathias Nyman , Felipe Balbi , Eugene Korenevsky , Peter Chen , Daniel Drake , Joe Perches , Nicolas Boichat , Johan Hovold , Richard Leitner , linux-kernel@vger.kernel.org, groeck@chromium.org Subject: [PATCH] usb: hub: Per-port setting to use old enumeration scheme Date: Wed, 23 May 2018 10:16:56 +0800 Message-Id: <20180523021656.122455-1-drinkcat@chromium.org> X-Mailer: git-send-email 2.17.0.441.gb46fe60e1d-goog Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The "old" enumeration scheme is considerably faster (it takes ~294ms instead of ~439ms to get the descriptor). It is currently only possible to use the old scheme globally (/sys/module/usbcore/parameters/old_scheme_first), which is not desirable as the new scheme was introduced to increase compatibility with more devices. However, in our case, we care about time-to-active for a specific USB device (which we make the firmware for), on a specific port (that is pogo-pin based: not a standard USB port). This new sysfs option makes it possible to use the old scheme on a single port only. Signed-off-by: Nicolas Boichat --- There are other "quirks" that we could add to reduce further enumeration time (e.g. reduce USB debounce time, reduce TRSTRCY to 10ms instead of 50ms as used currently), but the logic is quite similar, so it'd be good to have this reviewed first. drivers/usb/core/hub.c | 13 +++++++++---- drivers/usb/core/hub.h | 1 + drivers/usb/core/port.c | 23 +++++++++++++++++++++++ include/linux/usb.h | 7 +++++++ 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index c2d993d3816f0..f900f66a62856 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -2636,7 +2636,7 @@ static unsigned hub_is_wusb(struct usb_hub *hub) #define SET_ADDRESS_TRIES 2 #define GET_DESCRIPTOR_TRIES 2 #define SET_CONFIG_TRIES (2 * (use_both_schemes + 1)) -#define USE_NEW_SCHEME(i) ((i) / 2 == (int)old_scheme_first) +#define USE_NEW_SCHEME(i, scheme) ((i) / 2 == (int)scheme) #define HUB_ROOT_RESET_TIME 60 /* times are in msec */ #define HUB_SHORT_RESET_TIME 10 @@ -2651,12 +2651,16 @@ static unsigned hub_is_wusb(struct usb_hub *hub) * enumeration failures, so disable this enumeration scheme for USB3 * devices. */ -static bool use_new_scheme(struct usb_device *udev, int retry) +static bool use_new_scheme(struct usb_device *udev, int retry, + struct usb_port *port_dev) { + int old_scheme_first_port = + port_dev->quirks & USB_PORT_QUIRK_OLD_SCHEME; + if (udev->speed >= USB_SPEED_SUPER) return false; - return USE_NEW_SCHEME(retry); + return USE_NEW_SCHEME(retry, old_scheme_first_port || old_scheme_first); } /* Is a USB 3.0 port in the Inactive or Compliance Mode state? @@ -4392,6 +4396,7 @@ hub_port_init(struct usb_hub *hub, struct usb_device *udev, int port1, { struct usb_device *hdev = hub->hdev; struct usb_hcd *hcd = bus_to_hcd(hdev->bus); + struct usb_port *port_dev = hub->ports[port1 - 1]; int retries, operations, retval, i; unsigned delay = HUB_SHORT_RESET_TIME; enum usb_device_speed oldspeed = udev->speed; @@ -4513,7 +4518,7 @@ hub_port_init(struct usb_hub *hub, struct usb_device *udev, int port1, for (retries = 0; retries < GET_DESCRIPTOR_TRIES; (++retries, msleep(100))) { bool did_new_scheme = false; - if (use_new_scheme(udev, retry_counter)) { + if (use_new_scheme(udev, retry_counter, port_dev)) { struct usb_device_descriptor *buf; int r = 0; diff --git a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h index 4dc769ee9c740..4accfb63f7dcb 100644 --- a/drivers/usb/core/hub.h +++ b/drivers/usb/core/hub.h @@ -98,6 +98,7 @@ struct usb_port { struct mutex status_lock; u32 over_current_count; u8 portnum; + u32 quirks; unsigned int is_superspeed:1; unsigned int usb3_lpm_u1_permit:1; unsigned int usb3_lpm_u2_permit:1; diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c index 6979bde87d310..4a21431953953 100644 --- a/drivers/usb/core/port.c +++ b/drivers/usb/core/port.c @@ -50,6 +50,28 @@ static ssize_t over_current_count_show(struct device *dev, } static DEVICE_ATTR_RO(over_current_count); +static ssize_t quirks_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct usb_port *port_dev = to_usb_port(dev); + + return sprintf(buf, "%08x\n", port_dev->quirks); +} + +static ssize_t quirks_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + struct usb_port *port_dev = to_usb_port(dev); + u32 value; + + if (kstrtou32(buf, 16, &value)) + return -EINVAL; + + port_dev->quirks = value; + return count; +} +static DEVICE_ATTR_RW(quirks); + static ssize_t usb3_lpm_permit_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -118,6 +140,7 @@ static DEVICE_ATTR_RW(usb3_lpm_permit); static struct attribute *port_dev_attrs[] = { &dev_attr_connect_type.attr, + &dev_attr_quirks.attr, &dev_attr_over_current_count.attr, NULL, }; diff --git a/include/linux/usb.h b/include/linux/usb.h index beffceec49158..2ade17992ed66 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -489,6 +489,13 @@ enum usb_port_connect_type { USB_PORT_NOT_USED, }; +/* + * USB port quirks. + */ + +/* For the given port, prefer the old (faster) enumeration scheme. */ +#define USB_PORT_QUIRK_OLD_SCHEME BIT(0) + /* * USB 2.0 Link Power Management (LPM) parameters. */ -- 2.17.0.441.gb46fe60e1d-goog