thunderbolt: Scan for downstream switches
Add utility methods tb_port_state and tb_wait_for_port. Add tb_scan_switch which recursively checks for downstream switches. Signed-off-by: Andreas Noever <andreas.noever@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

父節點
ca389f716f
當前提交
9da672a428
@@ -11,6 +11,47 @@
|
||||
#include "tb.h"
|
||||
#include "tb_regs.h"
|
||||
|
||||
|
||||
/* enumeration & hot plug handling */
|
||||
|
||||
|
||||
static void tb_scan_port(struct tb_port *port);
|
||||
|
||||
/**
|
||||
* tb_scan_switch() - scan for and initialize downstream switches
|
||||
*/
|
||||
static void tb_scan_switch(struct tb_switch *sw)
|
||||
{
|
||||
int i;
|
||||
for (i = 1; i <= sw->config.max_port_number; i++)
|
||||
tb_scan_port(&sw->ports[i]);
|
||||
}
|
||||
|
||||
/**
|
||||
* tb_scan_port() - check for and initialize switches below port
|
||||
*/
|
||||
static void tb_scan_port(struct tb_port *port)
|
||||
{
|
||||
struct tb_switch *sw;
|
||||
if (tb_is_upstream_port(port))
|
||||
return;
|
||||
if (port->config.type != TB_TYPE_PORT)
|
||||
return;
|
||||
if (tb_wait_for_port(port, false) <= 0)
|
||||
return;
|
||||
if (port->remote) {
|
||||
tb_port_WARN(port, "port already has a remote!\n");
|
||||
return;
|
||||
}
|
||||
sw = tb_switch_alloc(port->sw->tb, tb_downstream_route(port));
|
||||
if (!sw)
|
||||
return;
|
||||
port->remote = tb_upstream_port(sw);
|
||||
tb_upstream_port(sw)->remote = port;
|
||||
tb_scan_switch(sw);
|
||||
}
|
||||
|
||||
|
||||
/* hotplug handling */
|
||||
|
||||
struct tb_hotplug_event {
|
||||
@@ -134,6 +175,9 @@ struct tb *thunderbolt_alloc_and_start(struct tb_nhi *nhi)
|
||||
if (!tb->root_switch)
|
||||
goto err_locked;
|
||||
|
||||
/* Full scan to discover devices added before the driver was loaded. */
|
||||
tb_scan_switch(tb->root_switch);
|
||||
|
||||
/* Allow tb_handle_hotplug to progress events */
|
||||
tb->hotplug_active = true;
|
||||
mutex_unlock(&tb->lock);
|
||||
|
Reference in New Issue
Block a user