Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp483483yba; Mon, 1 Apr 2019 10:12:08 -0700 (PDT) X-Google-Smtp-Source: APXvYqx4I870LynzVt5WkUQw8R3bjwISt8GzmQZlUMuQySOaQhEwznaxcpOIEa1PR3CTSlYbIQ2Y X-Received: by 2002:a62:6402:: with SMTP id y2mr35697696pfb.194.1554138728435; Mon, 01 Apr 2019 10:12:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554138728; cv=none; d=google.com; s=arc-20160816; b=Smgc/qbyOHGAMe0alwhRtOIplJ7nXePtpKdFASmGFZ+bY/ltidX/xAEQ1HNsA+E6gF hP3IwwiKesOadNbQvwfJuUk06CITYgW0G7kvIOTFDAlNKPi+3R5tsfygNCJrlCp1NwrU MbZioMp5U/9EFZKnhe6jKL5QCzv9aKIFexb3B8CIEFhyX41E/q+3gOXkAL+GT9NtrRa6 WuNqmCKydhglo1qrYZkdY0/OMyltAxMZgKtCeWVq3zFF4zde2qqr3qTNgWoTJ0345VO6 i8WjRW+QoMC2jfMNsNjO0cIJk3Q9HC6eD0z5Nna8+K045dH4/eP2SpAjyck/jVtgGWCC S4hQ== 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=w5+J/YUnSfonL2goCrIwI2e/4ZZoNb9F5Q3HxaW4gX0=; b=zLknJOiskWlml0z1pV8had6KXPhtllyqx73IRu07r6i/9qAqjfSiRFQlsAZurDu+FK Y8z7od4U+EgTMyMerCGjV5XVcg5Qm/6tNRQD9HKFkisbVsSSbJSfOMReHkX6WRGVx+O2 EVvb08Oq/l4mfYfL//A5LsdpNc6s2dw477LFQt/qCgFh4RVA4Mx7B5wMOXi+bgIOWwmp kS/vSbEgBlAYUQFZ7agzLwPLvFVATxlwR8Ipa0WjLjYSKyUCSPXW0npcrwJVXdwiSJzb zW8yOHE5LZL/PUxzm3G7QOQM6JLSqt6abcCXHPR5+OXyP5JcwE2t7E4FoNS0n6lgsf3e YuiQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=eyTpMMkd; 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 a63si9631880pfb.267.2019.04.01.10.11.52; Mon, 01 Apr 2019 10:12:08 -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=eyTpMMkd; 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 S1729978AbfDARKc (ORCPT + 99 others); Mon, 1 Apr 2019 13:10:32 -0400 Received: from mail.kernel.org ([198.145.29.99]:58210 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729424AbfDARKa (ORCPT ); Mon, 1 Apr 2019 13:10:30 -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 5EC43206B8; Mon, 1 Apr 2019 17:10:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1554138629; bh=ifDhmr4F2QpI8jNQ5Ec5asi3sryv9vlE3qrPevfjtBc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eyTpMMkdv/V/cNB0ok9KN86zUvGa/Z12DI5f+aYEB6ITVZuPuGXsnZ3pPwJFGWXcV LS8JeDRWFfdroG5up+Epa1wjAENtMo4H+XMU1UG07kpPhyAwaDvllb2cZkdYd4oWn8 kU2KUmk24IrCAAYbTiJTXLsQXMOVw8LEdAf9Ru7A= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Mathias Nyman Subject: [PATCH 5.0 121/146] xhci: Dont let USB3 ports stuck in polling state prevent suspend Date: Mon, 1 Apr 2019 19:02:13 +0200 Message-Id: <20190401170058.586845083@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190401170048.449559024@linuxfoundation.org> References: <20190401170048.449559024@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore 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 5.0-stable review patch. If anyone has any objections, please let me know. ------------------ From: Mathias Nyman commit d92f2c59cc2cbca6bfb2cc54882b58ba76b15fd4 upstream. Commit 2f31a67f01a8 ("usb: xhci: Prevent bus suspend if a port connect change or polling state is detected") was intended to prevent ports that were still link training from being forced to U3 suspend state mid enumeration. This solved enumeration issues for devices with slow link training. Turns out some devices are stuck in the link training/polling state, and thus that patch will prevent suspend completely for these devices. This is seen with USB3 card readers in some MacBooks. Instead of preventing suspend, give some time to complete the link training. On successful training the port will end up as connected and enabled. If port instead is stuck in link training the bus suspend will continue suspending after 360ms (10 * 36ms) timeout (tPollingLFPSTimeout). Original patch was sent to stable, this one should go there as well Fixes: 2f31a67f01a8 ("usb: xhci: Prevent bus suspend if a port connect change or polling state is detected") Cc: stable@vger.kernel.org Signed-off-by: Mathias Nyman Signed-off-by: Greg Kroah-Hartman --- drivers/usb/host/xhci-hub.c | 19 ++++++++++++------- drivers/usb/host/xhci.h | 8 ++++++++ 2 files changed, 20 insertions(+), 7 deletions(-) --- a/drivers/usb/host/xhci-hub.c +++ b/drivers/usb/host/xhci-hub.c @@ -1545,20 +1545,25 @@ int xhci_bus_suspend(struct usb_hcd *hcd port_index = max_ports; while (port_index--) { u32 t1, t2; - + int retries = 10; +retry: t1 = readl(ports[port_index]->addr); t2 = xhci_port_state_to_neutral(t1); portsc_buf[port_index] = 0; - /* Bail out if a USB3 port has a new device in link training */ - if ((hcd->speed >= HCD_USB3) && + /* + * Give a USB3 port in link training time to finish, but don't + * prevent suspend as port might be stuck + */ + if ((hcd->speed >= HCD_USB3) && retries-- && (t1 & PORT_PLS_MASK) == XDEV_POLLING) { - bus_state->bus_suspended = 0; spin_unlock_irqrestore(&xhci->lock, flags); - xhci_dbg(xhci, "Bus suspend bailout, port in polling\n"); - return -EBUSY; + msleep(XHCI_PORT_POLLING_LFPS_TIME); + spin_lock_irqsave(&xhci->lock, flags); + xhci_dbg(xhci, "port %d polling in bus suspend, waiting\n", + port_index); + goto retry; } - /* suspend ports in U0, or bail out for new connect changes */ if ((t1 & PORT_PE) && (t1 & PORT_PLS_MASK) == XDEV_U0) { if ((t1 & PORT_CSC) && wake_enabled) { --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h @@ -452,6 +452,14 @@ struct xhci_op_regs { */ #define XHCI_DEFAULT_BESL 4 +/* + * USB3 specification define a 360ms tPollingLFPSTiemout for USB3 ports + * to complete link training. usually link trainig completes much faster + * so check status 10 times with 36ms sleep in places we need to wait for + * polling to complete. + */ +#define XHCI_PORT_POLLING_LFPS_TIME 36 + /** * struct xhci_intr_reg - Interrupt Register Set * @irq_pending: IMAN - Interrupt Management Register. Used to enable