@@ -406,6 +406,7 @@ Kernel response contents:
``ETHTOOL_A_LINKMODES_PEER`` bitset partner link modes
``ETHTOOL_A_LINKMODES_SPEED`` u32 link speed (Mb/s)
``ETHTOOL_A_LINKMODES_DUPLEX`` u8 duplex mode
+ ``ETHTOOL_A_LINKMODES_LINK_MODE`` u8 link mode
``ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG`` u8 Master/slave port mode
``ETHTOOL_A_LINKMODES_MASTER_SLAVE_STATE`` u8 Master/slave port state
========================================== ====== ==========================
@@ -129,6 +129,7 @@ struct ethtool_link_ksettings {
__ETHTOOL_DECLARE_LINK_MODE_MASK(lp_advertising);
} link_modes;
u32 lanes;
+ enum ethtool_link_mode_bit_indices link_mode;
};
/**
@@ -1733,6 +1733,8 @@ enum ethtool_link_mode_bit_indices {
#define SPEED_UNKNOWN -1
+#define LINK_MODE_UNKNOWN -1
+
static inline int ethtool_validate_speed(__u32 speed)
{
return speed <= INT_MAX || speed == (__u32)SPEED_UNKNOWN;
@@ -4,6 +4,127 @@
#include "common.h"
#include "bitset.h"
+struct link_mode_info {
+ int speed;
+ u32 lanes;
+ u8 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
+#define __DUPLEX_Full DUPLEX_FULL
+#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, 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, 1, Full),
+ __DEFINE_SPECIAL_MODE_PARAMS(Pause),
+ __DEFINE_SPECIAL_MODE_PARAMS(Asym_Pause),
+ __DEFINE_LINK_MODE_PARAMS(2500, X, 1, Full),
+ __DEFINE_SPECIAL_MODE_PARAMS(Backplane),
+ __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, 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, 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, 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),
+};
+
+/* LINKMODES_GET */
+
struct linkmodes_req_info {
struct ethnl_req_info base;
};
@@ -29,7 +150,9 @@ static int linkmodes_prepare_data(const struct ethnl_req_info *req_base,
{
struct linkmodes_reply_data *data = LINKMODES_REPDATA(reply_base);
struct net_device *dev = reply_base->dev;
+ const struct link_mode_info *link_info;
int ret;
+ unsigned int i;
data->lsettings = &data->ksettings.base;
@@ -43,6 +166,16 @@ static int linkmodes_prepare_data(const struct ethnl_req_info *req_base,
goto out;
}
+ 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->lsettings->duplex = link_info->duplex;
+ }
+ }
+ }
+
data->peer_empty =
bitmap_empty(data->ksettings.link_modes.lp_advertising,
__ETHTOOL_LINK_MODE_MASK_NBITS);
@@ -150,125 +283,6 @@ const struct ethnl_request_ops ethnl_linkmodes_request_ops = {
/* LINKMODES_SET */
-struct link_mode_info {
- int speed;
- u32 lanes;
- u8 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
-#define __DUPLEX_Full DUPLEX_FULL
-#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, 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, 1, Full),
- __DEFINE_SPECIAL_MODE_PARAMS(Pause),
- __DEFINE_SPECIAL_MODE_PARAMS(Asym_Pause),
- __DEFINE_LINK_MODE_PARAMS(2500, X, 1, Full),
- __DEFINE_SPECIAL_MODE_PARAMS(Backplane),
- __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, 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, 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, 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[] = {
[ETHTOOL_A_LINKMODES_HEADER] =
NLA_POLICY_NESTED(ethnl_header_policy),