Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp18701226ybl; Fri, 3 Jan 2020 07:25:42 -0800 (PST) X-Google-Smtp-Source: APXvYqx7lmYmHLTOBevvegcMriSJRD32yDsPQlIFZ8lhL0HPORkJtFZSUMmHqAqHrm46af6OvJg4 X-Received: by 2002:aca:d15:: with SMTP id 21mr4271431oin.127.1578065142035; Fri, 03 Jan 2020 07:25:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1578065142; cv=none; d=google.com; s=arc-20160816; b=wzIg3P5M474D82IxKU3+HH5qVNOG4sSJDgYeqCQ4vRNx4yj2tKObRG489liNJONTP1 EBJxfaxSGumudMOWJRDCEnLwmIVNE5fL5O/yTrXaCWVGolPPHEOiAfjvD1XlIVOpK9B5 nuJfLnUDuucrRII+xUDkqJneXMYuzvzono3rDAHbUR6DihpFCfBh3iYCCKmbQKg1Wnd0 SAHWfni0KQ8IFmDySW55WjxyNEsUOdkpo0yjt5x5jswHcLjq1iuGMhC32ZvVJqQjXd2z bLO93RjcLUcVFgzpgU0HTVZP86f49+9EfhAa21a8ZXho4x1Q8R1Wohlup/qgJo/858n9 9bbA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:in-reply-to :subject:cc:to:from:date; bh=KB6xBo5ME9UA2QmezODHDj1jvezDfgg1cG0KEB9pez8=; b=VJtHgxjdzM9uIi6LCXAqSe/s3Mp/TKtOjfXPkuUrg3mEYdE+YkJwtQyjG5hefazN5y m5Tb/Je3dZZXa0wv9+U2bhh4m4CmrFdkKcdJMzA5XEMKpqXGFXYP6iRtBI9BpI++dReV ZOPWUtWDPaR6G+FFKU9IziNgCNUugeH/DuzvI61Vy/KzvUAfqn5FuHkNnWz3amn92BEA MI95oM3I9kBGvrK6suM6z2sDR5wJeIftZV7aVzpWzIAtRGHujAkWh5ByOTWeiH4ifbeV p7NQmwRwMjqmAbGwqNk2Ws7WxE+aMdbxLMWZEBoihJA5QYWgbIQRvScY0ywYMX/U50ne UF5g== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q9si27882746oif.92.2020.01.03.07.25.29; Fri, 03 Jan 2020 07:25:41 -0800 (PST) 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727731AbgACPVv (ORCPT + 99 others); Fri, 3 Jan 2020 10:21:51 -0500 Received: from iolanthe.rowland.org ([192.131.102.54]:34584 "HELO iolanthe.rowland.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1727621AbgACPVu (ORCPT ); Fri, 3 Jan 2020 10:21:50 -0500 Received: (qmail 1657 invoked by uid 2102); 3 Jan 2020 10:21:49 -0500 Received: from localhost (sendmail-bs@127.0.0.1) by localhost with SMTP; 3 Jan 2020 10:21:49 -0500 Date: Fri, 3 Jan 2020 10:21:49 -0500 (EST) From: Alan Stern X-X-Sender: stern@iolanthe.rowland.org To: Kai-Heng Feng cc: mathias.nyman@intel.com, , , , Subject: Re: [PATCH 3/3] USB: Disable LPM on WD19's Realtek Hub during setting its ports to U0 In-Reply-To: <20200103084008.3579-3-kai.heng.feng@canonical.com> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 3 Jan 2020, Kai-Heng Feng wrote: > Realtek Hub (0bda:0x0487) used in Dell Dock WD19 sometimes drops off the > bus when bringing underlying ports from U3 to U0. > > After some expirements and guessworks, the hub itself needs to be U0 > during setting its port's link state back to U0. > > So add a new quirk to let the hub disables LPM on setting U0 for its > downstream facing ports. > > Signed-off-by: Kai-Heng Feng > --- > drivers/usb/core/hub.c | 12 ++++++++++-- > drivers/usb/core/quirks.c | 7 +++++++ > include/linux/usb/quirks.h | 3 +++ > 3 files changed, 20 insertions(+), 2 deletions(-) > > diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c > index f229ad6952c0..35a035781c5a 100644 > --- a/drivers/usb/core/hub.c > +++ b/drivers/usb/core/hub.c > @@ -3533,9 +3533,17 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg) > } > > /* see 7.1.7.7; affects power usage, but not budgeting */ > - if (hub_is_superspeed(hub->hdev)) > + if (hub_is_superspeed(hub->hdev)) { > + if (hub->hdev->quirks & USB_QUIRK_DISABLE_LPM_ON_U0) { > + usb_lock_device(hub->hdev); > + usb_unlocked_disable_lpm(hub->hdev); > + } > status = hub_set_port_link_state(hub, port1, USB_SS_PORT_LS_U0); > - else > + if (hub->hdev->quirks & USB_QUIRK_DISABLE_LPM_ON_U0) { > + usb_unlocked_enable_lpm(hub->hdev); > + usb_unlock_device(hub->hdev); The locking here seems questionable. Doesn't this code sometimes get called with the hub already locked? Or with the child device locked (in which case locking the hub would violate the normal locking order: parent first, child second)? > + } > + } else > status = usb_clear_port_feature(hub->hdev, > port1, USB_PORT_FEAT_SUSPEND); > if (status) { > diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c > index 6b6413073584..69474d0d2b38 100644 > --- a/drivers/usb/core/quirks.c > +++ b/drivers/usb/core/quirks.c > @@ -131,6 +131,9 @@ static int quirks_param_set(const char *val, const struct kernel_param *kp) > case 'o': > flags |= USB_QUIRK_HUB_SLOW_RESET; > break; > + case 'p': > + flags |= USB_QUIRK_DISABLE_LPM_ON_U0; > + break; The new 'p' flag needs to be documented. Alan Stern