On Wed, Dec 13, 2023 at 12:46:35AM +0530, Sanath S wrote: > Boot firmware might have created tunnels of its own. Since we cannot > be sure they are usable for us. Tear them down and reset the ports > to handle it as a new hotplug for USB3 routers. > > Suggested-by: Mario Limonciello <mario.limonciello@xxxxxxx> > Signed-off-by: Sanath S <Sanath.S@xxxxxxx> > --- > drivers/thunderbolt/tb.c | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/drivers/thunderbolt/tb.c b/drivers/thunderbolt/tb.c > index fd49f86e0353..febd0b6972e3 100644 > --- a/drivers/thunderbolt/tb.c > +++ b/drivers/thunderbolt/tb.c > @@ -2598,6 +2598,17 @@ static int tb_start(struct tb *tb) > tb_switch_tmu_enable(tb->root_switch); > /* Full scan to discover devices added before the driver was loaded. */ > tb_scan_switch(tb->root_switch); > + /* > + * Boot firmware might have created tunnels of its own. Since we cannot > + * be sure they are usable for us, Tear them down and reset the ports > + * to handle it as new hotplug for USB4 routers. > + */ > + if (tb_switch_is_usb4(tb->root_switch)) { > + tb_switch_discover_tunnels(tb->root_switch, > + &tcm->tunnel_list, false); Why this is needed? It should be enough, to do simply something like this: if (tb_switch_is_usb4(tb->root_switch)) tb_switch_reset(tb->root_switch); and continue with the rest of the function. The tb_switch_reset() then resets the downstream ports synchronously so when it returns there is nothing to be discover. (We can use the tb_switch_reset() here, it already exists and is performing TBT 1 specific things but you can make it handle downstream port reset in case of USB4). You don't need to touch the ->hotplug_active or anything else here. > + tcm->hotplug_active = true; > + return tb_switch_reset_ports(tb->root_switch); > + } > /* Find out tunnels created by the boot firmware */ > tb_discover_tunnels(tb); > /* Add DP resources from the DP tunnels created by the boot firmware */ > -- > 2.34.1