Message ID | 20211217155353.460594-9-horatiu.vultur@microchip.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | net: lan966x: Add switchdev and vlan support | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Clearly marked for net-next |
netdev/fixes_present | success | Fixes tag not required for -next series |
netdev/subject_prefix | success | Link |
netdev/cover_letter | success | Series has a cover letter |
netdev/patch_count | success | Link |
netdev/header_inline | success | No static functions without inline keyword in header files |
netdev/build_32bit | success | Errors and warnings before: 0 this patch: 0 |
netdev/cc_maintainers | success | CCed 5 of 5 maintainers |
netdev/build_clang | success | Errors and warnings before: 0 this patch: 0 |
netdev/module_param | success | Was 0 now: 0 |
netdev/verify_signedoff | success | Signed-off-by tag matches author and committer |
netdev/verify_fixes | success | No Fixes tag |
netdev/build_allmodconfig_warn | success | Errors and warnings before: 0 this patch: 0 |
netdev/checkpatch | success | total: 0 errors, 0 warnings, 0 checks, 46 lines checked |
netdev/kdoc | success | Errors and warnings before: 0 this patch: 0 |
netdev/source_inline | success | Was 0 now: 0 |
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@microchip.com> > --- > .../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 >
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@microchip.com> > > --- > > .../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 > >
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); + + 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;
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@microchip.com> --- .../microchip/lan966x/lan966x_switchdev.c | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+)