diff options
Diffstat (limited to 'drivers/net/phy/smsc.c')
| -rw-r--r-- | drivers/net/phy/smsc.c | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/drivers/net/phy/smsc.c b/drivers/net/phy/smsc.c index 180c49479c42..a4b08198fb9f 100644 --- a/drivers/net/phy/smsc.c +++ b/drivers/net/phy/smsc.c | |||
| @@ -43,6 +43,22 @@ static int smsc_phy_ack_interrupt(struct phy_device *phydev) | |||
| 43 | 43 | ||
| 44 | static int smsc_phy_config_init(struct phy_device *phydev) | 44 | static int smsc_phy_config_init(struct phy_device *phydev) |
| 45 | { | 45 | { |
| 46 | int rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS); | ||
| 47 | |||
| 48 | if (rc < 0) | ||
| 49 | return rc; | ||
| 50 | |||
| 51 | /* Enable energy detect mode for this SMSC Transceivers */ | ||
| 52 | rc = phy_write(phydev, MII_LAN83C185_CTRL_STATUS, | ||
| 53 | rc | MII_LAN83C185_EDPWRDOWN); | ||
| 54 | if (rc < 0) | ||
| 55 | return rc; | ||
| 56 | |||
| 57 | return smsc_phy_ack_interrupt(phydev); | ||
| 58 | } | ||
| 59 | |||
| 60 | static int smsc_phy_reset(struct phy_device *phydev) | ||
| 61 | { | ||
| 46 | int rc = phy_read(phydev, MII_LAN83C185_SPECIAL_MODES); | 62 | int rc = phy_read(phydev, MII_LAN83C185_SPECIAL_MODES); |
| 47 | if (rc < 0) | 63 | if (rc < 0) |
| 48 | return rc; | 64 | return rc; |
| @@ -66,18 +82,7 @@ static int smsc_phy_config_init(struct phy_device *phydev) | |||
| 66 | rc = phy_read(phydev, MII_BMCR); | 82 | rc = phy_read(phydev, MII_BMCR); |
| 67 | } while (rc & BMCR_RESET); | 83 | } while (rc & BMCR_RESET); |
| 68 | } | 84 | } |
| 69 | 85 | return 0; | |
| 70 | rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS); | ||
| 71 | if (rc < 0) | ||
| 72 | return rc; | ||
| 73 | |||
| 74 | /* Enable energy detect mode for this SMSC Transceivers */ | ||
| 75 | rc = phy_write(phydev, MII_LAN83C185_CTRL_STATUS, | ||
| 76 | rc | MII_LAN83C185_EDPWRDOWN); | ||
| 77 | if (rc < 0) | ||
| 78 | return rc; | ||
| 79 | |||
| 80 | return smsc_phy_ack_interrupt (phydev); | ||
| 81 | } | 86 | } |
| 82 | 87 | ||
| 83 | static int lan911x_config_init(struct phy_device *phydev) | 88 | static int lan911x_config_init(struct phy_device *phydev) |
| @@ -142,6 +147,7 @@ static struct phy_driver smsc_phy_driver[] = { | |||
| 142 | .config_aneg = genphy_config_aneg, | 147 | .config_aneg = genphy_config_aneg, |
| 143 | .read_status = genphy_read_status, | 148 | .read_status = genphy_read_status, |
| 144 | .config_init = smsc_phy_config_init, | 149 | .config_init = smsc_phy_config_init, |
| 150 | .soft_reset = smsc_phy_reset, | ||
| 145 | 151 | ||
| 146 | /* IRQ related */ | 152 | /* IRQ related */ |
| 147 | .ack_interrupt = smsc_phy_ack_interrupt, | 153 | .ack_interrupt = smsc_phy_ack_interrupt, |
| @@ -164,6 +170,7 @@ static struct phy_driver smsc_phy_driver[] = { | |||
| 164 | .config_aneg = genphy_config_aneg, | 170 | .config_aneg = genphy_config_aneg, |
| 165 | .read_status = genphy_read_status, | 171 | .read_status = genphy_read_status, |
| 166 | .config_init = smsc_phy_config_init, | 172 | .config_init = smsc_phy_config_init, |
| 173 | .soft_reset = smsc_phy_reset, | ||
| 167 | 174 | ||
| 168 | /* IRQ related */ | 175 | /* IRQ related */ |
| 169 | .ack_interrupt = smsc_phy_ack_interrupt, | 176 | .ack_interrupt = smsc_phy_ack_interrupt, |
| @@ -186,6 +193,7 @@ static struct phy_driver smsc_phy_driver[] = { | |||
| 186 | .config_aneg = genphy_config_aneg, | 193 | .config_aneg = genphy_config_aneg, |
| 187 | .read_status = genphy_read_status, | 194 | .read_status = genphy_read_status, |
| 188 | .config_init = smsc_phy_config_init, | 195 | .config_init = smsc_phy_config_init, |
| 196 | .soft_reset = smsc_phy_reset, | ||
| 189 | 197 | ||
| 190 | /* IRQ related */ | 198 | /* IRQ related */ |
| 191 | .ack_interrupt = smsc_phy_ack_interrupt, | 199 | .ack_interrupt = smsc_phy_ack_interrupt, |
| @@ -230,6 +238,7 @@ static struct phy_driver smsc_phy_driver[] = { | |||
| 230 | .config_aneg = genphy_config_aneg, | 238 | .config_aneg = genphy_config_aneg, |
| 231 | .read_status = lan87xx_read_status, | 239 | .read_status = lan87xx_read_status, |
| 232 | .config_init = smsc_phy_config_init, | 240 | .config_init = smsc_phy_config_init, |
| 241 | .soft_reset = smsc_phy_reset, | ||
| 233 | 242 | ||
| 234 | /* IRQ related */ | 243 | /* IRQ related */ |
| 235 | .ack_interrupt = smsc_phy_ack_interrupt, | 244 | .ack_interrupt = smsc_phy_ack_interrupt, |
