thunderbolt: Show link type for XDomain connections too
authorMika Westerberg <mika.westerberg@linux.intel.com>
Tue, 30 Aug 2022 15:32:47 +0000 (18:32 +0300)
committerDavid S. Miller <davem@davemloft.net>
Wed, 31 Aug 2022 13:05:12 +0000 (14:05 +0100)
Following what we do for routers already, extend this to XDomain
connections as well. This will show in sysfs whether the link is in USB4
or Thunderbolt mode.

Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/thunderbolt/tb.c
drivers/thunderbolt/tb.h
drivers/thunderbolt/usb4.c
drivers/thunderbolt/usb4_port.c
include/linux/thunderbolt.h

index 9853f6c..9a27707 100644 (file)
@@ -174,10 +174,10 @@ static void tb_discover_tunnels(struct tb *tb)
        }
 }
 
-static int tb_port_configure_xdomain(struct tb_port *port)
+static int tb_port_configure_xdomain(struct tb_port *port, struct tb_xdomain *xd)
 {
        if (tb_switch_is_usb4(port->sw))
-               return usb4_port_configure_xdomain(port);
+               return usb4_port_configure_xdomain(port, xd);
        return tb_lc_configure_xdomain(port);
 }
 
@@ -212,7 +212,7 @@ static void tb_scan_xdomain(struct tb_port *port)
                              NULL);
        if (xd) {
                tb_port_at(route, sw)->xdomain = xd;
-               tb_port_configure_xdomain(port);
+               tb_port_configure_xdomain(port, xd);
                tb_xdomain_add(xd);
        }
 }
@@ -1516,7 +1516,7 @@ static void tb_restore_children(struct tb_switch *sw)
 
                        tb_restore_children(port->remote->sw);
                } else if (port->xdomain) {
-                       tb_port_configure_xdomain(port);
+                       tb_port_configure_xdomain(port, port->xdomain);
                }
        }
 }
index 5db76de..0f067c0 100644 (file)
@@ -1176,7 +1176,7 @@ void usb4_switch_remove_ports(struct tb_switch *sw);
 int usb4_port_unlock(struct tb_port *port);
 int usb4_port_configure(struct tb_port *port);
 void usb4_port_unconfigure(struct tb_port *port);
-int usb4_port_configure_xdomain(struct tb_port *port);
+int usb4_port_configure_xdomain(struct tb_port *port, struct tb_xdomain *xd);
 void usb4_port_unconfigure_xdomain(struct tb_port *port);
 int usb4_port_router_offline(struct tb_port *port);
 int usb4_port_router_online(struct tb_port *port);
index 3a2e712..a386228 100644 (file)
@@ -1115,12 +1115,14 @@ static int usb4_set_xdomain_configured(struct tb_port *port, bool configured)
 /**
  * usb4_port_configure_xdomain() - Configure port for XDomain
  * @port: USB4 port connected to another host
+ * @xd: XDomain that is connected to the port
  *
- * Marks the USB4 port as being connected to another host. Returns %0 in
- * success and negative errno in failure.
+ * Marks the USB4 port as being connected to another host and updates
+ * the link type. Returns %0 in success and negative errno in failure.
  */
-int usb4_port_configure_xdomain(struct tb_port *port)
+int usb4_port_configure_xdomain(struct tb_port *port, struct tb_xdomain *xd)
 {
+       xd->link_usb4 = link_is_usb4(port);
        return usb4_set_xdomain_configured(port, true);
 }
 
index 6b02945..1a30c0a 100644 (file)
@@ -53,6 +53,8 @@ static ssize_t link_show(struct device *dev, struct device_attribute *attr,
                link = port->sw->link_usb4 ? "usb4" : "tbt";
        else if (tb_port_has_remote(port))
                link = port->remote->sw->link_usb4 ? "usb4" : "tbt";
+       else if (port->xdomain)
+               link = port->xdomain->link_usb4 ? "usb4" : "tbt";
        else
                link = "none";
 
index 9f442d7..90cd08a 100644 (file)
@@ -187,6 +187,7 @@ void tb_unregister_property_dir(const char *key, struct tb_property_dir *dir);
  * @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: Downstream link is USB4
  * @is_unplugged: The XDomain is unplugged
  * @needs_uuid: If the XDomain does not have @remote_uuid it will be
  *             queried first
@@ -234,6 +235,7 @@ struct tb_xdomain {
        const char *device_name;
        unsigned int link_speed;
        unsigned int link_width;
+       bool link_usb4;
        bool is_unplugged;
        bool needs_uuid;
        struct ida service_ids;