Message ID | 20240408124803.12329-1-mika.westerberg@linux.intel.com (mailing list archive) |
---|---|
State | Accepted |
Commit | c38fa07dc69f0b9e6f43ecab96dc7861a70c827c |
Headers | show |
Series | [1/2] thunderbolt: Fix wake configurations after device unplug | expand |
On Mon, Apr 08, 2024 at 03:48:02PM +0300, Mika Westerberg wrote: > From: Gil Fine <gil.fine@linux.intel.com> > > Currently we don't configure correctly the wake events after unplug of device > router. What can happen is that the downstream ports of host router will be > configured to wake on: USB4-wake and wake-on-disconnect, but not on > wake-on-connect. This may cause the later plugged device not to wake the > domain and fail in enumeration. Fix this by clearing downstream port's "USB4 > Port is Configured" bit, after unplug of a device router. > > Signed-off-by: Gil Fine <gil.fine@linux.intel.com> > Cc: stable@vger.kernel.org > Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Both applied to thunderbolt.git/fixes.
diff --git a/drivers/thunderbolt/switch.c b/drivers/thunderbolt/switch.c index 6ffc4e81ffed..4edfd6e34e31 100644 --- a/drivers/thunderbolt/switch.c +++ b/drivers/thunderbolt/switch.c @@ -3180,22 +3180,29 @@ void tb_switch_unconfigure_link(struct tb_switch *sw) { struct tb_port *up, *down; - if (sw->is_unplugged) - return; if (!tb_route(sw) || tb_switch_is_icm(sw)) return; + /* + * Unconfigure downstream port so that wake-on-connect can be + * configured after router unplug. No need to unconfigure upstream port + * since its router is unplugged. + */ up = tb_upstream_port(sw); - if (tb_switch_is_usb4(up->sw)) - usb4_port_unconfigure(up); - else - tb_lc_unconfigure_port(up); - down = up->remote; if (tb_switch_is_usb4(down->sw)) usb4_port_unconfigure(down); else tb_lc_unconfigure_port(down); + + if (sw->is_unplugged) + return; + + up = tb_upstream_port(sw); + if (tb_switch_is_usb4(up->sw)) + usb4_port_unconfigure(up); + else + tb_lc_unconfigure_port(up); } static void tb_switch_credits_init(struct tb_switch *sw)