Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: phy: smsc: force all capable mode if the phy is started in powerdown mode

A SMSC PHY in power down mode can't be used.
If a SMSC PHY is in this mode in the config_init
stage, the mode "all capable" is set. So the PHY
could then be used.

Signed-off-by: Philippe Reynes <tremyfr@yahoo.fr>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

trem and committed by
David S. Miller
6ded7cd6 4bd9b0ff

+30 -1
+25 -1
drivers/net/phy/smsc.c
··· 43 43 44 44 static int smsc_phy_config_init(struct phy_device *phydev) 45 45 { 46 - int rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS); 46 + int rc = phy_read(phydev, MII_LAN83C185_SPECIAL_MODES); 47 + if (rc < 0) 48 + return rc; 49 + 50 + /* If the SMSC PHY is in power down mode, then set it 51 + * in all capable mode before using it. 52 + */ 53 + if ((rc & MII_LAN83C185_MODE_MASK) == MII_LAN83C185_MODE_POWERDOWN) { 54 + int timeout = 50000; 55 + 56 + /* set "all capable" mode and reset the phy */ 57 + rc |= MII_LAN83C185_MODE_ALL; 58 + phy_write(phydev, MII_LAN83C185_SPECIAL_MODES, rc); 59 + phy_write(phydev, MII_BMCR, BMCR_RESET); 60 + 61 + /* wait end of reset (max 500 ms) */ 62 + do { 63 + udelay(10); 64 + if (timeout-- == 0) 65 + return -1; 66 + rc = phy_read(phydev, MII_BMCR); 67 + } while (rc & BMCR_RESET); 68 + } 69 + 70 + rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS); 47 71 if (rc < 0) 48 72 return rc; 49 73
+5
include/linux/smscphy.h
··· 4 4 #define MII_LAN83C185_ISF 29 /* Interrupt Source Flags */ 5 5 #define MII_LAN83C185_IM 30 /* Interrupt Mask */ 6 6 #define MII_LAN83C185_CTRL_STATUS 17 /* Mode/Status Register */ 7 + #define MII_LAN83C185_SPECIAL_MODES 18 /* Special Modes Register */ 7 8 8 9 #define MII_LAN83C185_ISF_INT1 (1<<1) /* Auto-Negotiation Page Received */ 9 10 #define MII_LAN83C185_ISF_INT2 (1<<2) /* Parallel Detection Fault */ ··· 22 21 23 22 #define MII_LAN83C185_EDPWRDOWN (1 << 13) /* EDPWRDOWN */ 24 23 #define MII_LAN83C185_ENERGYON (1 << 1) /* ENERGYON */ 24 + 25 + #define MII_LAN83C185_MODE_MASK 0xE0 26 + #define MII_LAN83C185_MODE_POWERDOWN 0xC0 /* Power Down mode */ 27 + #define MII_LAN83C185_MODE_ALL 0xE0 /* All capable mode */ 25 28 26 29 #endif /* __LINUX_SMSCPHY_H__ */