net: Convert PHYs hwtstamp callback to use kernel_hwtstamp_config
[sfrench/cifs-2.6.git] / drivers / net / phy / phy.c
index a5fa077650e8383ddd65ff2fff0925fc5a6f32c8..d058316666ba0d06fe5cf9413f2910ce7ad61307 100644 (file)
@@ -325,9 +325,13 @@ EXPORT_SYMBOL(phy_ethtool_ksettings_get);
 int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd)
 {
        struct mii_ioctl_data *mii_data = if_mii(ifr);
+       struct kernel_hwtstamp_config kernel_cfg;
+       struct netlink_ext_ack extack = {};
        u16 val = mii_data->val_in;
        bool change_autoneg = false;
+       struct hwtstamp_config cfg;
        int prtad, devad;
+       int ret;
 
        switch (cmd) {
        case SIOCGMIIPHY:
@@ -411,8 +415,21 @@ int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd)
                return 0;
 
        case SIOCSHWTSTAMP:
-               if (phydev->mii_ts && phydev->mii_ts->hwtstamp)
-                       return phydev->mii_ts->hwtstamp(phydev->mii_ts, ifr);
+               if (phydev->mii_ts && phydev->mii_ts->hwtstamp) {
+                       if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg)))
+                               return -EFAULT;
+
+                       hwtstamp_config_to_kernel(&kernel_cfg, &cfg);
+                       ret = phydev->mii_ts->hwtstamp(phydev->mii_ts, &kernel_cfg, &extack);
+                       if (ret)
+                               return ret;
+
+                       hwtstamp_config_from_kernel(&cfg, &kernel_cfg);
+                       if (copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)))
+                               return -EFAULT;
+
+                       return 0;
+               }
                fallthrough;
 
        default: