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 <chris.chiu@canonical.com>
Subject: [PATCH v4 1/2] USB: Verify the port status when timeout happens during port suspend
Date: Fri, 14 May 2021 12:54:04 +0800 [thread overview]
Message-ID: <20210514045405.5261-2-chris.chiu@canonical.com> (raw)
In-Reply-To: <20210514045405.5261-1-chris.chiu@canonical.com>
From: Chris Chiu <chris.chiu@canonical.com>
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 which means the port has been suspended. We should treat
it suspended to make sure it will be resumed correctly.
Signed-off-by: Chris Chiu <chris.chiu@canonical.com>
---
Changelog:
v4:
- add comment for the timeout handling
- intialize the portstatus and portchange
- revise the commit message to reflect the change
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 | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index b2bc4b7c4289..e739f7b5991a 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -3385,6 +3385,26 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg)
status = 0;
}
if (status) {
+ /* Check if the port has been suspended for the timeout case
+ * to prevent the suspended port from incorrect handling.
+ */
+ if (status == -ETIMEDOUT) {
+ int ret;
+ u16 portstatus, portchange;
+
+ portstatus = portchange = 0;
+ 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 +3421,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
next prev parent reply other threads:[~2021-05-14 4:54 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-14 4:54 [PATCH v4 0/2] USB: propose a generic fix for PORT_SUSPEND set feature timeout chris.chiu
2021-05-14 4:54 ` chris.chiu [this message]
2021-05-14 4:54 ` [PATCH v4 2/2] Revert "USB: Add reset-resume quirk for WD19's Realtek Hub" chris.chiu
2021-05-14 15:33 ` [PATCH v4 0/2] USB: propose a generic fix for PORT_SUSPEND set feature timeout Alan Stern
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210514045405.5261-2-chris.chiu@canonical.com \
--to=chris.chiu@canonical.com \
--cc=gregkh@linuxfoundation.org \
--cc=hadess@hadess.net \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=m.v.b@runbox.com \
--cc=stern@rowland.harvard.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.