Skip to contentSkip to conversation

net: phy: marvell: Call phy_reset() where possible

PATCH In review Stefan Roese 3 participants 6 messages Feb 10, 2016 – Feb 18, 2016

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/2 net: phy: marvell: Call phy_reset() where possible

Instead of coding the soft PHY reset function multiple times in marvell.c, lets call the common phy_reset() function from phy.c.

Cc Stefan Agner <[email protected]>
Cc Hao Zhang <[email protected]>
Cc Michal Simek <[email protected]>
Cc Andy Fleming <[email protected]>
Cc Joe Hershberger <[email protected]>
---
 drivers/net/phy/marvell.c | 23 ++---------------------
 1 file changed, 2 insertions(+), 21 deletions(-)
drivers/net/phy/marvell.c +2 -21
index eab1558..6e3dc85 100644
@@ -172,7 +172,6 @@ static int m88e1011s_startup(struct phy_device *phydev)
 static int m88e1111s_config(struct phy_device *phydev)
 {
 	int reg;
-	int timeout;
 
 	if ((phydev->interface == PHY_INTERFACE_MODE_RGMII) ||
 			(phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) ||
@@ -236,16 +235,7 @@ static int m88e1111s_config(struct phy_device *phydev)
 			MIIM_88E1111_PHY_EXT_SR, reg);
 
 		/* soft reset */
-		timeout = 1000;
-		phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET);
-		udelay(1000);
-		reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);
-		while ((reg & BMCR_RESET) && --timeout) {
-			udelay(1000);
-			reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);
-		}
-		if (!timeout)
-			printf("%s: phy soft reset timeout\n", __func__);
+		phy_reset(phydev);
 
 		reg = phy_read(phydev, MDIO_DEVAD_NONE,
 			MIIM_88E1111_PHY_EXT_SR);
@@ -258,16 +248,7 @@ static int m88e1111s_config(struct phy_device *phydev)
 	}
 
 	/* soft reset */
-	timeout = 1000;
-	phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET);
-	udelay(1000);
-	reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);
-	while ((reg & BMCR_RESET) && --timeout) {
-		udelay(1000);
-		reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);
-	}
-	if (!timeout)
-		printf("%s: phy soft reset timeout\n", __func__);
+	phy_reset(phydev);
 
 	genphy_config_aneg(phydev);
 
Signature · 1 line
2.7.1
#1 lore raw

PATCH 2/2 net: phy: marvell: Fix problem with phy_reset() clearing BMCR

With commit a058052c [net: phy: do not read configuration register on reset], phy_reset() will clear the BMCR register. Resulting in bit 12 being cleared (A/N enable). This leads to autonegotiation link problems, at least on the Marvell Armada ClearFog board. I suspect that other boards using this driver will be affected as well.

At the of m88e1111s_config(), phy_reset() is called. This is not needed for the PHY to load the changed configuration, as phy_reset() is called a few lines before already. So lets call genphy_restart_aneg() here instead to start the AN correctly.

Tested on clearfog.

Cc Stefan Agner <[email protected]>
Cc Hao Zhang <[email protected]>
Cc Michal Simek <[email protected]>
Cc Andy Fleming <[email protected]>
Cc Joe Hershberger <[email protected]>
---
 drivers/net/phy/marvell.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/net/phy/marvell.c +1 -2
index 6e3dc85..b8b1157 100644
@@ -251,8 +251,7 @@ static int m88e1111s_config(struct phy_device *phydev)
 	phy_reset(phydev);
 
 	genphy_config_aneg(phydev);
-
-	phy_reset(phydev);
+	genphy_restart_aneg(phydev);
 
 	return 0;
 }
Signature · 1 line
2.7.1
#2 lore raw

PATCH 2/2 net: phy: marvell: Fix problem with phy_reset() clearing BMCR

Quoted 11 lines · Stefan Roese

With commit a058052c [net: phy: do not read configuration register on reset], phy_reset() will clear the BMCR register. Resulting in bit 12 being cleared (A/N enable). This leads to autonegotiation link problems, at least on the Marvell Armada ClearFog board. I suspect that other boards using this driver will be affected as well.

At the of m88e1111s_config(), phy_reset() is called. This is not needed for the PHY to load the changed configuration, as phy_reset() is called a few lines before already. So lets call genphy_restart_aneg() here instead to start the AN correctly.

Quoted 8 lines

Tested on clearfog.

Cc Stefan Agner <[email protected]>
Cc Hao Zhang <[email protected]>
Cc Michal Simek <[email protected]>
Cc Andy Fleming <[email protected]>
Cc Joe Hershberger <[email protected]>
#4 lore raw

PATCH 1/2 net: phy: marvell: Call phy_reset() where possible

In reply to Stefan Roese
Quoted 10 lines · Stefan Roese

Instead of coding the soft PHY reset function multiple times in marvell.c, lets call the common phy_reset() function from phy.c.

Cc Stefan Agner <[email protected]>
Cc Hao Zhang <[email protected]>
Cc Michal Simek <[email protected]>
Cc Andy Fleming <[email protected]>
Cc Joe Hershberger <[email protected]>

---