Skip to content

Commit

Permalink
netdev/phy/icplus: Correct broken phy_init code
Browse files Browse the repository at this point in the history
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: David McKay <david.mckay@st.com>
Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
David McKay authored and David S. Miller committed Feb 23, 2012
1 parent 0360689 commit b8e3995
Showing 1 changed file with 18 additions and 6 deletions.
24 changes: 18 additions & 6 deletions drivers/net/phy/icplus.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -124,19 +128,27 @@ 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;

if (phydev->interface == PHY_INTERFACE_MODE_RGMII) {
/* 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)
Expand Down

0 comments on commit b8e3995

Please sign in to comment.