2014-08-15 6:00 GMT-07:00 Gwenhael Goavec-Merou <[email protected]>: > On the one hand, phy_device.c provides a generic reset function if the phy > driver does not provide a soft_reset pointer. This generic reset does not take > into account the state of the phy, with a potential failure if the phy is in > powerdown mode. On the other hand, smsc driver provides a function with both > correct reset behaviour and configuration. > > This patch moves the reset part into a new smsc_phy_reset function and > provides > the soft_reset pointer to have a correct reset behaviour by default. > > Signed-off-by: Gwenhael Goavec-Merou <[email protected]>
Reviewed-by: Florian Fainelli <[email protected]> > --- > Changes since v1 (as advised by Sergei Shtylyov): > * fix '=' alignment > > drivers/net/phy/smsc.c | 33 +++++++++++++++++++++------------ > 1 file changed, 21 insertions(+), 12 deletions(-) > > diff --git a/drivers/net/phy/smsc.c b/drivers/net/phy/smsc.c > index 180c494..a4b0819 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) > > static int smsc_phy_config_init(struct phy_device *phydev) > { > + int rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS); > + > + if (rc < 0) > + return rc; > + > + /* Enable energy detect mode for this SMSC Transceivers */ > + rc = phy_write(phydev, MII_LAN83C185_CTRL_STATUS, > + rc | MII_LAN83C185_EDPWRDOWN); > + if (rc < 0) > + return rc; > + > + return smsc_phy_ack_interrupt(phydev); > +} > + > +static int smsc_phy_reset(struct phy_device *phydev) > +{ > int rc = phy_read(phydev, MII_LAN83C185_SPECIAL_MODES); > if (rc < 0) > return rc; > @@ -66,18 +82,7 @@ static int smsc_phy_config_init(struct phy_device *phydev) > rc = phy_read(phydev, MII_BMCR); > } while (rc & BMCR_RESET); > } > - > - rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS); > - if (rc < 0) > - return rc; > - > - /* Enable energy detect mode for this SMSC Transceivers */ > - rc = phy_write(phydev, MII_LAN83C185_CTRL_STATUS, > - rc | MII_LAN83C185_EDPWRDOWN); > - if (rc < 0) > - return rc; > - > - return smsc_phy_ack_interrupt (phydev); > + return 0; > } > > static int lan911x_config_init(struct phy_device *phydev) > @@ -142,6 +147,7 @@ static struct phy_driver smsc_phy_driver[] = { > .config_aneg = genphy_config_aneg, > .read_status = genphy_read_status, > .config_init = smsc_phy_config_init, > + .soft_reset = smsc_phy_reset, > > /* IRQ related */ > .ack_interrupt = smsc_phy_ack_interrupt, > @@ -164,6 +170,7 @@ static struct phy_driver smsc_phy_driver[] = { > .config_aneg = genphy_config_aneg, > .read_status = genphy_read_status, > .config_init = smsc_phy_config_init, > + .soft_reset = smsc_phy_reset, > > /* IRQ related */ > .ack_interrupt = smsc_phy_ack_interrupt, > @@ -186,6 +193,7 @@ static struct phy_driver smsc_phy_driver[] = { > .config_aneg = genphy_config_aneg, > .read_status = genphy_read_status, > .config_init = smsc_phy_config_init, > + .soft_reset = smsc_phy_reset, > > /* IRQ related */ > .ack_interrupt = smsc_phy_ack_interrupt, > @@ -230,6 +238,7 @@ static struct phy_driver smsc_phy_driver[] = { > .config_aneg = genphy_config_aneg, > .read_status = lan87xx_read_status, > .config_init = smsc_phy_config_init, > + .soft_reset = smsc_phy_reset, > > /* IRQ related */ > .ack_interrupt = smsc_phy_ack_interrupt, > -- > 1.8.5.5 > -- Florian -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

