net: preserve ifreq parameter when calling generic phy_mii_ioctl().
authorRichard Cochran <richardcochran@gmail.com>
Sat, 17 Jul 2010 08:48:55 +0000 (08:48 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 19 Jul 2010 02:15:25 +0000 (19:15 -0700)
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 <richard.cochran@omicron.at>
Signed-off-by: David S. Miller <davem@davemloft.net>
25 files changed:
drivers/net/arm/ixp4xx_eth.c
drivers/net/au1000_eth.c
drivers/net/bcm63xx_enet.c
drivers/net/cpmac.c
drivers/net/dnet.c
drivers/net/ethoc.c
drivers/net/fec.c
drivers/net/fec_mpc52xx.c
drivers/net/fs_enet/fs_enet-main.c
drivers/net/gianfar.c
drivers/net/macb.c
drivers/net/mv643xx_eth.c
drivers/net/octeon/octeon_mgmt.c
drivers/net/phy/phy.c
drivers/net/sb1250-mac.c
drivers/net/sh_eth.c
drivers/net/smsc911x.c
drivers/net/smsc9420.c
drivers/net/stmmac/stmmac_main.c
drivers/net/tc35815.c
drivers/net/tg3.c
drivers/net/ucc_geth.c
drivers/staging/octeon/ethernet-mdio.c
include/linux/phy.h
net/dsa/slave.c

index ee2f8425dbe70836d8920e002f857489a270b092..4f1cc7164ad9f41435e338a31286c4746120f90b 100644 (file)
@@ -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 */
index ece6128bef146aa330f98f486d23f2bed1c15ed5..386d4feec652b4d33ec0b5648c176b3b2048d0bf 100644 (file)
@@ -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 = {
index faf5add894d7788ebb8b1621951f164d772505d8..0d2c5da08937d33ad4a381e8a08ef04de378df86 100644 (file)
@@ -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;
 
index 38de1a4f825f18d735c4b5103d2d4f9b240ba426..e1f6156b3710e9888f779610ddb10a52fcfd5d9d 100644 (file)
@@ -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)
index 8b0f50bbf3e5cd13bfa4b240387071b3d2a939c9..4ea7141f525d513aa899b56e1f358c0845662c67 100644 (file)
@@ -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,
index 5bb6bb74c40eb6f2692db9c1e1c596976c21aecc..38c282e6565bcb42d3c482cd4945bd74a81a38bb 100644 (file)
@@ -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)
index 937f1b4a3483ae7556cee2880c98b7a091860869..391a553a3addd314b5defc7d6d0b8d41553054be 100644 (file)
@@ -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)
index 5f8346369b80019d79f6c9819d535095838819a4..d1a5b17b2a95567b3466674ec61acdc85657a5b2 100644 (file)
@@ -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 = {
index 309a0eaddd815739d33c196d94ce3aad770cec34..f08cff9020bdc4972b0f76dbaa2b61eb880d0f95 100644 (file)
@@ -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);
index 746a776a16534b404ba3cae4be3bbd254d26764c..27f02970d89874d7876d65366bacd3ac4ef3cf64 100644 (file)
@@ -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)
index 40797fbdca9f774798668dba14381a96f9b68511..ff2f158ab0b92d88597bf68d1b1a13cf89ca4e41 100644 (file)
@@ -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 = {
index af075af20e0c53807836ff1c6912616bfc60c378..2fcdb1e1b99d068ab4791752c53f52a42f14f97a 100644 (file)
@@ -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;
 }
index f4a0f08e14e1287bb14c8c9e897b9cebceabc0ad..b264f0f45605409b6cd378bb5b498b23bd73f994 100644 (file)
@@ -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)
index 64be4664ccab0c906f34ce05f49c66d7cbf6def3..bd88d818f0826aa8f892b6efae8b99404c41390b 100644 (file)
@@ -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) {
index 79eee3062083ab3b900da0c68e7df03cf5bffe9d..8e6bd45b9f311f4ea4c164d6d2528455cb64ae8e 100644 (file)
@@ -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)
index 7ac814d932b1271561ec49bf289aaf2b4f30a86b..32f2deaa38bb5a2f7b8964286fca1595fd82117a 100644 (file)
@@ -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)
index cc559741b0facf24b076e8b96eabe1c90ad78170..56dc2ff75ee360cc6bd7d9805c0e0960802f9b63 100644 (file)
@@ -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
index 6cdee6a15f9f2897fa06baa40ad5c34c90c2e27d..b09ee1c319e8cb56f4813cad857765bf10fce87b 100644 (file)
@@ -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,
index a31d580f306d90c206bc6b90e56cf9bd82a597d9..acf06168694035253c91d584c48c45bde654138f 100644 (file)
@@ -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;
 }
 
index be08b75dbc15a3d2d6adaf8d76c6d1de83c4d362..99e423a5b9f1d556211235ae52bfe3ce422a0254 100644 (file)
@@ -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)
index 5769e1507d2f1fa01532684bbfa54928a4ef6f9e..b26a577829390003fd1af2b80923624dec482e8d 100644 (file)
@@ -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) {
index dc32a62e611c7d8d3e3a9cb29690027fe18d5d09..e17dd743091532a394fd4671d71623775b5a1cdc 100644 (file)
@@ -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 = {
index 7e0be8d00dc3a55c2d4cb031c443d8c43c0de164..10a82ef3021529071476d6f5cc1ddbce9f093544 100644 (file)
@@ -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)
index 987e111f7b112ec1c72ab86243819666614c0676..d63736a84002e3c1a1945e616158cf734fe2b510 100644 (file)
@@ -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);
index 8fdca56bb08f33817645ae55f179fbe6a8ad9c1e..64ca2a6fa0d4449f58c9befbdcbd4d8c31b3cdb0 100644 (file)
@@ -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;
 }