thunderbolt: Add details to router uevent
authorMika Westerberg <mika.westerberg@linux.intel.com>
Tue, 2 Mar 2021 13:51:44 +0000 (15:51 +0200)
committerMika Westerberg <mika.westerberg@linux.intel.com>
Fri, 9 Apr 2021 09:26:10 +0000 (12:26 +0300)
Expose two environment variables for routers as part of the initial
uevent:

  USB4_VERSION=1.0
  USB4_TYPE=host|device|hub

Userspace can use this information to expose more details about each
connected device. Only USB4 devices have USB4_VERSION but all devices
have USB4_TYPE.

Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/thunderbolt/switch.c

index 321a5bcfce65bde72c6c3e756866c91a8570b5d6..a1b4a695080e35ffc7cc63cc5b788733d04acdcd 100644 (file)
@@ -1835,6 +1835,39 @@ static void tb_switch_release(struct device *dev)
        kfree(sw);
 }
 
+static int tb_switch_uevent(struct device *dev, struct kobj_uevent_env *env)
+{
+       struct tb_switch *sw = tb_to_switch(dev);
+       const char *type;
+
+       if (sw->config.thunderbolt_version == USB4_VERSION_1_0) {
+               if (add_uevent_var(env, "USB4_VERSION=1.0"))
+                       return -ENOMEM;
+       }
+
+       if (!tb_route(sw)) {
+               type = "host";
+       } else {
+               const struct tb_port *port;
+               bool hub = false;
+
+               /* Device is hub if it has any downstream ports */
+               tb_switch_for_each_port(sw, port) {
+                       if (!port->disabled && !tb_is_upstream_port(port) &&
+                            tb_port_is_null(port)) {
+                               hub = true;
+                               break;
+                       }
+               }
+
+               type = hub ? "hub" : "device";
+       }
+
+       if (add_uevent_var(env, "USB4_TYPE=%s", type))
+               return -ENOMEM;
+       return 0;
+}
+
 /*
  * Currently only need to provide the callbacks. Everything else is handled
  * in the connection manager.
@@ -1868,6 +1901,7 @@ static const struct dev_pm_ops tb_switch_pm_ops = {
 struct device_type tb_switch_type = {
        .name = "thunderbolt_device",
        .release = tb_switch_release,
+       .uevent = tb_switch_uevent,
        .pm = &tb_switch_pm_ops,
 };