Commit ab8ccae1 authored by Vivien Didelot's avatar Vivien Didelot Committed by Jakub Kicinski

net: dsa: add ports list in the switch fabric

Add a list of switch ports within the switch fabric. This will help the
lookup of a port inside the whole fabric, and it is the first step
towards supporting multiple CPU ports, before deprecating the usage of
the unique dst->cpu_dp pointer.

In preparation for a future allocation of the dsa_port structures,
return -ENOMEM in case no structure is returned, even though this
error cannot be reached yet.
Signed-off-by: default avatarVivien Didelot <vivien.didelot@gmail.com>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Signed-off-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
parent 68bb8ea8
...@@ -125,6 +125,9 @@ struct dsa_switch_tree { ...@@ -125,6 +125,9 @@ struct dsa_switch_tree {
*/ */
struct dsa_port *cpu_dp; struct dsa_port *cpu_dp;
/* List of switch ports */
struct list_head ports;
/* /*
* Data for the individual switch chips. * Data for the individual switch chips.
*/ */
...@@ -195,6 +198,8 @@ struct dsa_port { ...@@ -195,6 +198,8 @@ struct dsa_port {
struct work_struct xmit_work; struct work_struct xmit_work;
struct sk_buff_head xmit_queue; struct sk_buff_head xmit_queue;
struct list_head list;
/* /*
* Give the switch driver somewhere to hang its per-port private data * Give the switch driver somewhere to hang its per-port private data
* structures (accessible from the tagger). * structures (accessible from the tagger).
......
...@@ -45,6 +45,8 @@ static struct dsa_switch_tree *dsa_tree_alloc(int index) ...@@ -45,6 +45,8 @@ static struct dsa_switch_tree *dsa_tree_alloc(int index)
dst->index = index; dst->index = index;
INIT_LIST_HEAD(&dst->ports);
INIT_LIST_HEAD(&dst->list); INIT_LIST_HEAD(&dst->list);
list_add_tail(&dst->list, &dsa_tree_list); list_add_tail(&dst->list, &dsa_tree_list);
...@@ -616,6 +618,22 @@ static int dsa_tree_add_switch(struct dsa_switch_tree *dst, ...@@ -616,6 +618,22 @@ static int dsa_tree_add_switch(struct dsa_switch_tree *dst,
return err; return err;
} }
static struct dsa_port *dsa_port_touch(struct dsa_switch *ds, int index)
{
struct dsa_switch_tree *dst = ds->dst;
struct dsa_port *dp;
dp = &ds->ports[index];
dp->ds = ds;
dp->index = index;
INIT_LIST_HEAD(&dp->list);
list_add_tail(&dp->list, &dst->ports);
return dp;
}
static int dsa_port_parse_user(struct dsa_port *dp, const char *name) static int dsa_port_parse_user(struct dsa_port *dp, const char *name)
{ {
if (!name) if (!name)
...@@ -742,6 +760,20 @@ static int dsa_switch_parse_member_of(struct dsa_switch *ds, ...@@ -742,6 +760,20 @@ static int dsa_switch_parse_member_of(struct dsa_switch *ds,
return 0; return 0;
} }
static int dsa_switch_touch_ports(struct dsa_switch *ds)
{
struct dsa_port *dp;
int port;
for (port = 0; port < ds->num_ports; port++) {
dp = dsa_port_touch(ds, port);
if (!dp)
return -ENOMEM;
}
return 0;
}
static int dsa_switch_parse_of(struct dsa_switch *ds, struct device_node *dn) static int dsa_switch_parse_of(struct dsa_switch *ds, struct device_node *dn)
{ {
int err; int err;
...@@ -750,6 +782,10 @@ static int dsa_switch_parse_of(struct dsa_switch *ds, struct device_node *dn) ...@@ -750,6 +782,10 @@ static int dsa_switch_parse_of(struct dsa_switch *ds, struct device_node *dn)
if (err) if (err)
return err; return err;
err = dsa_switch_touch_ports(ds);
if (err)
return err;
return dsa_switch_parse_ports_of(ds, dn); return dsa_switch_parse_ports_of(ds, dn);
} }
...@@ -807,6 +843,8 @@ static int dsa_switch_parse_ports(struct dsa_switch *ds, ...@@ -807,6 +843,8 @@ static int dsa_switch_parse_ports(struct dsa_switch *ds,
static int dsa_switch_parse(struct dsa_switch *ds, struct dsa_chip_data *cd) static int dsa_switch_parse(struct dsa_switch *ds, struct dsa_chip_data *cd)
{ {
int err;
ds->cd = cd; ds->cd = cd;
/* We don't support interconnected switches nor multiple trees via /* We don't support interconnected switches nor multiple trees via
...@@ -817,6 +855,10 @@ static int dsa_switch_parse(struct dsa_switch *ds, struct dsa_chip_data *cd) ...@@ -817,6 +855,10 @@ static int dsa_switch_parse(struct dsa_switch *ds, struct dsa_chip_data *cd)
if (!ds->dst) if (!ds->dst)
return -ENOMEM; return -ENOMEM;
err = dsa_switch_touch_ports(ds);
if (err)
return err;
return dsa_switch_parse_ports(ds, cd); return dsa_switch_parse_ports(ds, cd);
} }
...@@ -849,7 +891,6 @@ static int dsa_switch_probe(struct dsa_switch *ds) ...@@ -849,7 +891,6 @@ static int dsa_switch_probe(struct dsa_switch *ds)
struct dsa_switch *dsa_switch_alloc(struct device *dev, size_t n) struct dsa_switch *dsa_switch_alloc(struct device *dev, size_t n)
{ {
struct dsa_switch *ds; struct dsa_switch *ds;
int i;
ds = devm_kzalloc(dev, struct_size(ds, ports, n), GFP_KERNEL); ds = devm_kzalloc(dev, struct_size(ds, ports, n), GFP_KERNEL);
if (!ds) if (!ds)
...@@ -858,11 +899,6 @@ struct dsa_switch *dsa_switch_alloc(struct device *dev, size_t n) ...@@ -858,11 +899,6 @@ struct dsa_switch *dsa_switch_alloc(struct device *dev, size_t n)
ds->dev = dev; ds->dev = dev;
ds->num_ports = n; ds->num_ports = n;
for (i = 0; i < ds->num_ports; ++i) {
ds->ports[i].index = i;
ds->ports[i].ds = ds;
}
return ds; return ds;
} }
EXPORT_SYMBOL_GPL(dsa_switch_alloc); EXPORT_SYMBOL_GPL(dsa_switch_alloc);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment