[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20190207143312.GI9224@smile.fi.intel.com>
Date: Thu, 7 Feb 2019 16:33:12 +0200
From: Andy Shevchenko <andriy.shevchenko@...ux.intel.com>
To: Mika Westerberg <mika.westerberg@...ux.intel.com>
Cc: linux-kernel@...r.kernel.org,
Michael Jamet <michael.jamet@...el.com>,
Yehezkel Bernat <YehezkelShB@...il.com>,
Andreas Noever <andreas.noever@...il.com>,
Lukas Wunner <lukas@...ner.de>,
"David S . Miller" <davem@...emloft.net>, netdev@...r.kernel.org
Subject: Re: [PATCH v2 13/28] thunderbolt: Add helper function to iterate
from one port to another
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
Powered by blists - more mailing lists