Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b629820d authored by Marek Vasut's avatar Marek Vasut Committed by David S. Miller
Browse files

net: phy: smsc: Implement PHY config_init for LAN87xx



The LAN8710/LAN8720 chips do have broken the "FlexPWR" smart power-saving
capability. Enabling it leads to the PHY not being able to detect Link when
cold-started without cable connected. Thus, make sure this is disabled.

Signed-off-by: default avatarMarek Vasut <marex@denx.de>
Cc: Christian Hohnstaedt <chohnstaedt@innominate.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: Fabio Estevam <fabio.estevam@freescale.com>
Cc: Giuseppe Cavallaro <peppe.cavallaro@st.com>
Cc: Otavio Salvador <otavio@ossystems.com.br>
Acked-by: default avatarOtavio Salvador <otavio@ossystems.com.br>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a3cff128
Loading
Loading
Loading
Loading
+27 −1
Original line number Diff line number Diff line
@@ -56,6 +56,32 @@ static int smsc_phy_config_init(struct phy_device *phydev)
	return smsc_phy_ack_interrupt (phydev);
}

static int lan87xx_config_init(struct phy_device *phydev)
{
	/*
	 * Make sure the EDPWRDOWN bit is NOT set. Setting this bit on
	 * LAN8710/LAN8720 PHY causes the PHY to misbehave, likely due
	 * to a bug on the chip.
	 *
	 * When the system is powered on with the network cable being
	 * disconnected all the way until after ifconfig ethX up is
	 * issued for the LAN port with this PHY, connecting the cable
	 * afterwards does not cause LINK change detection, while the
	 * expected behavior is the Link UP being detected.
	 */
	int rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS);
	if (rc < 0)
		return rc;

	rc &= ~MII_LAN83C185_EDPWRDOWN;

	rc = phy_write(phydev, MII_LAN83C185_CTRL_STATUS, rc);
	if (rc < 0)
		return rc;

	return smsc_phy_ack_interrupt(phydev);
}

static int lan911x_config_init(struct phy_device *phydev)
{
	return smsc_phy_ack_interrupt(phydev);
@@ -162,7 +188,7 @@ static struct phy_driver smsc_phy_driver[] = {
	/* basic functions */
	.config_aneg	= genphy_config_aneg,
	.read_status	= genphy_read_status,
	.config_init	= smsc_phy_config_init,
	.config_init	= lan87xx_config_init,

	/* IRQ related */
	.ack_interrupt	= smsc_phy_ack_interrupt,