net: dsa: qca8k: use dsa_for_each macro instead of for loop
authorChristian Marangi <ansuelsmth@gmail.com>
Sun, 30 Jul 2023 07:41:13 +0000 (09:41 +0200)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 1 Aug 2023 10:02:42 +0000 (12:02 +0200)
Convert for loop to dsa_for_each macro to save some redundant write on
unconnected/unused port and tidy things up.

Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
Link: https://lore.kernel.org/r/20230730074113.21889-5-ansuelsmth@gmail.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/dsa/qca/qca8k-8xxx.c

index f2cf8f7..de1dc22 100644 (file)
@@ -1800,7 +1800,8 @@ static int
 qca8k_setup(struct dsa_switch *ds)
 {
        struct qca8k_priv *priv = ds->priv;
-       int cpu_port, ret, i;
+       struct dsa_port *dp;
+       int cpu_port, ret;
        u32 mask;
 
        cpu_port = qca8k_find_cpu_port(ds);
@@ -1855,27 +1856,27 @@ qca8k_setup(struct dsa_switch *ds)
                dev_warn(priv->dev, "mib init failed");
 
        /* Initial setup of all ports */
-       for (i = 0; i < QCA8K_NUM_PORTS; i++) {
+       dsa_switch_for_each_port(dp, ds) {
                /* Disable forwarding by default on all ports */
-               ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i),
+               ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(dp->index),
                                QCA8K_PORT_LOOKUP_MEMBER, 0);
                if (ret)
                        return ret;
+       }
 
-               /* Enable QCA header mode on all cpu ports */
-               if (dsa_is_cpu_port(ds, i)) {
-                       ret = qca8k_write(priv, QCA8K_REG_PORT_HDR_CTRL(i),
-                                         FIELD_PREP(QCA8K_PORT_HDR_CTRL_TX_MASK, QCA8K_PORT_HDR_CTRL_ALL) |
-                                         FIELD_PREP(QCA8K_PORT_HDR_CTRL_RX_MASK, QCA8K_PORT_HDR_CTRL_ALL));
-                       if (ret) {
-                               dev_err(priv->dev, "failed enabling QCA header mode");
-                               return ret;
-                       }
+       /* Disable MAC by default on all user ports */
+       dsa_switch_for_each_user_port(dp, ds)
+               qca8k_port_set_status(priv, dp->index, 0);
+
+       /* Enable QCA header mode on all cpu ports */
+       dsa_switch_for_each_cpu_port(dp, ds) {
+               ret = qca8k_write(priv, QCA8K_REG_PORT_HDR_CTRL(dp->index),
+                                 FIELD_PREP(QCA8K_PORT_HDR_CTRL_TX_MASK, QCA8K_PORT_HDR_CTRL_ALL) |
+                                 FIELD_PREP(QCA8K_PORT_HDR_CTRL_RX_MASK, QCA8K_PORT_HDR_CTRL_ALL));
+               if (ret) {
+                       dev_err(priv->dev, "failed enabling QCA header mode on port %d", dp->index);
+                       return ret;
                }
-
-               /* Disable MAC by default on all user ports */
-               if (dsa_is_user_port(ds, i))
-                       qca8k_port_set_status(priv, i, 0);
        }
 
        /* Forward all unknown frames to CPU port for Linux processing
@@ -1897,48 +1898,48 @@ qca8k_setup(struct dsa_switch *ds)
                return ret;
 
        /* Setup connection between CPU port & user ports
-        * Configure specific switch configuration for ports
+        * Individual user ports get connected to CPU port only
         */
-       for (i = 0; i < QCA8K_NUM_PORTS; i++) {
-               /* Individual user ports get connected to CPU port only */
-               if (dsa_is_user_port(ds, i)) {
-                       ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i),
-                                       QCA8K_PORT_LOOKUP_MEMBER,
-                                       BIT(cpu_port));
-                       if (ret)
-                               return ret;
-
-                       ret = regmap_clear_bits(priv->regmap, QCA8K_PORT_LOOKUP_CTRL(i),
-                                               QCA8K_PORT_LOOKUP_LEARN);
-                       if (ret)
-                               return ret;
-
-                       /* For port based vlans to work we need to set the
-                        * default egress vid
-                        */
-                       ret = qca8k_rmw(priv, QCA8K_EGRESS_VLAN(i),
-                                       QCA8K_EGREES_VLAN_PORT_MASK(i),
-                                       QCA8K_EGREES_VLAN_PORT(i, QCA8K_PORT_VID_DEF));
-                       if (ret)
-                               return ret;
-
-                       ret = qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(i),
-                                         QCA8K_PORT_VLAN_CVID(QCA8K_PORT_VID_DEF) |
-                                         QCA8K_PORT_VLAN_SVID(QCA8K_PORT_VID_DEF));
-                       if (ret)
-                               return ret;
-               }
+       dsa_switch_for_each_user_port(dp, ds) {
+               u8 port = dp->index;
+
+               ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port),
+                               QCA8K_PORT_LOOKUP_MEMBER,
+                               BIT(cpu_port));
+               if (ret)
+                       return ret;
+
+               ret = regmap_clear_bits(priv->regmap, QCA8K_PORT_LOOKUP_CTRL(port),
+                                       QCA8K_PORT_LOOKUP_LEARN);
+               if (ret)
+                       return ret;
 
-               /* The port 5 of the qca8337 have some problem in flood condition. The
-                * original legacy driver had some specific buffer and priority settings
-                * for the different port suggested by the QCA switch team. Add this
-                * missing settings to improve switch stability under load condition.
-                * This problem is limited to qca8337 and other qca8k switch are not affected.
+               /* For port based vlans to work we need to set the
+                * default egress vid
                 */
-               if (priv->switch_id == QCA8K_ID_QCA8337)
-                       qca8k_setup_hol_fixup(priv, i);
+               ret = qca8k_rmw(priv, QCA8K_EGRESS_VLAN(port),
+                               QCA8K_EGREES_VLAN_PORT_MASK(port),
+                               QCA8K_EGREES_VLAN_PORT(port, QCA8K_PORT_VID_DEF));
+               if (ret)
+                       return ret;
+
+               ret = qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(port),
+                                 QCA8K_PORT_VLAN_CVID(QCA8K_PORT_VID_DEF) |
+                                 QCA8K_PORT_VLAN_SVID(QCA8K_PORT_VID_DEF));
+               if (ret)
+                       return ret;
        }
 
+       /* The port 5 of the qca8337 have some problem in flood condition. The
+        * original legacy driver had some specific buffer and priority settings
+        * for the different port suggested by the QCA switch team. Add this
+        * missing settings to improve switch stability under load condition.
+        * This problem is limited to qca8337 and other qca8k switch are not affected.
+        */
+       if (priv->switch_id == QCA8K_ID_QCA8337)
+               dsa_switch_for_each_available_port(dp, ds)
+                       qca8k_setup_hol_fixup(priv, dp->index);
+
        /* Special GLOBAL_FC_THRESH value are needed for ar8327 switch */
        if (priv->switch_id == QCA8K_ID_QCA8327) {
                mask = QCA8K_GLOBAL_FC_GOL_XON_THRES(288) |