net: dsa: tag_8021q: setup tagging via a single function call
authorVladimir Oltean <vladimir.oltean@nxp.com>
Thu, 10 Sep 2020 16:48:55 +0000 (19:48 +0300)
committerDavid S. Miller <davem@davemloft.net>
Sat, 12 Sep 2020 00:30:43 +0000 (17:30 -0700)
There is no point in calling dsa_port_setup_8021q_tagging for each
individual port. Additionally, it will become more difficult to do that
when we'll have a context structure to tag_8021q (next patch). So
refactor this now.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/sja1105/sja1105_main.c
include/linux/dsa/8021q.h
net/dsa/tag_8021q.c

index 5a28dfb..5084943 100644 (file)
@@ -1934,18 +1934,11 @@ static void sja1105_crosschip_bridge_leave(struct dsa_switch *ds,
 static int sja1105_setup_8021q_tagging(struct dsa_switch *ds, bool enabled)
 {
        struct sja1105_private *priv = ds->priv;
-       int rc, i;
+       int rc;
 
-       for (i = 0; i < SJA1105_NUM_PORTS; i++) {
-               priv->expect_dsa_8021q = true;
-               rc = dsa_port_setup_8021q_tagging(ds, i, enabled);
-               priv->expect_dsa_8021q = false;
-               if (rc < 0) {
-                       dev_err(ds->dev, "Failed to setup VLAN tagging for port %d: %d\n",
-                               i, rc);
-                       return rc;
-               }
-       }
+       rc = dsa_8021q_setup(priv->ds, enabled);
+       if (rc)
+               return rc;
 
        dev_info(ds->dev, "%s switch tagging\n",
                 enabled ? "Enabled" : "Disabled");
index 8047501..8586d8c 100644 (file)
@@ -25,8 +25,7 @@ struct dsa_8021q_crosschip_link {
 
 #if IS_ENABLED(CONFIG_NET_DSA_TAG_8021Q)
 
-int dsa_port_setup_8021q_tagging(struct dsa_switch *ds, int index,
-                                bool enabled);
+int dsa_8021q_setup(struct dsa_switch *ds, bool enabled);
 
 int dsa_8021q_crosschip_bridge_join(struct dsa_switch *ds, int port,
                                    struct dsa_switch *other_ds,
@@ -57,8 +56,7 @@ bool vid_is_dsa_8021q(u16 vid);
 
 #else
 
-int dsa_port_setup_8021q_tagging(struct dsa_switch *ds, int index,
-                                bool enabled)
+int dsa_8021q_setup(struct dsa_switch *ds, bool enabled)
 {
        return 0;
 }
index 780b2a1..e38fdf5 100644 (file)
@@ -209,7 +209,7 @@ static int dsa_8021q_vid_apply(struct dsa_switch *ds, int port, u16 vid,
  * +-+-----+-+-----+-+-----+-+-----+-+    +-+-----+-+-----+-+-----+-+-----+-+
  *   swp0    swp1    swp2    swp3           swp0    swp1    swp2    swp3
  */
-int dsa_port_setup_8021q_tagging(struct dsa_switch *ds, int port, bool enabled)
+static int dsa_8021q_setup_port(struct dsa_switch *ds, int port, bool enabled)
 {
        int upstream = dsa_upstream_port(ds, port);
        u16 rx_vid = dsa_8021q_rx_vid(ds, port);
@@ -275,7 +275,24 @@ int dsa_port_setup_8021q_tagging(struct dsa_switch *ds, int port, bool enabled)
 
        return err;
 }
-EXPORT_SYMBOL_GPL(dsa_port_setup_8021q_tagging);
+
+int dsa_8021q_setup(struct dsa_switch *ds, bool enabled)
+{
+       int rc, port;
+
+       for (port = 0; port < ds->num_ports; port++) {
+               rc = dsa_8021q_setup_port(ds, port, enabled);
+               if (rc < 0) {
+                       dev_err(ds->dev,
+                               "Failed to setup VLAN tagging for port %d: %d\n",
+                               port, rc);
+                       return rc;
+               }
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(dsa_8021q_setup);
 
 static int dsa_8021q_crosschip_link_apply(struct dsa_switch *ds, int port,
                                          struct dsa_switch *other_ds,