On Fri, Dec 17, 2021 at 04:53:52PM +0100, Horatiu Vultur wrote: > Currently allow a port to be part or not of the multicast flooding mask. > By implementing the switchdev calls SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS > and SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS. > > Signed-off-by: Horatiu Vultur <horatiu.vultur@xxxxxxxxxxxxx> > --- > .../microchip/lan966x/lan966x_switchdev.c | 34 +++++++++++++++++++ > 1 file changed, 34 insertions(+) > > diff --git a/drivers/net/ethernet/microchip/lan966x/lan966x_switchdev.c b/drivers/net/ethernet/microchip/lan966x/lan966x_switchdev.c > index cef9e690fb82..af227b33cb3f 100644 > --- a/drivers/net/ethernet/microchip/lan966x/lan966x_switchdev.c > +++ b/drivers/net/ethernet/microchip/lan966x/lan966x_switchdev.c > @@ -9,6 +9,34 @@ static struct notifier_block lan966x_netdevice_nb __read_mostly; > static struct notifier_block lan966x_switchdev_nb __read_mostly; > static struct notifier_block lan966x_switchdev_blocking_nb __read_mostly; > > +static void lan966x_port_bridge_flags(struct lan966x_port *port, > + struct switchdev_brport_flags flags) > +{ > + u32 val = lan_rd(port->lan966x, ANA_PGID(PGID_MC)); > + > + val = ANA_PGID_PGID_GET(val); Ideally you'd want to read PGID_MC only if you know that BR_MCAST_FLOOD is the flag getting changed. Otherwise you'd have to refactor this when you add support for more brport flags. > + > + if (flags.mask & BR_MCAST_FLOOD) { > + if (flags.val & BR_MCAST_FLOOD) > + val |= BIT(port->chip_port); > + else > + val &= ~BIT(port->chip_port); > + } > + > + lan_rmw(ANA_PGID_PGID_SET(val), > + ANA_PGID_PGID, > + port->lan966x, ANA_PGID(PGID_MC)); > +} > + > +static int lan966x_port_pre_bridge_flags(struct lan966x_port *port, > + struct switchdev_brport_flags flags) > +{ > + if (flags.mask & ~BR_MCAST_FLOOD) > + return -EINVAL; > + > + return 0; > +} > + > static void lan966x_update_fwd_mask(struct lan966x *lan966x) > { > int i; > @@ -67,6 +95,12 @@ static int lan966x_port_attr_set(struct net_device *dev, const void *ctx, > return 0; > > switch (attr->id) { > + case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS: > + lan966x_port_bridge_flags(port, attr->u.brport_flags); > + break; > + case SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS: > + err = lan966x_port_pre_bridge_flags(port, attr->u.brport_flags); > + break; > case SWITCHDEV_ATTR_ID_PORT_STP_STATE: > lan966x_port_stp_state_set(port, attr->u.stp_state); > break; > -- > 2.33.0 >