From 0370ca373b0da91e1a761f259a566243ceaf33a1 Mon Sep 17 00:00:00 2001 From: Heiner Kallweit <hkallweit1@gmail.com> Date: Mon, 20 Jan 2020 22:17:11 +0100 Subject: [PATCH] net: phy: add new version of phy_do_ioctl Add a new version of phy_do_ioctl that doesn't check whether net_device is running. It will typically be used if suitable drivers attach the PHY in probe already. Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net> --- drivers/net/phy/phy.c | 16 +++++++++++++--- include/linux/phy.h | 1 + 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index cf25fa3be1238..d76e038cf2cb5 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -433,18 +433,28 @@ int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd) EXPORT_SYMBOL(phy_mii_ioctl); /** - * phy_do_ioctl_running - generic ndo_do_ioctl implementation + * 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_running(struct net_device *dev, struct ifreq *ifr, int cmd) +int phy_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { - if (!netif_running(dev) || !dev->phydev) + 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) diff --git a/include/linux/phy.h b/include/linux/phy.h index f6e714da37d81..c570e162e05e5 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -1242,6 +1242,7 @@ void phy_ethtool_ksettings_get(struct phy_device *phydev, int phy_ethtool_ksettings_set(struct phy_device *phydev, const struct ethtool_link_ksettings *cmd); int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd); +int phy_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); int phy_do_ioctl_running(struct net_device *dev, struct ifreq *ifr, int cmd); void phy_request_interrupt(struct phy_device *phydev); void phy_free_interrupt(struct phy_device *phydev); -- 2.39.5