Skip to content
Snippets Groups Projects
Commit 9806925d authored by John Crispin's avatar John Crispin Committed by Kenneth Johansson
Browse files

net: phy: add phy_ethtool_ioctl()


Signed-off-by: default avatarJohn Crispin <john@phrozen.org>
parent 26ab4923
No related branches found
No related tags found
No related merge requests found
...@@ -472,6 +472,50 @@ int phy_ethtool_ksettings_get(struct phy_device *phydev, ...@@ -472,6 +472,50 @@ int phy_ethtool_ksettings_get(struct phy_device *phydev,
} }
EXPORT_SYMBOL(phy_ethtool_ksettings_get); EXPORT_SYMBOL(phy_ethtool_ksettings_get);
int phy_ethtool_ioctl(struct phy_device *phydev, void *useraddr)
{
u32 cmd;
int tmp;
struct ethtool_cmd ecmd = { ETHTOOL_GSET };
struct ethtool_value edata = { ETHTOOL_GLINK };
if (get_user(cmd, (u32 *)useraddr))
return -EFAULT;
switch (cmd) {
case ETHTOOL_GSET:
phy_ethtool_gset(phydev, &ecmd);
if (copy_to_user(useraddr, &ecmd, sizeof(ecmd)))
return -EFAULT;
return 0;
case ETHTOOL_SSET:
if (copy_from_user(&ecmd, useraddr, sizeof(ecmd)))
return -EFAULT;
return phy_ethtool_sset(phydev, &ecmd);
case ETHTOOL_NWAY_RST:
/* if autoneg is off, it's an error */
tmp = phy_read(phydev, MII_BMCR);
if (tmp & BMCR_ANENABLE) {
tmp |= (BMCR_ANRESTART);
phy_write(phydev, MII_BMCR, tmp);
return 0;
}
return -EINVAL;
case ETHTOOL_GLINK:
edata.data = (phy_read(phydev,
MII_BMSR) & BMSR_LSTATUS) ? 1 : 0;
if (copy_to_user(useraddr, &edata, sizeof(edata)))
return -EFAULT;
return 0;
}
return -EOPNOTSUPP;
}
EXPORT_SYMBOL(phy_ethtool_ioctl);
/** /**
* phy_mii_ioctl - generic PHY MII ioctl interface * phy_mii_ioctl - generic PHY MII ioctl interface
* @phydev: the phy_device struct * @phydev: the phy_device struct
......
...@@ -827,6 +827,7 @@ int phy_ethtool_ksettings_get(struct phy_device *phydev, ...@@ -827,6 +827,7 @@ int phy_ethtool_ksettings_get(struct phy_device *phydev,
struct ethtool_link_ksettings *cmd); struct ethtool_link_ksettings *cmd);
int phy_ethtool_ksettings_set(struct phy_device *phydev, int phy_ethtool_ksettings_set(struct phy_device *phydev,
const struct ethtool_link_ksettings *cmd); const struct ethtool_link_ksettings *cmd);
int phy_ethtool_ioctl(struct phy_device *phydev, void *useraddr);
int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd); int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd);
int phy_start_interrupts(struct phy_device *phydev); int phy_start_interrupts(struct phy_device *phydev);
void phy_print_status(struct phy_device *phydev); void phy_print_status(struct phy_device *phydev);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment