Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp3817798ybi; Mon, 29 Jul 2019 13:12:50 -0700 (PDT) X-Google-Smtp-Source: APXvYqzXSSoskzGMM0KZBbBUxVZo02mfKfrMp4vthtGI9WdU4KkRtXEjlxjWsjS+rBYMIhkJSd4B X-Received: by 2002:a17:902:61:: with SMTP id 88mr106742886pla.50.1564431170787; Mon, 29 Jul 2019 13:12:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1564431170; cv=none; d=google.com; s=arc-20160816; b=fvL4mc++6BTCzm7sWl+kUBCtFDj47W2apKoVmYM43TQbkRohfj70q1hGd2qBdcfTK+ sdDEYxGclf/APmk4ZqbGyCIXUh0MhSjjaAQwlYrzfDHtGEhTW9aJbhzLc0h9YJEIShnC zp5/VNZtmuFighkukDRnvPVEcwCqaNkNxYsZUYlBVCuGzbjylEnTJB6X6ObEDCtKvjNZ fnRaxNcYeFYvPjSMdHSxP/O84jP2UY/od7WR5cdQzqPaJNq+1jzgctJ1xN7eYebVZf2C 3Cz/sEUJrfokEVUTSGliMNAUHjJZY+lxUFH5BWdOa46eN2G+eeZVWaYKvmUaB0uySOLB IQAw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=wtxd/FcPEYdk55wmMKgF722rd59se3/GrDSzw2gSekI=; b=xXzyjAITYPOjQZjmrvquybLBURZCjefJdltdu1p/65kMf3chHLJX14rCh0r1sK1YrM l8QVePkmnv+bSWhB2IpEJ6MTaxUOb1vVjrYuM8EzVcf6ZPKj3X6PY6eiEyqOoaxVnC4m FvCLe28iZelR6niojYM27wR5mANCqKiFZSVdnTCtg24mZhRxOXQkDEeLWRpnr7pUf7jJ CnmJ+fRfl2tBx1DCAph0Br5EAPSkQg5f8lmIRDvLzyz/3sxGjjR1q89UjQ8w2Sazpihd UzNO2SBJsB2PWA5l9W6CIV9qu4rBc+fu6VGl2iZq6I5ImJSh10/wdNLJ2wKcdFxgowJe g6Iw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=YAgthj80; 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 b20si27157548pgk.437.2019.07.29.13.12.35; Mon, 29 Jul 2019 13:12:50 -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=@kernel.org header.s=default header.b=YAgthj80; 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 S1730164AbfG2UKH (ORCPT + 99 others); Mon, 29 Jul 2019 16:10:07 -0400 Received: from mail.kernel.org ([198.145.29.99]:49540 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388127AbfG2TfJ (ORCPT ); Mon, 29 Jul 2019 15:35:09 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 7D04F2070B; Mon, 29 Jul 2019 19:35:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1564428908; bh=xApx2e9Rfs8hpC4tOmZeB08FEqONQj7OKuSUdgAIHwQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=YAgthj80U6IOYy3rmBceDyosTRFaAIzmgxSpbuTNhGHJO+262wdcut3kbBHIIyfKe Kd0qgTplHSWhevuRo9BDz3Uq4JKfH8Ll4UsG+FHVBlQZOEdgUcLDGxzXZBddqTI2wm I2m94BG3ivrXpXCCr8nNMr4zYAYKS5lh9NFfnE34= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Thinh Nguyen , Sasha Levin Subject: [PATCH 4.14 223/293] usb: core: hub: Disable hub-initiated U1/U2 Date: Mon, 29 Jul 2019 21:21:54 +0200 Message-Id: <20190729190841.581256187@linuxfoundation.org> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190729190820.321094988@linuxfoundation.org> References: <20190729190820.321094988@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org [ Upstream commit 561759292774707b71ee61aecc07724905bb7ef1 ] If the device rejects the control transfer to enable device-initiated U1/U2 entry, then the device will not initiate U1/U2 transition. To improve the performance, the downstream port should not initate transition to U1/U2 to avoid the delay from the device link command response (no packet can be transmitted while waiting for a response from the device). If the device has some quirks and does not implement U1/U2, it may reject all the link state change requests, and the downstream port may resend and flood the bus with more requests. This will affect the device performance even further. This patch disables the hub-initated U1/U2 if the device-initiated U1/U2 entry fails. Reference: USB 3.2 spec 7.2.4.2.3 Signed-off-by: Thinh Nguyen Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/usb/core/hub.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 2e1e7399596e..b543a4730ef2 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -3876,6 +3876,9 @@ static int usb_set_lpm_timeout(struct usb_device *udev, * control transfers to set the hub timeout or enable device-initiated U1/U2 * will be successful. * + * If the control transfer to enable device-initiated U1/U2 entry fails, then + * hub-initiated U1/U2 will be disabled. + * * If we cannot set the parent hub U1/U2 timeout, we attempt to let the xHCI * driver know about it. If that call fails, it should be harmless, and just * take up more slightly more bus bandwidth for unnecessary U1/U2 exit latency. @@ -3930,23 +3933,24 @@ static void usb_enable_link_state(struct usb_hcd *hcd, struct usb_device *udev, * host know that this link state won't be enabled. */ hcd->driver->disable_usb3_lpm_timeout(hcd, udev, state); - } else { - /* Only a configured device will accept the Set Feature - * U1/U2_ENABLE - */ - if (udev->actconfig) - usb_set_device_initiated_lpm(udev, state, true); + return; + } - /* As soon as usb_set_lpm_timeout(timeout) returns 0, the - * hub-initiated LPM is enabled. Thus, LPM is enabled no - * matter the result of usb_set_device_initiated_lpm(). - * The only difference is whether device is able to initiate - * LPM. - */ + /* Only a configured device will accept the Set Feature + * U1/U2_ENABLE + */ + if (udev->actconfig && + usb_set_device_initiated_lpm(udev, state, true) == 0) { if (state == USB3_LPM_U1) udev->usb3_lpm_u1_enabled = 1; else if (state == USB3_LPM_U2) udev->usb3_lpm_u2_enabled = 1; + } else { + /* Don't request U1/U2 entry if the device + * cannot transition to U1/U2. + */ + usb_set_lpm_timeout(udev, state, 0); + hcd->driver->disable_usb3_lpm_timeout(hcd, udev, state); } } -- 2.20.1