| From 6bd42950e1d7a5301b0cca295a919b8b07d2c4d8 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 4 Mar 2025 10:53:21 +0200 |
| Subject: thunderbolt: Scan retimers after device router has been enumerated |
| |
| From: Mika Westerberg <mika.westerberg@linux.intel.com> |
| |
| [ Upstream commit 75749d2c1d8cef439f8b69fa1f4f36d0fc3193e6 ] |
| |
| Thomas reported connection issues on AMD system with Pluggable UD-4VPD |
| dock. After some experiments it looks like the device has some sort of |
| internal timeout that triggers reconnect. This is completely against the |
| USB4 spec, as there is no requirement for the host to enumerate the |
| device right away or even at all. |
| |
| In Linux case the delay is caused by scanning of retimers on the link so |
| we can work this around by doing the scanning after the device router |
| has been enumerated. |
| |
| Reported-by: Thomas Lynema <lyz27@yahoo.com> |
| Closes: https://bugzilla.kernel.org/show_bug.cgi?id=219748 |
| Reviewed-by: Mario Limonciello <mario.limonciello@amd.com> |
| Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/thunderbolt/tb.c | 16 ++++++++++++++-- |
| 1 file changed, 14 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/thunderbolt/tb.c b/drivers/thunderbolt/tb.c |
| index a7c6919fbf978..e1da433a9e7fb 100644 |
| --- a/drivers/thunderbolt/tb.c |
| +++ b/drivers/thunderbolt/tb.c |
| @@ -1295,11 +1295,15 @@ static void tb_scan_port(struct tb_port *port) |
| goto out_rpm_put; |
| } |
| |
| - tb_retimer_scan(port, true); |
| - |
| sw = tb_switch_alloc(port->sw->tb, &port->sw->dev, |
| tb_downstream_route(port)); |
| if (IS_ERR(sw)) { |
| + /* |
| + * Make the downstream retimers available even if there |
| + * is no router connected. |
| + */ |
| + tb_retimer_scan(port, true); |
| + |
| /* |
| * If there is an error accessing the connected switch |
| * it may be connected to another domain. Also we allow |
| @@ -1349,6 +1353,14 @@ static void tb_scan_port(struct tb_port *port) |
| upstream_port = tb_upstream_port(sw); |
| tb_configure_link(port, upstream_port, sw); |
| |
| + /* |
| + * Scan for downstream retimers. We only scan them after the |
| + * router has been enumerated to avoid issues with certain |
| + * Pluggable devices that expect the host to enumerate them |
| + * within certain timeout. |
| + */ |
| + tb_retimer_scan(port, true); |
| + |
| /* |
| * CL0s and CL1 are enabled and supported together. |
| * Silently ignore CLx enabling in case CLx is not supported. |
| -- |
| 2.39.5 |
| |