|
@@ -194,9 +194,7 @@ static int hns_nic_set_settings(struct net_device *net_dev,
|
|
|
{
|
|
|
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;
|
|
@@ -206,48 +204,35 @@ static int hns_nic_set_settings(struct net_device *net_dev,
|
|
|
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;
|
|
|
}
|