@@ -166,11 +166,15 @@ static int linkmodes_prepare_data(const struct ethnl_req_info *req_base,
goto out;
}
+ if (!(dev->ethtool_ops->capabilities & ETHTOOL_CAP_LINK_LANES_SUPPORTED))
+ data->ksettings.lanes = ETHTOOL_LANES_UNKNOWN;
+
if (data->ksettings.link_mode) {
for (i = 0; i < __ETHTOOL_LINK_MODE_MASK_NBITS; i++) {
if (data->ksettings.link_mode == i) {
link_info = &link_mode_params[i];
data->lsettings->speed = link_info->speed;
+ data->ksettings.lanes = link_info->lanes;
data->lsettings->duplex = link_info->duplex;
}
}
@@ -196,6 +200,7 @@ static int linkmodes_reply_size(const struct ethnl_req_info *req_base,
len = nla_total_size(sizeof(u8)) /* LINKMODES_AUTONEG */
+ nla_total_size(sizeof(u32)) /* LINKMODES_SPEED */
+ + nla_total_size(sizeof(u32)) /* LINKMODES_LANES */
+ nla_total_size(sizeof(u8)) /* LINKMODES_DUPLEX */
+ 0;
ret = ethnl_bitset_size(ksettings->link_modes.advertising,
@@ -253,6 +258,7 @@ static int linkmodes_fill_reply(struct sk_buff *skb,
}
if (nla_put_u32(skb, ETHTOOL_A_LINKMODES_SPEED, lsettings->speed) ||
+ nla_put_u32(skb, ETHTOOL_A_LINKMODES_LANES, ksettings->lanes) ||
nla_put_u8(skb, ETHTOOL_A_LINKMODES_DUPLEX, lsettings->duplex))
return -EMSGSIZE;