|
@@ -43,7 +43,31 @@ static int smsc_phy_ack_interrupt(struct phy_device *phydev)
|
|
|
|
|
|
static int smsc_phy_config_init(struct phy_device *phydev)
|
|
|
{
|
|
|
- int rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS);
|
|
|
+ int rc = phy_read(phydev, MII_LAN83C185_SPECIAL_MODES);
|
|
|
+ if (rc < 0)
|
|
|
+ return rc;
|
|
|
+
|
|
|
+ /* If the SMSC PHY is in power down mode, then set it
|
|
|
+ * in all capable mode before using it.
|
|
|
+ */
|
|
|
+ if ((rc & MII_LAN83C185_MODE_MASK) == MII_LAN83C185_MODE_POWERDOWN) {
|
|
|
+ int timeout = 50000;
|
|
|
+
|
|
|
+ /* set "all capable" mode and reset the phy */
|
|
|
+ rc |= MII_LAN83C185_MODE_ALL;
|
|
|
+ phy_write(phydev, MII_LAN83C185_SPECIAL_MODES, rc);
|
|
|
+ phy_write(phydev, MII_BMCR, BMCR_RESET);
|
|
|
+
|
|
|
+ /* wait end of reset (max 500 ms) */
|
|
|
+ do {
|
|
|
+ udelay(10);
|
|
|
+ if (timeout-- == 0)
|
|
|
+ return -1;
|
|
|
+ rc = phy_read(phydev, MII_BMCR);
|
|
|
+ } while (rc & BMCR_RESET);
|
|
|
+ }
|
|
|
+
|
|
|
+ rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS);
|
|
|
if (rc < 0)
|
|
|
return rc;
|
|
|
|