net: dsa: add a "tx_fwd_offload" argument to ->port_bridge_join
authorVladimir Oltean <vladimir.oltean@nxp.com>
Mon, 6 Dec 2021 16:57:57 +0000 (18:57 +0200)
committerJakub Kicinski <kuba@kernel.org>
Wed, 8 Dec 2021 22:31:16 +0000 (14:31 -0800)
This is a preparation patch for the removal of the DSA switch methods
->port_bridge_tx_fwd_offload() and ->port_bridge_tx_fwd_unoffload().
The plan is for the switch to report whether it offloads TX forwarding
directly as a response to the ->port_bridge_join() method.

This change deals with the noisy portion of converting all existing
function prototypes to take this new boolean pointer argument.
The bool is placed in the cross-chip notifier structure for bridge join,
and a reference to it is provided to drivers. In the next change, DSA
will then actually look at this value instead of calling
->port_bridge_tx_fwd_offload().

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Alvin Šipraga <alsi@bang-olufsen.dk>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
18 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/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/switch.c

index 4e41b1a..3867f3d 100644 (file)
@@ -1860,7 +1860,8 @@ 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)
+int b53_br_join(struct dsa_switch *ds, int port, struct dsa_bridge bridge,
+               bool *tx_fwd_offload)
 {
        struct b53_device *dev = ds->priv;
        s8 cpu_port = dsa_to_port(ds, port)->cpu_dp->index;
index ee17f8b..b41dc8a 100644 (file)
@@ -324,7 +324,8 @@ void b53_get_strings(struct dsa_switch *ds, int port, u32 stringset,
 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);
+int b53_br_join(struct dsa_switch *ds, int port, struct dsa_bridge bridge,
+               bool *tx_fwd_offload);
 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 70db3a9..33daaf1 100644 (file)
@@ -167,7 +167,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)
+                                    struct dsa_bridge bridge,
+                                    bool *tx_fwd_offload)
 {
        dev_dbg(ds->dev, "%s: port: %d, bridge: %s\n",
                __func__, port, bridge.dev->name);
index c8dc83c..9eecb75 100644 (file)
@@ -674,7 +674,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)
+                                     struct dsa_bridge bridge,
+                                     bool *tx_fwd_offload)
 {
        struct hellcreek *hellcreek = ds->priv;
 
index 29d9094..d55784d 100644 (file)
@@ -1103,7 +1103,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)
+                                   struct dsa_bridge bridge,
+                                   bool *tx_fwd_offload)
 {
        struct lan9303 *chip = ds->priv;
 
index 1f59fef..46ed953 100644 (file)
@@ -1146,7 +1146,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)
+                                 struct dsa_bridge bridge,
+                                 bool *tx_fwd_offload)
 {
        struct net_device *br = bridge.dev;
        struct gswip_priv *priv = ds->priv;
index 40d6e3f..47a8565 100644 (file)
@@ -192,7 +192,8 @@ void ksz_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *buf)
 EXPORT_SYMBOL_GPL(ksz_get_ethtool_stats);
 
 int ksz_port_bridge_join(struct dsa_switch *ds, int port,
-                        struct dsa_bridge bridge)
+                        struct dsa_bridge bridge,
+                        bool *tx_fwd_offload)
 {
        /* port_stp_state_set() will be called after to put the port in
         * appropriate state so there is no need to do anything.
index 88e5a5d..df8ae59 100644 (file)
@@ -155,7 +155,7 @@ 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);
+                        struct dsa_bridge bridge, bool *tx_fwd_offload);
 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 5b74c54..b82512e 100644 (file)
@@ -1186,7 +1186,7 @@ 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)
+                       struct dsa_bridge bridge, bool *tx_fwd_offload)
 {
        struct dsa_port *dp = dsa_to_port(ds, port), *other_dp;
        u32 port_bitmap = BIT(MT7530_CPU_PORT);
index aa5c5d4..c49abfb 100644 (file)
@@ -2442,7 +2442,8 @@ static int mv88e6xxx_bridge_map(struct mv88e6xxx_chip *chip,
 }
 
 static int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port,
-                                     struct dsa_bridge bridge)
+                                     struct dsa_bridge bridge,
+                                     bool *tx_fwd_offload)
 {
        struct mv88e6xxx_chip *chip = ds->priv;
        int err;
index b7e5a5c..01655bd 100644 (file)
@@ -706,7 +706,7 @@ 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)
+                            struct dsa_bridge bridge, bool *tx_fwd_offload)
 {
        struct ocelot *ocelot = ds->priv;
 
index dc983f7..0396945 100644 (file)
@@ -1811,7 +1811,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)
+                                 struct dsa_bridge bridge,
+                                 bool *tx_fwd_offload)
 {
        struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
        int port_mask, cpu_port;
index fac2333..ecc19bd 100644 (file)
@@ -1186,7 +1186,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)
+                          struct dsa_bridge bridge,
+                          bool *tx_fwd_offload)
 {
        struct realtek_smi *smi = ds->priv;
        unsigned int port_bitmap = 0;
index 24584fe..21622c6 100644 (file)
@@ -2074,7 +2074,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)
+                              struct dsa_bridge bridge,
+                              bool *tx_fwd_offload)
 {
        return sja1105_bridge_member(ds, port, bridge, true);
 }
index ebb55df..35fa19d 100644 (file)
@@ -540,7 +540,7 @@ 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)
+                              struct dsa_bridge bridge, bool *tx_fwd_offload)
 {
        return xrs700x_bridge_common(ds, port, bridge, true);
 }
index b9789c0..584b3f9 100644 (file)
@@ -822,7 +822,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);
+                                   struct dsa_bridge bridge,
+                                   bool *tx_fwd_offload);
        void    (*port_bridge_leave)(struct dsa_switch *ds, int port,
                                     struct dsa_bridge bridge);
        /* Called right after .port_bridge_join() */
index da6ff99..38ce512 100644 (file)
@@ -56,6 +56,7 @@ struct dsa_notifier_bridge_info {
        int tree_index;
        int sw_index;
        int port;
+       bool tx_fwd_offload;
 };
 
 /* DSA_NOTIFIER_FDB_* */
index cd0630d..9c92edd 100644 (file)
@@ -95,7 +95,8 @@ static int dsa_switch_bridge_join(struct dsa_switch *ds,
                if (!ds->ops->port_bridge_join)
                        return -EOPNOTSUPP;
 
-               err = ds->ops->port_bridge_join(ds, info->port, info->bridge);
+               err = ds->ops->port_bridge_join(ds, info->port, info->bridge,
+                                               &info->tx_fwd_offload);
                if (err)
                        return err;
        }