thunderbolt: Send reset only to first generation routers
authorMika Westerberg <mika.westerberg@linux.intel.com>
Thu, 19 Sep 2019 12:25:30 +0000 (15:25 +0300)
committerMika Westerberg <mika.westerberg@linux.intel.com>
Thu, 3 Sep 2020 09:06:41 +0000 (12:06 +0300)
First generation routers may need the reset command upon resume but it
is not supported by newer generations.

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

index 7ffb3b00b54f76528117af15b03e675e4aa56bf0..55ed8bcc60c3a81b63b9884e64c517246948495a 100644 (file)
@@ -1233,23 +1233,24 @@ static void tb_dump_switch(const struct tb *tb, const struct tb_switch *sw)
 
 /**
  * reset_switch() - reconfigure route, enable and send TB_CFG_PKG_RESET
+ * @sw: Switch to reset
  *
  * Return: Returns 0 on success or an error code on failure.
  */
-int tb_switch_reset(struct tb *tb, u64 route)
+int tb_switch_reset(struct tb_switch *sw)
 {
        struct tb_cfg_result res;
-       struct tb_regs_switch_header header = {
-               header.route_hi = route >> 32,
-               header.route_lo = route,
-               header.enabled = true,
-       };
-       tb_dbg(tb, "resetting switch at %llx\n", route);
-       res.err = tb_cfg_write(tb->ctl, ((u32 *) &header) + 2, route,
-                       0, 2, 2, 2);
+
+       if (sw->generation > 1)
+               return 0;
+
+       tb_sw_dbg(sw, "resetting switch\n");
+
+       res.err = tb_sw_write(sw, ((u32 *) &sw->config) + 2,
+                             TB_CFG_SWITCH, 2, 2);
        if (res.err)
                return res.err;
-       res = tb_cfg_reset(tb->ctl, route, TB_CFG_DEFAULT_TIMEOUT);
+       res = tb_cfg_reset(sw->tb->ctl, tb_route(sw), TB_CFG_DEFAULT_TIMEOUT);
        if (res.err > 0)
                return -EIO;
        return res.err;
index 98f268a818a080d03ad5e4ac7ec7d46149a6778f..a6da2d0567ae7aeb866639d727fb1b34e3f356f3 100644 (file)
@@ -1258,7 +1258,7 @@ static int tb_resume_noirq(struct tb *tb)
        tb_dbg(tb, "resuming...\n");
 
        /* remove any pci devices the firmware might have setup */
-       tb_switch_reset(tb, 0);
+       tb_switch_reset(tb->root_switch);
 
        tb_switch_resume(tb->root_switch);
        tb_free_invalid_tunnels(tb);
index a413d55b5f8b3d40aff34f0db6fab9dd98a63c9e..b16d290690f3199628a87c0fcc54353af61468c6 100644 (file)
@@ -634,7 +634,7 @@ int tb_switch_add(struct tb_switch *sw);
 void tb_switch_remove(struct tb_switch *sw);
 void tb_switch_suspend(struct tb_switch *sw);
 int tb_switch_resume(struct tb_switch *sw);
-int tb_switch_reset(struct tb *tb, u64 route);
+int tb_switch_reset(struct tb_switch *sw);
 void tb_sw_set_unplugged(struct tb_switch *sw);
 struct tb_port *tb_switch_find_port(struct tb_switch *sw,
                                    enum tb_port_type type);