net: dsa: make the STP state function return void
The DSA layer doesn't care about the return code of the port_stp_update routine, so make it void in the layer and the DSA drivers. Replace the useless dsa_slave_stp_update function with a dsa_slave_stp_state function used to reply to the switchdev SWITCHDEV_ATTR_ID_PORT_STP_STATE attribute. In the meantime, rename port_stp_update to port_stp_state_set to explicit the state change. Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
f453939c1a
commit
43c44a9f65
@ -533,7 +533,7 @@ Bridge layer
|
|||||||
out at the switch hardware for the switch to (re) learn MAC addresses behind
|
out at the switch hardware for the switch to (re) learn MAC addresses behind
|
||||||
this port.
|
this port.
|
||||||
|
|
||||||
- port_stp_update: bridge layer function invoked when a given switch port STP
|
- port_stp_state_set: bridge layer function invoked when a given switch port STP
|
||||||
state is computed by the bridge layer and should be propagated to switch
|
state is computed by the bridge layer and should be propagated to switch
|
||||||
hardware to forward/block/learn traffic. The switch driver is responsible for
|
hardware to forward/block/learn traffic. The switch driver is responsible for
|
||||||
computing a STP state change based on current and asked parameters and perform
|
computing a STP state change based on current and asked parameters and perform
|
||||||
|
@ -545,12 +545,11 @@ static void bcm_sf2_sw_br_leave(struct dsa_switch *ds, int port)
|
|||||||
priv->port_sts[port].bridge_dev = NULL;
|
priv->port_sts[port].bridge_dev = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bcm_sf2_sw_br_set_stp_state(struct dsa_switch *ds, int port,
|
static void bcm_sf2_sw_br_set_stp_state(struct dsa_switch *ds, int port,
|
||||||
u8 state)
|
u8 state)
|
||||||
{
|
{
|
||||||
struct bcm_sf2_priv *priv = ds_to_priv(ds);
|
struct bcm_sf2_priv *priv = ds_to_priv(ds);
|
||||||
u8 hw_state, cur_hw_state;
|
u8 hw_state, cur_hw_state;
|
||||||
int ret = 0;
|
|
||||||
u32 reg;
|
u32 reg;
|
||||||
|
|
||||||
reg = core_readl(priv, CORE_G_PCTL_PORT(port));
|
reg = core_readl(priv, CORE_G_PCTL_PORT(port));
|
||||||
@ -574,7 +573,7 @@ static int bcm_sf2_sw_br_set_stp_state(struct dsa_switch *ds, int port,
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
pr_err("%s: invalid STP state: %d\n", __func__, state);
|
pr_err("%s: invalid STP state: %d\n", __func__, state);
|
||||||
return -EINVAL;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fast-age ARL entries if we are moving a port from Learning or
|
/* Fast-age ARL entries if we are moving a port from Learning or
|
||||||
@ -584,10 +583,9 @@ static int bcm_sf2_sw_br_set_stp_state(struct dsa_switch *ds, int port,
|
|||||||
if (cur_hw_state != hw_state) {
|
if (cur_hw_state != hw_state) {
|
||||||
if (cur_hw_state >= G_MISTP_LEARN_STATE &&
|
if (cur_hw_state >= G_MISTP_LEARN_STATE &&
|
||||||
hw_state <= G_MISTP_LISTEN_STATE) {
|
hw_state <= G_MISTP_LISTEN_STATE) {
|
||||||
ret = bcm_sf2_sw_fast_age_port(ds, port);
|
if (bcm_sf2_sw_fast_age_port(ds, port)) {
|
||||||
if (ret) {
|
|
||||||
pr_err("%s: fast-ageing failed\n", __func__);
|
pr_err("%s: fast-ageing failed\n", __func__);
|
||||||
return ret;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -596,8 +594,6 @@ static int bcm_sf2_sw_br_set_stp_state(struct dsa_switch *ds, int port,
|
|||||||
reg &= ~(G_MISTP_STATE_MASK << G_MISTP_STATE_SHIFT);
|
reg &= ~(G_MISTP_STATE_MASK << G_MISTP_STATE_SHIFT);
|
||||||
reg |= hw_state;
|
reg |= hw_state;
|
||||||
core_writel(priv, reg, CORE_G_PCTL_PORT(port));
|
core_writel(priv, reg, CORE_G_PCTL_PORT(port));
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Address Resolution Logic routines */
|
/* Address Resolution Logic routines */
|
||||||
@ -1387,7 +1383,7 @@ static struct dsa_switch_driver bcm_sf2_switch_driver = {
|
|||||||
.set_eee = bcm_sf2_sw_set_eee,
|
.set_eee = bcm_sf2_sw_set_eee,
|
||||||
.port_bridge_join = bcm_sf2_sw_br_join,
|
.port_bridge_join = bcm_sf2_sw_br_join,
|
||||||
.port_bridge_leave = bcm_sf2_sw_br_leave,
|
.port_bridge_leave = bcm_sf2_sw_br_leave,
|
||||||
.port_stp_update = bcm_sf2_sw_br_set_stp_state,
|
.port_stp_state_set = bcm_sf2_sw_br_set_stp_state,
|
||||||
.port_fdb_prepare = bcm_sf2_sw_fdb_prepare,
|
.port_fdb_prepare = bcm_sf2_sw_fdb_prepare,
|
||||||
.port_fdb_add = bcm_sf2_sw_fdb_add,
|
.port_fdb_add = bcm_sf2_sw_fdb_add,
|
||||||
.port_fdb_del = bcm_sf2_sw_fdb_del,
|
.port_fdb_del = bcm_sf2_sw_fdb_del,
|
||||||
|
@ -105,7 +105,7 @@ struct dsa_switch_driver mv88e6171_switch_driver = {
|
|||||||
.get_regs = mv88e6xxx_get_regs,
|
.get_regs = mv88e6xxx_get_regs,
|
||||||
.port_bridge_join = mv88e6xxx_port_bridge_join,
|
.port_bridge_join = mv88e6xxx_port_bridge_join,
|
||||||
.port_bridge_leave = mv88e6xxx_port_bridge_leave,
|
.port_bridge_leave = mv88e6xxx_port_bridge_leave,
|
||||||
.port_stp_update = mv88e6xxx_port_stp_update,
|
.port_stp_state_set = mv88e6xxx_port_stp_state_set,
|
||||||
.port_vlan_filtering = mv88e6xxx_port_vlan_filtering,
|
.port_vlan_filtering = mv88e6xxx_port_vlan_filtering,
|
||||||
.port_vlan_prepare = mv88e6xxx_port_vlan_prepare,
|
.port_vlan_prepare = mv88e6xxx_port_vlan_prepare,
|
||||||
.port_vlan_add = mv88e6xxx_port_vlan_add,
|
.port_vlan_add = mv88e6xxx_port_vlan_add,
|
||||||
|
@ -326,7 +326,7 @@ struct dsa_switch_driver mv88e6352_switch_driver = {
|
|||||||
.get_regs = mv88e6xxx_get_regs,
|
.get_regs = mv88e6xxx_get_regs,
|
||||||
.port_bridge_join = mv88e6xxx_port_bridge_join,
|
.port_bridge_join = mv88e6xxx_port_bridge_join,
|
||||||
.port_bridge_leave = mv88e6xxx_port_bridge_leave,
|
.port_bridge_leave = mv88e6xxx_port_bridge_leave,
|
||||||
.port_stp_update = mv88e6xxx_port_stp_update,
|
.port_stp_state_set = mv88e6xxx_port_stp_state_set,
|
||||||
.port_vlan_filtering = mv88e6xxx_port_vlan_filtering,
|
.port_vlan_filtering = mv88e6xxx_port_vlan_filtering,
|
||||||
.port_vlan_prepare = mv88e6xxx_port_vlan_prepare,
|
.port_vlan_prepare = mv88e6xxx_port_vlan_prepare,
|
||||||
.port_vlan_add = mv88e6xxx_port_vlan_add,
|
.port_vlan_add = mv88e6xxx_port_vlan_add,
|
||||||
|
@ -1193,7 +1193,7 @@ static int _mv88e6xxx_port_based_vlan_map(struct dsa_switch *ds, int port)
|
|||||||
return _mv88e6xxx_reg_write(ds, REG_PORT(port), PORT_BASE_VLAN, reg);
|
return _mv88e6xxx_reg_write(ds, REG_PORT(port), PORT_BASE_VLAN, reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
int mv88e6xxx_port_stp_update(struct dsa_switch *ds, int port, u8 state)
|
void mv88e6xxx_port_stp_state_set(struct dsa_switch *ds, int port, u8 state)
|
||||||
{
|
{
|
||||||
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
|
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
|
||||||
int stp_state;
|
int stp_state;
|
||||||
@ -1215,14 +1215,12 @@ int mv88e6xxx_port_stp_update(struct dsa_switch *ds, int port, u8 state)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* mv88e6xxx_port_stp_update may be called with softirqs disabled,
|
/* mv88e6xxx_port_stp_state_set may be called with softirqs disabled,
|
||||||
* so we can not update the port state directly but need to schedule it.
|
* so we can not update the port state directly but need to schedule it.
|
||||||
*/
|
*/
|
||||||
ps->ports[port].state = stp_state;
|
ps->ports[port].state = stp_state;
|
||||||
set_bit(port, ps->port_state_update_mask);
|
set_bit(port, ps->port_state_update_mask);
|
||||||
schedule_work(&ps->bridge_work);
|
schedule_work(&ps->bridge_work);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _mv88e6xxx_port_pvid(struct dsa_switch *ds, int port, u16 *new,
|
static int _mv88e6xxx_port_pvid(struct dsa_switch *ds, int port, u16 *new,
|
||||||
|
@ -497,7 +497,7 @@ int mv88e6xxx_set_eee(struct dsa_switch *ds, int port,
|
|||||||
int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port,
|
int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port,
|
||||||
struct net_device *bridge);
|
struct net_device *bridge);
|
||||||
void mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port);
|
void mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port);
|
||||||
int mv88e6xxx_port_stp_update(struct dsa_switch *ds, int port, u8 state);
|
void mv88e6xxx_port_stp_state_set(struct dsa_switch *ds, int port, u8 state);
|
||||||
int mv88e6xxx_port_vlan_filtering(struct dsa_switch *ds, int port,
|
int mv88e6xxx_port_vlan_filtering(struct dsa_switch *ds, int port,
|
||||||
bool vlan_filtering);
|
bool vlan_filtering);
|
||||||
int mv88e6xxx_port_vlan_prepare(struct dsa_switch *ds, int port,
|
int mv88e6xxx_port_vlan_prepare(struct dsa_switch *ds, int port,
|
||||||
|
@ -299,8 +299,8 @@ struct dsa_switch_driver {
|
|||||||
int (*port_bridge_join)(struct dsa_switch *ds, int port,
|
int (*port_bridge_join)(struct dsa_switch *ds, int port,
|
||||||
struct net_device *bridge);
|
struct net_device *bridge);
|
||||||
void (*port_bridge_leave)(struct dsa_switch *ds, int port);
|
void (*port_bridge_leave)(struct dsa_switch *ds, int port);
|
||||||
int (*port_stp_update)(struct dsa_switch *ds, int port,
|
void (*port_stp_state_set)(struct dsa_switch *ds, int port,
|
||||||
u8 state);
|
u8 state);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* VLAN support
|
* VLAN support
|
||||||
|
@ -104,8 +104,8 @@ static int dsa_slave_open(struct net_device *dev)
|
|||||||
goto clear_promisc;
|
goto clear_promisc;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ds->drv->port_stp_update)
|
if (ds->drv->port_stp_state_set)
|
||||||
ds->drv->port_stp_update(ds, p->port, stp_state);
|
ds->drv->port_stp_state_set(ds, p->port, stp_state);
|
||||||
|
|
||||||
if (p->phy)
|
if (p->phy)
|
||||||
phy_start(p->phy);
|
phy_start(p->phy);
|
||||||
@ -147,8 +147,8 @@ static int dsa_slave_close(struct net_device *dev)
|
|||||||
if (ds->drv->port_disable)
|
if (ds->drv->port_disable)
|
||||||
ds->drv->port_disable(ds, p->port, p->phy);
|
ds->drv->port_disable(ds, p->port, p->phy);
|
||||||
|
|
||||||
if (ds->drv->port_stp_update)
|
if (ds->drv->port_stp_state_set)
|
||||||
ds->drv->port_stp_update(ds, p->port, BR_STATE_DISABLED);
|
ds->drv->port_stp_state_set(ds, p->port, BR_STATE_DISABLED);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -305,16 +305,19 @@ static int dsa_slave_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dsa_slave_stp_update(struct net_device *dev, u8 state)
|
static int dsa_slave_stp_state_set(struct net_device *dev,
|
||||||
|
const struct switchdev_attr *attr,
|
||||||
|
struct switchdev_trans *trans)
|
||||||
{
|
{
|
||||||
struct dsa_slave_priv *p = netdev_priv(dev);
|
struct dsa_slave_priv *p = netdev_priv(dev);
|
||||||
struct dsa_switch *ds = p->parent;
|
struct dsa_switch *ds = p->parent;
|
||||||
int ret = -EOPNOTSUPP;
|
|
||||||
|
|
||||||
if (ds->drv->port_stp_update)
|
if (switchdev_trans_ph_prepare(trans))
|
||||||
ret = ds->drv->port_stp_update(ds, p->port, state);
|
return ds->drv->port_stp_state_set ? 0 : -EOPNOTSUPP;
|
||||||
|
|
||||||
return ret;
|
ds->drv->port_stp_state_set(ds, p->port, attr->u.stp_state);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dsa_slave_vlan_filtering(struct net_device *dev,
|
static int dsa_slave_vlan_filtering(struct net_device *dev,
|
||||||
@ -339,17 +342,11 @@ static int dsa_slave_port_attr_set(struct net_device *dev,
|
|||||||
const struct switchdev_attr *attr,
|
const struct switchdev_attr *attr,
|
||||||
struct switchdev_trans *trans)
|
struct switchdev_trans *trans)
|
||||||
{
|
{
|
||||||
struct dsa_slave_priv *p = netdev_priv(dev);
|
|
||||||
struct dsa_switch *ds = p->parent;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
switch (attr->id) {
|
switch (attr->id) {
|
||||||
case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
|
case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
|
||||||
if (switchdev_trans_ph_prepare(trans))
|
ret = dsa_slave_stp_state_set(dev, attr, trans);
|
||||||
ret = ds->drv->port_stp_update ? 0 : -EOPNOTSUPP;
|
|
||||||
else
|
|
||||||
ret = ds->drv->port_stp_update(ds, p->port,
|
|
||||||
attr->u.stp_state);
|
|
||||||
break;
|
break;
|
||||||
case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING:
|
case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING:
|
||||||
ret = dsa_slave_vlan_filtering(dev, attr, trans);
|
ret = dsa_slave_vlan_filtering(dev, attr, trans);
|
||||||
@ -468,7 +465,8 @@ static void dsa_slave_bridge_port_leave(struct net_device *dev)
|
|||||||
/* Port left the bridge, put in BR_STATE_DISABLED by the bridge layer,
|
/* Port left the bridge, put in BR_STATE_DISABLED by the bridge layer,
|
||||||
* so allow it to be in BR_STATE_FORWARDING to be kept functional
|
* so allow it to be in BR_STATE_FORWARDING to be kept functional
|
||||||
*/
|
*/
|
||||||
dsa_slave_stp_update(dev, BR_STATE_FORWARDING);
|
if (ds->drv->port_stp_state_set)
|
||||||
|
ds->drv->port_stp_state_set(ds, p->port, BR_STATE_FORWARDING);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dsa_slave_port_attr_get(struct net_device *dev,
|
static int dsa_slave_port_attr_get(struct net_device *dev,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user