thunderbolt: Align USB4 router wakes configuration with the CM guide
authorMika Westerberg <mika.westerberg@linux.intel.com>
Thu, 14 Jan 2021 14:41:31 +0000 (16:41 +0200)
committerMika Westerberg <mika.westerberg@linux.intel.com>
Mon, 31 May 2021 11:40:08 +0000 (14:40 +0300)
The USB4 Configuration Manager guide suggests that the USB4 port wakes
are configured in a certain way, like that when the port is configured
the wake-on-connect should not be set and so forth, so align the driver
with this.

Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
drivers/thunderbolt/usb4.c

index 7e8b5ca..b56af7b 100644 (file)
@@ -399,12 +399,18 @@ int usb4_switch_set_wake(struct tb_switch *sw, unsigned int flags)
 
                val &= ~(PORT_CS_19_WOC | PORT_CS_19_WOD | PORT_CS_19_WOU4);
 
-               if (flags & TB_WAKE_ON_CONNECT)
-                       val |= PORT_CS_19_WOC;
-               if (flags & TB_WAKE_ON_DISCONNECT)
-                       val |= PORT_CS_19_WOD;
-               if (flags & TB_WAKE_ON_USB4)
+               if (tb_is_upstream_port(port)) {
                        val |= PORT_CS_19_WOU4;
+               } else {
+                       bool configured = val & PORT_CS_19_PC;
+
+                       if ((flags & TB_WAKE_ON_CONNECT) && !configured)
+                               val |= PORT_CS_19_WOC;
+                       if ((flags & TB_WAKE_ON_DISCONNECT) && configured)
+                               val |= PORT_CS_19_WOD;
+                       if ((flags & TB_WAKE_ON_USB4) && configured)
+                               val |= PORT_CS_19_WOU4;
+               }
 
                ret = tb_port_write(port, &val, TB_CFG_PORT,
                                    port->cap_usb4 + PORT_CS_19, 1);