@@ -12079,95 +12079,107 @@ static int tg3_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
12079
12079
return ret ;
12080
12080
}
12081
12081
12082
- static int tg3_get_settings (struct net_device * dev , struct ethtool_cmd * cmd )
12082
+ static int tg3_get_link_ksettings (struct net_device * dev ,
12083
+ struct ethtool_link_ksettings * cmd )
12083
12084
{
12084
12085
struct tg3 * tp = netdev_priv (dev );
12086
+ u32 supported , advertising ;
12085
12087
12086
12088
if (tg3_flag (tp , USE_PHYLIB )) {
12087
12089
struct phy_device * phydev ;
12088
12090
if (!(tp -> phy_flags & TG3_PHYFLG_IS_CONNECTED ))
12089
12091
return - EAGAIN ;
12090
12092
phydev = mdiobus_get_phy (tp -> mdio_bus , tp -> phy_addr );
12091
- return phy_ethtool_gset (phydev , cmd );
12093
+ return phy_ethtool_ksettings_get (phydev , cmd );
12092
12094
}
12093
12095
12094
- cmd -> supported = (SUPPORTED_Autoneg );
12096
+ supported = (SUPPORTED_Autoneg );
12095
12097
12096
12098
if (!(tp -> phy_flags & TG3_PHYFLG_10_100_ONLY ))
12097
- cmd -> supported |= (SUPPORTED_1000baseT_Half |
12098
- SUPPORTED_1000baseT_Full );
12099
+ supported |= (SUPPORTED_1000baseT_Half |
12100
+ SUPPORTED_1000baseT_Full );
12099
12101
12100
12102
if (!(tp -> phy_flags & TG3_PHYFLG_ANY_SERDES )) {
12101
- cmd -> supported |= (SUPPORTED_100baseT_Half |
12102
- SUPPORTED_100baseT_Full |
12103
- SUPPORTED_10baseT_Half |
12104
- SUPPORTED_10baseT_Full |
12105
- SUPPORTED_TP );
12106
- cmd -> port = PORT_TP ;
12103
+ supported |= (SUPPORTED_100baseT_Half |
12104
+ SUPPORTED_100baseT_Full |
12105
+ SUPPORTED_10baseT_Half |
12106
+ SUPPORTED_10baseT_Full |
12107
+ SUPPORTED_TP );
12108
+ cmd -> base . port = PORT_TP ;
12107
12109
} else {
12108
- cmd -> supported |= SUPPORTED_FIBRE ;
12109
- cmd -> port = PORT_FIBRE ;
12110
+ supported |= SUPPORTED_FIBRE ;
12111
+ cmd -> base . port = PORT_FIBRE ;
12110
12112
}
12113
+ ethtool_convert_legacy_u32_to_link_mode (cmd -> link_modes .supported ,
12114
+ supported );
12111
12115
12112
- cmd -> advertising = tp -> link_config .advertising ;
12116
+ advertising = tp -> link_config .advertising ;
12113
12117
if (tg3_flag (tp , PAUSE_AUTONEG )) {
12114
12118
if (tp -> link_config .flowctrl & FLOW_CTRL_RX ) {
12115
12119
if (tp -> link_config .flowctrl & FLOW_CTRL_TX ) {
12116
- cmd -> advertising |= ADVERTISED_Pause ;
12120
+ advertising |= ADVERTISED_Pause ;
12117
12121
} else {
12118
- cmd -> advertising |= ADVERTISED_Pause |
12119
- ADVERTISED_Asym_Pause ;
12122
+ advertising |= ADVERTISED_Pause |
12123
+ ADVERTISED_Asym_Pause ;
12120
12124
}
12121
12125
} else if (tp -> link_config .flowctrl & FLOW_CTRL_TX ) {
12122
- cmd -> advertising |= ADVERTISED_Asym_Pause ;
12126
+ advertising |= ADVERTISED_Asym_Pause ;
12123
12127
}
12124
12128
}
12129
+ ethtool_convert_legacy_u32_to_link_mode (cmd -> link_modes .advertising ,
12130
+ advertising );
12131
+
12125
12132
if (netif_running (dev ) && tp -> link_up ) {
12126
- ethtool_cmd_speed_set (cmd , tp -> link_config .active_speed );
12127
- cmd -> duplex = tp -> link_config .active_duplex ;
12128
- cmd -> lp_advertising = tp -> link_config .rmt_adv ;
12133
+ cmd -> base .speed = tp -> link_config .active_speed ;
12134
+ cmd -> base .duplex = tp -> link_config .active_duplex ;
12135
+ ethtool_convert_legacy_u32_to_link_mode (
12136
+ cmd -> link_modes .lp_advertising ,
12137
+ tp -> link_config .rmt_adv );
12138
+
12129
12139
if (!(tp -> phy_flags & TG3_PHYFLG_ANY_SERDES )) {
12130
12140
if (tp -> phy_flags & TG3_PHYFLG_MDIX_STATE )
12131
- cmd -> eth_tp_mdix = ETH_TP_MDI_X ;
12141
+ cmd -> base . eth_tp_mdix = ETH_TP_MDI_X ;
12132
12142
else
12133
- cmd -> eth_tp_mdix = ETH_TP_MDI ;
12143
+ cmd -> base . eth_tp_mdix = ETH_TP_MDI ;
12134
12144
}
12135
12145
} else {
12136
- ethtool_cmd_speed_set (cmd , SPEED_UNKNOWN );
12137
- cmd -> duplex = DUPLEX_UNKNOWN ;
12138
- cmd -> eth_tp_mdix = ETH_TP_MDI_INVALID ;
12139
- }
12140
- cmd -> phy_address = tp -> phy_addr ;
12141
- cmd -> transceiver = XCVR_INTERNAL ;
12142
- cmd -> autoneg = tp -> link_config .autoneg ;
12143
- cmd -> maxtxpkt = 0 ;
12144
- cmd -> maxrxpkt = 0 ;
12146
+ cmd -> base .speed = SPEED_UNKNOWN ;
12147
+ cmd -> base .duplex = DUPLEX_UNKNOWN ;
12148
+ cmd -> base .eth_tp_mdix = ETH_TP_MDI_INVALID ;
12149
+ }
12150
+ cmd -> base .phy_address = tp -> phy_addr ;
12151
+ cmd -> base .autoneg = tp -> link_config .autoneg ;
12145
12152
return 0 ;
12146
12153
}
12147
12154
12148
- static int tg3_set_settings (struct net_device * dev , struct ethtool_cmd * cmd )
12155
+ static int tg3_set_link_ksettings (struct net_device * dev ,
12156
+ const struct ethtool_link_ksettings * cmd )
12149
12157
{
12150
12158
struct tg3 * tp = netdev_priv (dev );
12151
- u32 speed = ethtool_cmd_speed (cmd );
12159
+ u32 speed = cmd -> base .speed ;
12160
+ u32 advertising ;
12152
12161
12153
12162
if (tg3_flag (tp , USE_PHYLIB )) {
12154
12163
struct phy_device * phydev ;
12155
12164
if (!(tp -> phy_flags & TG3_PHYFLG_IS_CONNECTED ))
12156
12165
return - EAGAIN ;
12157
12166
phydev = mdiobus_get_phy (tp -> mdio_bus , tp -> phy_addr );
12158
- return phy_ethtool_sset (phydev , cmd );
12167
+ return phy_ethtool_ksettings_set (phydev , cmd );
12159
12168
}
12160
12169
12161
- if (cmd -> autoneg != AUTONEG_ENABLE &&
12162
- cmd -> autoneg != AUTONEG_DISABLE )
12170
+ if (cmd -> base . autoneg != AUTONEG_ENABLE &&
12171
+ cmd -> base . autoneg != AUTONEG_DISABLE )
12163
12172
return - EINVAL ;
12164
12173
12165
- if (cmd -> autoneg == AUTONEG_DISABLE &&
12166
- cmd -> duplex != DUPLEX_FULL &&
12167
- cmd -> duplex != DUPLEX_HALF )
12174
+ if (cmd -> base . autoneg == AUTONEG_DISABLE &&
12175
+ cmd -> base . duplex != DUPLEX_FULL &&
12176
+ cmd -> base . duplex != DUPLEX_HALF )
12168
12177
return - EINVAL ;
12169
12178
12170
- if (cmd -> autoneg == AUTONEG_ENABLE ) {
12179
+ ethtool_convert_link_mode_to_legacy_u32 (& advertising ,
12180
+ cmd -> link_modes .advertising );
12181
+
12182
+ if (cmd -> base .autoneg == AUTONEG_ENABLE ) {
12171
12183
u32 mask = ADVERTISED_Autoneg |
12172
12184
ADVERTISED_Pause |
12173
12185
ADVERTISED_Asym_Pause ;
@@ -12185,7 +12197,7 @@ static int tg3_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
12185
12197
else
12186
12198
mask |= ADVERTISED_FIBRE ;
12187
12199
12188
- if (cmd -> advertising & ~mask )
12200
+ if (advertising & ~mask )
12189
12201
return - EINVAL ;
12190
12202
12191
12203
mask &= (ADVERTISED_1000baseT_Half |
@@ -12195,13 +12207,13 @@ static int tg3_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
12195
12207
ADVERTISED_10baseT_Half |
12196
12208
ADVERTISED_10baseT_Full );
12197
12209
12198
- cmd -> advertising &= mask ;
12210
+ advertising &= mask ;
12199
12211
} else {
12200
12212
if (tp -> phy_flags & TG3_PHYFLG_ANY_SERDES ) {
12201
12213
if (speed != SPEED_1000 )
12202
12214
return - EINVAL ;
12203
12215
12204
- if (cmd -> duplex != DUPLEX_FULL )
12216
+ if (cmd -> base . duplex != DUPLEX_FULL )
12205
12217
return - EINVAL ;
12206
12218
} else {
12207
12219
if (speed != SPEED_100 &&
@@ -12212,16 +12224,16 @@ static int tg3_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
12212
12224
12213
12225
tg3_full_lock (tp , 0 );
12214
12226
12215
- tp -> link_config .autoneg = cmd -> autoneg ;
12216
- if (cmd -> autoneg == AUTONEG_ENABLE ) {
12217
- tp -> link_config .advertising = (cmd -> advertising |
12227
+ tp -> link_config .autoneg = cmd -> base . autoneg ;
12228
+ if (cmd -> base . autoneg == AUTONEG_ENABLE ) {
12229
+ tp -> link_config .advertising = (advertising |
12218
12230
ADVERTISED_Autoneg );
12219
12231
tp -> link_config .speed = SPEED_UNKNOWN ;
12220
12232
tp -> link_config .duplex = DUPLEX_UNKNOWN ;
12221
12233
} else {
12222
12234
tp -> link_config .advertising = 0 ;
12223
12235
tp -> link_config .speed = speed ;
12224
- tp -> link_config .duplex = cmd -> duplex ;
12236
+ tp -> link_config .duplex = cmd -> base . duplex ;
12225
12237
}
12226
12238
12227
12239
tp -> phy_flags |= TG3_PHYFLG_USER_CONFIGURED ;
@@ -14094,8 +14106,6 @@ static int tg3_get_eee(struct net_device *dev, struct ethtool_eee *edata)
14094
14106
}
14095
14107
14096
14108
static const struct ethtool_ops tg3_ethtool_ops = {
14097
- .get_settings = tg3_get_settings ,
14098
- .set_settings = tg3_set_settings ,
14099
14109
.get_drvinfo = tg3_get_drvinfo ,
14100
14110
.get_regs_len = tg3_get_regs_len ,
14101
14111
.get_regs = tg3_get_regs ,
@@ -14128,6 +14138,8 @@ static const struct ethtool_ops tg3_ethtool_ops = {
14128
14138
.get_ts_info = tg3_get_ts_info ,
14129
14139
.get_eee = tg3_get_eee ,
14130
14140
.set_eee = tg3_set_eee ,
14141
+ .get_link_ksettings = tg3_get_link_ksettings ,
14142
+ .set_link_ksettings = tg3_set_link_ksettings ,
14131
14143
};
14132
14144
14133
14145
static struct rtnl_link_stats64 * tg3_get_stats64 (struct net_device * dev ,
0 commit comments