net: phy: at803x: add suspend/resume callbacks
When WOL is enabled, the chip can't be put into power-down (BMCR_PDOWN) mode, as that will also switch off the MAC, which consequently leads to a link loss. Use BMCR_ISOLATE in that case, which will at least save us some milliamperes in comparison to normal operation mode. Signed-off-by: Daniel Mack <zonque@gmail.com> Acked-by: Mugunthan V N <mugunthanvnm@ti.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
0197ffed86
commit
6229ed1f22
|
@ -100,6 +100,45 @@ static void at803x_get_wol(struct phy_device *phydev,
|
|||
wol->wolopts |= WAKE_MAGIC;
|
||||
}
|
||||
|
||||
static int at803x_suspend(struct phy_device *phydev)
|
||||
{
|
||||
int value;
|
||||
int wol_enabled;
|
||||
|
||||
mutex_lock(&phydev->lock);
|
||||
|
||||
value = phy_read(phydev, AT803X_INTR_ENABLE);
|
||||
wol_enabled = value & AT803X_WOL_ENABLE;
|
||||
|
||||
value = phy_read(phydev, MII_BMCR);
|
||||
|
||||
if (wol_enabled)
|
||||
value |= BMCR_ISOLATE;
|
||||
else
|
||||
value |= BMCR_PDOWN;
|
||||
|
||||
phy_write(phydev, MII_BMCR, value);
|
||||
|
||||
mutex_unlock(&phydev->lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int at803x_resume(struct phy_device *phydev)
|
||||
{
|
||||
int value;
|
||||
|
||||
mutex_lock(&phydev->lock);
|
||||
|
||||
value = phy_read(phydev, MII_BMCR);
|
||||
value &= ~(BMCR_PDOWN | BMCR_ISOLATE);
|
||||
phy_write(phydev, MII_BMCR, value);
|
||||
|
||||
mutex_unlock(&phydev->lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int at803x_config_init(struct phy_device *phydev)
|
||||
{
|
||||
int val;
|
||||
|
@ -161,6 +200,8 @@ static struct phy_driver at803x_driver[] = {
|
|||
.config_init = at803x_config_init,
|
||||
.set_wol = at803x_set_wol,
|
||||
.get_wol = at803x_get_wol,
|
||||
.suspend = at803x_suspend,
|
||||
.resume = at803x_resume,
|
||||
.features = PHY_GBIT_FEATURES,
|
||||
.flags = PHY_HAS_INTERRUPT,
|
||||
.config_aneg = genphy_config_aneg,
|
||||
|
@ -176,6 +217,8 @@ static struct phy_driver at803x_driver[] = {
|
|||
.config_init = at803x_config_init,
|
||||
.set_wol = at803x_set_wol,
|
||||
.get_wol = at803x_get_wol,
|
||||
.suspend = at803x_suspend,
|
||||
.resume = at803x_resume,
|
||||
.features = PHY_GBIT_FEATURES,
|
||||
.flags = PHY_HAS_INTERRUPT,
|
||||
.config_aneg = genphy_config_aneg,
|
||||
|
@ -191,6 +234,8 @@ static struct phy_driver at803x_driver[] = {
|
|||
.config_init = at803x_config_init,
|
||||
.set_wol = at803x_set_wol,
|
||||
.get_wol = at803x_get_wol,
|
||||
.suspend = at803x_suspend,
|
||||
.resume = at803x_resume,
|
||||
.features = PHY_GBIT_FEATURES,
|
||||
.flags = PHY_HAS_INTERRUPT,
|
||||
.config_aneg = genphy_config_aneg,
|
||||
|
|
Loading…
Reference in New Issue