Skip to content

Commit a9f3104

Browse files
ffainellikuba-moo
authored andcommitted
net: bcmgenet: Fix EEE implementation
We had a number of short comings: - EEE must be re-evaluated whenever the state machine detects a link change as wight be switching from a link partner with EEE enabled/disabled - tx_lpi_enabled controls whether EEE should be enabled/disabled for the transmit path, which applies to the TBUF block - We do not need to forcibly enable EEE upon system resume, as the PHY state machine will trigger a link event that will do that, too Fixes: 6ef398e ("net: bcmgenet: add EEE support") Signed-off-by: Florian Fainelli <[email protected]> Reviewed-by: Russell King (Oracle) <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent f0d7519 commit a9f3104

File tree

3 files changed

+16
-14
lines changed

3 files changed

+16
-14
lines changed

drivers/net/ethernet/broadcom/genet/bcmgenet.c

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1272,7 +1272,8 @@ static void bcmgenet_get_ethtool_stats(struct net_device *dev,
12721272
}
12731273
}
12741274

1275-
static void bcmgenet_eee_enable_set(struct net_device *dev, bool enable)
1275+
void bcmgenet_eee_enable_set(struct net_device *dev, bool enable,
1276+
bool tx_lpi_enabled)
12761277
{
12771278
struct bcmgenet_priv *priv = netdev_priv(dev);
12781279
u32 off = priv->hw_params->tbuf_offset + TBUF_ENERGY_CTRL;
@@ -1292,7 +1293,7 @@ static void bcmgenet_eee_enable_set(struct net_device *dev, bool enable)
12921293

12931294
/* Enable EEE and switch to a 27Mhz clock automatically */
12941295
reg = bcmgenet_readl(priv->base + off);
1295-
if (enable)
1296+
if (tx_lpi_enabled)
12961297
reg |= TBUF_EEE_EN | TBUF_PM_EN;
12971298
else
12981299
reg &= ~(TBUF_EEE_EN | TBUF_PM_EN);
@@ -1313,6 +1314,7 @@ static void bcmgenet_eee_enable_set(struct net_device *dev, bool enable)
13131314

13141315
priv->eee.eee_enabled = enable;
13151316
priv->eee.eee_active = enable;
1317+
priv->eee.tx_lpi_enabled = tx_lpi_enabled;
13161318
}
13171319

13181320
static int bcmgenet_get_eee(struct net_device *dev, struct ethtool_eee *e)
@@ -1328,6 +1330,7 @@ static int bcmgenet_get_eee(struct net_device *dev, struct ethtool_eee *e)
13281330

13291331
e->eee_enabled = p->eee_enabled;
13301332
e->eee_active = p->eee_active;
1333+
e->tx_lpi_enabled = p->tx_lpi_enabled;
13311334
e->tx_lpi_timer = bcmgenet_umac_readl(priv, UMAC_EEE_LPI_TIMER);
13321335

13331336
return phy_ethtool_get_eee(dev->phydev, e);
@@ -1337,7 +1340,6 @@ static int bcmgenet_set_eee(struct net_device *dev, struct ethtool_eee *e)
13371340
{
13381341
struct bcmgenet_priv *priv = netdev_priv(dev);
13391342
struct ethtool_eee *p = &priv->eee;
1340-
int ret = 0;
13411343

13421344
if (GENET_IS_V1(priv))
13431345
return -EOPNOTSUPP;
@@ -1348,16 +1350,11 @@ static int bcmgenet_set_eee(struct net_device *dev, struct ethtool_eee *e)
13481350
p->eee_enabled = e->eee_enabled;
13491351

13501352
if (!p->eee_enabled) {
1351-
bcmgenet_eee_enable_set(dev, false);
1353+
bcmgenet_eee_enable_set(dev, false, false);
13521354
} else {
1353-
ret = phy_init_eee(dev->phydev, false);
1354-
if (ret) {
1355-
netif_err(priv, hw, dev, "EEE initialization failed\n");
1356-
return ret;
1357-
}
1358-
1355+
p->eee_active = phy_init_eee(dev->phydev, false) >= 0;
13591356
bcmgenet_umac_writel(priv, e->tx_lpi_timer, UMAC_EEE_LPI_TIMER);
1360-
bcmgenet_eee_enable_set(dev, true);
1357+
bcmgenet_eee_enable_set(dev, p->eee_active, e->tx_lpi_enabled);
13611358
}
13621359

13631360
return phy_ethtool_set_eee(dev->phydev, e);
@@ -4279,9 +4276,6 @@ static int bcmgenet_resume(struct device *d)
42794276
if (!device_may_wakeup(d))
42804277
phy_resume(dev->phydev);
42814278

4282-
if (priv->eee.eee_enabled)
4283-
bcmgenet_eee_enable_set(dev, true);
4284-
42854279
bcmgenet_netif_start(dev);
42864280

42874281
netif_device_attach(dev);

drivers/net/ethernet/broadcom/genet/bcmgenet.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -703,4 +703,7 @@ int bcmgenet_wol_power_down_cfg(struct bcmgenet_priv *priv,
703703
void bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv,
704704
enum bcmgenet_power_mode mode);
705705

706+
void bcmgenet_eee_enable_set(struct net_device *dev, bool enable,
707+
bool tx_lpi_enabled);
708+
706709
#endif /* __BCMGENET_H__ */

drivers/net/ethernet/broadcom/genet/bcmmii.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,11 @@ static void bcmgenet_mac_config(struct net_device *dev)
8787
reg |= CMD_TX_EN | CMD_RX_EN;
8888
}
8989
bcmgenet_umac_writel(priv, reg, UMAC_CMD);
90+
91+
priv->eee.eee_active = phy_init_eee(phydev, 0) >= 0;
92+
bcmgenet_eee_enable_set(dev,
93+
priv->eee.eee_enabled && priv->eee.eee_active,
94+
priv->eee.tx_lpi_enabled);
9095
}
9196

9297
/* setup netdev link state when PHY link status change and

0 commit comments

Comments
 (0)