net: dsa: Pass VLAN MSTI migration notifications to driver
authorTobias Waldekranz <tobias@waldekranz.com>
Wed, 16 Mar 2022 15:08:53 +0000 (16:08 +0100)
committerJakub Kicinski <kuba@kernel.org>
Thu, 17 Mar 2022 23:49:59 +0000 (16:49 -0700)
Add the usual trampoline functionality from the generic DSA layer down
to the drivers for VLAN MSTI migrations.

Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/dsa.h
net/dsa/dsa_priv.h
net/dsa/port.c
net/dsa/slave.c

index 9bfe984..644fda2 100644 (file)
@@ -976,6 +976,9 @@ struct dsa_switch_ops {
                                 struct netlink_ext_ack *extack);
        int     (*port_vlan_del)(struct dsa_switch *ds, int port,
                                 const struct switchdev_obj_port_vlan *vlan);
+       int     (*vlan_msti_set)(struct dsa_switch *ds, struct dsa_bridge bridge,
+                                const struct switchdev_vlan_msti *msti);
+
        /*
         * Forwarding database
         */
index 2aba420..d90b4cf 100644 (file)
@@ -236,6 +236,8 @@ bool dsa_port_skip_vlan_configuration(struct dsa_port *dp);
 int dsa_port_ageing_time(struct dsa_port *dp, clock_t ageing_clock);
 int dsa_port_mst_enable(struct dsa_port *dp, bool on,
                        struct netlink_ext_ack *extack);
+int dsa_port_vlan_msti(struct dsa_port *dp,
+                      const struct switchdev_vlan_msti *msti);
 int dsa_port_mtu_change(struct dsa_port *dp, int new_mtu,
                        bool targeted_match);
 int dsa_port_fdb_add(struct dsa_port *dp, const unsigned char *addr,
index 0221403..3ac114f 100644 (file)
@@ -323,7 +323,10 @@ static void dsa_port_bridge_destroy(struct dsa_port *dp,
 
 static bool dsa_port_supports_mst(struct dsa_port *dp)
 {
-       return dsa_port_can_configure_learning(dp);
+       struct dsa_switch *ds = dp->ds;
+
+       return ds->ops->vlan_msti_set &&
+               dsa_port_can_configure_learning(dp);
 }
 
 int dsa_port_bridge_join(struct dsa_port *dp, struct net_device *br,
@@ -800,6 +803,17 @@ int dsa_port_bridge_flags(struct dsa_port *dp,
        return 0;
 }
 
+int dsa_port_vlan_msti(struct dsa_port *dp,
+                      const struct switchdev_vlan_msti *msti)
+{
+       struct dsa_switch *ds = dp->ds;
+
+       if (!ds->ops->vlan_msti_set)
+               return -EOPNOTSUPP;
+
+       return ds->ops->vlan_msti_set(ds, *dp->bridge, msti);
+}
+
 int dsa_port_mtu_change(struct dsa_port *dp, int new_mtu,
                        bool targeted_match)
 {
index 6393a35..945e1ab 100644 (file)
@@ -483,6 +483,12 @@ static int dsa_slave_port_attr_set(struct net_device *dev, const void *ctx,
 
                ret = dsa_port_bridge_flags(dp, attr->u.brport_flags, extack);
                break;
+       case SWITCHDEV_ATTR_ID_VLAN_MSTI:
+               if (!dsa_port_offloads_bridge_dev(dp, attr->orig_dev))
+                       return -EOPNOTSUPP;
+
+               ret = dsa_port_vlan_msti(dp, &attr->u.vlan_msti);
+               break;
        default:
                ret = -EOPNOTSUPP;
                break;