On Wed, Feb 13, 2019 at 02:06:32PM -0800, Florian Fainelli wrote: > In preparation for getting rid of switchdev_port_attr_get(), have mlxsw > check for the bridge flags being set through switchdev_port_attr_set() > when the SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS attribute identifier is > used. > > Signed-off-by: Florian Fainelli <f.fainelli@xxxxxxxxx> > --- > .../ethernet/mellanox/mlxsw/spectrum_switchdev.c | 14 +++++++++++--- > 1 file changed, 11 insertions(+), 3 deletions(-) > > diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c > index 1f492b7dbea8..7616eab50035 100644 > --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c > +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c > @@ -598,13 +598,17 @@ mlxsw_sp_bridge_port_learning_set(struct mlxsw_sp_port *mlxsw_sp_port, > static int mlxsw_sp_port_attr_br_flags_set(struct mlxsw_sp_port *mlxsw_sp_port, > struct switchdev_trans *trans, > struct net_device *orig_dev, > - unsigned long brport_flags) > + unsigned long brport_flags, > + bool pre_set) > { > struct mlxsw_sp_bridge_port *bridge_port; > int err; > > - if (switchdev_trans_ph_prepare(trans)) > + if (switchdev_trans_ph_prepare(trans) && pre_set) { > + if (brport_flags & ~(BR_LEARNING | BR_FLOOD | BR_MCAST_FLOOD)) > + return -EOPNOTSUPP; > return 0; > + } When we get SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS we only want to perform a check. With this code in case it's not prepare phase, then we continue to set the flags. Better do: if (pre_set) { if (switchdev_trans_ph_commit(trans)) return 0; // perform check here } > > bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp_port->mlxsw_sp->bridge, > orig_dev); > @@ -833,6 +837,7 @@ static int mlxsw_sp_port_attr_set(struct net_device *dev, > struct switchdev_trans *trans) > { > struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev); > + bool pre_set = false; > int err; > > switch (attr->id) { > @@ -841,10 +846,13 @@ static int mlxsw_sp_port_attr_set(struct net_device *dev, > attr->orig_dev, > attr->u.stp_state); > break; > + case SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS: > + pre_set = true; /* fall through */ > case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS: > err = mlxsw_sp_port_attr_br_flags_set(mlxsw_sp_port, trans, > attr->orig_dev, > - attr->u.brport_flags); > + attr->u.brport_flags, > + pre_set); > break; > case SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME: > err = mlxsw_sp_port_attr_br_ageing_set(mlxsw_sp_port, trans, > -- > 2.17.1 >