Skip to content

Commit 8bf5438

Browse files
committed
Merge branch 'dsa-use-per-port-upstream-port'
Vivien Didelot says: ==================== net: dsa: use per-port upstream port An upstream port is a local switch port used to reach a CPU port. DSA still considers a unique CPU port in the whole switch fabric and thus return a unique upstream port for a given switch. This is wrong in a multiple CPU ports environment. We are now switching to using the dedicated CPU port assigned to each port in order to get rid of the deprecated unique tree CPU port. This patchset makes the dsa_upstream_port() helper take a port argument and goes one step closer complete support for multiple CPU ports. Changes in v2: - reverse-christmas-tree-fy variables ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 9382a50 + 07073c7 commit 8bf5438

File tree

3 files changed

+46
-25
lines changed

3 files changed

+46
-25
lines changed

drivers/net/dsa/mv88e6xxx/chip.c

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1723,9 +1723,11 @@ static int mv88e6xxx_setup_message_port(struct mv88e6xxx_chip *chip, int port)
17231723

17241724
static int mv88e6xxx_setup_egress_floods(struct mv88e6xxx_chip *chip, int port)
17251725
{
1726-
bool flood = port == dsa_upstream_port(chip->ds);
1726+
struct dsa_switch *ds = chip->ds;
1727+
bool flood;
17271728

17281729
/* Upstream ports flood frames with unknown unicast or multicast DA */
1730+
flood = dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port);
17291731
if (chip->info->ops->port_set_egress_floods)
17301732
return chip->info->ops->port_set_egress_floods(chip, port,
17311733
flood, flood);
@@ -1742,6 +1744,39 @@ static int mv88e6xxx_serdes_power(struct mv88e6xxx_chip *chip, int port,
17421744
return 0;
17431745
}
17441746

1747+
static int mv88e6xxx_setup_upstream_port(struct mv88e6xxx_chip *chip, int port)
1748+
{
1749+
struct dsa_switch *ds = chip->ds;
1750+
int upstream_port;
1751+
int err;
1752+
1753+
upstream_port = dsa_upstream_port(ds, port);
1754+
if (chip->info->ops->port_set_upstream_port) {
1755+
err = chip->info->ops->port_set_upstream_port(chip, port,
1756+
upstream_port);
1757+
if (err)
1758+
return err;
1759+
}
1760+
1761+
if (port == upstream_port) {
1762+
if (chip->info->ops->set_cpu_port) {
1763+
err = chip->info->ops->set_cpu_port(chip,
1764+
upstream_port);
1765+
if (err)
1766+
return err;
1767+
}
1768+
1769+
if (chip->info->ops->set_egress_port) {
1770+
err = chip->info->ops->set_egress_port(chip,
1771+
upstream_port);
1772+
if (err)
1773+
return err;
1774+
}
1775+
}
1776+
1777+
return 0;
1778+
}
1779+
17451780
static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port)
17461781
{
17471782
struct dsa_switch *ds = chip->ds;
@@ -1812,13 +1847,9 @@ static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port)
18121847
if (err)
18131848
return err;
18141849

1815-
reg = 0;
1816-
if (chip->info->ops->port_set_upstream_port) {
1817-
err = chip->info->ops->port_set_upstream_port(
1818-
chip, port, dsa_upstream_port(ds));
1819-
if (err)
1820-
return err;
1821-
}
1850+
err = mv88e6xxx_setup_upstream_port(chip, port);
1851+
if (err)
1852+
return err;
18221853

18231854
err = mv88e6xxx_port_set_8021q_mode(chip, port,
18241855
MV88E6XXX_PORT_CTL2_8021Q_MODE_DISABLED);
@@ -1944,21 +1975,8 @@ static int mv88e6xxx_set_ageing_time(struct dsa_switch *ds,
19441975
static int mv88e6xxx_g1_setup(struct mv88e6xxx_chip *chip)
19451976
{
19461977
struct dsa_switch *ds = chip->ds;
1947-
u32 upstream_port = dsa_upstream_port(ds);
19481978
int err;
19491979

1950-
if (chip->info->ops->set_cpu_port) {
1951-
err = chip->info->ops->set_cpu_port(chip, upstream_port);
1952-
if (err)
1953-
return err;
1954-
}
1955-
1956-
if (chip->info->ops->set_egress_port) {
1957-
err = chip->info->ops->set_egress_port(chip, upstream_port);
1958-
if (err)
1959-
return err;
1960-
}
1961-
19621980
/* Disable remote management, and set the switch's DSA device number. */
19631981
err = mv88e6xxx_g1_write(chip, MV88E6XXX_G1_CTL2,
19641982
MV88E6XXX_G1_CTL2_MULTIPLE_CASCADE |

include/net/dsa.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -307,10 +307,13 @@ static inline unsigned int dsa_towards_port(struct dsa_switch *ds, int device,
307307
}
308308

309309
/* Return the local port used to reach the dedicated CPU port */
310-
static inline u8 dsa_upstream_port(struct dsa_switch *ds)
310+
static inline unsigned int dsa_upstream_port(struct dsa_switch *ds, int port)
311311
{
312-
struct dsa_switch_tree *dst = ds->dst;
313-
struct dsa_port *cpu_dp = dst->cpu_dp;
312+
const struct dsa_port *dp = dsa_to_port(ds, port);
313+
const struct dsa_port *cpu_dp = dp->cpu_dp;
314+
315+
if (!cpu_dp)
316+
return port;
314317

315318
return dsa_towards_port(ds, cpu_dp->ds->index, cpu_dp->index);
316319
}

net/dsa/dsa2.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ static int dsa_tree_setup_default_cpu(struct dsa_switch_tree *dst)
241241
for (port = 0; port < ds->num_ports; port++) {
242242
dp = &ds->ports[port];
243243

244-
if (dsa_port_is_user(dp))
244+
if (dsa_port_is_user(dp) || dsa_port_is_dsa(dp))
245245
dp->cpu_dp = dst->cpu_dp;
246246
}
247247
}

0 commit comments

Comments
 (0)