]> git.baikalelectronics.ru Git - kernel.git/commitdiff
net: dsa: qca8k: move bridge functions to common code
authorChristian Marangi <ansuelsmth@gmail.com>
Wed, 27 Jul 2022 11:35:17 +0000 (13:35 +0200)
committerJakub Kicinski <kuba@kernel.org>
Fri, 29 Jul 2022 05:24:39 +0000 (22:24 -0700)
The same bridge functions are used by drivers based on qca8k family
switch. Move them to common code to make them accessible also by other
drivers.
While at it also drop unnecessary qca8k_priv cast for void pointers.

Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/dsa/qca/qca8k-8xxx.c
drivers/net/dsa/qca/qca8k-common.c
drivers/net/dsa/qca/qca8k.h

index 9729aabbd83d6e91e53940b1b6dc2178d269df39..11d3116733af39d6ecf06173e115f3d84b57af8f 100644 (file)
@@ -1898,99 +1898,6 @@ exit:
        return ret;
 }
 
-static void
-qca8k_port_stp_state_set(struct dsa_switch *ds, int port, u8 state)
-{
-       struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
-       u32 stp_state;
-
-       switch (state) {
-       case BR_STATE_DISABLED:
-               stp_state = QCA8K_PORT_LOOKUP_STATE_DISABLED;
-               break;
-       case BR_STATE_BLOCKING:
-               stp_state = QCA8K_PORT_LOOKUP_STATE_BLOCKING;
-               break;
-       case BR_STATE_LISTENING:
-               stp_state = QCA8K_PORT_LOOKUP_STATE_LISTENING;
-               break;
-       case BR_STATE_LEARNING:
-               stp_state = QCA8K_PORT_LOOKUP_STATE_LEARNING;
-               break;
-       case BR_STATE_FORWARDING:
-       default:
-               stp_state = QCA8K_PORT_LOOKUP_STATE_FORWARD;
-               break;
-       }
-
-       qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port),
-                 QCA8K_PORT_LOOKUP_STATE_MASK, stp_state);
-}
-
-static int qca8k_port_bridge_join(struct dsa_switch *ds, int port,
-                                 struct dsa_bridge bridge,
-                                 bool *tx_fwd_offload,
-                                 struct netlink_ext_ack *extack)
-{
-       struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
-       int port_mask, cpu_port;
-       int i, ret;
-
-       cpu_port = dsa_to_port(ds, port)->cpu_dp->index;
-       port_mask = BIT(cpu_port);
-
-       for (i = 0; i < QCA8K_NUM_PORTS; i++) {
-               if (dsa_is_cpu_port(ds, i))
-                       continue;
-               if (!dsa_port_offloads_bridge(dsa_to_port(ds, i), &bridge))
-                       continue;
-               /* Add this port to the portvlan mask of the other ports
-                * in the bridge
-                */
-               ret = regmap_set_bits(priv->regmap,
-                                     QCA8K_PORT_LOOKUP_CTRL(i),
-                                     BIT(port));
-               if (ret)
-                       return ret;
-               if (i != port)
-                       port_mask |= BIT(i);
-       }
-
-       /* Add all other ports to this ports portvlan mask */
-       ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port),
-                       QCA8K_PORT_LOOKUP_MEMBER, port_mask);
-
-       return ret;
-}
-
-static void qca8k_port_bridge_leave(struct dsa_switch *ds, int port,
-                                   struct dsa_bridge bridge)
-{
-       struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
-       int cpu_port, i;
-
-       cpu_port = dsa_to_port(ds, port)->cpu_dp->index;
-
-       for (i = 0; i < QCA8K_NUM_PORTS; i++) {
-               if (dsa_is_cpu_port(ds, i))
-                       continue;
-               if (!dsa_port_offloads_bridge(dsa_to_port(ds, i), &bridge))
-                       continue;
-               /* Remove this port to the portvlan mask of the other ports
-                * in the bridge
-                */
-               regmap_clear_bits(priv->regmap,
-                                 QCA8K_PORT_LOOKUP_CTRL(i),
-                                 BIT(port));
-       }
-
-       /* Set the cpu port to be the only one in the portvlan mask of
-        * this port
-        */
-       qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port),
-                 QCA8K_PORT_LOOKUP_MEMBER, BIT(cpu_port));
-}
-
 static void
 qca8k_port_fast_age(struct dsa_switch *ds, int port)
 {
index c662fdbae51f4fc755eb90922ef1f2a8a1d8c882..13069c9ba3e6c5156b49e6260b1e53f2186b9b39 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <linux/netdevice.h>
 #include <net/dsa.h>
+#include <linux/if_bridge.h>
 
 #include "qca8k.h"
 
@@ -275,3 +276,95 @@ int qca8k_get_mac_eee(struct dsa_switch *ds, int port,
        /* Nothing to do on the port's MAC */
        return 0;
 }
+
+void qca8k_port_stp_state_set(struct dsa_switch *ds, int port, u8 state)
+{
+       struct qca8k_priv *priv = ds->priv;
+       u32 stp_state;
+
+       switch (state) {
+       case BR_STATE_DISABLED:
+               stp_state = QCA8K_PORT_LOOKUP_STATE_DISABLED;
+               break;
+       case BR_STATE_BLOCKING:
+               stp_state = QCA8K_PORT_LOOKUP_STATE_BLOCKING;
+               break;
+       case BR_STATE_LISTENING:
+               stp_state = QCA8K_PORT_LOOKUP_STATE_LISTENING;
+               break;
+       case BR_STATE_LEARNING:
+               stp_state = QCA8K_PORT_LOOKUP_STATE_LEARNING;
+               break;
+       case BR_STATE_FORWARDING:
+       default:
+               stp_state = QCA8K_PORT_LOOKUP_STATE_FORWARD;
+               break;
+       }
+
+       qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port),
+                 QCA8K_PORT_LOOKUP_STATE_MASK, stp_state);
+}
+
+int qca8k_port_bridge_join(struct dsa_switch *ds, int port,
+                          struct dsa_bridge bridge,
+                          bool *tx_fwd_offload,
+                          struct netlink_ext_ack *extack)
+{
+       struct qca8k_priv *priv = ds->priv;
+       int port_mask, cpu_port;
+       int i, ret;
+
+       cpu_port = dsa_to_port(ds, port)->cpu_dp->index;
+       port_mask = BIT(cpu_port);
+
+       for (i = 0; i < QCA8K_NUM_PORTS; i++) {
+               if (dsa_is_cpu_port(ds, i))
+                       continue;
+               if (!dsa_port_offloads_bridge(dsa_to_port(ds, i), &bridge))
+                       continue;
+               /* Add this port to the portvlan mask of the other ports
+                * in the bridge
+                */
+               ret = regmap_set_bits(priv->regmap,
+                                     QCA8K_PORT_LOOKUP_CTRL(i),
+                                     BIT(port));
+               if (ret)
+                       return ret;
+               if (i != port)
+                       port_mask |= BIT(i);
+       }
+
+       /* Add all other ports to this ports portvlan mask */
+       ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port),
+                       QCA8K_PORT_LOOKUP_MEMBER, port_mask);
+
+       return ret;
+}
+
+void qca8k_port_bridge_leave(struct dsa_switch *ds, int port,
+                            struct dsa_bridge bridge)
+{
+       struct qca8k_priv *priv = ds->priv;
+       int cpu_port, i;
+
+       cpu_port = dsa_to_port(ds, port)->cpu_dp->index;
+
+       for (i = 0; i < QCA8K_NUM_PORTS; i++) {
+               if (dsa_is_cpu_port(ds, i))
+                       continue;
+               if (!dsa_port_offloads_bridge(dsa_to_port(ds, i), &bridge))
+                       continue;
+               /* Remove this port to the portvlan mask of the other ports
+                * in the bridge
+                */
+               regmap_clear_bits(priv->regmap,
+                                 QCA8K_PORT_LOOKUP_CTRL(i),
+                                 BIT(port));
+       }
+
+       /* Set the cpu port to be the only one in the portvlan mask of
+        * this port
+        */
+       qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port),
+                 QCA8K_PORT_LOOKUP_MEMBER, BIT(cpu_port));
+}
index c73cbdfc6ac65f6c7d2db2956e6ec638aac13dae..edb2b23a02b980b7b0317ff2801dcfdd414adbab 100644 (file)
@@ -454,4 +454,13 @@ int qca8k_get_sset_count(struct dsa_switch *ds, int port, int sset);
 int qca8k_set_mac_eee(struct dsa_switch *ds, int port, struct ethtool_eee *eee);
 int qca8k_get_mac_eee(struct dsa_switch *ds, int port, struct ethtool_eee *e);
 
+/* Common bridge function */
+void qca8k_port_stp_state_set(struct dsa_switch *ds, int port, u8 state);
+int qca8k_port_bridge_join(struct dsa_switch *ds, int port,
+                          struct dsa_bridge bridge,
+                          bool *tx_fwd_offload,
+                          struct netlink_ext_ack *extack);
+void qca8k_port_bridge_leave(struct dsa_switch *ds, int port,
+                            struct dsa_bridge bridge);
+
 #endif /* __QCA8K_H */