Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp21433pxj; Wed, 12 May 2021 21:17:07 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwj5hP7Avp6H/WNw0WqvA6+woCIxTqN0INTLKoqrctWyDSlFUpJSDbjKcDOa94ti5Zc0nxo X-Received: by 2002:aa7:c6ca:: with SMTP id b10mr32545532eds.221.1620879426853; Wed, 12 May 2021 21:17:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620879426; cv=none; d=google.com; s=arc-20160816; b=qMRzJHliALJA8EGizre10lnFualYPm+Hky2Igr/PiFO0hMko1qeKd1FmoZO/8df3x2 2Yyu3tHiemxHYvHFRrGbA0u+kXihvy6gA+pU5TUju/52+SXUaG/chPrttDij3y2bTybe GyH1MD+2WFT1SdbrLjJBs2OMEDMHjk2OTi7NudJNnoqS574Uay1P02yK8NNFLB3w1bjy YSW183rlqJ07RzCthnmDCzMwuh/5nv8Cfq0y6RthnTQevMp/wtiWGPoJDjO/xEvAo1q6 0UUkLyXBwv/BB0azX+Vnqy99XnGCH/eBirdE5y4CXi1WyPLLhAsXbo10uQmwtEPxrt5N B0YQ== 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 :references:in-reply-to:message-id:date:subject:cc:to:from; bh=x8AIPF+RZ46jYP6kcUp2z4L38qwUlbTt+Tvj8k+h0WA=; b=njRAhtBvcR7FPw935YbpDFJfnIWjUwQQ72iconZDsmHp3otEhJgOcFn/ldQV6kajz7 +7CH40UFDPvA0M3e1mLh5sNUS4m/6LjGaIokjuZiw3m8jpz7AW1D18xYJR8P9KOh95LT IT4v12pCUSEwPjV5cLLTd5cJrhSQeGiJ0UZnR9GpJ8+3GV69CXVkSJfw50WPk931YsTN GnwA6LK57xC+2fo2ejvRF36VwXHAKljWKz0k2B7fjJjMiObMwl23T4eduxCFlDYFg8b+ bDMkL0V5hkm7LlzdGE/jZh9gzmBUZTDrUwDlGqvcVolf358Qs1Dl7VskLnlAkXGP4Ry+ i8bw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=canonical.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id m1si1998040edb.244.2021.05.12.21.16.40; Wed, 12 May 2021 21:17:06 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=canonical.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230327AbhEMEQa (ORCPT + 99 others); Thu, 13 May 2021 00:16:30 -0400 Received: from youngberry.canonical.com ([91.189.89.112]:49191 "EHLO youngberry.canonical.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229837AbhEMEQK (ORCPT ); Thu, 13 May 2021 00:16:10 -0400 Received: from 111-240-128-202.dynamic-ip.hinet.net ([111.240.128.202] helo=localhost.localdomain) by youngberry.canonical.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.93) (envelope-from ) id 1lh2kV-000084-FM; Thu, 13 May 2021 04:14:59 +0000 From: chris.chiu@canonical.com To: stern@rowland.harvard.edu, gregkh@linuxfoundation.org, m.v.b@runbox.com, hadess@hadess.net Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Chris Chiu Subject: [PATCH v3 1/2] USB: Verify the port status when timeout happens during port suspend Date: Thu, 13 May 2021 12:14:45 +0800 Message-Id: <20210513041446.3082-2-chris.chiu@canonical.com> X-Mailer: git-send-email 2.21.1 (Apple Git-122.3) In-Reply-To: <20210513041446.3082-1-chris.chiu@canonical.com> References: <20210513041446.3082-1-chris.chiu@canonical.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Chris Chiu On the Realtek high-speed Hub(0bda:5487), the port which has wakeup enabled_descendants will sometimes timeout when setting PORT_SUSPEND feature. After checking the PORT_SUSPEND bit in wPortStatus, it is already set. However, the hub will fail to activate because the PORT_SUSPEND feature of that port is not cleared during resume. All connected devices are lost after resume. Check the port status to verify whether it's really suspended when timeout happpens. If yes, mark it as suspended so the device can be resumed correctly. Signed-off-by: Chris Chiu --- Changelog: v3: - create a new goto target for the timeout case instead of reset_resume - Revise the commit title/message because reset_resume is not required. v2: - create a new variable to keep the result of hub_port_status when suspend timeout. drivers/usb/core/hub.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index b2bc4b7c4289..c5d64175eaa9 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -3385,6 +3385,21 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) status = 0; } if (status) { + if (status == -ETIMEDOUT) { + u16 portstatus, portchange; + + int ret = hub_port_status(hub, port1, &portstatus, + &portchange); + + dev_dbg(&port_dev->dev, + "suspend timeout, status %04x\n", portstatus); + + if (ret == 0 && port_is_suspended(hub, portstatus)) { + status = 0; + goto suspend_done; + } + } + dev_dbg(&port_dev->dev, "can't suspend, status %d\n", status); /* Try to enable USB3 LTM again */ @@ -3401,6 +3416,7 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) if (!PMSG_IS_AUTO(msg)) status = 0; } else { + suspend_done: dev_dbg(&udev->dev, "usb %ssuspend, wakeup %d\n", (PMSG_IS_AUTO(msg) ? "auto-" : ""), udev->do_remote_wakeup); -- 2.20.1