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: Mika Westerberg <mika.westerberg@linux.intel.com>
This commit is contained in:
parent
2ca3263a80
commit
356b6c4ef5
|
@ -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)
|
||||||
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);
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue