From 28b041139e344ecd0f144d6205b004ae354cfa1e Mon Sep 17 00:00:00 2001 From: Richard Cochran Date: Sat, 17 Jul 2010 08:48:55 +0000 Subject: [PATCH] net: preserve ifreq parameter when calling generic phy_mii_ioctl(). The phy_mii_ioctl() function unnecessarily throws away the original ifreq. We need access to the ifreq in order to support PHYs that can perform hardware time stamping. Two maverick drivers filter the ioctl commands passed to phy_mii_ioctl(). This is unnecessary since phylib will check the command in any case. Signed-off-by: Richard Cochran Signed-off-by: David S. Miller --- drivers/net/arm/ixp4xx_eth.c | 3 ++- drivers/net/au1000_eth.c | 2 +- drivers/net/bcm63xx_enet.c | 2 +- drivers/net/cpmac.c | 5 +---- drivers/net/dnet.c | 2 +- drivers/net/ethoc.c | 2 +- drivers/net/fec.c | 2 +- drivers/net/fec_mpc52xx.c | 2 +- drivers/net/fs_enet/fs_enet-main.c | 3 +-- drivers/net/gianfar.c | 2 +- drivers/net/macb.c | 2 +- drivers/net/mv643xx_eth.c | 2 +- drivers/net/octeon/octeon_mgmt.c | 2 +- drivers/net/phy/phy.c | 3 ++- drivers/net/sb1250-mac.c | 2 +- drivers/net/sh_eth.c | 2 +- drivers/net/smsc911x.c | 2 +- drivers/net/smsc9420.c | 2 +- drivers/net/stmmac/stmmac_main.c | 22 ++++++++-------------- drivers/net/tc35815.c | 2 +- drivers/net/tg3.c | 2 +- drivers/net/ucc_geth.c | 2 +- drivers/staging/octeon/ethernet-mdio.c | 2 +- include/linux/phy.h | 2 +- net/dsa/slave.c | 3 +-- 25 files changed, 34 insertions(+), 43 deletions(-) diff --git a/drivers/net/arm/ixp4xx_eth.c b/drivers/net/arm/ixp4xx_eth.c index ee2f8425dbe70..4f1cc7164ad9f 100644 --- a/drivers/net/arm/ixp4xx_eth.c +++ b/drivers/net/arm/ixp4xx_eth.c @@ -782,7 +782,8 @@ static int eth_ioctl(struct net_device *dev, struct ifreq *req, int cmd) if (!netif_running(dev)) return -EINVAL; - return phy_mii_ioctl(port->phydev, if_mii(req), cmd); + + return phy_mii_ioctl(port->phydev, req, cmd); } /* ethtool support */ diff --git a/drivers/net/au1000_eth.c b/drivers/net/au1000_eth.c index ece6128bef146..386d4feec652b 100644 --- a/drivers/net/au1000_eth.c +++ b/drivers/net/au1000_eth.c @@ -978,7 +978,7 @@ static int au1000_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) if (!aup->phy_dev) return -EINVAL; /* PHY not controllable */ - return phy_mii_ioctl(aup->phy_dev, if_mii(rq), cmd); + return phy_mii_ioctl(aup->phy_dev, rq, cmd); } static const struct net_device_ops au1000_netdev_ops = { diff --git a/drivers/net/bcm63xx_enet.c b/drivers/net/bcm63xx_enet.c index faf5add894d77..0d2c5da08937d 100644 --- a/drivers/net/bcm63xx_enet.c +++ b/drivers/net/bcm63xx_enet.c @@ -1496,7 +1496,7 @@ static int bcm_enet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) if (priv->has_phy) { if (!priv->phydev) return -ENODEV; - return phy_mii_ioctl(priv->phydev, if_mii(rq), cmd); + return phy_mii_ioctl(priv->phydev, rq, cmd); } else { struct mii_if_info mii; diff --git a/drivers/net/cpmac.c b/drivers/net/cpmac.c index 38de1a4f825f1..e1f6156b3710e 100644 --- a/drivers/net/cpmac.c +++ b/drivers/net/cpmac.c @@ -846,11 +846,8 @@ static int cpmac_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) return -EINVAL; if (!priv->phy) return -EINVAL; - if ((cmd == SIOCGMIIPHY) || (cmd == SIOCGMIIREG) || - (cmd == SIOCSMIIREG)) - return phy_mii_ioctl(priv->phy, if_mii(ifr), cmd); - return -EOPNOTSUPP; + return phy_mii_ioctl(priv->phy, ifr, cmd); } static int cpmac_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) diff --git a/drivers/net/dnet.c b/drivers/net/dnet.c index 8b0f50bbf3e5c..4ea7141f525d5 100644 --- a/drivers/net/dnet.c +++ b/drivers/net/dnet.c @@ -797,7 +797,7 @@ static int dnet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) if (!phydev) return -ENODEV; - return phy_mii_ioctl(phydev, if_mii(rq), cmd); + return phy_mii_ioctl(phydev, rq, cmd); } static void dnet_get_drvinfo(struct net_device *dev, diff --git a/drivers/net/ethoc.c b/drivers/net/ethoc.c index 5bb6bb74c40eb..38c282e6565bc 100644 --- a/drivers/net/ethoc.c +++ b/drivers/net/ethoc.c @@ -730,7 +730,7 @@ static int ethoc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) phy = priv->phy; } - return phy_mii_ioctl(phy, mdio, cmd); + return phy_mii_ioctl(phy, ifr, cmd); } static int ethoc_config(struct net_device *dev, struct ifmap *map) diff --git a/drivers/net/fec.c b/drivers/net/fec.c index 937f1b4a3483a..391a553a3addd 100644 --- a/drivers/net/fec.c +++ b/drivers/net/fec.c @@ -825,7 +825,7 @@ static int fec_enet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) if (!phydev) return -ENODEV; - return phy_mii_ioctl(phydev, if_mii(rq), cmd); + return phy_mii_ioctl(phydev, rq, cmd); } static void fec_enet_free_buffers(struct net_device *dev) diff --git a/drivers/net/fec_mpc52xx.c b/drivers/net/fec_mpc52xx.c index 5f8346369b800..d1a5b17b2a955 100644 --- a/drivers/net/fec_mpc52xx.c +++ b/drivers/net/fec_mpc52xx.c @@ -826,7 +826,7 @@ static int mpc52xx_fec_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) if (!priv->phydev) return -ENOTSUPP; - return phy_mii_ioctl(priv->phydev, if_mii(rq), cmd); + return phy_mii_ioctl(priv->phydev, rq, cmd); } static const struct net_device_ops mpc52xx_fec_netdev_ops = { diff --git a/drivers/net/fs_enet/fs_enet-main.c b/drivers/net/fs_enet/fs_enet-main.c index 309a0eaddd815..f08cff9020bdc 100644 --- a/drivers/net/fs_enet/fs_enet-main.c +++ b/drivers/net/fs_enet/fs_enet-main.c @@ -963,12 +963,11 @@ static const struct ethtool_ops fs_ethtool_ops = { static int fs_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { struct fs_enet_private *fep = netdev_priv(dev); - struct mii_ioctl_data *mii = (struct mii_ioctl_data *)&rq->ifr_data; if (!netif_running(dev)) return -EINVAL; - return phy_mii_ioctl(fep->phydev, mii, cmd); + return phy_mii_ioctl(fep->phydev, rq, cmd); } extern int fs_mii_connect(struct net_device *dev); diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index 746a776a16534..27f02970d8987 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c @@ -847,7 +847,7 @@ static int gfar_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) if (!priv->phydev) return -ENODEV; - return phy_mii_ioctl(priv->phydev, if_mii(rq), cmd); + return phy_mii_ioctl(priv->phydev, rq, cmd); } static unsigned int reverse_bitmap(unsigned int bit_map, unsigned int max_qs) diff --git a/drivers/net/macb.c b/drivers/net/macb.c index 40797fbdca9f7..ff2f158ab0b92 100644 --- a/drivers/net/macb.c +++ b/drivers/net/macb.c @@ -1082,7 +1082,7 @@ static int macb_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) if (!phydev) return -ENODEV; - return phy_mii_ioctl(phydev, if_mii(rq), cmd); + return phy_mii_ioctl(phydev, rq, cmd); } static const struct net_device_ops macb_netdev_ops = { diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c index af075af20e0c5..2fcdb1e1b99d0 100644 --- a/drivers/net/mv643xx_eth.c +++ b/drivers/net/mv643xx_eth.c @@ -2461,7 +2461,7 @@ static int mv643xx_eth_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) struct mv643xx_eth_private *mp = netdev_priv(dev); if (mp->phy != NULL) - return phy_mii_ioctl(mp->phy, if_mii(ifr), cmd); + return phy_mii_ioctl(mp->phy, ifr, cmd); return -EOPNOTSUPP; } diff --git a/drivers/net/octeon/octeon_mgmt.c b/drivers/net/octeon/octeon_mgmt.c index f4a0f08e14e12..b264f0f456054 100644 --- a/drivers/net/octeon/octeon_mgmt.c +++ b/drivers/net/octeon/octeon_mgmt.c @@ -620,7 +620,7 @@ static int octeon_mgmt_ioctl(struct net_device *netdev, if (!p->phydev) return -EINVAL; - return phy_mii_ioctl(p->phydev, if_mii(rq), cmd); + return phy_mii_ioctl(p->phydev, rq, cmd); } static void octeon_mgmt_adjust_link(struct net_device *netdev) diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 64be4664ccab0..bd88d818f0826 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -309,8 +309,9 @@ EXPORT_SYMBOL(phy_ethtool_gset); * current state. Use at own risk. */ int phy_mii_ioctl(struct phy_device *phydev, - struct mii_ioctl_data *mii_data, int cmd) + struct ifreq *ifr, int cmd) { + struct mii_ioctl_data *mii_data = if_mii(ifr); u16 val = mii_data->val_in; switch (cmd) { diff --git a/drivers/net/sb1250-mac.c b/drivers/net/sb1250-mac.c index 79eee3062083a..8e6bd45b9f311 100644 --- a/drivers/net/sb1250-mac.c +++ b/drivers/net/sb1250-mac.c @@ -2532,7 +2532,7 @@ static int sbmac_mii_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) if (!netif_running(dev) || !sc->phy_dev) return -EINVAL; - return phy_mii_ioctl(sc->phy_dev, if_mii(rq), cmd); + return phy_mii_ioctl(sc->phy_dev, rq, cmd); } static int sbmac_close(struct net_device *dev) diff --git a/drivers/net/sh_eth.c b/drivers/net/sh_eth.c index 7ac814d932b12..32f2deaa38bb5 100644 --- a/drivers/net/sh_eth.c +++ b/drivers/net/sh_eth.c @@ -1284,7 +1284,7 @@ static int sh_eth_do_ioctl(struct net_device *ndev, struct ifreq *rq, if (!phydev) return -ENODEV; - return phy_mii_ioctl(phydev, if_mii(rq), cmd); + return phy_mii_ioctl(phydev, rq, cmd); } #if defined(SH_ETH_HAS_TSU) diff --git a/drivers/net/smsc911x.c b/drivers/net/smsc911x.c index cc559741b0fac..56dc2ff75ee36 100644 --- a/drivers/net/smsc911x.c +++ b/drivers/net/smsc911x.c @@ -1538,7 +1538,7 @@ static int smsc911x_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) if (!netif_running(dev) || !pdata->phy_dev) return -EINVAL; - return phy_mii_ioctl(pdata->phy_dev, if_mii(ifr), cmd); + return phy_mii_ioctl(pdata->phy_dev, ifr, cmd); } static int diff --git a/drivers/net/smsc9420.c b/drivers/net/smsc9420.c index 6cdee6a15f9f2..b09ee1c319e8c 100644 --- a/drivers/net/smsc9420.c +++ b/drivers/net/smsc9420.c @@ -245,7 +245,7 @@ static int smsc9420_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) if (!netif_running(dev) || !pd->phy_dev) return -EINVAL; - return phy_mii_ioctl(pd->phy_dev, if_mii(ifr), cmd); + return phy_mii_ioctl(pd->phy_dev, ifr, cmd); } static int smsc9420_ethtool_get_settings(struct net_device *dev, diff --git a/drivers/net/stmmac/stmmac_main.c b/drivers/net/stmmac/stmmac_main.c index a31d580f306d9..acf0616869403 100644 --- a/drivers/net/stmmac/stmmac_main.c +++ b/drivers/net/stmmac/stmmac_main.c @@ -1437,24 +1437,18 @@ static void stmmac_poll_controller(struct net_device *dev) static int stmmac_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { struct stmmac_priv *priv = netdev_priv(dev); - int ret = -EOPNOTSUPP; + int ret; if (!netif_running(dev)) return -EINVAL; - switch (cmd) { - case SIOCGMIIPHY: - case SIOCGMIIREG: - case SIOCSMIIREG: - if (!priv->phydev) - return -EINVAL; - - spin_lock(&priv->lock); - ret = phy_mii_ioctl(priv->phydev, if_mii(rq), cmd); - spin_unlock(&priv->lock); - default: - break; - } + if (!priv->phydev) + return -EINVAL; + + spin_lock(&priv->lock); + ret = phy_mii_ioctl(priv->phydev, rq, cmd); + spin_unlock(&priv->lock); + return ret; } diff --git a/drivers/net/tc35815.c b/drivers/net/tc35815.c index be08b75dbc15a..99e423a5b9f1d 100644 --- a/drivers/net/tc35815.c +++ b/drivers/net/tc35815.c @@ -2066,7 +2066,7 @@ static int tc35815_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) return -EINVAL; if (!lp->phy_dev) return -ENODEV; - return phy_mii_ioctl(lp->phy_dev, if_mii(rq), cmd); + return phy_mii_ioctl(lp->phy_dev, rq, cmd); } static void tc35815_chip_reset(struct net_device *dev) diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 5769e1507d2f1..b26a577829390 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c @@ -10932,7 +10932,7 @@ static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) if (!(tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED)) return -EAGAIN; phydev = tp->mdio_bus->phy_map[TG3_PHY_MII_ADDR]; - return phy_mii_ioctl(phydev, data, cmd); + return phy_mii_ioctl(phydev, ifr, cmd); } switch (cmd) { diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c index dc32a62e611c7..e17dd74309153 100644 --- a/drivers/net/ucc_geth.c +++ b/drivers/net/ucc_geth.c @@ -3714,7 +3714,7 @@ static int ucc_geth_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) if (!ugeth->phydev) return -ENODEV; - return phy_mii_ioctl(ugeth->phydev, if_mii(rq), cmd); + return phy_mii_ioctl(ugeth->phydev, rq, cmd); } static const struct net_device_ops ucc_geth_netdev_ops = { diff --git a/drivers/staging/octeon/ethernet-mdio.c b/drivers/staging/octeon/ethernet-mdio.c index 7e0be8d00dc3a..10a82ef302152 100644 --- a/drivers/staging/octeon/ethernet-mdio.c +++ b/drivers/staging/octeon/ethernet-mdio.c @@ -113,7 +113,7 @@ int cvm_oct_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) if (!priv->phydev) return -EINVAL; - return phy_mii_ioctl(priv->phydev, if_mii(rq), cmd); + return phy_mii_ioctl(priv->phydev, rq, cmd); } static void cvm_oct_adjust_link(struct net_device *dev) diff --git a/include/linux/phy.h b/include/linux/phy.h index 987e111f7b112..d63736a84002e 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -498,7 +498,7 @@ void phy_stop_machine(struct phy_device *phydev); int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd); int phy_ethtool_gset(struct phy_device *phydev, struct ethtool_cmd *cmd); int phy_mii_ioctl(struct phy_device *phydev, - struct mii_ioctl_data *mii_data, int cmd); + struct ifreq *ifr, int cmd); int phy_start_interrupts(struct phy_device *phydev); void phy_print_status(struct phy_device *phydev); struct phy_device* phy_device_create(struct mii_bus *bus, int addr, int phy_id); diff --git a/net/dsa/slave.c b/net/dsa/slave.c index 8fdca56bb08f3..64ca2a6fa0d44 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c @@ -164,10 +164,9 @@ out: static int dsa_slave_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { struct dsa_slave_priv *p = netdev_priv(dev); - struct mii_ioctl_data *mii_data = if_mii(ifr); if (p->phy != NULL) - return phy_mii_ioctl(p->phy, mii_data, cmd); + return phy_mii_ioctl(p->phy, ifr, cmd); return -EOPNOTSUPP; } -- 2.30.2