]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: dsa: mt7530: convert to phylink managed EEE
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Mon, 10 Feb 2025 10:36:54 +0000 (10:36 +0000)
committerJakub Kicinski <kuba@kernel.org>
Thu, 13 Feb 2025 02:20:04 +0000 (18:20 -0800)
Convert mt7530 to use phylink managed EEE. When enabling EEE, we set
both PMCR_FORCE_EEE1G and PMCR_FORCE_EEE100 irrespective of the speed,
and clear them both when disabling.

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Link: https://patch.msgid.link/E1thR9q-003vXI-Cp@rmk-PC.armlinux.org.uk
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/dsa/mt7530.c

index 1c83af805209cae40c56138fa8f72261e396f58c..9fd44e55d51963318ed5cfa3175af9faa77236e4 100644 (file)
@@ -2957,28 +2957,61 @@ static void mt753x_phylink_mac_link_up(struct phylink_config *config,
                        mcr |= PMCR_FORCE_RX_FC_EN;
        }
 
-       if (mode == MLO_AN_PHY && phydev && phy_init_eee(phydev, false) >= 0) {
-               switch (speed) {
-               case SPEED_1000:
-               case SPEED_2500:
-                       mcr |= PMCR_FORCE_EEE1G;
-                       break;
-               case SPEED_100:
-                       mcr |= PMCR_FORCE_EEE100;
-                       break;
-               }
-       }
-
        mt7530_set(priv, MT753X_PMCR_P(dp->index), mcr);
 }
 
+static void mt753x_phylink_mac_disable_tx_lpi(struct phylink_config *config)
+{
+       struct dsa_port *dp = dsa_phylink_to_port(config);
+       struct mt7530_priv *priv = dp->ds->priv;
+
+       mt7530_clear(priv, MT753X_PMCR_P(dp->index),
+                    PMCR_FORCE_EEE1G | PMCR_FORCE_EEE100);
+}
+
+static int mt753x_phylink_mac_enable_tx_lpi(struct phylink_config *config,
+                                           u32 timer, bool tx_clock_stop)
+{
+       struct dsa_port *dp = dsa_phylink_to_port(config);
+       struct mt7530_priv *priv = dp->ds->priv;
+       u32 val;
+
+       /* If the timer is zero, then set LPI_MODE_EN, which allows the
+        * system to enter LPI mode immediately rather than waiting for
+        * the LPI threshold.
+        */
+       if (!timer)
+               val = LPI_MODE_EN;
+       else if (FIELD_FIT(LPI_THRESH_MASK, timer))
+               val = FIELD_PREP(LPI_THRESH_MASK, timer);
+       else
+               val = LPI_THRESH_MASK;
+
+       mt7530_rmw(priv, MT753X_PMEEECR_P(dp->index),
+                  LPI_THRESH_MASK | LPI_MODE_EN, val);
+
+       mt7530_set(priv, MT753X_PMCR_P(dp->index),
+                  PMCR_FORCE_EEE1G | PMCR_FORCE_EEE100);
+
+       return 0;
+}
+
 static void mt753x_phylink_get_caps(struct dsa_switch *ds, int port,
                                    struct phylink_config *config)
 {
        struct mt7530_priv *priv = ds->priv;
+       u32 eeecr;
 
        config->mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE;
 
+       config->lpi_capabilities = MAC_100FD | MAC_1000FD | MAC_2500FD;
+
+       eeecr = mt7530_read(priv, MT753X_PMEEECR_P(port));
+       /* tx_lpi_timer should be in microseconds. The time units for
+        * LPI threshold are unspecified.
+        */
+       config->lpi_timer_default = FIELD_GET(LPI_THRESH_MASK, eeecr);
+
        priv->info->mac_port_get_caps(ds, port, config);
 }
 
@@ -3088,18 +3121,9 @@ mt753x_setup(struct dsa_switch *ds)
 static int mt753x_set_mac_eee(struct dsa_switch *ds, int port,
                              struct ethtool_keee *e)
 {
-       struct mt7530_priv *priv = ds->priv;
-       u32 set, mask = LPI_THRESH_MASK | LPI_MODE_EN;
-
        if (e->tx_lpi_timer > 0xFFF)
                return -EINVAL;
 
-       set = LPI_THRESH_SET(e->tx_lpi_timer);
-       if (!e->tx_lpi_enabled)
-               /* Force LPI Mode without a delay */
-               set |= LPI_MODE_EN;
-       mt7530_rmw(priv, MT753X_PMEEECR_P(port), mask, set);
-
        return 0;
 }
 
@@ -3238,6 +3262,8 @@ static const struct phylink_mac_ops mt753x_phylink_mac_ops = {
        .mac_config     = mt753x_phylink_mac_config,
        .mac_link_down  = mt753x_phylink_mac_link_down,
        .mac_link_up    = mt753x_phylink_mac_link_up,
+       .mac_disable_tx_lpi = mt753x_phylink_mac_disable_tx_lpi,
+       .mac_enable_tx_lpi = mt753x_phylink_mac_enable_tx_lpi,
 };
 
 const struct mt753x_info mt753x_table[] = {