The 12/17/2021 17:40, Vladimir Oltean wrote: > > 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. I can see your point. I will refactor this now, such that when new flags are added this should not be changed. > > > + > > + 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 > > -- /Horatiu