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

Commit b8e3995a authored by David McKay's avatar David McKay Committed by David S. Miller
Browse files

netdev/phy/icplus: Correct broken phy_init code



The code for ip1001_config_init() was totally broken if you were not
using RGMII. Instead of returning an error code or zero it actually
returned the value in the IP1001_SPEC_CTRL_STATUS_2 register. It was
also trying to set the IP1001_APS_ON bit , but never actually wrote
back the register.

The error checking was also incorrect in both this function and the
reset function, so this patch fixes that up in a consistent fashion.

Signed-off-by: default avatarDavid McKay <david.mckay@st.com>
Signed-off-by: default avatarGiuseppe Cavallaro <peppe.cavallaro@st.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 03606895
Loading
Loading
Loading
Loading
+18 −6
Original line number Diff line number Diff line
@@ -98,20 +98,24 @@ static int ip175c_config_init(struct phy_device *phydev)

static int ip1xx_reset(struct phy_device *phydev)
{
	int err, bmcr;
	int bmcr;

	/* Software Reset PHY */
	bmcr = phy_read(phydev, MII_BMCR);
	if (bmcr < 0)
		return bmcr;
	bmcr |= BMCR_RESET;
	err = phy_write(phydev, MII_BMCR, bmcr);
	if (err < 0)
		return err;
	bmcr = phy_write(phydev, MII_BMCR, bmcr);
	if (bmcr < 0)
		return bmcr;

	do {
		bmcr = phy_read(phydev, MII_BMCR);
		if (bmcr < 0)
			return bmcr;
	} while (bmcr & BMCR_RESET);

	return err;
	return 0;
}

static int ip1001_config_init(struct phy_device *phydev)
@@ -124,7 +128,10 @@ static int ip1001_config_init(struct phy_device *phydev)

	/* Enable Auto Power Saving mode */
	c = phy_read(phydev, IP1001_SPEC_CTRL_STATUS_2);
	if (c < 0)
		return c;
	c |= IP1001_APS_ON;
	c = phy_write(phydev, IP1001_SPEC_CTRL_STATUS_2, c);
	if (c < 0)
		return c;

@@ -132,11 +139,16 @@ static int ip1001_config_init(struct phy_device *phydev)
		/* Additional delay (2ns) used to adjust RX clock phase
		 * at RGMII interface */
		c = phy_read(phydev, IP10XX_SPEC_CTRL_STATUS);
		if (c < 0)
			return c;

		c |= IP1001_PHASE_SEL_MASK;
		c = phy_write(phydev, IP10XX_SPEC_CTRL_STATUS, c);
		if (c < 0)
			return c;
	}

	return c;
	return 0;
}

static int ip101a_config_init(struct phy_device *phydev)