netdev/phy/icplus: Correct broken phy_init code
authorDavid McKay <david.mckay@st.com>
Tue, 21 Feb 2012 21:24:57 +0000 (21:24 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 23 Feb 2012 22:14:26 +0000 (17:14 -0500)
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>
drivers/net/phy/icplus.c

index c81f136ae670f1c616ac0fee867b9c2ed08351e0..7ee4f5822bb945a3d3522bbb2ff7aa351699b3b5 100644 (file)
@@ -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)