net: dsa: pass extack to .port_bridge_join driver methods
authorVladimir Oltean <vladimir.oltean@nxp.com>
Fri, 25 Feb 2022 09:22:23 +0000 (11:22 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sun, 27 Feb 2022 11:06:14 +0000 (11:06 +0000)
As FDB isolation cannot be enforced between VLAN-aware bridges in lack
of hardware assistance like extra FID bits, it seems plausible that many
DSA switches cannot do it. Therefore, they need to reject configurations
with multiple VLAN-aware bridges from the two code paths that can
transition towards that state:

- joining a VLAN-aware bridge
- toggling VLAN awareness on an existing bridge

The .port_vlan_filtering method already propagates the netlink extack to
the driver, let's propagate it from .port_bridge_join too, to make sure
that the driver can use the same function for both.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
19 files changed:
drivers/net/dsa/b53/b53_common.c
drivers/net/dsa/b53/b53_priv.h
drivers/net/dsa/dsa_loop.c
drivers/net/dsa/hirschmann/hellcreek.c
drivers/net/dsa/lan9303-core.c
drivers/net/dsa/lantiq_gswip.c
drivers/net/dsa/microchip/ksz_common.c
drivers/net/dsa/microchip/ksz_common.h
drivers/net/dsa/mt7530.c
drivers/net/dsa/mv88e6xxx/chip.c
drivers/net/dsa/ocelot/felix.c
drivers/net/dsa/qca8k.c
drivers/net/dsa/realtek/rtl8366rb.c
drivers/net/dsa/sja1105/sja1105_main.c
drivers/net/dsa/xrs700x/xrs700x.c
include/net/dsa.h
net/dsa/dsa_priv.h
net/dsa/port.c
net/dsa/switch.c

index a8cc6e1..122e637 100644 (file)
@@ -1869,7 +1869,7 @@ int b53_mdb_del(struct dsa_switch *ds, int port,
 EXPORT_SYMBOL(b53_mdb_del);
 
 int b53_br_join(struct dsa_switch *ds, int port, struct dsa_bridge bridge,
-               bool *tx_fwd_offload)
+               bool *tx_fwd_offload, struct netlink_ext_ack *extack)
 {
        struct b53_device *dev = ds->priv;
        s8 cpu_port = dsa_to_port(ds, port)->cpu_dp->index;
index d3091f0..86e7eb7 100644 (file)
@@ -324,7 +324,7 @@ void b53_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *data);
 int b53_get_sset_count(struct dsa_switch *ds, int port, int sset);
 void b53_get_ethtool_phy_stats(struct dsa_switch *ds, int port, uint64_t *data);
 int b53_br_join(struct dsa_switch *ds, int port, struct dsa_bridge bridge,
-               bool *tx_fwd_offload);
+               bool *tx_fwd_offload, struct netlink_ext_ack *extack);
 void b53_br_leave(struct dsa_switch *ds, int port, struct dsa_bridge bridge);
 void b53_br_set_stp_state(struct dsa_switch *ds, int port, u8 state);
 void b53_br_fast_age(struct dsa_switch *ds, int port);
index 33daaf1..263e411 100644 (file)
@@ -168,7 +168,8 @@ static int dsa_loop_phy_write(struct dsa_switch *ds, int port,
 
 static int dsa_loop_port_bridge_join(struct dsa_switch *ds, int port,
                                     struct dsa_bridge bridge,
-                                    bool *tx_fwd_offload)
+                                    bool *tx_fwd_offload,
+                                    struct netlink_ext_ack *extack)
 {
        dev_dbg(ds->dev, "%s: port: %d, bridge: %s\n",
                __func__, port, bridge.dev->name);
index cb89be9..ac1f3b3 100644 (file)
@@ -675,7 +675,8 @@ static int hellcreek_bridge_flags(struct dsa_switch *ds, int port,
 
 static int hellcreek_port_bridge_join(struct dsa_switch *ds, int port,
                                      struct dsa_bridge bridge,
-                                     bool *tx_fwd_offload)
+                                     bool *tx_fwd_offload,
+                                     struct netlink_ext_ack *extack)
 {
        struct hellcreek *hellcreek = ds->priv;
 
index a21184e..e03ff1f 100644 (file)
@@ -1111,7 +1111,8 @@ static void lan9303_port_disable(struct dsa_switch *ds, int port)
 
 static int lan9303_port_bridge_join(struct dsa_switch *ds, int port,
                                    struct dsa_bridge bridge,
-                                   bool *tx_fwd_offload)
+                                   bool *tx_fwd_offload,
+                                   struct netlink_ext_ack *extack)
 {
        struct lan9303 *chip = ds->priv;
 
index 3dfb532..a8bd233 100644 (file)
@@ -1152,7 +1152,8 @@ static int gswip_vlan_remove(struct gswip_priv *priv,
 
 static int gswip_port_bridge_join(struct dsa_switch *ds, int port,
                                  struct dsa_bridge bridge,
-                                 bool *tx_fwd_offload)
+                                 bool *tx_fwd_offload,
+                                 struct netlink_ext_ack *extack)
 {
        struct net_device *br = bridge.dev;
        struct gswip_priv *priv = ds->priv;
index 104458e..8014b18 100644 (file)
@@ -217,7 +217,8 @@ EXPORT_SYMBOL_GPL(ksz_get_ethtool_stats);
 
 int ksz_port_bridge_join(struct dsa_switch *ds, int port,
                         struct dsa_bridge bridge,
-                        bool *tx_fwd_offload)
+                        bool *tx_fwd_offload,
+                        struct netlink_ext_ack *extack)
 {
        /* port_stp_state_set() will be called after to put the port in
         * appropriate state so there is no need to do anything.
index 6693344..4ff0a15 100644 (file)
@@ -159,7 +159,8 @@ void ksz_mac_link_down(struct dsa_switch *ds, int port, unsigned int mode,
 int ksz_sset_count(struct dsa_switch *ds, int port, int sset);
 void ksz_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *buf);
 int ksz_port_bridge_join(struct dsa_switch *ds, int port,
-                        struct dsa_bridge bridge, bool *tx_fwd_offload);
+                        struct dsa_bridge bridge, bool *tx_fwd_offload,
+                        struct netlink_ext_ack *extack);
 void ksz_port_bridge_leave(struct dsa_switch *ds, int port,
                           struct dsa_bridge bridge);
 void ksz_port_fast_age(struct dsa_switch *ds, int port);
index abe63ec..66b00c1 100644 (file)
@@ -1186,7 +1186,8 @@ mt7530_port_bridge_flags(struct dsa_switch *ds, int port,
 
 static int
 mt7530_port_bridge_join(struct dsa_switch *ds, int port,
-                       struct dsa_bridge bridge, bool *tx_fwd_offload)
+                       struct dsa_bridge bridge, bool *tx_fwd_offload,
+                       struct netlink_ext_ack *extack)
 {
        struct dsa_port *dp = dsa_to_port(ds, port), *other_dp;
        u32 port_bitmap = BIT(MT7530_CPU_PORT);
index d79c65b..84b90fc 100644 (file)
@@ -2618,7 +2618,8 @@ static int mv88e6xxx_map_virtual_bridge_to_pvt(struct dsa_switch *ds,
 
 static int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port,
                                      struct dsa_bridge bridge,
-                                     bool *tx_fwd_offload)
+                                     bool *tx_fwd_offload,
+                                     struct netlink_ext_ack *extack)
 {
        struct mv88e6xxx_chip *chip = ds->priv;
        int err;
@@ -2684,7 +2685,8 @@ static void mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port,
 
 static int mv88e6xxx_crosschip_bridge_join(struct dsa_switch *ds,
                                           int tree_index, int sw_index,
-                                          int port, struct dsa_bridge bridge)
+                                          int port, struct dsa_bridge bridge,
+                                          struct netlink_ext_ack *extack)
 {
        struct mv88e6xxx_chip *chip = ds->priv;
        int err;
index 4d3b0ba..c2e0d2b 100644 (file)
@@ -674,7 +674,8 @@ static int felix_bridge_flags(struct dsa_switch *ds, int port,
 }
 
 static int felix_bridge_join(struct dsa_switch *ds, int port,
-                            struct dsa_bridge bridge, bool *tx_fwd_offload)
+                            struct dsa_bridge bridge, bool *tx_fwd_offload,
+                            struct netlink_ext_ack *extack)
 {
        struct ocelot *ocelot = ds->priv;
 
index 95104ae..ee0dbf3 100644 (file)
@@ -2247,7 +2247,8 @@ qca8k_port_stp_state_set(struct dsa_switch *ds, int port, u8 state)
 
 static int qca8k_port_bridge_join(struct dsa_switch *ds, int port,
                                  struct dsa_bridge bridge,
-                                 bool *tx_fwd_offload)
+                                 bool *tx_fwd_offload,
+                                 struct netlink_ext_ack *extack)
 {
        struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
        int port_mask, cpu_port;
index fb6565e..1a3406b 100644 (file)
@@ -1189,7 +1189,8 @@ rtl8366rb_port_disable(struct dsa_switch *ds, int port)
 static int
 rtl8366rb_port_bridge_join(struct dsa_switch *ds, int port,
                           struct dsa_bridge bridge,
-                          bool *tx_fwd_offload)
+                          bool *tx_fwd_offload,
+                          struct netlink_ext_ack *extack)
 {
        struct realtek_priv *priv = ds->priv;
        unsigned int port_bitmap = 0;
index 3a5e37c..edcf9b2 100644 (file)
@@ -2071,7 +2071,8 @@ static void sja1105_bridge_stp_state_set(struct dsa_switch *ds, int port,
 
 static int sja1105_bridge_join(struct dsa_switch *ds, int port,
                               struct dsa_bridge bridge,
-                              bool *tx_fwd_offload)
+                              bool *tx_fwd_offload,
+                              struct netlink_ext_ack *extack)
 {
        int rc;
 
index bc06fe6..3887ed3 100644 (file)
@@ -534,7 +534,8 @@ static int xrs700x_bridge_common(struct dsa_switch *ds, int port,
 }
 
 static int xrs700x_bridge_join(struct dsa_switch *ds, int port,
-                              struct dsa_bridge bridge, bool *tx_fwd_offload)
+                              struct dsa_bridge bridge, bool *tx_fwd_offload,
+                              struct netlink_ext_ack *extack)
 {
        return xrs700x_bridge_common(ds, port, bridge, true);
 }
index 87c5f18..cfedcfb 100644 (file)
@@ -937,7 +937,8 @@ struct dsa_switch_ops {
        int     (*set_ageing_time)(struct dsa_switch *ds, unsigned int msecs);
        int     (*port_bridge_join)(struct dsa_switch *ds, int port,
                                    struct dsa_bridge bridge,
-                                   bool *tx_fwd_offload);
+                                   bool *tx_fwd_offload,
+                                   struct netlink_ext_ack *extack);
        void    (*port_bridge_leave)(struct dsa_switch *ds, int port,
                                     struct dsa_bridge bridge);
        void    (*port_stp_state_set)(struct dsa_switch *ds, int port,
@@ -1021,7 +1022,8 @@ struct dsa_switch_ops {
         */
        int     (*crosschip_bridge_join)(struct dsa_switch *ds, int tree_index,
                                         int sw_index, int port,
-                                        struct dsa_bridge bridge);
+                                        struct dsa_bridge bridge,
+                                        struct netlink_ext_ack *extack);
        void    (*crosschip_bridge_leave)(struct dsa_switch *ds, int tree_index,
                                          int sw_index, int port,
                                          struct dsa_bridge bridge);
index 27575fc..07c0ad5 100644 (file)
@@ -59,6 +59,7 @@ struct dsa_notifier_bridge_info {
        int sw_index;
        int port;
        bool tx_fwd_offload;
+       struct netlink_ext_ack *extack;
 };
 
 /* DSA_NOTIFIER_FDB_* */
index 7af44a2..d9da425 100644 (file)
@@ -328,6 +328,7 @@ int dsa_port_bridge_join(struct dsa_port *dp, struct net_device *br,
                .tree_index = dp->ds->dst->index,
                .sw_index = dp->ds->index,
                .port = dp->index,
+               .extack = extack,
        };
        struct net_device *dev = dp->slave;
        struct net_device *brport_dev;
index 1d3c161..327d66b 100644 (file)
@@ -96,7 +96,8 @@ static int dsa_switch_bridge_join(struct dsa_switch *ds,
                        return -EOPNOTSUPP;
 
                err = ds->ops->port_bridge_join(ds, info->port, info->bridge,
-                                               &info->tx_fwd_offload);
+                                               &info->tx_fwd_offload,
+                                               info->extack);
                if (err)
                        return err;
        }
@@ -105,7 +106,8 @@ static int dsa_switch_bridge_join(struct dsa_switch *ds,
            ds->ops->crosschip_bridge_join) {
                err = ds->ops->crosschip_bridge_join(ds, info->tree_index,
                                                     info->sw_index,
-                                                    info->port, info->bridge);
+                                                    info->port, info->bridge,
+                                                    info->extack);
                if (err)
                        return err;
        }