diff -r dce13f854817 -r 622a7faa07df master/master.c --- a/master/master.c Mon Jan 30 15:12:21 2012 +0100 +++ b/master/master.c Mon Jan 30 15:17:34 2012 +0100 @@ -1913,24 +1913,33 @@ ) { ec_slave_t *slave = master->slaves + *slave_position; - unsigned int i; + unsigned int port_index; int ret; + static const unsigned int next_table[EC_MAX_PORTS] = { + 3, 2, 0, 1 + }; + slave->ports[0].next_slave = port0_slave; - for (i = 1; i < EC_MAX_PORTS; i++) { - if (!slave->ports[i].link.loop_closed) { + port_index = 3; + while (port_index != 0) { + if (!slave->ports[port_index].link.loop_closed) { *slave_position = *slave_position + 1; if (*slave_position < master->slave_count) { - slave->ports[i].next_slave = master->slaves + *slave_position; + slave->ports[port_index].next_slave = + master->slaves + *slave_position; ret = ec_master_calc_topology_rec(master, slave, slave_position); - if (ret) + if (ret) { return ret; + } } else { return -1; } } + + port_index = next_table[port_index]; } return 0;