Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a6692754 authored by Vivien Didelot's avatar Vivien Didelot Committed by David S. Miller
Browse files

net: dsa: pass bridge down to drivers



Some DSA drivers may or may not support multiple software bridges on top
of an hardware switch.

It is more convenient for them to access the bridge's net_device for
finer configuration.

Removing the need to craft and access a bitmask also simplifies the
code.

This patch changes the signature of bridge related functions, update DSA
drivers, and removes dsa_slave_br_port_mask.

Signed-off-by: default avatarVivien Didelot <vivien.didelot@savoirfairelinux.com>
Tested-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d715fa64
Loading
Loading
Loading
Loading
+2 −5
Original line number Diff line number Diff line
@@ -524,17 +524,14 @@ Bridge layer
- port_join_bridge: bridge layer function invoked when a given switch port is
  added to a bridge, this function should be doing the necessary at the switch
  level to permit the joining port from being added to the relevant logical
  domain for it to ingress/egress traffic with other members of the bridge. DSA
  does nothing but calculate a bitmask of switch ports currently members of the
  specified bridge being requested the join
  domain for it to ingress/egress traffic with other members of the bridge.

- port_leave_bridge: bridge layer function invoked when a given switch port is
  removed from a bridge, this function should be doing the necessary at the
  switch level to deny the leaving port from ingress/egress traffic from the
  remaining bridge members. When the port leaves the bridge, it should be aged
  out at the switch hardware for the switch to (re) learn MAC addresses behind
  this port. DSA calculates the bitmask of ports still members of the bridge
  being left
  this port.

- port_stp_update: bridge layer function invoked when a given switch port STP
  state is computed by the bridge layer and should be propagated to switch
+7 −5
Original line number Diff line number Diff line
@@ -483,16 +483,17 @@ static int bcm_sf2_sw_fast_age_port(struct dsa_switch *ds, int port)
}

static int bcm_sf2_sw_br_join(struct dsa_switch *ds, int port,
			      u32 br_port_mask)
			      struct net_device *bridge)
{
	struct bcm_sf2_priv *priv = ds_to_priv(ds);
	unsigned int i;
	u32 reg, p_ctl;

	priv->port_sts[port].bridge_dev = bridge;
	p_ctl = core_readl(priv, CORE_PORT_VLAN_CTL_PORT(port));

	for (i = 0; i < priv->hw_params.num_ports; i++) {
		if (!((1 << i) & br_port_mask))
		if (priv->port_sts[i].bridge_dev != bridge)
			continue;

		/* Add this local port to the remote port VLAN control
@@ -515,10 +516,10 @@ static int bcm_sf2_sw_br_join(struct dsa_switch *ds, int port,
	return 0;
}

static int bcm_sf2_sw_br_leave(struct dsa_switch *ds, int port,
			       u32 br_port_mask)
static int bcm_sf2_sw_br_leave(struct dsa_switch *ds, int port)
{
	struct bcm_sf2_priv *priv = ds_to_priv(ds);
	struct net_device *bridge = priv->port_sts[port].bridge_dev;
	unsigned int i;
	u32 reg, p_ctl;

@@ -526,7 +527,7 @@ static int bcm_sf2_sw_br_leave(struct dsa_switch *ds, int port,

	for (i = 0; i < priv->hw_params.num_ports; i++) {
		/* Don't touch the remaining ports */
		if (!((1 << i) & br_port_mask))
		if (priv->port_sts[i].bridge_dev != bridge)
			continue;

		reg = core_readl(priv, CORE_PORT_VLAN_CTL_PORT(i));
@@ -541,6 +542,7 @@ static int bcm_sf2_sw_br_leave(struct dsa_switch *ds, int port,

	core_writel(priv, p_ctl, CORE_PORT_VLAN_CTL_PORT(port));
	priv->port_sts[port].vlan_ctl_mask = p_ctl;
	priv->port_sts[port].bridge_dev = NULL;

	return 0;
}
+2 −0
Original line number Diff line number Diff line
@@ -50,6 +50,8 @@ struct bcm_sf2_port_status {
	struct ethtool_eee eee;

	u32 vlan_ctl_mask;

	struct net_device *bridge_dev;
};

struct bcm_sf2_arl_entry {
+11 −2
Original line number Diff line number Diff line
@@ -1889,13 +1889,22 @@ int mv88e6xxx_port_fdb_dump(struct dsa_switch *ds, int port,
	return err;
}

int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port, u32 members)
int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port,
			       struct net_device *bridge)
{
	struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);

	ps->ports[port].bridge_dev = bridge;

	return 0;
}

int mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port, u32 members)
int mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port)
{
	struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);

	ps->ports[port].bridge_dev = NULL;

	return 0;
}

+4 −2
Original line number Diff line number Diff line
@@ -380,6 +380,7 @@ struct mv88e6xxx_vtu_stu_entry {
};

struct mv88e6xxx_priv_port {
	struct net_device *bridge_dev;
	u8 state;
};

@@ -481,8 +482,9 @@ int mv88e6xxx_phy_write_indirect(struct dsa_switch *ds, int addr, int regnum,
int mv88e6xxx_get_eee(struct dsa_switch *ds, int port, struct ethtool_eee *e);
int mv88e6xxx_set_eee(struct dsa_switch *ds, int port,
		      struct phy_device *phydev, struct ethtool_eee *e);
int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port, u32 members);
int mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port, u32 members);
int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port,
			       struct net_device *bridge);
int mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port);
int mv88e6xxx_port_stp_update(struct dsa_switch *ds, int port, u8 state);
int mv88e6xxx_port_vlan_prepare(struct dsa_switch *ds, int port,
				const struct switchdev_obj_port_vlan *vlan,
Loading