{
        struct hns_nic_priv *priv = netdev_priv(net_dev);
        struct hnae_handle *h;
-       int link_stat;
        u32 speed;
-       u8 duplex, autoneg;
 
        if (!netif_running(net_dev))
                return -ESRCH;
                return -ENODEV;
 
        h = priv->ae_handle;
-       link_stat = hns_nic_get_link(net_dev);
-       duplex = cmd->duplex;
        speed = ethtool_cmd_speed(cmd);
-       autoneg = cmd->autoneg;
-
-       if (!link_stat) {
-               if (duplex != (u8)DUPLEX_UNKNOWN || speed != (u32)SPEED_UNKNOWN)
-                       return -EINVAL;
-
-               if (h->phy_if == PHY_INTERFACE_MODE_SGMII && h->phy_node) {
-                       priv->phy->autoneg = autoneg;
-                       return phy_start_aneg(priv->phy);
-               }
-       }
 
        if (h->phy_if == PHY_INTERFACE_MODE_XGMII) {
-               if (autoneg != AUTONEG_DISABLE)
-                       return -EINVAL;
-
-               if (speed != SPEED_10000 || duplex != DUPLEX_FULL)
+               if (cmd->autoneg == AUTONEG_ENABLE || speed != SPEED_10000 ||
+                   cmd->duplex != DUPLEX_FULL)
                        return -EINVAL;
        } else if (h->phy_if == PHY_INTERFACE_MODE_SGMII) {
-               if (!h->phy_node && autoneg != AUTONEG_DISABLE)
+               if (!priv->phy && cmd->autoneg == AUTONEG_ENABLE)
                        return -EINVAL;
 
-               if (speed == SPEED_1000 && duplex == DUPLEX_HALF)
+               if (speed == SPEED_1000 && cmd->duplex == DUPLEX_HALF)
                        return -EINVAL;
+               if (priv->phy)
+                       return phy_ethtool_sset(priv->phy, cmd);
 
-               if (speed != SPEED_10 && speed != SPEED_100 &&
-                   speed != SPEED_1000)
+               if ((speed != SPEED_10 && speed != SPEED_100 &&
+                    speed != SPEED_1000) || (cmd->duplex != DUPLEX_HALF &&
+                    cmd->duplex != DUPLEX_FULL))
                        return -EINVAL;
        } else {
                netdev_err(net_dev, "Not supported!");
                return -ENOTSUPP;
        }
 
-       if (priv->phy) {
-               return phy_ethtool_sset(priv->phy, cmd);
-       } else if (h->dev->ops->adjust_link && link_stat) {
-               h->dev->ops->adjust_link(h, speed, duplex);
+       if (h->dev->ops->adjust_link) {
+               h->dev->ops->adjust_link(h, (int)speed, cmd->duplex);
                return 0;
        }
+
        netdev_err(net_dev, "Not supported!");
        return -ENOTSUPP;
 }