|
@@ -2030,21 +2030,6 @@ out:
|
|
|
return ret;
|
|
return ret;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
|
|
|
|
|
-{
|
|
|
|
|
- struct rtl8169_private *tp = netdev_priv(dev);
|
|
|
|
|
- int ret;
|
|
|
|
|
-
|
|
|
|
|
- del_timer_sync(&tp->timer);
|
|
|
|
|
-
|
|
|
|
|
- rtl_lock_work(tp);
|
|
|
|
|
- ret = rtl8169_set_speed(dev, cmd->autoneg, ethtool_cmd_speed(cmd),
|
|
|
|
|
- cmd->duplex, cmd->advertising);
|
|
|
|
|
- rtl_unlock_work(tp);
|
|
|
|
|
-
|
|
|
|
|
- return ret;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
static netdev_features_t rtl8169_fix_features(struct net_device *dev,
|
|
static netdev_features_t rtl8169_fix_features(struct net_device *dev,
|
|
|
netdev_features_t features)
|
|
netdev_features_t features)
|
|
|
{
|
|
{
|
|
@@ -2171,6 +2156,27 @@ static int rtl8169_get_link_ksettings(struct net_device *dev,
|
|
|
return rc;
|
|
return rc;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+static int rtl8169_set_link_ksettings(struct net_device *dev,
|
|
|
|
|
+ const struct ethtool_link_ksettings *cmd)
|
|
|
|
|
+{
|
|
|
|
|
+ struct rtl8169_private *tp = netdev_priv(dev);
|
|
|
|
|
+ int rc;
|
|
|
|
|
+ u32 advertising;
|
|
|
|
|
+
|
|
|
|
|
+ if (!ethtool_convert_link_mode_to_legacy_u32(&advertising,
|
|
|
|
|
+ cmd->link_modes.advertising))
|
|
|
|
|
+ return -EINVAL;
|
|
|
|
|
+
|
|
|
|
|
+ del_timer_sync(&tp->timer);
|
|
|
|
|
+
|
|
|
|
|
+ rtl_lock_work(tp);
|
|
|
|
|
+ rc = rtl8169_set_speed(dev, cmd->base.autoneg, cmd->base.speed,
|
|
|
|
|
+ cmd->base.duplex, advertising);
|
|
|
|
|
+ rtl_unlock_work(tp);
|
|
|
|
|
+
|
|
|
|
|
+ return rc;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
static void rtl8169_get_regs(struct net_device *dev, struct ethtool_regs *regs,
|
|
static void rtl8169_get_regs(struct net_device *dev, struct ethtool_regs *regs,
|
|
|
void *p)
|
|
void *p)
|
|
|
{
|
|
{
|
|
@@ -2591,7 +2597,6 @@ static const struct ethtool_ops rtl8169_ethtool_ops = {
|
|
|
.get_link = ethtool_op_get_link,
|
|
.get_link = ethtool_op_get_link,
|
|
|
.get_coalesce = rtl_get_coalesce,
|
|
.get_coalesce = rtl_get_coalesce,
|
|
|
.set_coalesce = rtl_set_coalesce,
|
|
.set_coalesce = rtl_set_coalesce,
|
|
|
- .set_settings = rtl8169_set_settings,
|
|
|
|
|
.get_msglevel = rtl8169_get_msglevel,
|
|
.get_msglevel = rtl8169_get_msglevel,
|
|
|
.set_msglevel = rtl8169_set_msglevel,
|
|
.set_msglevel = rtl8169_set_msglevel,
|
|
|
.get_regs = rtl8169_get_regs,
|
|
.get_regs = rtl8169_get_regs,
|
|
@@ -2603,6 +2608,7 @@ static const struct ethtool_ops rtl8169_ethtool_ops = {
|
|
|
.get_ts_info = ethtool_op_get_ts_info,
|
|
.get_ts_info = ethtool_op_get_ts_info,
|
|
|
.nway_reset = rtl8169_nway_reset,
|
|
.nway_reset = rtl8169_nway_reset,
|
|
|
.get_link_ksettings = rtl8169_get_link_ksettings,
|
|
.get_link_ksettings = rtl8169_get_link_ksettings,
|
|
|
|
|
+ .set_link_ksettings = rtl8169_set_link_ksettings,
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
static void rtl8169_get_mac_version(struct rtl8169_private *tp,
|
|
static void rtl8169_get_mac_version(struct rtl8169_private *tp,
|