mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-07 23:20:32 -04:00
net: dsa: mt7530: convert to phylink managed EEE
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>
This commit is contained in:
committed by
Jakub Kicinski
parent
b8927bd44f
commit
9cf21773f5
@@ -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[] = {
|
||||
|
||||
Reference in New Issue
Block a user