struct ethtool_link_ksettings *cmd)
 {
        struct lan78xx_net *dev = netdev_priv(net);
-       struct phy_device *phydev = net->phydev;
-       int ret;
-
-       ret = usb_autopm_get_interface(dev->intf);
-       if (ret < 0)
-               return ret;
 
-       phy_ethtool_ksettings_get(phydev, cmd);
-
-       usb_autopm_put_interface(dev->intf);
-
-       return ret;
+       return phylink_ethtool_ksettings_get(dev->phylink, cmd);
 }
 
 static int lan78xx_set_link_ksettings(struct net_device *net,
                                      const struct ethtool_link_ksettings *cmd)
 {
        struct lan78xx_net *dev = netdev_priv(net);
-       struct phy_device *phydev = net->phydev;
-       int ret = 0;
-       int temp;
-
-       ret = usb_autopm_get_interface(dev->intf);
-       if (ret < 0)
-               return ret;
-
-       /* change speed & duplex */
-       ret = phy_ethtool_ksettings_set(phydev, cmd);
 
-       if (!cmd->base.autoneg) {
-               /* force link down */
-               temp = phy_read(phydev, MII_BMCR);
-               phy_write(phydev, MII_BMCR, temp | BMCR_LOOPBACK);
-               mdelay(1);
-               phy_write(phydev, MII_BMCR, temp);
-       }
-
-       usb_autopm_put_interface(dev->intf);
-
-       return ret;
+       return phylink_ethtool_ksettings_set(dev->phylink, cmd);
 }
 
 static void lan78xx_get_pause(struct net_device *net,