Commit ea13c9ee authored by Mugunthan V N's avatar Mugunthan V N Committed by David S. Miller

drivers: net: phy: at803x: seperate wol specific code to wol standard apis

WOL is initilized in phy config_init, but there are standard apis
(set_wol/get_wol) for WOL in phy frame work. So this patch moves
WOL specific code from config_init to wol standard apis.

Cc: Matus Ujhelyi <ujhelyi.m@gmail.com>
Signed-off-by: default avatarMugunthan V N <mugunthanvnm@ti.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 317420ab
...@@ -32,10 +32,13 @@ MODULE_DESCRIPTION("Atheros 803x PHY driver"); ...@@ -32,10 +32,13 @@ MODULE_DESCRIPTION("Atheros 803x PHY driver");
MODULE_AUTHOR("Matus Ujhelyi"); MODULE_AUTHOR("Matus Ujhelyi");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
static void at803x_set_wol_mac_addr(struct phy_device *phydev) static int at803x_set_wol(struct phy_device *phydev,
struct ethtool_wolinfo *wol)
{ {
struct net_device *ndev = phydev->attached_dev; struct net_device *ndev = phydev->attached_dev;
const u8 *mac; const u8 *mac;
int ret;
u32 value;
unsigned int i, offsets[] = { unsigned int i, offsets[] = {
AT803X_LOC_MAC_ADDR_32_47_OFFSET, AT803X_LOC_MAC_ADDR_32_47_OFFSET,
AT803X_LOC_MAC_ADDR_16_31_OFFSET, AT803X_LOC_MAC_ADDR_16_31_OFFSET,
...@@ -43,30 +46,60 @@ static void at803x_set_wol_mac_addr(struct phy_device *phydev) ...@@ -43,30 +46,60 @@ static void at803x_set_wol_mac_addr(struct phy_device *phydev)
}; };
if (!ndev) if (!ndev)
return; return -ENODEV;
mac = (const u8 *) ndev->dev_addr; if (wol->wolopts & WAKE_MAGIC) {
mac = (const u8 *) ndev->dev_addr;
if (!is_valid_ether_addr(mac)) if (!is_valid_ether_addr(mac))
return; return -EFAULT;
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
phy_write(phydev, AT803X_MMD_ACCESS_CONTROL, phy_write(phydev, AT803X_MMD_ACCESS_CONTROL,
AT803X_DEVICE_ADDR); AT803X_DEVICE_ADDR);
phy_write(phydev, AT803X_MMD_ACCESS_CONTROL_DATA, phy_write(phydev, AT803X_MMD_ACCESS_CONTROL_DATA,
offsets[i]); offsets[i]);
phy_write(phydev, AT803X_MMD_ACCESS_CONTROL, phy_write(phydev, AT803X_MMD_ACCESS_CONTROL,
AT803X_FUNC_DATA); AT803X_FUNC_DATA);
phy_write(phydev, AT803X_MMD_ACCESS_CONTROL_DATA, phy_write(phydev, AT803X_MMD_ACCESS_CONTROL_DATA,
mac[(i * 2) + 1] | (mac[(i * 2)] << 8)); mac[(i * 2) + 1] | (mac[(i * 2)] << 8));
}
value = phy_read(phydev, AT803X_INTR_ENABLE);
value |= AT803X_WOL_ENABLE;
ret = phy_write(phydev, AT803X_INTR_ENABLE, value);
if (ret)
return ret;
value = phy_read(phydev, AT803X_INTR_STATUS);
} else {
value = phy_read(phydev, AT803X_INTR_ENABLE);
value &= (~AT803X_WOL_ENABLE);
ret = phy_write(phydev, AT803X_INTR_ENABLE, value);
if (ret)
return ret;
value = phy_read(phydev, AT803X_INTR_STATUS);
} }
return ret;
}
static void at803x_get_wol(struct phy_device *phydev,
struct ethtool_wolinfo *wol)
{
u32 value;
wol->supported = WAKE_MAGIC;
wol->wolopts = 0;
value = phy_read(phydev, AT803X_INTR_ENABLE);
if (value & AT803X_WOL_ENABLE)
wol->wolopts |= WAKE_MAGIC;
} }
static int at803x_config_init(struct phy_device *phydev) static int at803x_config_init(struct phy_device *phydev)
{ {
int val; int val;
u32 features; u32 features;
int status;
features = SUPPORTED_TP | SUPPORTED_MII | SUPPORTED_AUI | features = SUPPORTED_TP | SUPPORTED_MII | SUPPORTED_AUI |
SUPPORTED_FIBRE | SUPPORTED_BNC; SUPPORTED_FIBRE | SUPPORTED_BNC;
...@@ -100,11 +133,6 @@ static int at803x_config_init(struct phy_device *phydev) ...@@ -100,11 +133,6 @@ static int at803x_config_init(struct phy_device *phydev)
phydev->supported = features; phydev->supported = features;
phydev->advertising = features; phydev->advertising = features;
/* enable WOL */
at803x_set_wol_mac_addr(phydev);
status = phy_write(phydev, AT803X_INTR_ENABLE, AT803X_WOL_ENABLE);
status = phy_read(phydev, AT803X_INTR_STATUS);
return 0; return 0;
} }
...@@ -115,6 +143,8 @@ static struct phy_driver at803x_driver[] = { ...@@ -115,6 +143,8 @@ static struct phy_driver at803x_driver[] = {
.name = "Atheros 8035 ethernet", .name = "Atheros 8035 ethernet",
.phy_id_mask = 0xffffffef, .phy_id_mask = 0xffffffef,
.config_init = at803x_config_init, .config_init = at803x_config_init,
.set_wol = at803x_set_wol,
.get_wol = at803x_get_wol,
.features = PHY_GBIT_FEATURES, .features = PHY_GBIT_FEATURES,
.flags = PHY_HAS_INTERRUPT, .flags = PHY_HAS_INTERRUPT,
.config_aneg = &genphy_config_aneg, .config_aneg = &genphy_config_aneg,
...@@ -128,6 +158,8 @@ static struct phy_driver at803x_driver[] = { ...@@ -128,6 +158,8 @@ static struct phy_driver at803x_driver[] = {
.name = "Atheros 8030 ethernet", .name = "Atheros 8030 ethernet",
.phy_id_mask = 0xffffffef, .phy_id_mask = 0xffffffef,
.config_init = at803x_config_init, .config_init = at803x_config_init,
.set_wol = at803x_set_wol,
.get_wol = at803x_get_wol,
.features = PHY_GBIT_FEATURES, .features = PHY_GBIT_FEATURES,
.flags = PHY_HAS_INTERRUPT, .flags = PHY_HAS_INTERRUPT,
.config_aneg = &genphy_config_aneg, .config_aneg = &genphy_config_aneg,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment