in test.c [597:679]
static void tb_test_path_complex_tree_walk(struct kunit *test)
{
/*
* Walks from Device #3 DP IN to Device #9 DP OUT.
*
* [Host]
* 1 |
* 1 |
* [Device #1]
* 3 / | 5 \ 7
* 1 / | \ 1
* [Device #2] | [Device #5]
* 5 | | 1 \ 7
* 1 | [Device #4] \ 1
* [Device #3] [Device #6]
* 3 /
* 1 /
* [Device #7]
* 3 / | 5
* 1 / |
* [Device #8] | 1
* [Device #9]
*/
static const struct port_expectation test_data[] = {
{ .route = 0x50301, .port = 13, .type = TB_TYPE_DP_HDMI_IN },
{ .route = 0x50301, .port = 1, .type = TB_TYPE_PORT },
{ .route = 0x301, .port = 5, .type = TB_TYPE_PORT },
{ .route = 0x301, .port = 1, .type = TB_TYPE_PORT },
{ .route = 0x1, .port = 3, .type = TB_TYPE_PORT },
{ .route = 0x1, .port = 7, .type = TB_TYPE_PORT },
{ .route = 0x701, .port = 1, .type = TB_TYPE_PORT },
{ .route = 0x701, .port = 7, .type = TB_TYPE_PORT },
{ .route = 0x70701, .port = 1, .type = TB_TYPE_PORT },
{ .route = 0x70701, .port = 3, .type = TB_TYPE_PORT },
{ .route = 0x3070701, .port = 1, .type = TB_TYPE_PORT },
{ .route = 0x3070701, .port = 5, .type = TB_TYPE_PORT },
{ .route = 0x503070701, .port = 1, .type = TB_TYPE_PORT },
{ .route = 0x503070701, .port = 14, .type = TB_TYPE_DP_HDMI_OUT },
};
struct tb_switch *host, *dev1, *dev2, *dev3, *dev5, *dev6, *dev7, *dev9;
struct tb_port *src_port, *dst_port, *p;
int i;
host = alloc_host(test);
dev1 = alloc_dev_default(test, host, 0x1, true);
dev2 = alloc_dev_default(test, dev1, 0x301, true);
dev3 = alloc_dev_with_dpin(test, dev2, 0x50301, true);
alloc_dev_default(test, dev1, 0x501, true);
dev5 = alloc_dev_default(test, dev1, 0x701, true);
dev6 = alloc_dev_default(test, dev5, 0x70701, true);
dev7 = alloc_dev_default(test, dev6, 0x3070701, true);
alloc_dev_default(test, dev7, 0x303070701, true);
dev9 = alloc_dev_default(test, dev7, 0x503070701, true);
src_port = &dev3->ports[13];
dst_port = &dev9->ports[14];
/* Walk both directions */
i = 0;
tb_for_each_port_on_path(src_port, dst_port, p) {
KUNIT_EXPECT_TRUE(test, i < ARRAY_SIZE(test_data));
KUNIT_EXPECT_EQ(test, tb_route(p->sw), test_data[i].route);
KUNIT_EXPECT_EQ(test, p->port, test_data[i].port);
KUNIT_EXPECT_EQ(test, (enum tb_port_type)p->config.type,
test_data[i].type);
i++;
}
KUNIT_EXPECT_EQ(test, i, ARRAY_SIZE(test_data));
i = ARRAY_SIZE(test_data) - 1;
tb_for_each_port_on_path(dst_port, src_port, p) {
KUNIT_EXPECT_TRUE(test, i < ARRAY_SIZE(test_data));
KUNIT_EXPECT_EQ(test, tb_route(p->sw), test_data[i].route);
KUNIT_EXPECT_EQ(test, p->port, test_data[i].port);
KUNIT_EXPECT_EQ(test, (enum tb_port_type)p->config.type,
test_data[i].type);
i--;
}
KUNIT_EXPECT_EQ(test, i, -1);
}