|
@@ -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,
|