From e1a9fa83f9821d0b04c8da94d6f355c54a307541 Mon Sep 17 00:00:00 2001
From: Algernon <lixiaodong67@huawei.com>
Date: Wed, 15 Nov 2023 11:08:12 +0800
Subject: [PATCH 278/283] net: hns3: Fallback ethtool's modification of lane

driver inclusion
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EN49
--------------------------------

Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
---
 Documentation/networking/ethtool-netlink.rst  |  26 -
 drivers/net/ethernet/hisilicon/hns3/hnae3.h   |  11 +-
 .../hns3/hns3_common/hclge_comm_cmd.c         |   1 -
 .../hns3/hns3_common/hclge_comm_cmd.h         |   1 -
 .../ethernet/hisilicon/hns3/hns3_debugfs.c    |   3 -
 .../ethernet/hisilicon/hns3/hns3_ethtool.c    |  27 +-
 .../hisilicon/hns3/hns3pf/hclge_main.c        |  22 +-
 .../hisilicon/hns3/hns3pf/hclge_main.h        |   3 +-
 .../hisilicon/hns3/hns3pf/hclge_mdio.c        |   2 +-
 .../hisilicon/hns3/hns3pf/hclge_sysfs.c       |   3 -
 .../hisilicon/hns3/hns3vf/hclgevf_main.c      |   2 +-
 include/linux/ethtool.h                       |   6 -
 include/net/netlink.h                         |   7 -
 include/uapi/linux/ethtool.h                  |  14 -
 include/uapi/linux/ethtool_netlink.h          |   3 -
 net/ethtool/Makefile                          |   2 +-
 net/ethtool/linkmodes.c                       | 512 ------------------
 net/ethtool/netlink.h                         |   2 -
 18 files changed, 24 insertions(+), 623 deletions(-)
 delete mode 100644 net/ethtool/linkmodes.c

diff --git a/Documentation/networking/ethtool-netlink.rst b/Documentation/networking/ethtool-netlink.rst
index 01da978de86d..c0c33704aa96 100644
--- a/Documentation/networking/ethtool-netlink.rst
+++ b/Documentation/networking/ethtool-netlink.rst
@@ -224,32 +224,6 @@ an ``ACT_REPLY`` message. Performing an action also triggers a notification
 
 Later sections describe the format and semantics of these messages.
 
-LINKMODES_SET
-=============
-
-Request contents:
-
-  ==========================================  ======  ==========================
-  ``ETHTOOL_A_LINKMODES_HEADER``              nested  request header
-  ``ETHTOOL_A_LINKMODES_AUTONEG``             u8      autonegotiation status
-  ``ETHTOOL_A_LINKMODES_OURS``                bitset  advertised link modes
-  ``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_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, 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.
-
-
 RINGS_GET
 =========
 
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
index 422f50b36c22..a4353ef510dd 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
@@ -104,7 +104,6 @@ enum HNAE3_DEV_CAP_BITS {
 	HNAE3_DEV_SUPPORT_MC_MAC_MNG_B,
 	HNAE3_DEV_SUPPORT_CQ_B,
 	HNAE3_DEV_SUPPORT_FEC_STATS_B,
-	HNAE3_DEV_SUPPORT_LANE_NUM_B,
 	HNAE3_DEV_SUPPORT_WOL_B,
 	HNAE3_DEV_SUPPORT_VF_FAULT_B,
 	HNAE3_DEV_SUPPORT_NOTIFY_PKT_B,
@@ -177,17 +176,12 @@ enum HNAE3_DEV_CAP_BITS {
 #define hnae3_ae_dev_cq_supported(ae_dev) \
 	test_bit(HNAE3_DEV_SUPPORT_CQ_B, (ae_dev)->caps)
 
-#define hnae3_ae_dev_lane_num_supported(ae_dev) \
-	test_bit(HNAE3_DEV_SUPPORT_LANE_NUM_B, (ae_dev)->caps)
-
 #define hnae3_ae_dev_wol_supported(ae_dev) \
 	test_bit(HNAE3_DEV_SUPPORT_WOL_B, (ae_dev)->caps)
 
 #define hnae3_ae_dev_notify_pkt_supported(ae_dev) \
 	test_bit(HNAE3_DEV_SUPPORT_NOTIFY_PKT_B, (ae_dev)->caps)
 
-#define hnae3_ae_dev_lane_num_supported(ae_dev) \
-	test_bit(HNAE3_DEV_SUPPORT_LANE_NUM_B, (ae_dev)->caps)
 #define hnae3_ae_dev_fec_stats_supported(ae_dev) \
 	test_bit(HNAE3_DEV_SUPPORT_FEC_STATS_B, (ae_dev)->caps)
 #define hnae3_ae_dev_tm_flush_supported(hdev) \
@@ -626,10 +620,9 @@ struct hnae3_ae_ops {
 	void (*client_stop)(struct hnae3_handle *handle);
 	int (*get_status)(struct hnae3_handle *handle);
 	void (*get_ksettings_an_result)(struct hnae3_handle *handle,
-					u8 *auto_neg, u32 *speed, u8 *duplex,
-					u32 *lane_num);
+					u8 *auto_neg, u32 *speed, u8 *duplex);
 	int (*cfg_mac_speed_dup_h)(struct hnae3_handle *handle, int speed,
-				   u8 duplex, u8 lane_num);
+				   u8 duplex);
 
 	void (*get_media_type)(struct hnae3_handle *handle, u8 *media_type,
 			       u8 *module_type);
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c
index 78321511798a..756627abd5fe 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c
@@ -155,7 +155,6 @@ static const struct hclge_comm_caps_bit_map hclge_pf_cmd_caps[] = {
 	{HCLGE_COMM_CAP_GRO_B, HNAE3_DEV_SUPPORT_GRO_B},
 	{HCLGE_COMM_CAP_FD_B, HNAE3_DEV_SUPPORT_FD_B},
 	{HCLGE_COMM_CAP_FEC_STATS_B, HNAE3_DEV_SUPPORT_FEC_STATS_B},
-	{HCLGE_COMM_CAP_LANE_NUM_B, HNAE3_DEV_SUPPORT_LANE_NUM_B},
 	{HCLGE_COMM_CAP_WOL_B, HNAE3_DEV_SUPPORT_WOL_B},
 	{HCLGE_COMM_CAP_NOTIFY_PKT_B, HNAE3_DEV_SUPPORT_NOTIFY_PKT_B},
 	{HCLGE_COMM_CAP_TM_FLUSH_B, HNAE3_DEV_SUPPORT_TM_FLUSH_B},
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h
index 8477e9f1a3d7..248fab27931b 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h
@@ -344,7 +344,6 @@ enum HCLGE_COMM_CAP_BITS {
 	HCLGE_COMM_CAP_GRO_B = 20,
 	HCLGE_COMM_CAP_FD_B = 21,
 	HCLGE_COMM_CAP_FEC_STATS_B = 25,
-	HCLGE_COMM_CAP_LANE_NUM_B = 27,
 	HCLGE_COMM_CAP_WOL_B = 28,
 	HCLGE_COMM_CAP_NOTIFY_PKT_B = 29,
 	HCLGE_COMM_CAP_TM_FLUSH_B = 31,
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
index c5234d1d078f..23fc3897a662 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
@@ -391,9 +391,6 @@ static struct hns3_dbg_cap_info hns3_dbg_cap[] = {
 	}, {
 		.name = "support FEC statistics",
 		.cap_bit = HNAE3_DEV_SUPPORT_FEC_STATS_B,
-	}, {
-		.name = "support lane num",
-		.cap_bit = HNAE3_DEV_SUPPORT_LANE_NUM_B,
 	}, {
 		.name = "support tm flush",
 		.cap_bit = HNAE3_DEV_SUPPORT_TM_FLUSH_B,
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
index 21675ff52380..c951f7c4eea9 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
@@ -766,8 +766,7 @@ static void hns3_get_ksettings(struct hnae3_handle *h,
 		ops->get_ksettings_an_result(h,
 					     &cmd->base.autoneg,
 					     &cmd->base.speed,
-					     &cmd->base.duplex,
-					     &cmd->lanes);
+					     &cmd->base.duplex);
 
 	/* 2.get link mode */
 	if (ops->get_link_mode)
@@ -849,7 +848,6 @@ static int hns3_check_ksettings_param(const struct net_device *netdev,
 	const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
 	u8 module_type = HNAE3_MODULE_TYPE_UNKNOWN;
 	u8 media_type = HNAE3_MEDIA_TYPE_UNKNOWN;
-	u32 lane_num;
 	u8 autoneg;
 	u32 speed;
 	u8 duplex;
@@ -862,10 +860,9 @@ static int hns3_check_ksettings_param(const struct net_device *netdev,
 		return 0;
 
 	if (ops->get_ksettings_an_result) {
-		ops->get_ksettings_an_result(handle, &autoneg, &speed,
-						&duplex, &lane_num);
+		ops->get_ksettings_an_result(handle, &autoneg, &speed, &duplex);
 		if (cmd->base.autoneg == autoneg && cmd->base.speed == speed &&
-		    cmd->base.duplex == duplex && cmd->lanes == lane_num)
+		    cmd->base.duplex == duplex)
 			return 0;
 	}
 
@@ -902,14 +899,12 @@ static int hns3_set_link_ksettings(struct net_device *netdev,
 	if (cmd->base.speed == SPEED_1000 && cmd->base.duplex == DUPLEX_HALF)
 		return -EINVAL;
 
-	if (cmd->lanes && !hnae3_ae_dev_lane_num_supported(ae_dev))
-		return -EOPNOTSUPP;
-
-	netif_dbg(handle, drv, netdev,
-		  "set link(%s): autoneg=%u, speed=%u, duplex=%u, lanes=%u\n",
-		  netdev->phydev ? "phy" : "mac",
-		  cmd->base.autoneg, cmd->base.speed, cmd->base.duplex,
-		  cmd->lanes);
+	if (netif_msg_ifdown(handle))
+		netdev_info(netdev,
+			    "set link(%s): autoneg=%u, speed=%u, duplex=%u\n",
+			    netdev->phydev ? "phy" : "mac",
+			    cmd->base.autoneg, cmd->base.speed,
+			    cmd->base.duplex);
 
 	/* Only support ksettings_set for netdev with phy attached for now */
 	if (netdev->phydev) {
@@ -947,8 +942,7 @@ static int hns3_set_link_ksettings(struct net_device *netdev,
 
 	if (ops->cfg_mac_speed_dup_h)
 		ret = ops->cfg_mac_speed_dup_h(handle, cmd->base.speed,
-					       cmd->base.duplex,
-						   (u8)(cmd->lanes));
+					       cmd->base.duplex);
 
 	return ret;
 }
@@ -2050,7 +2044,6 @@ static const struct ethtool_ops hns3vf_ethtool_ops = {
 static const struct ethtool_ops hns3_ethtool_ops = {
 	.supported_coalesce_params = HNS3_ETHTOOL_COALESCE,
 	.supported_ring_params = HNS3_ETHTOOL_RING,
-	.cap_link_lanes_supported = true,
 	.self_test = hns3_self_test,
 	.get_drvinfo = hns3_get_drvinfo,
 	.get_link = hns3_get_link,
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
index bcc28501475d..0e24115ad161 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
@@ -2792,37 +2792,33 @@ int hclge_cfg_mac_speed_dup_hw(struct hclge_dev *hdev, int speed,
 	return 0;
 }
 
-int hclge_cfg_mac_speed_dup(struct hclge_dev *hdev, int speed,
-			    u8 duplex, u8 lane_num)
+int hclge_cfg_mac_speed_dup(struct hclge_dev *hdev, int speed, u8 duplex)
 {
 	struct hclge_mac *mac = &hdev->hw.mac;
 	int ret;
 
 	duplex = hclge_check_speed_dup(duplex, speed);
 	if (!mac->support_autoneg && mac->speed == speed &&
-	    mac->duplex == duplex &&
-		(mac->lane_num == lane_num || lane_num == 0))
+	    mac->duplex == duplex)
 		return 0;
 
-	ret = hclge_cfg_mac_speed_dup_hw(hdev, speed, duplex, lane_num);
+	ret = hclge_cfg_mac_speed_dup_hw(hdev, speed, duplex, 0);
 	if (ret)
 		return ret;
 
 	hdev->hw.mac.speed = speed;
 	hdev->hw.mac.duplex = duplex;
-	if (!lane_num)
-		hdev->hw.mac.lane_num = lane_num;
 
 	return 0;
 }
 
 static int hclge_cfg_mac_speed_dup_h(struct hnae3_handle *handle, int speed,
-				     u8 duplex, u8 lane_num)
+				     u8 duplex)
 {
 	struct hclge_vport *vport = hclge_get_vport(handle);
 	struct hclge_dev *hdev = vport->back;
 
-	return hclge_cfg_mac_speed_dup(hdev, speed, duplex, lane_num);
+	return hclge_cfg_mac_speed_dup(hdev, speed, duplex);
 }
 
 static int hclge_set_autoneg_en(struct hclge_dev *hdev, bool enable)
@@ -3633,13 +3629,13 @@ static int hclge_update_port_info(struct hclge_dev *hdev)
 			return 0;
 		}
 		return hclge_cfg_mac_speed_dup(hdev, mac->speed,
-					       HCLGE_MAC_FULL, mac->lane_num);
+					       HCLGE_MAC_FULL);
 	} else {
 		if (speed == HCLGE_MAC_SPEED_UNKNOWN)
 			return 0; /* do nothing if no SFP */
 
 		/* must config full duplex for SFP */
-		return hclge_cfg_mac_speed_dup(hdev, speed, HCLGE_MAC_FULL, 0);
+		return hclge_cfg_mac_speed_dup(hdev, speed, HCLGE_MAC_FULL);
 	}
 }
 
@@ -11139,7 +11135,7 @@ static int hclge_set_pauseparam(struct hnae3_handle *handle, u32 auto_neg,
 
 static void hclge_get_ksettings_an_result(struct hnae3_handle *handle,
 					  u8 *auto_neg, u32 *speed,
-					  u8 *duplex, u32 *lane_num)
+					  u8 *duplex)
 {
 	struct hclge_vport *vport = hclge_get_vport(handle);
 	struct hclge_dev *hdev = vport->back;
@@ -11150,8 +11146,6 @@ static void hclge_get_ksettings_an_result(struct hnae3_handle *handle,
 		*duplex = hdev->hw.mac.duplex;
 	if (auto_neg)
 		*auto_neg = hdev->hw.mac.autoneg;
-	if (lane_num)
-		*lane_num = hdev->hw.mac.lane_num;
 }
 
 void hclge_get_media_type(struct hnae3_handle *handle, u8 *media_type,
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
index 2311dc45ff6e..be2f888209f3 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
@@ -1153,8 +1153,7 @@ static inline bool hclge_is_reset_pending(struct hclge_dev *hdev)
 }
 
 int hclge_inform_reset_assert_to_vf(struct hclge_vport *vport);
-int hclge_cfg_mac_speed_dup(struct hclge_dev *hdev, int speed,
-			    u8 duplex, u8 lane_num);
+int hclge_cfg_mac_speed_dup(struct hclge_dev *hdev, int speed, u8 duplex);
 int hclge_set_vlan_filter(struct hnae3_handle *handle, __be16 proto,
 			  u16 vlan_id, bool is_kill);
 int hclge_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable);
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
index 11723c13c96a..79e6760b3fc7 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
@@ -187,7 +187,7 @@ static void hclge_mac_adjust_link(struct net_device *netdev)
 	speed = netdev->phydev->speed;
 	duplex = netdev->phydev->duplex;
 
-	ret = hclge_cfg_mac_speed_dup(hdev, speed, duplex, 0);
+	ret = hclge_cfg_mac_speed_dup(hdev, speed, duplex);
 	if (ret)
 		netdev_err(netdev, "failed to adjust link.\n");
 
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_sysfs.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_sysfs.c
index 6840d7bda82e..3bbc33761254 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_sysfs.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_sysfs.c
@@ -78,9 +78,6 @@ int hclge_register_sysfs(struct hclge_dev *hdev)
 {
 	int ret;
 
-	if (!hnae3_ae_dev_lane_num_supported(hdev->ae_dev))
-		return 0;
-
 	ret = device_create_file(&hdev->pdev->dev, hclge_hw_attrs_list[0]);
 	if (ret)
 		dev_err(&hdev->pdev->dev,
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
index 22f8dfe86df8..091240208893 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
@@ -3649,7 +3649,7 @@ static int hclgevf_get_status(struct hnae3_handle *handle)
 
 static void hclgevf_get_ksettings_an_result(struct hnae3_handle *handle,
 					    u8 *auto_neg, u32 *speed,
-					    u8 *duplex, u32 *lane_num)
+					    u8 *duplex)
 {
 	struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
 
diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h
index 4bc3cd4060da..bf14a439afc2 100644
--- a/include/linux/ethtool.h
+++ b/include/linux/ethtool.h
@@ -149,9 +149,6 @@ struct ethtool_link_ksettings {
 		__ETHTOOL_DECLARE_LINK_MODE_MASK(advertising);
 		__ETHTOOL_DECLARE_LINK_MODE_MASK(lp_advertising);
 	} link_modes;
-#ifndef __GENKSYMS__
-	u32	lanes;
-#endif
 };
 
 /**
@@ -295,8 +292,6 @@ struct ethtool_fec_stats {
 
 /**
  * struct ethtool_ops - optional netdev operations
- * @cap_link_lanes_supported: indicates if the driver supports lanes
- *	parameter.
  * @supported_coalesce_params: supported types of interrupt coalescing.
  * @supported_ring_params: supported ring params.
  * @get_drvinfo: Report driver/device information.  Should only set the
@@ -442,7 +437,6 @@ struct ethtool_fec_stats {
  */
 struct ethtool_ops {
 #ifndef __GENKSYMS__
-	u32     cap_link_lanes_supported:1;
 	u32     supported_coalesce_params;
 	u32     supported_ring_params;
 #endif
diff --git a/include/net/netlink.h b/include/net/netlink.h
index e91076f81d3e..d9c642558255 100644
--- a/include/net/netlink.h
+++ b/include/net/netlink.h
@@ -278,13 +278,6 @@ struct nla_policy {
 		      tp == NLA_MSECS ||		\
 		      tp == NLA_BINARY) + tp)
 
-#define NLA_POLICY_RANGE(tp, _min, _max) {		 \
-	.type = NLA_ENSURE_INT_OR_BINARY_TYPE(tp),		\
-	.validation_type = NLA_VALIDATE_RANGE,		\
-	.min = _min,				\
-	.max = _max					\
-}
-
 #define NLA_POLICY_MIN(tp, _min) {			\
 	.type = NLA_ENSURE_INT_OR_BINARY_TYPE(tp),	\
 	.validation_type = NLA_VALIDATE_MIN,		\
diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h
index 4f19dca5fcfa..0649b8295feb 100644
--- a/include/uapi/linux/ethtool.h
+++ b/include/uapi/linux/ethtool.h
@@ -1742,8 +1742,6 @@ enum ethtool_link_mode_bit_indices {
 #define SPEED_50000		50000
 #define SPEED_56000		56000
 #define SPEED_100000		100000
-#define SPEED_200000		200000
-#define SPEED_400000		400000
 
 #define SPEED_UNKNOWN		-1
 
@@ -1769,18 +1767,6 @@ static inline int ethtool_validate_duplex(__u8 duplex)
 	return 0;
 }
 
-#define MASTER_SLAVE_CFG_UNSUPPORTED			0
-#define MASTER_SLAVE_CFG_UNKNOWN 				1
-#define MASTER_SLAVE_CFG_MASTER_PREFERRED		2
-#define MASTER_SLAVE_CFG_SLAVE_PREFERRED		3
-#define MASTER_SLAVE_CFG_MASTER_FORCE			4
-#define MASTER_SLAVE_CFG_SLAVE_FORCE			5
-#define MASTER_SLAVE_STATE_UNSUPPORTED			0
-#define MASTER_SLAVE_STATE_UNKNOWN				1
-#define MASTER_SLAVE_STATE_MASTER				2
-#define MASTER_SLAVE_STATE_SLAVE				3
-#define MASTER_SLAVE_STATE_ERR					4
-
 /* Which connector port. */
 #define PORT_TP			0x00
 #define PORT_AUI		0x01
diff --git a/include/uapi/linux/ethtool_netlink.h b/include/uapi/linux/ethtool_netlink.h
index 3b7ed0fe545a..a616a033c5be 100644
--- a/include/uapi/linux/ethtool_netlink.h
+++ b/include/uapi/linux/ethtool_netlink.h
@@ -203,9 +203,6 @@ enum {
 	ETHTOOL_A_LINKMODES_PEER,		/* bitset */
 	ETHTOOL_A_LINKMODES_SPEED,		/* u32 */
 	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,
diff --git a/net/ethtool/Makefile b/net/ethtool/Makefile
index 8900e8ff22f8..892eb657f722 100644
--- a/net/ethtool/Makefile
+++ b/net/ethtool/Makefile
@@ -4,4 +4,4 @@ obj-y				+= ioctl.o common.o
 
 obj-$(CONFIG_ETHTOOL_NETLINK)	+= ethtool_nl.o
 
-ethtool_nl-y	:= netlink.o rings.o linkmodes.o bitset.o fec.o
\ No newline at end of file
+ethtool_nl-y	:= netlink.o rings.o bitset.o fec.o
diff --git a/net/ethtool/linkmodes.c b/net/ethtool/linkmodes.c
deleted file mode 100644
index f8f3fc74ac78..000000000000
--- a/net/ethtool/linkmodes.c
+++ /dev/null
@@ -1,512 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-
-#include "netlink.h"
-#include "common.h"
-#include "bitset.h"
-
-struct linkmodes_req_info {
-	struct ethnl_req_info		base;
-};
-
-struct linkmodes_reply_data {
-	struct ethnl_reply_data		base;
-	struct ethtool_link_ksettings	ksettings;
-	struct ethtool_link_settings	*lsettings;
-	bool				peer_empty;
-};
-
-#define LINKMODES_REPDATA(__reply_base) \
-	container_of(__reply_base, struct linkmodes_reply_data, base)
-
-const struct nla_policy ethnl_linkmodes_get_policy[] = {
-	[ETHTOOL_A_LINKMODES_HEADER]		=
-		NLA_POLICY_NESTED(ethnl_header_policy),
-};
-
-static int linkmodes_prepare_data(const struct ethnl_req_info *req_base,
-				  struct ethnl_reply_data *reply_base,
-				  struct genl_info *info)
-{
-	struct linkmodes_reply_data *data = LINKMODES_REPDATA(reply_base);
-	struct net_device *dev = reply_base->dev;
-	int ret;
-
-	data->lsettings = &data->ksettings.base;
-
-	ret = ethnl_ops_begin(dev);
-	if (ret < 0)
-		return ret;
-
-	ret = __ethtool_get_link_ksettings(dev, &data->ksettings);
-	if (ret < 0 && info) {
-		GENL_SET_ERR_MSG(info, "failed to retrieve link settings");
-		goto out;
-	}
-
-	data->peer_empty =
-		bitmap_empty(data->ksettings.link_modes.lp_advertising,
-			     __ETHTOOL_LINK_MODE_MASK_NBITS);
-
-out:
-	ethnl_ops_complete(dev);
-	return ret;
-}
-
-static int linkmodes_reply_size(const struct ethnl_req_info *req_base,
-				const struct ethnl_reply_data *reply_base)
-{
-	const struct linkmodes_reply_data *data = LINKMODES_REPDATA(reply_base);
-	const struct ethtool_link_ksettings *ksettings = &data->ksettings;
-	const struct ethtool_link_settings *lsettings = &ksettings->base;
-	bool compact = req_base->flags & ETHTOOL_FLAG_COMPACT_BITSETS;
-	int len, ret;
-
-	len = nla_total_size(sizeof(u8)) /* LINKMODES_AUTONEG */
-		+ nla_total_size(sizeof(u32)) /* LINKMODES_SPEED */
-		+ nla_total_size(sizeof(u8)) /* LINKMODES_DUPLEX */
-		+ 0;
-	ret = ethnl_bitset_size(ksettings->link_modes.advertising,
-				ksettings->link_modes.supported,
-				__ETHTOOL_LINK_MODE_MASK_NBITS,
-				link_mode_names, compact);
-	if (ret < 0)
-		return ret;
-	len += ret;
-	if (!data->peer_empty) {
-		ret = ethnl_bitset_size(ksettings->link_modes.lp_advertising,
-					NULL, __ETHTOOL_LINK_MODE_MASK_NBITS,
-					link_mode_names, compact);
-		if (ret < 0)
-			return ret;
-		len += ret;
-	}
-
-	if (lsettings->master_slave_cfg != MASTER_SLAVE_CFG_UNSUPPORTED)
-		len += nla_total_size(sizeof(u8));
-
-	if (lsettings->master_slave_state != MASTER_SLAVE_STATE_UNSUPPORTED)
-		len += nla_total_size(sizeof(u8));
-
-	return len;
-}
-
-static int linkmodes_fill_reply(struct sk_buff *skb,
-				const struct ethnl_req_info *req_base,
-				const struct ethnl_reply_data *reply_base)
-{
-	const struct linkmodes_reply_data *data = LINKMODES_REPDATA(reply_base);
-	const struct ethtool_link_ksettings *ksettings = &data->ksettings;
-	const struct ethtool_link_settings *lsettings = &ksettings->base;
-	bool compact = req_base->flags & ETHTOOL_FLAG_COMPACT_BITSETS;
-	int ret;
-
-	if (nla_put_u8(skb, ETHTOOL_A_LINKMODES_AUTONEG, lsettings->autoneg))
-		return -EMSGSIZE;
-
-	ret = ethnl_put_bitset(skb, ETHTOOL_A_LINKMODES_OURS,
-			       ksettings->link_modes.advertising,
-			       ksettings->link_modes.supported,
-			       __ETHTOOL_LINK_MODE_MASK_NBITS, link_mode_names,
-			       compact);
-	if (ret < 0)
-		return -EMSGSIZE;
-	if (!data->peer_empty) {
-		ret = ethnl_put_bitset(skb, ETHTOOL_A_LINKMODES_PEER,
-				       ksettings->link_modes.lp_advertising,
-				       NULL, __ETHTOOL_LINK_MODE_MASK_NBITS,
-				       link_mode_names, compact);
-		if (ret < 0)
-			return -EMSGSIZE;
-	}
-
-	if (nla_put_u32(skb, ETHTOOL_A_LINKMODES_SPEED, lsettings->speed) ||
-	    nla_put_u8(skb, ETHTOOL_A_LINKMODES_DUPLEX, lsettings->duplex))
-		return -EMSGSIZE;
-
-	if (lsettings->master_slave_cfg != MASTER_SLAVE_CFG_UNSUPPORTED &&
-	    nla_put_u8(skb, ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG,
-		       lsettings->master_slave_cfg))
-		return -EMSGSIZE;
-
-	if (lsettings->master_slave_state != MASTER_SLAVE_STATE_UNSUPPORTED &&
-	    nla_put_u8(skb, ETHTOOL_A_LINKMODES_MASTER_SLAVE_STATE,
-		       lsettings->master_slave_state))
-		return -EMSGSIZE;
-
-	return 0;
-}
-
-const struct ethnl_request_ops ethnl_linkmodes_request_ops = {
-	.request_cmd		= ETHTOOL_MSG_LINKMODES_GET,
-	.reply_cmd		= ETHTOOL_MSG_LINKMODES_GET_REPLY,
-	.hdr_attr		= ETHTOOL_A_LINKMODES_HEADER,
-	.req_info_size		= sizeof(struct linkmodes_req_info),
-	.reply_data_size	= sizeof(struct linkmodes_reply_data),
-
-	.prepare_data		= linkmodes_prepare_data,
-	.reply_size		= linkmodes_reply_size,
-	.fill_reply		= linkmodes_fill_reply,
-};
-
-/* LINKMODES_SET */
-
-struct link_mode_info {
-	int				speed;
-	u8				lanes;
-	u8				duplex;
-};
-
-#define __LINK_MODE_LANES_CR		1
-#define __LINK_MODE_LANES_CR2		2
-#define __LINK_MODE_LANES_CR4		4
-#define __LINK_MODE_LANES_CR8		8
-#define __LINK_MODE_LANES_DR		1
-#define __LINK_MODE_LANES_DR2		2
-#define __LINK_MODE_LANES_DR4		4
-#define __LINK_MODE_LANES_DR8		8
-#define __LINK_MODE_LANES_KR		1
-#define __LINK_MODE_LANES_KR2		2
-#define __LINK_MODE_LANES_KR4		4
-#define __LINK_MODE_LANES_KR8		8
-#define __LINK_MODE_LANES_SR		1
-#define __LINK_MODE_LANES_SR2		2
-#define __LINK_MODE_LANES_SR4		4
-#define __LINK_MODE_LANES_SR8		8
-#define __LINK_MODE_LANES_ER		1
-#define __LINK_MODE_LANES_KX		1
-#define __LINK_MODE_LANES_KX4		4
-#define __LINK_MODE_LANES_LR		1
-#define __LINK_MODE_LANES_LR4		4
-#define __LINK_MODE_LANES_LR4_ER4	4
-#define __LINK_MODE_LANES_LR_ER_FR	1
-#define __LINK_MODE_LANES_LR2_ER2_FR2	2
-#define __LINK_MODE_LANES_LR4_ER4_FR4	4
-#define __LINK_MODE_LANES_LR8_ER8_FR8	8
-#define __LINK_MODE_LANES_LRM		1
-#define __LINK_MODE_LANES_MLD2		2
-#define __LINK_MODE_LANES_T		1
-#define __LINK_MODE_LANES_T1		1
-#define __LINK_MODE_LANES_X		1
-#define __LINK_MODE_LANES_FX		1
-
-#define __DEFINE_LINK_MODE_PARAMS(_speed, _type, _duplex)	\
-	[ETHTOOL_LINK_MODE(_speed, _type, _duplex)] = {		\
-		.speed  = SPEED_ ## _speed, \
-		.lanes  = __LINK_MODE_LANES_ ## _type, \
-		.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	= 0, \
-		.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_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_SPECIAL_MODE_PARAMS(Pause),
-	__DEFINE_SPECIAL_MODE_PARAMS(Asym_Pause),
-	__DEFINE_LINK_MODE_PARAMS(2500, X, 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),
-	[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_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_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),
-};
-
-const struct nla_policy ethnl_linkmodes_set_policy[] = {
-	[ETHTOOL_A_LINKMODES_HEADER]		=
-		NLA_POLICY_NESTED(ethnl_header_policy),
-	[ETHTOOL_A_LINKMODES_AUTONEG]		= { .type = NLA_U8 },
-	[ETHTOOL_A_LINKMODES_OURS]		= { .type = NLA_NESTED },
-	[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]		=
-		NLA_POLICY_RANGE(NLA_U32, 1, 8),
-};
-
-/* 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_lanes,
-				 bool req_duplex)
-{
-	unsigned long *advertising = ksettings->link_modes.advertising;
-	unsigned long *supported = ksettings->link_modes.supported;
-	DECLARE_BITMAP(old_adv, __ETHTOOL_LINK_MODE_MASK_NBITS);
-	unsigned int i;
-
-	BUILD_BUG_ON(ARRAY_SIZE(link_mode_params) !=
-		     __ETHTOOL_LINK_MODE_MASK_NBITS);
-
-	bitmap_copy(old_adv, advertising, __ETHTOOL_LINK_MODE_MASK_NBITS);
-
-	for (i = 0; i < __ETHTOOL_LINK_MODE_MASK_NBITS; i++) {
-		const struct link_mode_info *info = &link_mode_params[i];
-
-		if (info->speed == SPEED_UNKNOWN)
-			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
-			clear_bit(i, advertising);
-	}
-
-	return !bitmap_equal(old_adv, advertising,
-			     __ETHTOOL_LINK_MODE_MASK_NBITS);
-}
-
-static bool ethnl_validate_master_slave_cfg(u8 cfg)
-{
-	switch (cfg) {
-	case MASTER_SLAVE_CFG_MASTER_PREFERRED:
-	case MASTER_SLAVE_CFG_SLAVE_PREFERRED:
-	case MASTER_SLAVE_CFG_MASTER_FORCE:
-	case MASTER_SLAVE_CFG_SLAVE_FORCE:
-		return true;
-	}
-
-	return false;
-}
-
-static int ethnl_check_linkmodes(struct genl_info *info, struct nlattr **tb)
-{
-	const struct nlattr *master_slave_cfg, *lanes_cfg;
-
-	master_slave_cfg = tb[ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG];
-	if (master_slave_cfg &&
-	    !ethnl_validate_master_slave_cfg(nla_get_u8(master_slave_cfg))) {
-		NL_SET_ERR_MSG_ATTR(info->extack, master_slave_cfg,
-				    "master/slave value is invalid");
-		return -EOPNOTSUPP;
-	}
-
-	lanes_cfg = tb[ETHTOOL_A_LINKMODES_LANES];
-	if (lanes_cfg && !is_power_of_2(nla_get_u32(lanes_cfg))) {
-		NL_SET_ERR_MSG_ATTR(info->extack, lanes_cfg,
-				    "lanes value is invalid");
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-static int ethnl_update_linkmodes(struct genl_info *info, struct nlattr **tb,
-				  struct ethtool_link_ksettings *ksettings,
-				  bool *mod, const struct net_device *dev)
-{
-	struct ethtool_link_settings *lsettings = &ksettings->base;
-	bool req_speed, req_lanes, req_duplex;
-	const struct nlattr *master_slave_cfg, *lanes_cfg;
-	int ret;
-
-	master_slave_cfg = tb[ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG];
-	if (master_slave_cfg) {
-		if (lsettings->master_slave_cfg == MASTER_SLAVE_CFG_UNSUPPORTED) {
-			NL_SET_ERR_MSG_ATTR(info->extack, master_slave_cfg,
-					    "master/slave configuration not supported by device");
-			return -EOPNOTSUPP;
-		}
-	}
-
-	*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);
-
-	lanes_cfg = tb[ETHTOOL_A_LINKMODES_LANES];
-	if (lanes_cfg) {
-		/* If autoneg is off and lanes parameter is
-		 * not supported by the driver,
-		 * return an error.
-		 */
-		if (!lsettings->autoneg &&
-		    !dev->ethtool_ops->cap_link_lanes_supported) {
-			NL_SET_ERR_MSG_ATTR(info->extack, lanes_cfg,
-					    "lanes configuration not supported by device");
-			return -EOPNOTSUPP;
-		}
-	} else if (!lsettings->autoneg && ksettings->lanes) {
-		/* If autoneg is off and lanes parameter is not passed from user but
-		 * it was defined previously then set the lanes parameter to 0.
-		 */
-		ksettings->lanes = 0;
-		*mod = true;
-	}
-
-	ret = ethnl_update_bitset(ksettings->link_modes.advertising,
-				  __ETHTOOL_LINK_MODE_MASK_NBITS,
-				  tb[ETHTOOL_A_LINKMODES_OURS], link_mode_names,
-				  info->extack, mod);
-	if (ret < 0)
-		return ret;
-	ethnl_update_u32(&lsettings->speed, tb[ETHTOOL_A_LINKMODES_SPEED],
-			 mod);
-	ethnl_update_u32(&ksettings->lanes, lanes_cfg, 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_lanes || req_duplex) &&
-	    ethnl_auto_linkmodes(ksettings, req_speed, req_lanes, req_duplex))
-		*mod = true;
-
-	return 0;
-}
-
-int ethnl_set_linkmodes(struct sk_buff *skb, struct genl_info *info)
-{
-	struct ethtool_link_ksettings ksettings = {};
-	struct ethnl_req_info req_info = {};
-	struct nlattr **tb = info->attrs;
-	struct net_device *dev;
-	bool mod = false;
-	int ret;
-
-	ret = ethnl_check_linkmodes(info, tb);
-	if (ret < 0)
-		return ret;
-
-	ret = ethnl_parse_header_dev_get(&req_info,
-					 tb[ETHTOOL_A_LINKMODES_HEADER],
-					 genl_info_net(info), info->extack,
-					 true);
-	if (ret < 0)
-		return ret;
-	dev = req_info.dev;
-	ret = -EOPNOTSUPP;
-	if (!dev->ethtool_ops->get_link_ksettings ||
-	    !dev->ethtool_ops->set_link_ksettings)
-		goto out_dev;
-
-	rtnl_lock();
-	ret = ethnl_ops_begin(dev);
-	if (ret < 0)
-		goto out_rtnl;
-
-	ret = __ethtool_get_link_ksettings(dev, &ksettings);
-	if (ret < 0) {
-		GENL_SET_ERR_MSG(info, "failed to retrieve link settings");
-		goto out_ops;
-	}
-
-	ret = ethnl_update_linkmodes(info, tb, &ksettings, &mod, dev);
-	if (ret < 0)
-		goto out_ops;
-
-	if (mod) {
-		ret = dev->ethtool_ops->set_link_ksettings(dev, &ksettings);
-		if (ret < 0)
-			GENL_SET_ERR_MSG(info, "link settings update failed");
-		else
-			ethtool_notify(dev, ETHTOOL_MSG_LINKMODES_NTF, NULL);
-	}
-
-out_ops:
-	ethnl_ops_complete(dev);
-out_rtnl:
-	rtnl_unlock();
-out_dev:
-	dev_put(dev);
-	return ret;
-}
diff --git a/net/ethtool/netlink.h b/net/ethtool/netlink.h
index 17155d446f2d..ebecf06a5a6e 100644
--- a/net/ethtool/netlink.h
+++ b/net/ethtool/netlink.h
@@ -339,8 +339,6 @@ 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_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];
-- 
2.34.1

