Takashi Iwai 4aa027
From c056d480b40a68f2520ccc156c7fae672d69d57d Mon Sep 17 00:00:00 2001
Takashi Iwai 4aa027
From: Florian Fainelli <f.fainelli@gmail.com>
Takashi Iwai 4aa027
Date: Tue, 30 Mar 2021 15:00:24 -0700
Takashi Iwai 4aa027
Subject: [PATCH] net: phy: broadcom: Only advertise EEE for supported modes
Takashi Iwai 4aa027
Git-commit: c056d480b40a68f2520ccc156c7fae672d69d57d
Takashi Iwai 4aa027
Patch-mainline: v5.12-rc7
Takashi Iwai 4aa027
References: git-fixes
Takashi Iwai 4aa027
Takashi Iwai 4aa027
We should not be advertising EEE for modes that we do not support,
Takashi Iwai 4aa027
correct that oversight by looking at the PHY device supported linkmodes.
Takashi Iwai 4aa027
Takashi Iwai 4aa027
Fixes: 99cec8a4dda2 ("net: phy: broadcom: Allow enabling or disabling of EEE")
Takashi Iwai 4aa027
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Takashi Iwai 4aa027
Signed-off-by: David S. Miller <davem@davemloft.net>
Takashi Iwai 4aa027
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 4aa027
Takashi Iwai 4aa027
---
Takashi Iwai 4aa027
 drivers/net/phy/bcm-phy-lib.c | 13 ++++++++++---
Takashi Iwai 4aa027
 1 file changed, 10 insertions(+), 3 deletions(-)
Takashi Iwai 4aa027
Takashi Iwai 4aa027
diff --git a/drivers/net/phy/bcm-phy-lib.c b/drivers/net/phy/bcm-phy-lib.c
Takashi Iwai 4aa027
index 53282a6d5928..287cccf8f7f4 100644
Takashi Iwai 4aa027
--- a/drivers/net/phy/bcm-phy-lib.c
Takashi Iwai 4aa027
+++ b/drivers/net/phy/bcm-phy-lib.c
Takashi Iwai 4aa027
@@ -369,7 +369,7 @@ EXPORT_SYMBOL_GPL(bcm_phy_enable_apd);
Takashi Iwai 4aa027
 
Takashi Iwai 4aa027
 int bcm_phy_set_eee(struct phy_device *phydev, bool enable)
Takashi Iwai 4aa027
 {
Takashi Iwai 4aa027
-	int val;
Takashi Iwai 4aa027
+	int val, mask = 0;
Takashi Iwai 4aa027
 
Takashi Iwai 4aa027
 	/* Enable EEE at PHY level */
Takashi Iwai 4aa027
 	val = phy_read_mmd(phydev, MDIO_MMD_AN, BRCM_CL45VEN_EEE_CONTROL);
Takashi Iwai 4aa027
@@ -388,10 +388,17 @@ int bcm_phy_set_eee(struct phy_device *phydev, bool enable)
Takashi Iwai 4aa027
 	if (val < 0)
Takashi Iwai 4aa027
 		return val;
Takashi Iwai 4aa027
 
Takashi Iwai 4aa027
+	if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
Takashi Iwai 4aa027
+			      phydev->supported))
Takashi Iwai 4aa027
+		mask |= MDIO_EEE_1000T;
Takashi Iwai 4aa027
+	if (linkmode_test_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT,
Takashi Iwai 4aa027
+			      phydev->supported))
Takashi Iwai 4aa027
+		mask |= MDIO_EEE_100TX;
Takashi Iwai 4aa027
+
Takashi Iwai 4aa027
 	if (enable)
Takashi Iwai 4aa027
-		val |= (MDIO_EEE_100TX | MDIO_EEE_1000T);
Takashi Iwai 4aa027
+		val |= mask;
Takashi Iwai 4aa027
 	else
Takashi Iwai 4aa027
-		val &= ~(MDIO_EEE_100TX | MDIO_EEE_1000T);
Takashi Iwai 4aa027
+		val &= ~mask;
Takashi Iwai 4aa027
 
Takashi Iwai 4aa027
 	phy_write_mmd(phydev, MDIO_MMD_AN, BCM_CL45VEN_EEE_ADV, (u32)val);
Takashi Iwai 4aa027
 
Takashi Iwai 4aa027
-- 
Takashi Iwai 4aa027
2.26.2
Takashi Iwai 4aa027