On Wed, Feb 06, 2019 at 04:17:23PM +0300, Mika Westerberg wrote:
> We need to be able to walk from one port to another when we are creating
> paths where there are multiple switches between two ports. For this
> reason introduce a new function tb_port_get_next() and a new macro
> tb_for_each_port().

> +struct tb_port *tb_port_get_next(struct tb_port *start, struct tb_port *end,
> +                              struct tb_port *prev)
> +{
> +     struct tb_port *port, *next;
> +
> +     if (!prev)
> +             return start;
> +
> +     if (prev->sw == end->sw) {

> +             if (prev != end)
> +                     return end;
> +             return NULL;

I would prefer to see the similar pattern as you used below, i.e. when we have
an "bail out" condition, check for it.

                if (prev == end)
                        return NULL;
                return end;


> +     }
> +
> +     /* Switch back to use primary links for walking */
> +     if (prev->dual_link_port && prev->link_nr)
> +             port = prev->dual_link_port;
> +     else
> +             port = prev;
> +
> +     if (start->sw->config.depth < end->sw->config.depth) {
> +             if (port->remote &&
> +                 port->remote->sw->config.depth > port->sw->config.depth)
> +                     next = port->remote;
> +             else
> +                     next = tb_port_at(tb_route(end->sw), port->sw);
> +     } else if (start->sw->config.depth > end->sw->config.depth) {
> +             if (tb_is_upstream_port(port))
> +                     next = port->remote;
> +             else
> +                     next = tb_upstream_port(port->sw);
> +     } else {

> +             /* Must be the same switch then */
> +             if (start->sw != end->sw)
> +                     return NULL;
> +             return end;

Here is a good pattern.

> +     }
> +
> +     /* If prev was dual link return another end of that link then */
> +     if (next->dual_link_port && next->link_nr != prev->link_nr)
> +             return next->dual_link_port;
> +
> +     return next;
> +}

-- 
With Best Regards,
Andy Shevchenko


Reply via email to