Skip to content

Commit

Permalink
net: dsa: Associate slave network device with CPU port
Browse files Browse the repository at this point in the history
In preparation for supporting multiple CPU ports with DSA, have the
dsa_port structure know which CPU it is associated with. This will be
important in order to make sure the correct CPU is used for transmission
of the frames. If not for functional reasons, for performance (e.g: load
balancing) and forwarding decisions.

Reviewed-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Florian Fainelli authored and David S. Miller committed Jun 13, 2017
1 parent 67dbb9d commit a29342e
Show file tree
Hide file tree
Showing 5 changed files with 17 additions and 2 deletions.
1 change: 1 addition & 0 deletions include/net/dsa.h
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ struct dsa_port {
struct dsa_switch *ds;
unsigned int index;
const char *name;
struct dsa_port *cpu_dp;
struct net_device *netdev;
struct device_node *dn;
unsigned int ageing_time;
Expand Down
11 changes: 11 additions & 0 deletions net/dsa/dsa2.c
Original file line number Diff line number Diff line change
Expand Up @@ -490,6 +490,8 @@ static int dsa_cpu_parse(struct dsa_port *port, u32 index,
enum dsa_tag_protocol tag_protocol;
struct net_device *ethernet_dev;
struct device_node *ethernet;
struct dsa_port *p;
unsigned int i;

if (port->dn) {
ethernet = of_parse_phandle(port->dn, "ethernet", 0);
Expand All @@ -507,6 +509,15 @@ static int dsa_cpu_parse(struct dsa_port *port, u32 index,
if (!dst->cpu_dp) {
dst->cpu_dp = port;
dst->cpu_dp->netdev = ethernet_dev;

for (i = 0; i < ds->num_ports; i++) {
p = &ds->ports[i];
if (!dsa_port_is_valid(p) ||
i == index)
continue;

p->cpu_dp = port;
}
}

tag_protocol = ds->ops->get_tag_protocol(ds);
Expand Down
2 changes: 1 addition & 1 deletion net/dsa/dsa_priv.h
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ extern const struct dsa_device_ops trailer_netdev_ops;

static inline struct net_device *dsa_master_netdev(struct dsa_slave_priv *p)
{
return p->dp->ds->dst->cpu_dp->netdev;
return p->dp->cpu_dp->netdev;
}

#endif
1 change: 1 addition & 0 deletions net/dsa/legacy.c
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ static int dsa_switch_setup_one(struct dsa_switch *ds, struct device *parent)
ds->dsa_port_mask |= 1 << i;
} else {
ds->enabled_port_mask |= 1 << i;
ds->ports[i].cpu_dp = dst->cpu_dp;
}
valid_name_found = true;
}
Expand Down
4 changes: 3 additions & 1 deletion net/dsa/slave.c
Original file line number Diff line number Diff line change
Expand Up @@ -1140,9 +1140,11 @@ int dsa_slave_create(struct dsa_switch *ds, struct device *parent,
struct net_device *master;
struct net_device *slave_dev;
struct dsa_slave_priv *p;
struct dsa_port *cpu_dp;
int ret;

master = ds->dst->cpu_dp->netdev;
cpu_dp = ds->dst->cpu_dp;
master = cpu_dp->netdev;

slave_dev = alloc_netdev(sizeof(struct dsa_slave_priv), name,
NET_NAME_UNKNOWN, ether_setup);
Expand Down

0 comments on commit a29342e

Please sign in to comment.