Commit 356b6c4e authored by Mika Westerberg's avatar Mika Westerberg

thunderbolt: Send reset only to first generation routers

First generation routers may need the reset command upon resume but it
is not supported by newer generations.
Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
parent 2ca3263a
...@@ -1233,23 +1233,24 @@ static void tb_dump_switch(const struct tb *tb, const struct tb_switch *sw) ...@@ -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 * 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. * 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_cfg_result res;
struct tb_regs_switch_header header = {
header.route_hi = route >> 32, if (sw->generation > 1)
header.route_lo = route, return 0;
header.enabled = true,
}; tb_sw_dbg(sw, "resetting switch\n");
tb_dbg(tb, "resetting switch at %llx\n", route);
res.err = tb_cfg_write(tb->ctl, ((u32 *) &header) + 2, route, res.err = tb_sw_write(sw, ((u32 *) &sw->config) + 2,
0, 2, 2, 2); TB_CFG_SWITCH, 2, 2);
if (res.err) if (res.err)
return 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) if (res.err > 0)
return -EIO; return -EIO;
return res.err; return res.err;
......
...@@ -1258,7 +1258,7 @@ static int tb_resume_noirq(struct tb *tb) ...@@ -1258,7 +1258,7 @@ static int tb_resume_noirq(struct tb *tb)
tb_dbg(tb, "resuming...\n"); tb_dbg(tb, "resuming...\n");
/* remove any pci devices the firmware might have setup */ /* 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_switch_resume(tb->root_switch);
tb_free_invalid_tunnels(tb); tb_free_invalid_tunnels(tb);
......
...@@ -634,7 +634,7 @@ int tb_switch_add(struct tb_switch *sw); ...@@ -634,7 +634,7 @@ int tb_switch_add(struct tb_switch *sw);
void tb_switch_remove(struct tb_switch *sw); void tb_switch_remove(struct tb_switch *sw);
void tb_switch_suspend(struct tb_switch *sw); void tb_switch_suspend(struct tb_switch *sw);
int tb_switch_resume(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); void tb_sw_set_unplugged(struct tb_switch *sw);
struct tb_port *tb_switch_find_port(struct tb_switch *sw, struct tb_port *tb_switch_find_port(struct tb_switch *sw,
enum tb_port_type type); enum tb_port_type type);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment