diff options
Diffstat (limited to 'net/dsa')
| -rw-r--r-- | net/dsa/dsa_priv.h | 2 | ||||
| -rw-r--r-- | net/dsa/port.c | 12 | ||||
| -rw-r--r-- | net/dsa/slave.c | 3 | 
3 files changed, 17 insertions, 0 deletions
| diff --git a/net/dsa/dsa_priv.h b/net/dsa/dsa_priv.h index b2be53a13aa0..12f8c7ee4dd8 100644 --- a/net/dsa/dsa_priv.h +++ b/net/dsa/dsa_priv.h @@ -150,6 +150,8 @@ int dsa_port_pre_bridge_flags(const struct dsa_port *dp, unsigned long flags,  			      struct switchdev_trans *trans);  int dsa_port_bridge_flags(const struct dsa_port *dp, unsigned long flags,  			  struct switchdev_trans *trans); +int dsa_port_mrouter(struct dsa_port *dp, bool mrouter, +		     struct switchdev_trans *trans);  int dsa_port_vlan_add(struct dsa_port *dp,  		      const struct switchdev_obj_port_vlan *vlan,  		      struct switchdev_trans *trans); diff --git a/net/dsa/port.c b/net/dsa/port.c index d2b65e8dc60c..f071acf2842b 100644 --- a/net/dsa/port.c +++ b/net/dsa/port.c @@ -261,6 +261,18 @@ int dsa_port_bridge_flags(const struct dsa_port *dp, unsigned long flags,  	return err;  } +int dsa_port_mrouter(struct dsa_port *dp, bool mrouter, +		     struct switchdev_trans *trans) +{ +	struct dsa_switch *ds = dp->ds; +	int port = dp->index; + +	if (switchdev_trans_ph_prepare(trans)) +		return ds->ops->port_egress_floods ? 0 : -EOPNOTSUPP; + +	return ds->ops->port_egress_floods(ds, port, true, mrouter); +} +  int dsa_port_fdb_add(struct dsa_port *dp, const unsigned char *addr,  		     u16 vid)  { diff --git a/net/dsa/slave.c b/net/dsa/slave.c index 9bcb598fc840..614c38ece104 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c @@ -301,6 +301,9 @@ static int dsa_slave_port_attr_set(struct net_device *dev,  	case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS:  		ret = dsa_port_bridge_flags(dp, attr->u.brport_flags, trans);  		break; +	case SWITCHDEV_ATTR_ID_BRIDGE_MROUTER: +		ret = dsa_port_mrouter(dp->cpu_dp, attr->u.mrouter, trans); +		break;  	default:  		ret = -EOPNOTSUPP;  		break; | 

