diff options
Diffstat (limited to 'drivers/net/phy/phy.c')
| -rw-r--r-- | drivers/net/phy/phy.c | 29 | 
1 files changed, 27 insertions, 2 deletions
| diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 80be4d691e5b..d76e038cf2cb 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -422,8 +422,8 @@ int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd)  		return 0;  	case SIOCSHWTSTAMP: -		if (phydev->drv && phydev->drv->hwtstamp) -			return phydev->drv->hwtstamp(phydev, ifr); +		if (phydev->mii_ts && phydev->mii_ts->hwtstamp) +			return phydev->mii_ts->hwtstamp(phydev->mii_ts, ifr);  		/* fall through */  	default: @@ -432,6 +432,31 @@ int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd)  }  EXPORT_SYMBOL(phy_mii_ioctl); +/** + * phy_do_ioctl - generic ndo_do_ioctl implementation + * @dev: the net_device struct + * @ifr: &struct ifreq for socket ioctl's + * @cmd: ioctl cmd to execute + */ +int phy_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) +{ +	if (!dev->phydev) +		return -ENODEV; + +	return phy_mii_ioctl(dev->phydev, ifr, cmd); +} +EXPORT_SYMBOL(phy_do_ioctl); + +/* same as phy_do_ioctl, but ensures that net_device is running */ +int phy_do_ioctl_running(struct net_device *dev, struct ifreq *ifr, int cmd) +{ +	if (!netif_running(dev)) +		return -ENODEV; + +	return phy_do_ioctl(dev, ifr, cmd); +} +EXPORT_SYMBOL(phy_do_ioctl_running); +  void phy_queue_state_machine(struct phy_device *phydev, unsigned long jiffies)  {  	mod_delayed_work(system_power_efficient_wq, &phydev->state_queue, |