net: dsa: list DSA links in the fabric
Implement a new list of DSA links in the switch fabric itself, to provide an alterative to the ds->rtable static arrays. At the same time, provide a new dsa_routing_port() helper to abstract the usage of ds->rtable in drivers. If there's no port to reach a given device, return the first invalid port, ds->num_ports. This avoids potential signedness errors or the need to define special values. Signed-off-by: Vivien Didelot <vivien.didelot@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
5c26c1d6df
commit
c5f51765a1
@@ -123,6 +123,9 @@ struct dsa_switch_tree {
|
||||
/* List of switch ports */
|
||||
struct list_head ports;
|
||||
|
||||
/* List of DSA links composing the routing table */
|
||||
struct list_head rtable;
|
||||
|
||||
/*
|
||||
* Data for the individual switch chips.
|
||||
*/
|
||||
@@ -214,6 +217,17 @@ struct dsa_port {
|
||||
bool setup;
|
||||
};
|
||||
|
||||
/* TODO: ideally DSA ports would have a single dp->link_dp member,
|
||||
* and no dst->rtable nor this struct dsa_link would be needed,
|
||||
* but this would require some more complex tree walking,
|
||||
* so keep it stupid at the moment and list them all.
|
||||
*/
|
||||
struct dsa_link {
|
||||
struct dsa_port *dp;
|
||||
struct dsa_port *link_dp;
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
struct dsa_switch {
|
||||
bool setup;
|
||||
|
||||
@@ -324,6 +338,19 @@ static inline u32 dsa_user_ports(struct dsa_switch *ds)
|
||||
return mask;
|
||||
}
|
||||
|
||||
/* Return the local port used to reach an arbitrary switch device */
|
||||
static inline unsigned int dsa_routing_port(struct dsa_switch *ds, int device)
|
||||
{
|
||||
struct dsa_switch_tree *dst = ds->dst;
|
||||
struct dsa_link *dl;
|
||||
|
||||
list_for_each_entry(dl, &dst->rtable, list)
|
||||
if (dl->dp->ds == ds && dl->link_dp->ds->index == device)
|
||||
return dl->dp->index;
|
||||
|
||||
return ds->num_ports;
|
||||
}
|
||||
|
||||
/* Return the local port used to reach an arbitrary switch port */
|
||||
static inline unsigned int dsa_towards_port(struct dsa_switch *ds, int device,
|
||||
int port)
|
||||
@@ -331,7 +358,7 @@ static inline unsigned int dsa_towards_port(struct dsa_switch *ds, int device,
|
||||
if (device == ds->index)
|
||||
return port;
|
||||
else
|
||||
return ds->rtable[device];
|
||||
return dsa_routing_port(ds, device);
|
||||
}
|
||||
|
||||
/* Return the local port used to reach the dedicated CPU port */
|
||||
|
Reference in New Issue
Block a user