|
@@ -1379,7 +1379,7 @@ static int octeon_mgmt_get_settings(struct net_device *netdev,
|
|
|
if (p->phydev)
|
|
|
return phy_ethtool_gset(p->phydev, cmd);
|
|
|
|
|
|
- return -EINVAL;
|
|
|
+ return -EOPNOTSUPP;
|
|
|
}
|
|
|
|
|
|
static int octeon_mgmt_set_settings(struct net_device *netdev,
|
|
@@ -1393,14 +1393,28 @@ static int octeon_mgmt_set_settings(struct net_device *netdev,
|
|
|
if (p->phydev)
|
|
|
return phy_ethtool_sset(p->phydev, cmd);
|
|
|
|
|
|
- return -EINVAL;
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+}
|
|
|
+
|
|
|
+static int octeon_mgmt_nway_reset(struct net_device *dev)
|
|
|
+{
|
|
|
+ struct octeon_mgmt *p = netdev_priv(dev);
|
|
|
+
|
|
|
+ if (!capable(CAP_NET_ADMIN))
|
|
|
+ return -EPERM;
|
|
|
+
|
|
|
+ if (p->phydev)
|
|
|
+ return phy_start_aneg(p->phydev);
|
|
|
+
|
|
|
+ return -EOPNOTSUPP;
|
|
|
}
|
|
|
|
|
|
static const struct ethtool_ops octeon_mgmt_ethtool_ops = {
|
|
|
.get_drvinfo = octeon_mgmt_get_drvinfo,
|
|
|
- .get_link = ethtool_op_get_link,
|
|
|
.get_settings = octeon_mgmt_get_settings,
|
|
|
- .set_settings = octeon_mgmt_set_settings
|
|
|
+ .set_settings = octeon_mgmt_set_settings,
|
|
|
+ .nway_reset = octeon_mgmt_nway_reset,
|
|
|
+ .get_link = ethtool_op_get_link,
|
|
|
};
|
|
|
|
|
|
static const struct net_device_ops octeon_mgmt_ops = {
|