[stable,5.15,v2] net: bcmgenet: Fix EEE implementation

Message ID 20240208190605.3341379-2-florian.fainelli@broadcom.com
State New
Headers
Series [stable,5.15,v2] net: bcmgenet: Fix EEE implementation |

Commit Message

Florian Fainelli Feb. 8, 2024, 7:06 p.m. UTC
  [ Upstream commit a9f31047baca57d47440c879cf259b86f900260c ]

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: 6ef398ea60d9 ("net: bcmgenet: add EEE support")
Signed-off-by: Florian Fainelli <florian.fainelli@broadcom.com>
Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Link: https://lore.kernel.org/r/20230606214348.2408018-1-florian.fainelli@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Florian Fainelli <florian.fainelli@broadcom.com>
---
Changes in v2:

- none

 .../net/ethernet/broadcom/genet/bcmgenet.c    | 22 +++++++------------
 .../net/ethernet/broadcom/genet/bcmgenet.h    |  3 +++
 drivers/net/ethernet/broadcom/genet/bcmmii.c  |  5 +++++
 3 files changed, 16 insertions(+), 14 deletions(-)
  

Comments

Sasha Levin Feb. 11, 2024, 4:36 p.m. UTC | #1
On Thu, Feb 08, 2024 at 11:06:05AM -0800, Florian Fainelli wrote:
>[ Upstream commit a9f31047baca57d47440c879cf259b86f900260c ]
>
>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: 6ef398ea60d9 ("net: bcmgenet: add EEE support")
>Signed-off-by: Florian Fainelli <florian.fainelli@broadcom.com>
>Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
>Link: https://lore.kernel.org/r/20230606214348.2408018-1-florian.fainelli@broadcom.com
>Signed-off-by: Jakub Kicinski <kuba@kernel.org>
>Signed-off-by: Sasha Levin <sashal@kernel.org>
>Signed-off-by: Florian Fainelli <florian.fainelli@broadcom.com>

It doesn't look like this one applies to 5.15...
  
Florian Fainelli Feb. 12, 2024, 1:49 a.m. UTC | #2
On 2/11/2024 8:36 AM, Sasha Levin wrote:
> On Thu, Feb 08, 2024 at 11:06:05AM -0800, Florian Fainelli wrote:
>> [ Upstream commit a9f31047baca57d47440c879cf259b86f900260c ]
>>
>> 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: 6ef398ea60d9 ("net: bcmgenet: add EEE support")
>> Signed-off-by: Florian Fainelli <florian.fainelli@broadcom.com>
>> Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
>> Link: 
>> https://lore.kernel.org/r/20230606214348.2408018-1-florian.fainelli@broadcom.com
>> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
>> Signed-off-by: Sasha Levin <sashal@kernel.org>
>> Signed-off-by: Florian Fainelli <florian.fainelli@broadcom.com>
> 
> It doesn't look like this one applies to 5.15...
> 

Yes I based it off an incorrect branch that has additional changes 
queued up locally, v3 coming shortly, thanks!
  

Patch

diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index 66f0c28298bf..7327a8d5dc75 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -1318,7 +1318,8 @@  static void bcmgenet_get_ethtool_stats(struct net_device *dev,
 	}
 }
 
-static void bcmgenet_eee_enable_set(struct net_device *dev, bool enable)
+void bcmgenet_eee_enable_set(struct net_device *dev, bool enable,
+			     bool tx_lpi_enabled)
 {
 	struct bcmgenet_priv *priv = netdev_priv(dev);
 	u32 off = priv->hw_params->tbuf_offset + TBUF_ENERGY_CTRL;
@@ -1338,7 +1339,7 @@  static void bcmgenet_eee_enable_set(struct net_device *dev, bool enable)
 
 	/* Enable EEE and switch to a 27Mhz clock automatically */
 	reg = bcmgenet_readl(priv->base + off);
-	if (enable)
+	if (tx_lpi_enabled)
 		reg |= TBUF_EEE_EN | TBUF_PM_EN;
 	else
 		reg &= ~(TBUF_EEE_EN | TBUF_PM_EN);
@@ -1359,6 +1360,7 @@  static void bcmgenet_eee_enable_set(struct net_device *dev, bool enable)
 
 	priv->eee.eee_enabled = enable;
 	priv->eee.eee_active = enable;
+	priv->eee.tx_lpi_enabled = tx_lpi_enabled;
 }
 
 static int bcmgenet_get_eee(struct net_device *dev, struct ethtool_eee *e)
@@ -1374,6 +1376,7 @@  static int bcmgenet_get_eee(struct net_device *dev, struct ethtool_eee *e)
 
 	e->eee_enabled = p->eee_enabled;
 	e->eee_active = p->eee_active;
+	e->tx_lpi_enabled = p->tx_lpi_enabled;
 	e->tx_lpi_timer = bcmgenet_umac_readl(priv, UMAC_EEE_LPI_TIMER);
 
 	return phy_ethtool_get_eee(dev->phydev, e);
@@ -1383,7 +1386,6 @@  static int bcmgenet_set_eee(struct net_device *dev, struct ethtool_eee *e)
 {
 	struct bcmgenet_priv *priv = netdev_priv(dev);
 	struct ethtool_eee *p = &priv->eee;
-	int ret = 0;
 
 	if (GENET_IS_V1(priv))
 		return -EOPNOTSUPP;
@@ -1394,16 +1396,11 @@  static int bcmgenet_set_eee(struct net_device *dev, struct ethtool_eee *e)
 	p->eee_enabled = e->eee_enabled;
 
 	if (!p->eee_enabled) {
-		bcmgenet_eee_enable_set(dev, false);
+		bcmgenet_eee_enable_set(dev, false, false);
 	} else {
-		ret = phy_init_eee(dev->phydev, 0);
-		if (ret) {
-			netif_err(priv, hw, dev, "EEE initialization failed\n");
-			return ret;
-		}
-
+		p->eee_active = phy_init_eee(dev->phydev, false) >= 0;
 		bcmgenet_umac_writel(priv, e->tx_lpi_timer, UMAC_EEE_LPI_TIMER);
-		bcmgenet_eee_enable_set(dev, true);
+		bcmgenet_eee_enable_set(dev, p->eee_active, e->tx_lpi_enabled);
 	}
 
 	return phy_ethtool_set_eee(dev->phydev, e);
@@ -4219,9 +4216,6 @@  static int bcmgenet_resume(struct device *d)
 	if (!device_may_wakeup(d))
 		phy_resume(dev->phydev);
 
-	if (priv->eee.eee_enabled)
-		bcmgenet_eee_enable_set(dev, true);
-
 	bcmgenet_netif_start(dev);
 
 	netif_device_attach(dev);
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.h b/drivers/net/ethernet/broadcom/genet/bcmgenet.h
index d111af605c44..95b3db100af6 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h
@@ -735,4 +735,7 @@  int bcmgenet_wol_power_down_cfg(struct bcmgenet_priv *priv,
 int bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv,
 			      enum bcmgenet_power_mode mode);
 
+void bcmgenet_eee_enable_set(struct net_device *dev, bool enable,
+			     bool tx_lpi_enabled);
+
 #endif /* __BCMGENET_H__ */
diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c
index 32fc845ade9e..72bb9364a471 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c
@@ -87,6 +87,11 @@  static void bcmgenet_mac_config(struct net_device *dev)
 		reg |= CMD_TX_EN | CMD_RX_EN;
 	}
 	bcmgenet_umac_writel(priv, reg, UMAC_CMD);
+
+	priv->eee.eee_active = phy_init_eee(phydev, 0) >= 0;
+	bcmgenet_eee_enable_set(dev,
+				priv->eee.eee_enabled && priv->eee.eee_active,
+				priv->eee.tx_lpi_enabled);
 }
 
 /* setup netdev link state when PHY link status change and