Received: by 2002:a6b:fb09:0:0:0:0:0 with SMTP id h9csp2927837iog; Mon, 27 Jun 2022 05:58:32 -0700 (PDT) X-Google-Smtp-Source: AGRyM1sd359NFGZfX7lIlX8ykAQ1KLflRZQIbyqt5TBUnwI2gx4M2zP1J/U3rqd4+fvPWT0RQaWZ X-Received: by 2002:a05:6a00:ad0:b0:4e1:2d96:2ab0 with SMTP id c16-20020a056a000ad000b004e12d962ab0mr14842981pfl.3.1656334712005; Mon, 27 Jun 2022 05:58:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1656334712; cv=none; d=google.com; s=arc-20160816; b=obnJgPP6RU+rI7NSAWJI5/Yl4Zdk+M2XZqzeYReIlm19QCPKmgjh8ELLwoR+eKWPVQ cvIz2a5viOXbgd0Smp67ib+i2fp3/Btp1ICNp8GMt8UTdRFazTvDZeeg2Z75z2u3AeTO V1vc66eyMw5j6QRoQ6cuqII5efHUj7Xvz24J2Yh83l1Ex0WgESDmC+FKmHeIzGrL4SmD hTpI88HB+MmYXujw3upbAJal0QDywYKvUErMAZEgnFg7PLk+pNwNvQ5m/b/tgGcI0e4x 4SONCzhEIxzfCEjioNgEhiiHj/K059HplAWKfM5c5RDnze7aiCTnGDvQHDbyUbGrmISO CPBg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=nAJP+Uy4N3Xqt5CZOrmUByHQBHqDAd22uRdB6bV2VCk=; b=KVWUT7p6WhgUBcDZWb6ifiGKZX+8gxLDzguPny2afD4s4aAnBl70qzOLyfo07+bYGY HbWrgcN1H/7wZRsd9e3NXsZOHMk1abX1geXpkBvFAo5dnX7n4B3tbRvs9FoLxG6Wz5DB VqrdYZkXnjQATgXmLqVj0JrY32mV1Gozt1N0PlrQJGQSSotRKLjksKGXZkfOHTzAXLXK mksmSMkiEFBN/uBFfhvH6JYULWTJ6SD+dToFmPspRhX1s+gbonmjxqMppJTWxSiWEJ8U Cx1E3rxws+wAW9IXJJhAPXUp6EokaYEfLnt9kO9amIjEsvTcy5FgbElaJQ+UUOqz5Ucl bwCw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=v49qUZ0S; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id qe15-20020a17090b4f8f00b001ece6b376absi15644372pjb.37.2022.06.27.05.58.20; Mon, 27 Jun 2022 05:58:31 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=v49qUZ0S; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235697AbiF0LeG (ORCPT + 99 others); Mon, 27 Jun 2022 07:34:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49932 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235730AbiF0Lch (ORCPT ); Mon, 27 Jun 2022 07:32:37 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7D276B85E; Mon, 27 Jun 2022 04:29:36 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id CD14BB81122; Mon, 27 Jun 2022 11:29:34 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3D4F2C3411D; Mon, 27 Jun 2022 11:29:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1656329373; bh=Oae29rXEpAbedTU0LwPxLpUcqf8CXhY8N15Xyi0ITX0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=v49qUZ0SeYdzD7aVn3igA8R04ANuJdYI7WQr9BatVcOs8vnE/hSHT2qEG1QEVXyH+ b2VWJoxh8ONBC39ujn8ittiBsr7N5wBLeq5HAqCJKUMMqnWpiZhWr27NKI7afLpD5a ayatkQ/8sdmpC+DmIHMWEpbVGytOmv49g9tKXjS8= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Mathias Nyman Subject: [PATCH 5.4 36/60] xhci: turn off port power in shutdown Date: Mon, 27 Jun 2022 13:21:47 +0200 Message-Id: <20220627111928.753066955@linuxfoundation.org> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220627111927.641837068@linuxfoundation.org> References: <20220627111927.641837068@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.5 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Mathias Nyman commit 83810f84ecf11dfc5a9414a8b762c3501b328185 upstream. If ports are not turned off in shutdown then runtime suspended self-powered USB devices may survive in U3 link state over S5. During subsequent boot, if firmware sends an IPC command to program the port in DISCONNECT state, it will time out, causing significant delay in the boot time. Turning off roothub port power is also recommended in xhci specification 4.19.4 "Port Power" in the additional note. Cc: stable@vger.kernel.org Signed-off-by: Mathias Nyman Link: https://lore.kernel.org/r/20220623111945.1557702-3-mathias.nyman@linux.intel.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/host/xhci-hub.c | 2 +- drivers/usb/host/xhci.c | 15 +++++++++++++-- drivers/usb/host/xhci.h | 2 ++ 3 files changed, 16 insertions(+), 3 deletions(-) --- a/drivers/usb/host/xhci-hub.c +++ b/drivers/usb/host/xhci-hub.c @@ -566,7 +566,7 @@ struct xhci_hub *xhci_get_rhub(struct us * It will release and re-aquire the lock while calling ACPI * method. */ -static void xhci_set_port_power(struct xhci_hcd *xhci, struct usb_hcd *hcd, +void xhci_set_port_power(struct xhci_hcd *xhci, struct usb_hcd *hcd, u16 index, bool on, unsigned long *flags) { struct xhci_hub *rhub; --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c @@ -775,6 +775,8 @@ static void xhci_stop(struct usb_hcd *hc void xhci_shutdown(struct usb_hcd *hcd) { struct xhci_hcd *xhci = hcd_to_xhci(hcd); + unsigned long flags; + int i; if (xhci->quirks & XHCI_SPURIOUS_REBOOT) usb_disable_xhci_ports(to_pci_dev(hcd->self.sysdev)); @@ -790,12 +792,21 @@ void xhci_shutdown(struct usb_hcd *hcd) del_timer_sync(&xhci->shared_hcd->rh_timer); } - spin_lock_irq(&xhci->lock); + spin_lock_irqsave(&xhci->lock, flags); xhci_halt(xhci); + + /* Power off USB2 ports*/ + for (i = 0; i < xhci->usb2_rhub.num_ports; i++) + xhci_set_port_power(xhci, xhci->main_hcd, i, false, &flags); + + /* Power off USB3 ports*/ + for (i = 0; i < xhci->usb3_rhub.num_ports; i++) + xhci_set_port_power(xhci, xhci->shared_hcd, i, false, &flags); + /* Workaround for spurious wakeups at shutdown with HSW */ if (xhci->quirks & XHCI_SPURIOUS_WAKEUP) xhci_reset(xhci, XHCI_RESET_SHORT_USEC); - spin_unlock_irq(&xhci->lock); + spin_unlock_irqrestore(&xhci->lock, flags); xhci_cleanup_msix(xhci); --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h @@ -2155,6 +2155,8 @@ int xhci_hub_control(struct usb_hcd *hcd int xhci_hub_status_data(struct usb_hcd *hcd, char *buf); int xhci_find_raw_port_number(struct usb_hcd *hcd, int port1); struct xhci_hub *xhci_get_rhub(struct usb_hcd *hcd); +void xhci_set_port_power(struct xhci_hcd *xhci, struct usb_hcd *hcd, u16 index, + bool on, unsigned long *flags); void xhci_hc_died(struct xhci_hcd *xhci);