* @device_name: Name of the device (or %NULL if not known)
  * @link_speed: Speed of the link in Gb/s
  * @link_width: Width of the link (1 or 2)
+ * @link_usb4: Upstream link is USB4
  * @generation: Switch Thunderbolt generation
  * @cap_plug_events: Offset to the plug events capability (%0 if not found)
  * @cap_lc: Offset to the link controller capability (%0 if not found)
        const char *device_name;
        unsigned int link_speed;
        unsigned int link_width;
+       bool link_usb4;
        unsigned int generation;
        int cap_plug_events;
        int cap_lc;
 
        return 0;
 }
 
+static bool link_is_usb4(struct tb_port *port)
+{
+       u32 val;
+
+       if (!port->cap_usb4)
+               return false;
+
+       if (tb_port_read(port, &val, TB_CFG_PORT,
+                        port->cap_usb4 + PORT_CS_18, 1))
+               return false;
+
+       return !(val & PORT_CS_18_TCM);
+}
+
 /**
  * usb4_switch_setup() - Additional setup for USB4 device
  * @sw: USB4 router to setup
  */
 int usb4_switch_setup(struct tb_switch *sw)
 {
+       struct tb_port *downstream_port;
        struct tb_switch *parent;
        bool tbt3, xhci;
        u32 val = 0;
        if (ret)
                return ret;
 
+       parent = tb_switch_parent(sw);
+       downstream_port = tb_port_at(tb_route(sw), parent);
+       sw->link_usb4 = link_is_usb4(downstream_port);
+       tb_sw_dbg(sw, "link: %s\n", sw->link_usb4 ? "USB4" : "TBT3");
+
        xhci = val & ROUTER_CS_6_HCI;
        tbt3 = !(val & ROUTER_CS_6_TNS);
 
        if (ret)
                return ret;
 
-       parent = tb_switch_parent(sw);
-
-       if (tb_switch_find_port(parent, TB_TYPE_USB3_DOWN)) {
+       if (sw->link_usb4 && tb_switch_find_port(parent, TB_TYPE_USB3_DOWN)) {
                val |= ROUTER_CS_5_UTO;
                xhci = false;
        }