@@ -431,16 +431,17 @@ Request contents:
``ETHTOOL_A_LINKMODES_SPEED`` u32 link speed (Mb/s)
``ETHTOOL_A_LINKMODES_DUPLEX`` u8 duplex mode
``ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG`` u8 Master/slave port mode
+ ``ETHTOOL_A_LINKMODES_LANES`` u32 lanes
========================================== ====== ==========================
``ETHTOOL_A_LINKMODES_OURS`` bit set allows setting advertised link modes. If
autonegotiation is on (either set now or kept from before), advertised modes
are not changed (no ``ETHTOOL_A_LINKMODES_OURS`` attribute) and at least one
-of speed and duplex is specified, kernel adjusts advertised modes to all
-supported modes matching speed, duplex or both (whatever is specified). This
-autoselection is done on ethtool side with ioctl interface, netlink interface
-is supposed to allow requesting changes without knowing what exactly kernel
-supports.
+of speed, duplex and lanes is specified, kernel adjusts advertised modes to all
+supported modes matching speed, duplex, lanes or all (whatever is specified).
+This autoselection is done on ethtool side with ioctl interface, netlink
+interface is supposed to allow requesting changes without knowing what exactly
+kernel supports.
LINKSTATE_GET
@@ -128,6 +128,7 @@ struct ethtool_link_ksettings {
__ETHTOOL_DECLARE_LINK_MODE_MASK(advertising);
__ETHTOOL_DECLARE_LINK_MODE_MASK(lp_advertising);
} link_modes;
+ u32 lanes;
};
/**
@@ -242,6 +243,8 @@ bool ethtool_convert_link_mode_to_legacy_u32(u32 *legacy_u32,
ETHTOOL_COALESCE_PKT_RATE_LOW | ETHTOOL_COALESCE_PKT_RATE_HIGH | \
ETHTOOL_COALESCE_RATE_SAMPLE_INTERVAL)
+#define ETHTOOL_CAP_LINK_LANES_SUPPORTED BIT(0)
+
#define ETHTOOL_STAT_NOT_SET (~0ULL)
/**
@@ -420,6 +423,7 @@ struct ethtool_pause_stats {
* of the generic netdev features interface.
*/
struct ethtool_ops {
+ u32 capabilities;
u32 supported_coalesce_params;
void (*get_drvinfo)(struct net_device *, struct ethtool_drvinfo *);
int (*get_regs_len)(struct net_device *);
@@ -1738,6 +1738,8 @@ static inline int ethtool_validate_speed(__u32 speed)
return speed <= INT_MAX || speed == (__u32)SPEED_UNKNOWN;
}
+#define ETHTOOL_LANES_UNKNOWN 0
+
/* Duplex, half or full. */
#define DUPLEX_HALF 0x00
#define DUPLEX_FULL 0x01
@@ -227,6 +227,7 @@ enum {
ETHTOOL_A_LINKMODES_DUPLEX, /* u8 */
ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG, /* u8 */
ETHTOOL_A_LINKMODES_MASTER_SLAVE_STATE, /* u8 */
+ ETHTOOL_A_LINKMODES_LANES, /* u32 */
/* add new constants above here */
__ETHTOOL_A_LINKMODES_CNT,
@@ -152,12 +152,14 @@ const struct ethnl_request_ops ethnl_linkmodes_request_ops = {
struct link_mode_info {
int speed;
+ u32 lanes;
u8 duplex;
};
-#define __DEFINE_LINK_MODE_PARAMS(_speed, _type, _duplex) \
+#define __DEFINE_LINK_MODE_PARAMS(_speed, _type, _lanes, _duplex) \
[ETHTOOL_LINK_MODE(_speed, _type, _duplex)] = { \
.speed = SPEED_ ## _speed, \
+ .lanes = _lanes, \
.duplex = __DUPLEX_ ## _duplex \
}
#define __DUPLEX_Half DUPLEX_HALF
@@ -165,105 +167,106 @@ struct link_mode_info {
#define __DEFINE_SPECIAL_MODE_PARAMS(_mode) \
[ETHTOOL_LINK_MODE_ ## _mode ## _BIT] = { \
.speed = SPEED_UNKNOWN, \
+ .lanes = ETHTOOL_LANES_UNKNOWN, \
.duplex = DUPLEX_UNKNOWN, \
}
static const struct link_mode_info link_mode_params[] = {
- __DEFINE_LINK_MODE_PARAMS(10, T, Half),
- __DEFINE_LINK_MODE_PARAMS(10, T, Full),
- __DEFINE_LINK_MODE_PARAMS(100, T, Half),
- __DEFINE_LINK_MODE_PARAMS(100, T, Full),
- __DEFINE_LINK_MODE_PARAMS(1000, T, Half),
- __DEFINE_LINK_MODE_PARAMS(1000, T, Full),
+ __DEFINE_LINK_MODE_PARAMS(10, T, 1, Half),
+ __DEFINE_LINK_MODE_PARAMS(10, T, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(100, T, 1, Half),
+ __DEFINE_LINK_MODE_PARAMS(100, T, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(1000, T, 1, Half),
+ __DEFINE_LINK_MODE_PARAMS(1000, T, 1, Full),
__DEFINE_SPECIAL_MODE_PARAMS(Autoneg),
__DEFINE_SPECIAL_MODE_PARAMS(TP),
__DEFINE_SPECIAL_MODE_PARAMS(AUI),
__DEFINE_SPECIAL_MODE_PARAMS(MII),
__DEFINE_SPECIAL_MODE_PARAMS(FIBRE),
__DEFINE_SPECIAL_MODE_PARAMS(BNC),
- __DEFINE_LINK_MODE_PARAMS(10000, T, Full),
+ __DEFINE_LINK_MODE_PARAMS(10000, T, 1, Full),
__DEFINE_SPECIAL_MODE_PARAMS(Pause),
__DEFINE_SPECIAL_MODE_PARAMS(Asym_Pause),
- __DEFINE_LINK_MODE_PARAMS(2500, X, Full),
+ __DEFINE_LINK_MODE_PARAMS(2500, X, 1, Full),
__DEFINE_SPECIAL_MODE_PARAMS(Backplane),
- __DEFINE_LINK_MODE_PARAMS(1000, KX, Full),
- __DEFINE_LINK_MODE_PARAMS(10000, KX4, Full),
- __DEFINE_LINK_MODE_PARAMS(10000, KR, Full),
+ __DEFINE_LINK_MODE_PARAMS(1000, KX, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(10000, KX4, 4, Full),
+ __DEFINE_LINK_MODE_PARAMS(10000, KR, 1, Full),
[ETHTOOL_LINK_MODE_10000baseR_FEC_BIT] = {
.speed = SPEED_10000,
.duplex = DUPLEX_FULL,
},
- __DEFINE_LINK_MODE_PARAMS(20000, MLD2, Full),
- __DEFINE_LINK_MODE_PARAMS(20000, KR2, Full),
- __DEFINE_LINK_MODE_PARAMS(40000, KR4, Full),
- __DEFINE_LINK_MODE_PARAMS(40000, CR4, Full),
- __DEFINE_LINK_MODE_PARAMS(40000, SR4, Full),
- __DEFINE_LINK_MODE_PARAMS(40000, LR4, Full),
- __DEFINE_LINK_MODE_PARAMS(56000, KR4, Full),
- __DEFINE_LINK_MODE_PARAMS(56000, CR4, Full),
- __DEFINE_LINK_MODE_PARAMS(56000, SR4, Full),
- __DEFINE_LINK_MODE_PARAMS(56000, LR4, Full),
- __DEFINE_LINK_MODE_PARAMS(25000, CR, Full),
- __DEFINE_LINK_MODE_PARAMS(25000, KR, Full),
- __DEFINE_LINK_MODE_PARAMS(25000, SR, Full),
- __DEFINE_LINK_MODE_PARAMS(50000, CR2, Full),
- __DEFINE_LINK_MODE_PARAMS(50000, KR2, Full),
- __DEFINE_LINK_MODE_PARAMS(100000, KR4, Full),
- __DEFINE_LINK_MODE_PARAMS(100000, SR4, Full),
- __DEFINE_LINK_MODE_PARAMS(100000, CR4, Full),
- __DEFINE_LINK_MODE_PARAMS(100000, LR4_ER4, Full),
- __DEFINE_LINK_MODE_PARAMS(50000, SR2, Full),
- __DEFINE_LINK_MODE_PARAMS(1000, X, Full),
- __DEFINE_LINK_MODE_PARAMS(10000, CR, Full),
- __DEFINE_LINK_MODE_PARAMS(10000, SR, Full),
- __DEFINE_LINK_MODE_PARAMS(10000, LR, Full),
- __DEFINE_LINK_MODE_PARAMS(10000, LRM, Full),
- __DEFINE_LINK_MODE_PARAMS(10000, ER, Full),
- __DEFINE_LINK_MODE_PARAMS(2500, T, Full),
- __DEFINE_LINK_MODE_PARAMS(5000, T, Full),
+ __DEFINE_LINK_MODE_PARAMS(20000, MLD2, 2, Full),
+ __DEFINE_LINK_MODE_PARAMS(20000, KR2, 2, Full),
+ __DEFINE_LINK_MODE_PARAMS(40000, KR4, 4, Full),
+ __DEFINE_LINK_MODE_PARAMS(40000, CR4, 4, Full),
+ __DEFINE_LINK_MODE_PARAMS(40000, SR4, 4, Full),
+ __DEFINE_LINK_MODE_PARAMS(40000, LR4, 4, Full),
+ __DEFINE_LINK_MODE_PARAMS(56000, KR4, 4, Full),
+ __DEFINE_LINK_MODE_PARAMS(56000, CR4, 4, Full),
+ __DEFINE_LINK_MODE_PARAMS(56000, SR4, 4, Full),
+ __DEFINE_LINK_MODE_PARAMS(56000, LR4, 4, Full),
+ __DEFINE_LINK_MODE_PARAMS(25000, CR, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(25000, KR, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(25000, SR, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(50000, CR2, 2, Full),
+ __DEFINE_LINK_MODE_PARAMS(50000, KR2, 2, Full),
+ __DEFINE_LINK_MODE_PARAMS(100000, KR4, 4, Full),
+ __DEFINE_LINK_MODE_PARAMS(100000, SR4, 4, Full),
+ __DEFINE_LINK_MODE_PARAMS(100000, CR4, 4, Full),
+ __DEFINE_LINK_MODE_PARAMS(100000, LR4_ER4, 4, Full),
+ __DEFINE_LINK_MODE_PARAMS(50000, SR2, 2, Full),
+ __DEFINE_LINK_MODE_PARAMS(1000, X, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(10000, CR, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(10000, SR, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(10000, LR, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(10000, LRM, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(10000, ER, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(2500, T, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(5000, T, 1, Full),
__DEFINE_SPECIAL_MODE_PARAMS(FEC_NONE),
__DEFINE_SPECIAL_MODE_PARAMS(FEC_RS),
__DEFINE_SPECIAL_MODE_PARAMS(FEC_BASER),
- __DEFINE_LINK_MODE_PARAMS(50000, KR, Full),
- __DEFINE_LINK_MODE_PARAMS(50000, SR, Full),
- __DEFINE_LINK_MODE_PARAMS(50000, CR, Full),
- __DEFINE_LINK_MODE_PARAMS(50000, LR_ER_FR, Full),
- __DEFINE_LINK_MODE_PARAMS(50000, DR, Full),
- __DEFINE_LINK_MODE_PARAMS(100000, KR2, Full),
- __DEFINE_LINK_MODE_PARAMS(100000, SR2, Full),
- __DEFINE_LINK_MODE_PARAMS(100000, CR2, Full),
- __DEFINE_LINK_MODE_PARAMS(100000, LR2_ER2_FR2, Full),
- __DEFINE_LINK_MODE_PARAMS(100000, DR2, Full),
- __DEFINE_LINK_MODE_PARAMS(200000, KR4, Full),
- __DEFINE_LINK_MODE_PARAMS(200000, SR4, Full),
- __DEFINE_LINK_MODE_PARAMS(200000, LR4_ER4_FR4, Full),
- __DEFINE_LINK_MODE_PARAMS(200000, DR4, Full),
- __DEFINE_LINK_MODE_PARAMS(200000, CR4, Full),
- __DEFINE_LINK_MODE_PARAMS(100, T1, Full),
- __DEFINE_LINK_MODE_PARAMS(1000, T1, Full),
- __DEFINE_LINK_MODE_PARAMS(400000, KR8, Full),
- __DEFINE_LINK_MODE_PARAMS(400000, SR8, Full),
- __DEFINE_LINK_MODE_PARAMS(400000, LR8_ER8_FR8, Full),
- __DEFINE_LINK_MODE_PARAMS(400000, DR8, Full),
- __DEFINE_LINK_MODE_PARAMS(400000, CR8, Full),
+ __DEFINE_LINK_MODE_PARAMS(50000, KR, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(50000, SR, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(50000, CR, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(50000, LR_ER_FR, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(50000, DR, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(100000, KR2, 2, Full),
+ __DEFINE_LINK_MODE_PARAMS(100000, SR2, 2, Full),
+ __DEFINE_LINK_MODE_PARAMS(100000, CR2, 2, Full),
+ __DEFINE_LINK_MODE_PARAMS(100000, LR2_ER2_FR2, 2, Full),
+ __DEFINE_LINK_MODE_PARAMS(100000, DR2, 2, Full),
+ __DEFINE_LINK_MODE_PARAMS(200000, KR4, 4, Full),
+ __DEFINE_LINK_MODE_PARAMS(200000, SR4, 4, Full),
+ __DEFINE_LINK_MODE_PARAMS(200000, LR4_ER4_FR4, 4, Full),
+ __DEFINE_LINK_MODE_PARAMS(200000, DR4, 4, Full),
+ __DEFINE_LINK_MODE_PARAMS(200000, CR4, 4, Full),
+ __DEFINE_LINK_MODE_PARAMS(100, T1, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(1000, T1, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(400000, KR8, 8, Full),
+ __DEFINE_LINK_MODE_PARAMS(400000, SR8, 8, Full),
+ __DEFINE_LINK_MODE_PARAMS(400000, LR8_ER8_FR8, 8, Full),
+ __DEFINE_LINK_MODE_PARAMS(400000, DR8, 8, Full),
+ __DEFINE_LINK_MODE_PARAMS(400000, CR8, 8, Full),
__DEFINE_SPECIAL_MODE_PARAMS(FEC_LLRS),
- __DEFINE_LINK_MODE_PARAMS(100000, KR, Full),
- __DEFINE_LINK_MODE_PARAMS(100000, SR, Full),
- __DEFINE_LINK_MODE_PARAMS(100000, LR_ER_FR, Full),
- __DEFINE_LINK_MODE_PARAMS(100000, DR, Full),
- __DEFINE_LINK_MODE_PARAMS(100000, CR, Full),
- __DEFINE_LINK_MODE_PARAMS(200000, KR2, Full),
- __DEFINE_LINK_MODE_PARAMS(200000, SR2, Full),
- __DEFINE_LINK_MODE_PARAMS(200000, LR2_ER2_FR2, Full),
- __DEFINE_LINK_MODE_PARAMS(200000, DR2, Full),
- __DEFINE_LINK_MODE_PARAMS(200000, CR2, Full),
- __DEFINE_LINK_MODE_PARAMS(400000, KR4, Full),
- __DEFINE_LINK_MODE_PARAMS(400000, SR4, Full),
- __DEFINE_LINK_MODE_PARAMS(400000, LR4_ER4_FR4, Full),
- __DEFINE_LINK_MODE_PARAMS(400000, DR4, Full),
- __DEFINE_LINK_MODE_PARAMS(400000, CR4, Full),
- __DEFINE_LINK_MODE_PARAMS(100, FX, Half),
- __DEFINE_LINK_MODE_PARAMS(100, FX, Full),
+ __DEFINE_LINK_MODE_PARAMS(100000, KR, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(100000, SR, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(100000, LR_ER_FR, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(100000, DR, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(100000, CR, 1, Full),
+ __DEFINE_LINK_MODE_PARAMS(200000, KR2, 2, Full),
+ __DEFINE_LINK_MODE_PARAMS(200000, SR2, 2, Full),
+ __DEFINE_LINK_MODE_PARAMS(200000, LR2_ER2_FR2, 2, Full),
+ __DEFINE_LINK_MODE_PARAMS(200000, DR2, 2, Full),
+ __DEFINE_LINK_MODE_PARAMS(200000, CR2, 2, Full),
+ __DEFINE_LINK_MODE_PARAMS(400000, KR4, 4, Full),
+ __DEFINE_LINK_MODE_PARAMS(400000, SR4, 4, Full),
+ __DEFINE_LINK_MODE_PARAMS(400000, LR4_ER4_FR4, 4, Full),
+ __DEFINE_LINK_MODE_PARAMS(400000, DR4, 4, Full),
+ __DEFINE_LINK_MODE_PARAMS(400000, CR4, 4, Full),
+ __DEFINE_LINK_MODE_PARAMS(100, FX, 1, Half),
+ __DEFINE_LINK_MODE_PARAMS(100, FX, 1, Full),
};
const struct nla_policy ethnl_linkmodes_set_policy[] = {
@@ -274,16 +277,17 @@ const struct nla_policy ethnl_linkmodes_set_policy[] = {
[ETHTOOL_A_LINKMODES_SPEED] = { .type = NLA_U32 },
[ETHTOOL_A_LINKMODES_DUPLEX] = { .type = NLA_U8 },
[ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG] = { .type = NLA_U8 },
+ [ETHTOOL_A_LINKMODES_LANES] = { .type = NLA_U32 },
};
-/* Set advertised link modes to all supported modes matching requested speed
- * and duplex values. Called when autonegotiation is on, speed or duplex is
- * requested but no link mode change. This is done in userspace with ioctl()
- * interface, move it into kernel for netlink.
+/* Set advertised link modes to all supported modes matching requested speed,
+ * lanes and duplex values. Called when autonegotiation is on, speed, lanes or
+ * duplex is requested but no link mode change. This is done in userspace with
+ * ioctl() interface, move it into kernel for netlink.
* Returns true if advertised modes bitmap was modified.
*/
static bool ethnl_auto_linkmodes(struct ethtool_link_ksettings *ksettings,
- bool req_speed, bool req_duplex)
+ bool req_speed, bool req_lanes, bool req_duplex)
{
unsigned long *advertising = ksettings->link_modes.advertising;
unsigned long *supported = ksettings->link_modes.supported;
@@ -302,6 +306,7 @@ static bool ethnl_auto_linkmodes(struct ethtool_link_ksettings *ksettings,
continue;
if (test_bit(i, supported) &&
(!req_speed || info->speed == ksettings->base.speed) &&
+ (!req_lanes || info->lanes == ksettings->lanes) &&
(!req_duplex || info->duplex == ksettings->base.duplex))
set_bit(i, advertising);
else
@@ -325,12 +330,25 @@ static bool ethnl_validate_master_slave_cfg(u8 cfg)
return false;
}
+static bool ethnl_validate_lanes_cfg(u32 cfg)
+{
+ switch (cfg) {
+ case 1:
+ case 2:
+ case 4:
+ case 8:
+ return true;
+ }
+
+ return false;
+}
+
static int ethnl_update_linkmodes(struct genl_info *info, struct nlattr **tb,
struct ethtool_link_ksettings *ksettings,
- bool *mod)
+ bool *mod, const struct net_device *dev)
{
struct ethtool_link_settings *lsettings = &ksettings->base;
- bool req_speed, req_duplex;
+ bool req_speed, req_lanes, req_duplex;
const struct nlattr *master_slave_cfg;
int ret;
@@ -353,10 +371,39 @@ static int ethnl_update_linkmodes(struct genl_info *info, struct nlattr **tb,
*mod = false;
req_speed = tb[ETHTOOL_A_LINKMODES_SPEED];
+ req_lanes = tb[ETHTOOL_A_LINKMODES_LANES];
req_duplex = tb[ETHTOOL_A_LINKMODES_DUPLEX];
ethnl_update_u8(&lsettings->autoneg, tb[ETHTOOL_A_LINKMODES_AUTONEG],
mod);
+
+ if (req_lanes) {
+ u32 lanes_cfg = nla_get_u32(tb[ETHTOOL_A_LINKMODES_LANES]);
+
+ if (!ethnl_validate_lanes_cfg(lanes_cfg)) {
+ NL_SET_ERR_MSG_ATTR(info->extack,
+ tb[ETHTOOL_A_LINKMODES_LANES],
+ "lanes value is invalid");
+ return -EINVAL;
+ }
+
+ /* If autoneg is off and lanes parameter is not supported by the
+ * driver, return an error.
+ */
+ if (!lsettings->autoneg &&
+ !(dev->ethtool_ops->capabilities & ETHTOOL_CAP_LINK_LANES_SUPPORTED)) {
+ NL_SET_ERR_MSG_ATTR(info->extack,
+ tb[ETHTOOL_A_LINKMODES_LANES],
+ "lanes configuration not supported by device");
+ return -EOPNOTSUPP;
+ }
+ } else if (!lsettings->autoneg) {
+ /* If autoneg is off and lanes parameter is not passed from user,
+ * set the lanes parameter to UNKNOWN.
+ */
+ ksettings->lanes = ETHTOOL_LANES_UNKNOWN;
+ }
+
ret = ethnl_update_bitset(ksettings->link_modes.advertising,
__ETHTOOL_LINK_MODE_MASK_NBITS,
tb[ETHTOOL_A_LINKMODES_OURS], link_mode_names,
@@ -365,13 +412,15 @@ static int ethnl_update_linkmodes(struct genl_info *info, struct nlattr **tb,
return ret;
ethnl_update_u32(&lsettings->speed, tb[ETHTOOL_A_LINKMODES_SPEED],
mod);
+ ethnl_update_u32(&ksettings->lanes, tb[ETHTOOL_A_LINKMODES_LANES],
+ mod);
ethnl_update_u8(&lsettings->duplex, tb[ETHTOOL_A_LINKMODES_DUPLEX],
mod);
ethnl_update_u8(&lsettings->master_slave_cfg, master_slave_cfg, mod);
if (!tb[ETHTOOL_A_LINKMODES_OURS] && lsettings->autoneg &&
- (req_speed || req_duplex) &&
- ethnl_auto_linkmodes(ksettings, req_speed, req_duplex))
+ (req_speed || req_lanes || req_duplex) &&
+ ethnl_auto_linkmodes(ksettings, req_speed, req_lanes, req_duplex))
*mod = true;
return 0;
@@ -409,7 +458,7 @@ int ethnl_set_linkmodes(struct sk_buff *skb, struct genl_info *info)
goto out_ops;
}
- ret = ethnl_update_linkmodes(info, tb, &ksettings, &mod);
+ ret = ethnl_update_linkmodes(info, tb, &ksettings, &mod, dev);
if (ret < 0)
goto out_ops;
@@ -351,7 +351,7 @@ extern const struct nla_policy ethnl_strset_get_policy[ETHTOOL_A_STRSET_COUNTS_O
extern const struct nla_policy ethnl_linkinfo_get_policy[ETHTOOL_A_LINKINFO_HEADER + 1];
extern const struct nla_policy ethnl_linkinfo_set_policy[ETHTOOL_A_LINKINFO_TP_MDIX_CTRL + 1];
extern const struct nla_policy ethnl_linkmodes_get_policy[ETHTOOL_A_LINKMODES_HEADER + 1];
-extern const struct nla_policy ethnl_linkmodes_set_policy[ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG + 1];
+extern const struct nla_policy ethnl_linkmodes_set_policy[ETHTOOL_A_LINKMODES_LANES + 1];
extern const struct nla_policy ethnl_linkstate_get_policy[ETHTOOL_A_LINKSTATE_HEADER + 1];
extern const struct nla_policy ethnl_debug_get_policy[ETHTOOL_A_DEBUG_HEADER + 1];
extern const struct nla_policy ethnl_debug_set_policy[ETHTOOL_A_DEBUG_MSGMASK + 1];