xref: /linux/net/ethtool/common.c (revision b693b51e0829b96a5c43f45c3fba3d11f6f09d2f)
1 // SPDX-License-Identifier: GPL-2.0-only
2 
3 #include <linux/ethtool_netlink.h>
4 #include <linux/net_tstamp.h>
5 #include <linux/phy.h>
6 #include <linux/rtnetlink.h>
7 #include <linux/ptp_clock_kernel.h>
8 #include <linux/phy_link_topology.h>
9 #include <net/netdev_queues.h>
10 
11 #include "common.h"
12 #include "netlink.h"
13 #include "../core/dev.h"
14 
15 
16 const char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN] = {
17 	[NETIF_F_SG_BIT] =               "tx-scatter-gather",
18 	[NETIF_F_IP_CSUM_BIT] =          "tx-checksum-ipv4",
19 	[NETIF_F_HW_CSUM_BIT] =          "tx-checksum-ip-generic",
20 	[NETIF_F_IPV6_CSUM_BIT] =        "tx-checksum-ipv6",
21 	[NETIF_F_HIGHDMA_BIT] =          "highdma",
22 	[NETIF_F_FRAGLIST_BIT] =         "tx-scatter-gather-fraglist",
23 	[NETIF_F_HW_VLAN_CTAG_TX_BIT] =  "tx-vlan-hw-insert",
24 
25 	[NETIF_F_HW_VLAN_CTAG_RX_BIT] =  "rx-vlan-hw-parse",
26 	[NETIF_F_HW_VLAN_CTAG_FILTER_BIT] = "rx-vlan-filter",
27 	[NETIF_F_HW_VLAN_STAG_TX_BIT] =  "tx-vlan-stag-hw-insert",
28 	[NETIF_F_HW_VLAN_STAG_RX_BIT] =  "rx-vlan-stag-hw-parse",
29 	[NETIF_F_HW_VLAN_STAG_FILTER_BIT] = "rx-vlan-stag-filter",
30 	[NETIF_F_VLAN_CHALLENGED_BIT] =  "vlan-challenged",
31 	[NETIF_F_GSO_BIT] =              "tx-generic-segmentation",
32 	[NETIF_F_GRO_BIT] =              "rx-gro",
33 	[NETIF_F_GRO_HW_BIT] =           "rx-gro-hw",
34 	[NETIF_F_LRO_BIT] =              "rx-lro",
35 
36 	[NETIF_F_TSO_BIT] =              "tx-tcp-segmentation",
37 	[NETIF_F_GSO_ROBUST_BIT] =       "tx-gso-robust",
38 	[NETIF_F_TSO_ECN_BIT] =          "tx-tcp-ecn-segmentation",
39 	[NETIF_F_GSO_ACCECN_BIT] =	 "tx-tcp-accecn-segmentation",
40 	[NETIF_F_TSO_MANGLEID_BIT] =	 "tx-tcp-mangleid-segmentation",
41 	[NETIF_F_TSO6_BIT] =             "tx-tcp6-segmentation",
42 	[NETIF_F_FSO_BIT] =              "tx-fcoe-segmentation",
43 	[NETIF_F_GSO_GRE_BIT] =		 "tx-gre-segmentation",
44 	[NETIF_F_GSO_GRE_CSUM_BIT] =	 "tx-gre-csum-segmentation",
45 	[NETIF_F_GSO_IPXIP4_BIT] =	 "tx-ipxip4-segmentation",
46 	[NETIF_F_GSO_IPXIP6_BIT] =	 "tx-ipxip6-segmentation",
47 	[NETIF_F_GSO_UDP_TUNNEL_BIT] =	 "tx-udp_tnl-segmentation",
48 	[NETIF_F_GSO_UDP_TUNNEL_CSUM_BIT] = "tx-udp_tnl-csum-segmentation",
49 	[NETIF_F_GSO_PARTIAL_BIT] =	 "tx-gso-partial",
50 	[NETIF_F_GSO_TUNNEL_REMCSUM_BIT] = "tx-tunnel-remcsum-segmentation",
51 	[NETIF_F_GSO_SCTP_BIT] =	 "tx-sctp-segmentation",
52 	[NETIF_F_GSO_ESP_BIT] =		 "tx-esp-segmentation",
53 	[NETIF_F_GSO_UDP_L4_BIT] =	 "tx-udp-segmentation",
54 	[NETIF_F_GSO_FRAGLIST_BIT] =	 "tx-gso-list",
55 
56 	[NETIF_F_FCOE_CRC_BIT] =         "tx-checksum-fcoe-crc",
57 	[NETIF_F_SCTP_CRC_BIT] =        "tx-checksum-sctp",
58 	[NETIF_F_NTUPLE_BIT] =           "rx-ntuple-filter",
59 	[NETIF_F_RXHASH_BIT] =           "rx-hashing",
60 	[NETIF_F_RXCSUM_BIT] =           "rx-checksum",
61 	[NETIF_F_NOCACHE_COPY_BIT] =     "tx-nocache-copy",
62 	[NETIF_F_LOOPBACK_BIT] =         "loopback",
63 	[NETIF_F_RXFCS_BIT] =            "rx-fcs",
64 	[NETIF_F_RXALL_BIT] =            "rx-all",
65 	[NETIF_F_HW_L2FW_DOFFLOAD_BIT] = "l2-fwd-offload",
66 	[NETIF_F_HW_TC_BIT] =		 "hw-tc-offload",
67 	[NETIF_F_HW_ESP_BIT] =		 "esp-hw-offload",
68 	[NETIF_F_HW_ESP_TX_CSUM_BIT] =	 "esp-tx-csum-hw-offload",
69 	[NETIF_F_RX_UDP_TUNNEL_PORT_BIT] =	 "rx-udp_tunnel-port-offload",
70 	[NETIF_F_HW_TLS_TX_BIT] =	 "tls-hw-tx-offload",
71 	[NETIF_F_HW_TLS_RX_BIT] =	 "tls-hw-rx-offload",
72 	[NETIF_F_GRO_FRAGLIST_BIT] =	 "rx-gro-list",
73 	[NETIF_F_HW_MACSEC_BIT] =	 "macsec-hw-offload",
74 	[NETIF_F_GRO_UDP_FWD_BIT] =	 "rx-udp-gro-forwarding",
75 	[NETIF_F_HW_HSR_TAG_INS_BIT] =	 "hsr-tag-ins-offload",
76 	[NETIF_F_HW_HSR_TAG_RM_BIT] =	 "hsr-tag-rm-offload",
77 	[NETIF_F_HW_HSR_FWD_BIT] =	 "hsr-fwd-offload",
78 	[NETIF_F_HW_HSR_DUP_BIT] =	 "hsr-dup-offload",
79 };
80 
81 const char
82 rss_hash_func_strings[ETH_RSS_HASH_FUNCS_COUNT][ETH_GSTRING_LEN] = {
83 	[ETH_RSS_HASH_TOP_BIT] =	"toeplitz",
84 	[ETH_RSS_HASH_XOR_BIT] =	"xor",
85 	[ETH_RSS_HASH_CRC32_BIT] =	"crc32",
86 };
87 
88 const char
89 tunable_strings[__ETHTOOL_TUNABLE_COUNT][ETH_GSTRING_LEN] = {
90 	[ETHTOOL_ID_UNSPEC]     = "Unspec",
91 	[ETHTOOL_RX_COPYBREAK]	= "rx-copybreak",
92 	[ETHTOOL_TX_COPYBREAK]	= "tx-copybreak",
93 	[ETHTOOL_PFC_PREVENTION_TOUT] = "pfc-prevention-tout",
94 	[ETHTOOL_TX_COPYBREAK_BUF_SIZE] = "tx-copybreak-buf-size",
95 };
96 
97 const char
98 phy_tunable_strings[__ETHTOOL_PHY_TUNABLE_COUNT][ETH_GSTRING_LEN] = {
99 	[ETHTOOL_ID_UNSPEC]     = "Unspec",
100 	[ETHTOOL_PHY_DOWNSHIFT]	= "phy-downshift",
101 	[ETHTOOL_PHY_FAST_LINK_DOWN] = "phy-fast-link-down",
102 	[ETHTOOL_PHY_EDPD]	= "phy-energy-detect-power-down",
103 	[ETHTOOL_PHY_SHORT_CABLE_PRESET] = "phy-short-cable-preset",
104 	[ETHTOOL_PHY_LPF_BW]	= "phy-lpf-bandwidth",
105 	[ETHTOOL_PHY_DSP_EQ_INIT_VALUE] = "phy-dsp-eq-init-value",
106 };
107 
108 #define __LINK_MODE_NAME(speed, type, duplex) \
109 	#speed "base" #type "/" #duplex
110 #define __DEFINE_LINK_MODE_NAME(speed, type, duplex) \
111 	[ETHTOOL_LINK_MODE(speed, type, duplex)] = \
112 	__LINK_MODE_NAME(speed, type, duplex)
113 #define __DEFINE_SPECIAL_MODE_NAME(_mode, _name) \
114 	[ETHTOOL_LINK_MODE_ ## _mode ## _BIT] = _name
115 
116 const char link_mode_names[][ETH_GSTRING_LEN] = {
117 	__DEFINE_LINK_MODE_NAME(10, T, Half),
118 	__DEFINE_LINK_MODE_NAME(10, T, Full),
119 	__DEFINE_LINK_MODE_NAME(100, T, Half),
120 	__DEFINE_LINK_MODE_NAME(100, T, Full),
121 	__DEFINE_LINK_MODE_NAME(1000, T, Half),
122 	__DEFINE_LINK_MODE_NAME(1000, T, Full),
123 	__DEFINE_SPECIAL_MODE_NAME(Autoneg, "Autoneg"),
124 	__DEFINE_SPECIAL_MODE_NAME(TP, "TP"),
125 	__DEFINE_SPECIAL_MODE_NAME(AUI, "AUI"),
126 	__DEFINE_SPECIAL_MODE_NAME(MII, "MII"),
127 	__DEFINE_SPECIAL_MODE_NAME(FIBRE, "FIBRE"),
128 	__DEFINE_SPECIAL_MODE_NAME(BNC, "BNC"),
129 	__DEFINE_LINK_MODE_NAME(10000, T, Full),
130 	__DEFINE_SPECIAL_MODE_NAME(Pause, "Pause"),
131 	__DEFINE_SPECIAL_MODE_NAME(Asym_Pause, "Asym_Pause"),
132 	__DEFINE_LINK_MODE_NAME(2500, X, Full),
133 	__DEFINE_SPECIAL_MODE_NAME(Backplane, "Backplane"),
134 	__DEFINE_LINK_MODE_NAME(1000, KX, Full),
135 	__DEFINE_LINK_MODE_NAME(10000, KX4, Full),
136 	__DEFINE_LINK_MODE_NAME(10000, KR, Full),
137 	__DEFINE_SPECIAL_MODE_NAME(10000baseR_FEC, "10000baseR_FEC"),
138 	__DEFINE_LINK_MODE_NAME(20000, MLD2, Full),
139 	__DEFINE_LINK_MODE_NAME(20000, KR2, Full),
140 	__DEFINE_LINK_MODE_NAME(40000, KR4, Full),
141 	__DEFINE_LINK_MODE_NAME(40000, CR4, Full),
142 	__DEFINE_LINK_MODE_NAME(40000, SR4, Full),
143 	__DEFINE_LINK_MODE_NAME(40000, LR4, Full),
144 	__DEFINE_LINK_MODE_NAME(56000, KR4, Full),
145 	__DEFINE_LINK_MODE_NAME(56000, CR4, Full),
146 	__DEFINE_LINK_MODE_NAME(56000, SR4, Full),
147 	__DEFINE_LINK_MODE_NAME(56000, LR4, Full),
148 	__DEFINE_LINK_MODE_NAME(25000, CR, Full),
149 	__DEFINE_LINK_MODE_NAME(25000, KR, Full),
150 	__DEFINE_LINK_MODE_NAME(25000, SR, Full),
151 	__DEFINE_LINK_MODE_NAME(50000, CR2, Full),
152 	__DEFINE_LINK_MODE_NAME(50000, KR2, Full),
153 	__DEFINE_LINK_MODE_NAME(100000, KR4, Full),
154 	__DEFINE_LINK_MODE_NAME(100000, SR4, Full),
155 	__DEFINE_LINK_MODE_NAME(100000, CR4, Full),
156 	__DEFINE_LINK_MODE_NAME(100000, LR4_ER4, Full),
157 	__DEFINE_LINK_MODE_NAME(50000, SR2, Full),
158 	__DEFINE_LINK_MODE_NAME(1000, X, Full),
159 	__DEFINE_LINK_MODE_NAME(10000, CR, Full),
160 	__DEFINE_LINK_MODE_NAME(10000, SR, Full),
161 	__DEFINE_LINK_MODE_NAME(10000, LR, Full),
162 	__DEFINE_LINK_MODE_NAME(10000, LRM, Full),
163 	__DEFINE_LINK_MODE_NAME(10000, ER, Full),
164 	__DEFINE_LINK_MODE_NAME(2500, T, Full),
165 	__DEFINE_LINK_MODE_NAME(5000, T, Full),
166 	__DEFINE_SPECIAL_MODE_NAME(FEC_NONE, "None"),
167 	__DEFINE_SPECIAL_MODE_NAME(FEC_RS, "RS"),
168 	__DEFINE_SPECIAL_MODE_NAME(FEC_BASER, "BASER"),
169 	__DEFINE_LINK_MODE_NAME(50000, KR, Full),
170 	__DEFINE_LINK_MODE_NAME(50000, SR, Full),
171 	__DEFINE_LINK_MODE_NAME(50000, CR, Full),
172 	__DEFINE_LINK_MODE_NAME(50000, LR_ER_FR, Full),
173 	__DEFINE_LINK_MODE_NAME(50000, DR, Full),
174 	__DEFINE_LINK_MODE_NAME(100000, KR2, Full),
175 	__DEFINE_LINK_MODE_NAME(100000, SR2, Full),
176 	__DEFINE_LINK_MODE_NAME(100000, CR2, Full),
177 	__DEFINE_LINK_MODE_NAME(100000, LR2_ER2_FR2, Full),
178 	__DEFINE_LINK_MODE_NAME(100000, DR2, Full),
179 	__DEFINE_LINK_MODE_NAME(200000, KR4, Full),
180 	__DEFINE_LINK_MODE_NAME(200000, SR4, Full),
181 	__DEFINE_LINK_MODE_NAME(200000, LR4_ER4_FR4, Full),
182 	__DEFINE_LINK_MODE_NAME(200000, DR4, Full),
183 	__DEFINE_LINK_MODE_NAME(200000, CR4, Full),
184 	__DEFINE_LINK_MODE_NAME(100, T1, Full),
185 	__DEFINE_LINK_MODE_NAME(1000, T1, Full),
186 	__DEFINE_LINK_MODE_NAME(400000, KR8, Full),
187 	__DEFINE_LINK_MODE_NAME(400000, SR8, Full),
188 	__DEFINE_LINK_MODE_NAME(400000, LR8_ER8_FR8, Full),
189 	__DEFINE_LINK_MODE_NAME(400000, DR8, Full),
190 	__DEFINE_LINK_MODE_NAME(400000, CR8, Full),
191 	__DEFINE_SPECIAL_MODE_NAME(FEC_LLRS, "LLRS"),
192 	__DEFINE_LINK_MODE_NAME(100000, KR, Full),
193 	__DEFINE_LINK_MODE_NAME(100000, SR, Full),
194 	__DEFINE_LINK_MODE_NAME(100000, LR_ER_FR, Full),
195 	__DEFINE_LINK_MODE_NAME(100000, DR, Full),
196 	__DEFINE_LINK_MODE_NAME(100000, CR, Full),
197 	__DEFINE_LINK_MODE_NAME(200000, KR2, Full),
198 	__DEFINE_LINK_MODE_NAME(200000, SR2, Full),
199 	__DEFINE_LINK_MODE_NAME(200000, LR2_ER2_FR2, Full),
200 	__DEFINE_LINK_MODE_NAME(200000, DR2, Full),
201 	__DEFINE_LINK_MODE_NAME(200000, CR2, Full),
202 	__DEFINE_LINK_MODE_NAME(400000, KR4, Full),
203 	__DEFINE_LINK_MODE_NAME(400000, SR4, Full),
204 	__DEFINE_LINK_MODE_NAME(400000, LR4_ER4_FR4, Full),
205 	__DEFINE_LINK_MODE_NAME(400000, DR4, Full),
206 	__DEFINE_LINK_MODE_NAME(400000, CR4, Full),
207 	__DEFINE_LINK_MODE_NAME(100, FX, Half),
208 	__DEFINE_LINK_MODE_NAME(100, FX, Full),
209 	__DEFINE_LINK_MODE_NAME(10, T1L, Full),
210 	__DEFINE_LINK_MODE_NAME(800000, CR8, Full),
211 	__DEFINE_LINK_MODE_NAME(800000, KR8, Full),
212 	__DEFINE_LINK_MODE_NAME(800000, DR8, Full),
213 	__DEFINE_LINK_MODE_NAME(800000, DR8_2, Full),
214 	__DEFINE_LINK_MODE_NAME(800000, SR8, Full),
215 	__DEFINE_LINK_MODE_NAME(800000, VR8, Full),
216 	__DEFINE_LINK_MODE_NAME(10, T1S, Full),
217 	__DEFINE_LINK_MODE_NAME(10, T1S, Half),
218 	__DEFINE_LINK_MODE_NAME(10, T1S_P2MP, Half),
219 	__DEFINE_LINK_MODE_NAME(10, T1BRR, Full),
220 	__DEFINE_LINK_MODE_NAME(200000, CR, Full),
221 	__DEFINE_LINK_MODE_NAME(200000, KR, Full),
222 	__DEFINE_LINK_MODE_NAME(200000, DR, Full),
223 	__DEFINE_LINK_MODE_NAME(200000, DR_2, Full),
224 	__DEFINE_LINK_MODE_NAME(200000, SR, Full),
225 	__DEFINE_LINK_MODE_NAME(200000, VR, Full),
226 	__DEFINE_LINK_MODE_NAME(400000, CR2, Full),
227 	__DEFINE_LINK_MODE_NAME(400000, KR2, Full),
228 	__DEFINE_LINK_MODE_NAME(400000, DR2, Full),
229 	__DEFINE_LINK_MODE_NAME(400000, DR2_2, Full),
230 	__DEFINE_LINK_MODE_NAME(400000, SR2, Full),
231 	__DEFINE_LINK_MODE_NAME(400000, VR2, Full),
232 	__DEFINE_LINK_MODE_NAME(800000, CR4, Full),
233 	__DEFINE_LINK_MODE_NAME(800000, KR4, Full),
234 	__DEFINE_LINK_MODE_NAME(800000, DR4, Full),
235 	__DEFINE_LINK_MODE_NAME(800000, DR4_2, Full),
236 	__DEFINE_LINK_MODE_NAME(800000, SR4, Full),
237 	__DEFINE_LINK_MODE_NAME(800000, VR4, Full),
238 	__DEFINE_LINK_MODE_NAME(1600000, CR8, Full),
239 	__DEFINE_LINK_MODE_NAME(1600000, KR8, Full),
240 	__DEFINE_LINK_MODE_NAME(1600000, DR8, Full),
241 	__DEFINE_LINK_MODE_NAME(1600000, DR8_2, Full),
242 };
243 static_assert(ARRAY_SIZE(link_mode_names) == __ETHTOOL_LINK_MODE_MASK_NBITS);
244 
245 #define __LINK_MODE_LANES_CR		1
246 #define __LINK_MODE_LANES_CR2		2
247 #define __LINK_MODE_LANES_CR4		4
248 #define __LINK_MODE_LANES_CR8		8
249 #define __LINK_MODE_LANES_DR		1
250 #define __LINK_MODE_LANES_DR_2		1
251 #define __LINK_MODE_LANES_DR2		2
252 #define __LINK_MODE_LANES_DR2_2		2
253 #define __LINK_MODE_LANES_DR4		4
254 #define __LINK_MODE_LANES_DR4_2		4
255 #define __LINK_MODE_LANES_DR8		8
256 #define __LINK_MODE_LANES_KR		1
257 #define __LINK_MODE_LANES_KR2		2
258 #define __LINK_MODE_LANES_KR4		4
259 #define __LINK_MODE_LANES_KR8		8
260 #define __LINK_MODE_LANES_SR		1
261 #define __LINK_MODE_LANES_SR2		2
262 #define __LINK_MODE_LANES_SR4		4
263 #define __LINK_MODE_LANES_SR8		8
264 #define __LINK_MODE_LANES_ER		1
265 #define __LINK_MODE_LANES_KX		1
266 #define __LINK_MODE_LANES_KX4		4
267 #define __LINK_MODE_LANES_LR		1
268 #define __LINK_MODE_LANES_LR4		4
269 #define __LINK_MODE_LANES_LR4_ER4	4
270 #define __LINK_MODE_LANES_LR_ER_FR	1
271 #define __LINK_MODE_LANES_LR2_ER2_FR2	2
272 #define __LINK_MODE_LANES_LR4_ER4_FR4	4
273 #define __LINK_MODE_LANES_LR8_ER8_FR8	8
274 #define __LINK_MODE_LANES_LRM		1
275 #define __LINK_MODE_LANES_MLD2		2
276 #define __LINK_MODE_LANES_T		1
277 #define __LINK_MODE_LANES_T1		1
278 #define __LINK_MODE_LANES_X		1
279 #define __LINK_MODE_LANES_FX		1
280 #define __LINK_MODE_LANES_T1L		1
281 #define __LINK_MODE_LANES_T1S		1
282 #define __LINK_MODE_LANES_T1S_P2MP	1
283 #define __LINK_MODE_LANES_VR		1
284 #define __LINK_MODE_LANES_VR2		2
285 #define __LINK_MODE_LANES_VR4		4
286 #define __LINK_MODE_LANES_VR8		8
287 #define __LINK_MODE_LANES_DR8_2		8
288 #define __LINK_MODE_LANES_T1BRR		1
289 
290 #define __DEFINE_LINK_MODE_PARAMS_PAIRS(_speed, _type, _min_pairs, _pairs, _duplex, _medium) \
291 	[ETHTOOL_LINK_MODE(_speed, _type, _duplex)] = {		\
292 		.speed  = SPEED_ ## _speed, \
293 		.lanes  = __LINK_MODE_LANES_ ## _type, \
294 		.min_pairs = _min_pairs, \
295 		.pairs = _pairs, \
296 		.duplex	= __DUPLEX_ ## _duplex, \
297 		.mediums = BIT(ETHTOOL_LINK_MEDIUM_BASE ## _medium) \
298 	}
299 
300 #define __DEFINE_LINK_MODE_PARAMS(_speed, _type, _duplex, _medium)	\
301 	[ETHTOOL_LINK_MODE(_speed, _type, _duplex)] = {		\
302 		.speed  = SPEED_ ## _speed, \
303 		.lanes  = __LINK_MODE_LANES_ ## _type, \
304 		.min_pairs = 0, \
305 		.pairs = 0, \
306 		.duplex	= __DUPLEX_ ## _duplex, \
307 		.mediums = BIT(ETHTOOL_LINK_MEDIUM_BASE ## _medium) \
308 	}
309 #define __DEFINE_LINK_MODE_PARAMS_MEDIUMS(_speed, _type, _duplex, _mediums)	\
310 	[ETHTOOL_LINK_MODE(_speed, _type, _duplex)] = {		\
311 		.speed  = SPEED_ ## _speed, \
312 		.lanes  = __LINK_MODE_LANES_ ## _type, \
313 		.min_pairs = 0, \
314 		.pairs = 0, \
315 		.duplex	= __DUPLEX_ ## _duplex, \
316 		.mediums = (_mediums) \
317 	}
318 #define __MED(_medium)	(BIT(ETHTOOL_LINK_MEDIUM_BASE ## _medium))
319 #define __DUPLEX_Half DUPLEX_HALF
320 #define __DUPLEX_Full DUPLEX_FULL
321 #define __DEFINE_SPECIAL_MODE_PARAMS(_mode) \
322 	[ETHTOOL_LINK_MODE_ ## _mode ## _BIT] = { \
323 		.speed	= SPEED_UNKNOWN, \
324 		.lanes	= 0, \
325 		.duplex	= DUPLEX_UNKNOWN, \
326 		.mediums = BIT(ETHTOOL_LINK_MEDIUM_NONE), \
327 	}
328 
329 const struct link_mode_info link_mode_params[] = {
330 	__DEFINE_LINK_MODE_PARAMS_PAIRS(10, T, 2, 4, Half, T),
331 	__DEFINE_LINK_MODE_PARAMS_PAIRS(10, T, 2, 4, Full, T),
332 	__DEFINE_LINK_MODE_PARAMS_PAIRS(100, T, 2, 4, Half, T),
333 	__DEFINE_LINK_MODE_PARAMS_PAIRS(100, T, 2, 4, Full, T),
334 	__DEFINE_LINK_MODE_PARAMS_PAIRS(1000, T, 4, 4, Half, T),
335 	__DEFINE_LINK_MODE_PARAMS_PAIRS(1000, T, 4, 4, Full, T),
336 	__DEFINE_SPECIAL_MODE_PARAMS(Autoneg),
337 	__DEFINE_SPECIAL_MODE_PARAMS(TP),
338 	__DEFINE_SPECIAL_MODE_PARAMS(AUI),
339 	__DEFINE_SPECIAL_MODE_PARAMS(MII),
340 	__DEFINE_SPECIAL_MODE_PARAMS(FIBRE),
341 	__DEFINE_SPECIAL_MODE_PARAMS(BNC),
342 	__DEFINE_LINK_MODE_PARAMS_PAIRS(10000, T, 4, 4, Full, T),
343 	__DEFINE_SPECIAL_MODE_PARAMS(Pause),
344 	__DEFINE_SPECIAL_MODE_PARAMS(Asym_Pause),
345 	__DEFINE_LINK_MODE_PARAMS_MEDIUMS(2500, X, Full,
346 					  __MED(C) | __MED(S) | __MED(L)),
347 	__DEFINE_SPECIAL_MODE_PARAMS(Backplane),
348 	__DEFINE_LINK_MODE_PARAMS(1000, KX, Full, K),
349 	__DEFINE_LINK_MODE_PARAMS(10000, KX4, Full, K),
350 	__DEFINE_LINK_MODE_PARAMS(10000, KR, Full, K),
351 	[ETHTOOL_LINK_MODE_10000baseR_FEC_BIT] = {
352 		.speed	= SPEED_10000,
353 		.lanes	= 1,
354 		.duplex = DUPLEX_FULL,
355 	},
356 	__DEFINE_LINK_MODE_PARAMS(20000, MLD2, Full, MLD),
357 	__DEFINE_LINK_MODE_PARAMS(20000, KR2, Full, K),
358 	__DEFINE_LINK_MODE_PARAMS(40000, KR4, Full, K),
359 	__DEFINE_LINK_MODE_PARAMS(40000, CR4, Full, C),
360 	__DEFINE_LINK_MODE_PARAMS(40000, SR4, Full, S),
361 	__DEFINE_LINK_MODE_PARAMS(40000, LR4, Full, L),
362 	__DEFINE_LINK_MODE_PARAMS(56000, KR4, Full, K),
363 	__DEFINE_LINK_MODE_PARAMS(56000, CR4, Full, C),
364 	__DEFINE_LINK_MODE_PARAMS(56000, SR4, Full, S),
365 	__DEFINE_LINK_MODE_PARAMS(56000, LR4, Full, L),
366 	__DEFINE_LINK_MODE_PARAMS(25000, CR, Full, C),
367 	__DEFINE_LINK_MODE_PARAMS(25000, KR, Full, K),
368 	__DEFINE_LINK_MODE_PARAMS(25000, SR, Full, S),
369 	__DEFINE_LINK_MODE_PARAMS(50000, CR2, Full, C),
370 	__DEFINE_LINK_MODE_PARAMS(50000, KR2, Full, K),
371 	__DEFINE_LINK_MODE_PARAMS(100000, KR4, Full, K),
372 	__DEFINE_LINK_MODE_PARAMS(100000, SR4, Full, S),
373 	__DEFINE_LINK_MODE_PARAMS(100000, CR4, Full, C),
374 	__DEFINE_LINK_MODE_PARAMS_MEDIUMS(100000, LR4_ER4, Full,
375 					  __MED(L) | __MED(E)),
376 	__DEFINE_LINK_MODE_PARAMS(50000, SR2, Full, S),
377 	__DEFINE_LINK_MODE_PARAMS_MEDIUMS(1000, X, Full,
378 					  __MED(C) | __MED(S) | __MED(L)),
379 	__DEFINE_LINK_MODE_PARAMS(10000, CR, Full, C),
380 	__DEFINE_LINK_MODE_PARAMS(10000, SR, Full, S),
381 	__DEFINE_LINK_MODE_PARAMS(10000, LR, Full, L),
382 	__DEFINE_LINK_MODE_PARAMS(10000, LRM, Full, L),
383 	__DEFINE_LINK_MODE_PARAMS(10000, ER, Full, E),
384 	__DEFINE_LINK_MODE_PARAMS_PAIRS(2500, T, 4, 4, Full, T),
385 	__DEFINE_LINK_MODE_PARAMS_PAIRS(5000, T, 4, 4, Full, T),
386 	__DEFINE_SPECIAL_MODE_PARAMS(FEC_NONE),
387 	__DEFINE_SPECIAL_MODE_PARAMS(FEC_RS),
388 	__DEFINE_SPECIAL_MODE_PARAMS(FEC_BASER),
389 	__DEFINE_LINK_MODE_PARAMS(50000, KR, Full, K),
390 	__DEFINE_LINK_MODE_PARAMS(50000, SR, Full, S),
391 	__DEFINE_LINK_MODE_PARAMS(50000, CR, Full, C),
392 	__DEFINE_LINK_MODE_PARAMS_MEDIUMS(50000, LR_ER_FR, Full,
393 					  __MED(L) | __MED(E) | __MED(F)),
394 	__DEFINE_LINK_MODE_PARAMS(50000, DR, Full, D),
395 	__DEFINE_LINK_MODE_PARAMS(100000, KR2, Full, K),
396 	__DEFINE_LINK_MODE_PARAMS(100000, SR2, Full, S),
397 	__DEFINE_LINK_MODE_PARAMS(100000, CR2, Full, C),
398 	__DEFINE_LINK_MODE_PARAMS_MEDIUMS(100000, LR2_ER2_FR2, Full,
399 					  __MED(L) | __MED(E) | __MED(F)),
400 	__DEFINE_LINK_MODE_PARAMS(100000, DR2, Full, D),
401 	__DEFINE_LINK_MODE_PARAMS(200000, KR4, Full, K),
402 	__DEFINE_LINK_MODE_PARAMS(200000, SR4, Full, S),
403 	__DEFINE_LINK_MODE_PARAMS_MEDIUMS(200000, LR4_ER4_FR4, Full,
404 					  __MED(L) | __MED(E) | __MED(F)),
405 	__DEFINE_LINK_MODE_PARAMS(200000, DR4, Full, D),
406 	__DEFINE_LINK_MODE_PARAMS(200000, CR4, Full, C),
407 	__DEFINE_LINK_MODE_PARAMS_PAIRS(100, T1, 1, 1, Full, T),
408 	__DEFINE_LINK_MODE_PARAMS_PAIRS(1000, T1, 1, 1, Full, T),
409 	__DEFINE_LINK_MODE_PARAMS(400000, KR8, Full, K),
410 	__DEFINE_LINK_MODE_PARAMS(400000, SR8, Full, S),
411 	__DEFINE_LINK_MODE_PARAMS_MEDIUMS(400000, LR8_ER8_FR8, Full,
412 					  __MED(L) | __MED(E) | __MED(F)),
413 	__DEFINE_LINK_MODE_PARAMS(400000, DR8, Full, D),
414 	__DEFINE_LINK_MODE_PARAMS(400000, CR8, Full, C),
415 	__DEFINE_SPECIAL_MODE_PARAMS(FEC_LLRS),
416 	__DEFINE_LINK_MODE_PARAMS(100000, KR, Full, K),
417 	__DEFINE_LINK_MODE_PARAMS(100000, SR, Full, S),
418 	__DEFINE_LINK_MODE_PARAMS_MEDIUMS(100000, LR_ER_FR, Full,
419 					  __MED(L) | __MED(E) | __MED(F)),
420 	__DEFINE_LINK_MODE_PARAMS(100000, DR, Full, D),
421 	__DEFINE_LINK_MODE_PARAMS(100000, CR, Full, C),
422 	__DEFINE_LINK_MODE_PARAMS(200000, KR2, Full, K),
423 	__DEFINE_LINK_MODE_PARAMS(200000, SR2, Full, S),
424 	__DEFINE_LINK_MODE_PARAMS_MEDIUMS(200000, LR2_ER2_FR2, Full,
425 					  __MED(L) | __MED(E) | __MED(F)),
426 	__DEFINE_LINK_MODE_PARAMS(200000, DR2, Full, D),
427 	__DEFINE_LINK_MODE_PARAMS(200000, CR2, Full, C),
428 	__DEFINE_LINK_MODE_PARAMS(400000, KR4, Full, K),
429 	__DEFINE_LINK_MODE_PARAMS(400000, SR4, Full, S),
430 	__DEFINE_LINK_MODE_PARAMS_MEDIUMS(400000, LR4_ER4_FR4, Full,
431 					  __MED(L) | __MED(E) | __MED(F)),
432 	__DEFINE_LINK_MODE_PARAMS(400000, DR4, Full, D),
433 	__DEFINE_LINK_MODE_PARAMS(400000, CR4, Full, C),
434 	__DEFINE_LINK_MODE_PARAMS(100, FX, Half, F),
435 	__DEFINE_LINK_MODE_PARAMS(100, FX, Full, F),
436 	__DEFINE_LINK_MODE_PARAMS_PAIRS(10, T1L, 1, 1, Full, T),
437 	__DEFINE_LINK_MODE_PARAMS(800000, CR8, Full, C),
438 	__DEFINE_LINK_MODE_PARAMS(800000, KR8, Full, K),
439 	__DEFINE_LINK_MODE_PARAMS(800000, DR8, Full, D),
440 	__DEFINE_LINK_MODE_PARAMS(800000, DR8_2, Full, D),
441 	__DEFINE_LINK_MODE_PARAMS(800000, SR8, Full, S),
442 	__DEFINE_LINK_MODE_PARAMS(800000, VR8, Full, V),
443 	__DEFINE_LINK_MODE_PARAMS_PAIRS(10, T1S, 1, 1, Full, T),
444 	__DEFINE_LINK_MODE_PARAMS_PAIRS(10, T1S, 1, 1, Half, T),
445 	__DEFINE_LINK_MODE_PARAMS_PAIRS(10, T1S_P2MP, 1, 1, Half, T),
446 	__DEFINE_LINK_MODE_PARAMS_PAIRS(10, T1BRR, 1, 1, Full, T),
447 	__DEFINE_LINK_MODE_PARAMS(200000, CR, Full, C),
448 	__DEFINE_LINK_MODE_PARAMS(200000, KR, Full, K),
449 	__DEFINE_LINK_MODE_PARAMS(200000, DR, Full, D),
450 	__DEFINE_LINK_MODE_PARAMS(200000, DR_2, Full, D),
451 	__DEFINE_LINK_MODE_PARAMS(200000, SR, Full, S),
452 	__DEFINE_LINK_MODE_PARAMS(200000, VR, Full, V),
453 	__DEFINE_LINK_MODE_PARAMS(400000, CR2, Full, C),
454 	__DEFINE_LINK_MODE_PARAMS(400000, KR2, Full, K),
455 	__DEFINE_LINK_MODE_PARAMS(400000, DR2, Full, D),
456 	__DEFINE_LINK_MODE_PARAMS(400000, DR2_2, Full, D),
457 	__DEFINE_LINK_MODE_PARAMS(400000, SR2, Full, S),
458 	__DEFINE_LINK_MODE_PARAMS(400000, VR2, Full, V),
459 	__DEFINE_LINK_MODE_PARAMS(800000, CR4, Full, C),
460 	__DEFINE_LINK_MODE_PARAMS(800000, KR4, Full, K),
461 	__DEFINE_LINK_MODE_PARAMS(800000, DR4, Full, D),
462 	__DEFINE_LINK_MODE_PARAMS(800000, DR4_2, Full, D),
463 	__DEFINE_LINK_MODE_PARAMS(800000, SR4, Full, S),
464 	__DEFINE_LINK_MODE_PARAMS(800000, VR4, Full, V),
465 	__DEFINE_LINK_MODE_PARAMS(1600000, CR8, Full, C),
466 	__DEFINE_LINK_MODE_PARAMS(1600000, KR8, Full, K),
467 	__DEFINE_LINK_MODE_PARAMS(1600000, DR8, Full, D),
468 	__DEFINE_LINK_MODE_PARAMS(1600000, DR8_2, Full, D),
469 };
470 static_assert(ARRAY_SIZE(link_mode_params) == __ETHTOOL_LINK_MODE_MASK_NBITS);
471 EXPORT_SYMBOL_GPL(link_mode_params);
472 
473 static const char ethtool_link_medium_names[][ETH_GSTRING_LEN] = {
474 	[ETHTOOL_LINK_MEDIUM_BASET] = "BaseT",
475 	[ETHTOOL_LINK_MEDIUM_BASEK] = "BaseK",
476 	[ETHTOOL_LINK_MEDIUM_BASES] = "BaseS",
477 	[ETHTOOL_LINK_MEDIUM_BASEC] = "BaseC",
478 	[ETHTOOL_LINK_MEDIUM_BASEL] = "BaseL",
479 	[ETHTOOL_LINK_MEDIUM_BASED] = "BaseD",
480 	[ETHTOOL_LINK_MEDIUM_BASEE] = "BaseE",
481 	[ETHTOOL_LINK_MEDIUM_BASEF] = "BaseF",
482 	[ETHTOOL_LINK_MEDIUM_BASEV] = "BaseV",
483 	[ETHTOOL_LINK_MEDIUM_BASEMLD] = "BaseMLD",
484 	[ETHTOOL_LINK_MEDIUM_NONE] = "None",
485 };
486 static_assert(ARRAY_SIZE(ethtool_link_medium_names) == __ETHTOOL_LINK_MEDIUM_LAST);
487 
488 const char netif_msg_class_names[][ETH_GSTRING_LEN] = {
489 	[NETIF_MSG_DRV_BIT]		= "drv",
490 	[NETIF_MSG_PROBE_BIT]		= "probe",
491 	[NETIF_MSG_LINK_BIT]		= "link",
492 	[NETIF_MSG_TIMER_BIT]		= "timer",
493 	[NETIF_MSG_IFDOWN_BIT]		= "ifdown",
494 	[NETIF_MSG_IFUP_BIT]		= "ifup",
495 	[NETIF_MSG_RX_ERR_BIT]		= "rx_err",
496 	[NETIF_MSG_TX_ERR_BIT]		= "tx_err",
497 	[NETIF_MSG_TX_QUEUED_BIT]	= "tx_queued",
498 	[NETIF_MSG_INTR_BIT]		= "intr",
499 	[NETIF_MSG_TX_DONE_BIT]		= "tx_done",
500 	[NETIF_MSG_RX_STATUS_BIT]	= "rx_status",
501 	[NETIF_MSG_PKTDATA_BIT]		= "pktdata",
502 	[NETIF_MSG_HW_BIT]		= "hw",
503 	[NETIF_MSG_WOL_BIT]		= "wol",
504 };
505 static_assert(ARRAY_SIZE(netif_msg_class_names) == NETIF_MSG_CLASS_COUNT);
506 
507 const char wol_mode_names[][ETH_GSTRING_LEN] = {
508 	[const_ilog2(WAKE_PHY)]		= "phy",
509 	[const_ilog2(WAKE_UCAST)]	= "ucast",
510 	[const_ilog2(WAKE_MCAST)]	= "mcast",
511 	[const_ilog2(WAKE_BCAST)]	= "bcast",
512 	[const_ilog2(WAKE_ARP)]		= "arp",
513 	[const_ilog2(WAKE_MAGIC)]	= "magic",
514 	[const_ilog2(WAKE_MAGICSECURE)]	= "magicsecure",
515 	[const_ilog2(WAKE_FILTER)]	= "filter",
516 };
517 static_assert(ARRAY_SIZE(wol_mode_names) == WOL_MODE_COUNT);
518 
519 const char sof_timestamping_names[][ETH_GSTRING_LEN] = {
520 	[const_ilog2(SOF_TIMESTAMPING_TX_HARDWARE)]  = "hardware-transmit",
521 	[const_ilog2(SOF_TIMESTAMPING_TX_SOFTWARE)]  = "software-transmit",
522 	[const_ilog2(SOF_TIMESTAMPING_RX_HARDWARE)]  = "hardware-receive",
523 	[const_ilog2(SOF_TIMESTAMPING_RX_SOFTWARE)]  = "software-receive",
524 	[const_ilog2(SOF_TIMESTAMPING_SOFTWARE)]     = "software-system-clock",
525 	[const_ilog2(SOF_TIMESTAMPING_SYS_HARDWARE)] = "hardware-legacy-clock",
526 	[const_ilog2(SOF_TIMESTAMPING_RAW_HARDWARE)] = "hardware-raw-clock",
527 	[const_ilog2(SOF_TIMESTAMPING_OPT_ID)]       = "option-id",
528 	[const_ilog2(SOF_TIMESTAMPING_TX_SCHED)]     = "sched-transmit",
529 	[const_ilog2(SOF_TIMESTAMPING_TX_ACK)]       = "ack-transmit",
530 	[const_ilog2(SOF_TIMESTAMPING_OPT_CMSG)]     = "option-cmsg",
531 	[const_ilog2(SOF_TIMESTAMPING_OPT_TSONLY)]   = "option-tsonly",
532 	[const_ilog2(SOF_TIMESTAMPING_OPT_STATS)]    = "option-stats",
533 	[const_ilog2(SOF_TIMESTAMPING_OPT_PKTINFO)]  = "option-pktinfo",
534 	[const_ilog2(SOF_TIMESTAMPING_OPT_TX_SWHW)]  = "option-tx-swhw",
535 	[const_ilog2(SOF_TIMESTAMPING_BIND_PHC)]     = "bind-phc",
536 	[const_ilog2(SOF_TIMESTAMPING_OPT_ID_TCP)]   = "option-id-tcp",
537 	[const_ilog2(SOF_TIMESTAMPING_OPT_RX_FILTER)] = "option-rx-filter",
538 	[const_ilog2(SOF_TIMESTAMPING_TX_COMPLETION)] = "tx-completion",
539 };
540 static_assert(ARRAY_SIZE(sof_timestamping_names) == __SOF_TIMESTAMPING_CNT);
541 
542 const char ts_tx_type_names[][ETH_GSTRING_LEN] = {
543 	[HWTSTAMP_TX_OFF]		= "off",
544 	[HWTSTAMP_TX_ON]		= "on",
545 	[HWTSTAMP_TX_ONESTEP_SYNC]	= "onestep-sync",
546 	[HWTSTAMP_TX_ONESTEP_P2P]	= "onestep-p2p",
547 };
548 static_assert(ARRAY_SIZE(ts_tx_type_names) == __HWTSTAMP_TX_CNT);
549 
550 const char ts_rx_filter_names[][ETH_GSTRING_LEN] = {
551 	[HWTSTAMP_FILTER_NONE]			= "none",
552 	[HWTSTAMP_FILTER_ALL]			= "all",
553 	[HWTSTAMP_FILTER_SOME]			= "some",
554 	[HWTSTAMP_FILTER_PTP_V1_L4_EVENT]	= "ptpv1-l4-event",
555 	[HWTSTAMP_FILTER_PTP_V1_L4_SYNC]	= "ptpv1-l4-sync",
556 	[HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ]	= "ptpv1-l4-delay-req",
557 	[HWTSTAMP_FILTER_PTP_V2_L4_EVENT]	= "ptpv2-l4-event",
558 	[HWTSTAMP_FILTER_PTP_V2_L4_SYNC]	= "ptpv2-l4-sync",
559 	[HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ]	= "ptpv2-l4-delay-req",
560 	[HWTSTAMP_FILTER_PTP_V2_L2_EVENT]	= "ptpv2-l2-event",
561 	[HWTSTAMP_FILTER_PTP_V2_L2_SYNC]	= "ptpv2-l2-sync",
562 	[HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ]	= "ptpv2-l2-delay-req",
563 	[HWTSTAMP_FILTER_PTP_V2_EVENT]		= "ptpv2-event",
564 	[HWTSTAMP_FILTER_PTP_V2_SYNC]		= "ptpv2-sync",
565 	[HWTSTAMP_FILTER_PTP_V2_DELAY_REQ]	= "ptpv2-delay-req",
566 	[HWTSTAMP_FILTER_NTP_ALL]		= "ntp-all",
567 };
568 static_assert(ARRAY_SIZE(ts_rx_filter_names) == __HWTSTAMP_FILTER_CNT);
569 
570 const char ts_flags_names[][ETH_GSTRING_LEN] = {
571 	[const_ilog2(HWTSTAMP_FLAG_BONDED_PHC_INDEX)] = "bonded-phc-index",
572 };
573 static_assert(ARRAY_SIZE(ts_flags_names) == __HWTSTAMP_FLAG_CNT);
574 
575 const char udp_tunnel_type_names[][ETH_GSTRING_LEN] = {
576 	[ETHTOOL_UDP_TUNNEL_TYPE_VXLAN]		= "vxlan",
577 	[ETHTOOL_UDP_TUNNEL_TYPE_GENEVE]	= "geneve",
578 	[ETHTOOL_UDP_TUNNEL_TYPE_VXLAN_GPE]	= "vxlan-gpe",
579 };
580 static_assert(ARRAY_SIZE(udp_tunnel_type_names) ==
581 	      __ETHTOOL_UDP_TUNNEL_TYPE_CNT);
582 
583 /* return false if legacy contained non-0 deprecated fields
584  * maxtxpkt/maxrxpkt. rest of ksettings always updated
585  */
586 bool
587 convert_legacy_settings_to_link_ksettings(
588 	struct ethtool_link_ksettings *link_ksettings,
589 	const struct ethtool_cmd *legacy_settings)
590 {
591 	bool retval = true;
592 
593 	memset(link_ksettings, 0, sizeof(*link_ksettings));
594 
595 	/* This is used to tell users that driver is still using these
596 	 * deprecated legacy fields, and they should not use
597 	 * %ETHTOOL_GLINKSETTINGS/%ETHTOOL_SLINKSETTINGS
598 	 */
599 	if (legacy_settings->maxtxpkt ||
600 	    legacy_settings->maxrxpkt)
601 		retval = false;
602 
603 	ethtool_convert_legacy_u32_to_link_mode(
604 		link_ksettings->link_modes.supported,
605 		legacy_settings->supported);
606 	ethtool_convert_legacy_u32_to_link_mode(
607 		link_ksettings->link_modes.advertising,
608 		legacy_settings->advertising);
609 	ethtool_convert_legacy_u32_to_link_mode(
610 		link_ksettings->link_modes.lp_advertising,
611 		legacy_settings->lp_advertising);
612 	link_ksettings->base.speed
613 		= ethtool_cmd_speed(legacy_settings);
614 	link_ksettings->base.duplex
615 		= legacy_settings->duplex;
616 	link_ksettings->base.port
617 		= legacy_settings->port;
618 	link_ksettings->base.phy_address
619 		= legacy_settings->phy_address;
620 	link_ksettings->base.autoneg
621 		= legacy_settings->autoneg;
622 	link_ksettings->base.mdio_support
623 		= legacy_settings->mdio_support;
624 	link_ksettings->base.eth_tp_mdix
625 		= legacy_settings->eth_tp_mdix;
626 	link_ksettings->base.eth_tp_mdix_ctrl
627 		= legacy_settings->eth_tp_mdix_ctrl;
628 	return retval;
629 }
630 
631 int __ethtool_get_link(struct net_device *dev)
632 {
633 	if (!dev->ethtool_ops->get_link)
634 		return -EOPNOTSUPP;
635 
636 	return netif_running(dev) && dev->ethtool_ops->get_link(dev);
637 }
638 
639 int ethtool_get_rx_ring_count(struct net_device *dev)
640 {
641 	const struct ethtool_ops *ops = dev->ethtool_ops;
642 
643 	if (!ops->get_rx_ring_count)
644 		return -EOPNOTSUPP;
645 
646 	return ops->get_rx_ring_count(dev);
647 }
648 
649 static int ethtool_get_rxnfc_rule_count(struct net_device *dev)
650 {
651 	const struct ethtool_ops *ops = dev->ethtool_ops;
652 	struct ethtool_rxnfc info = {
653 		.cmd = ETHTOOL_GRXCLSRLCNT,
654 	};
655 	int err;
656 
657 	err = ops->get_rxnfc(dev, &info, NULL);
658 	if (err)
659 		return err;
660 
661 	return info.rule_cnt;
662 }
663 
664 /* Max offset for one RSS context */
665 static u32 ethtool_get_rss_ctx_max_channel(struct ethtool_rxfh_context *ctx)
666 {
667 	u32 max_ring = 0;
668 	u32 i, *tbl;
669 
670 	if (WARN_ON_ONCE(!ctx))
671 		return 0;
672 	tbl = ethtool_rxfh_context_indir(ctx);
673 	for (i = 0; i < ctx->indir_size; i++)
674 		max_ring = max(max_ring, tbl[i]);
675 	return max_ring;
676 }
677 
678 static int ethtool_get_max_rxnfc_channel(struct net_device *dev, u64 *max)
679 {
680 	const struct ethtool_ops *ops = dev->ethtool_ops;
681 	struct ethtool_rxnfc *info;
682 	int err, i, rule_cnt;
683 	u64 max_ring = 0;
684 
685 	if (!ops->get_rxnfc)
686 		return -EOPNOTSUPP;
687 
688 	rule_cnt = ethtool_get_rxnfc_rule_count(dev);
689 	if (rule_cnt <= 0)
690 		return -EINVAL;
691 
692 	info = kvzalloc_flex(*info, rule_locs, rule_cnt);
693 	if (!info)
694 		return -ENOMEM;
695 
696 	info->cmd = ETHTOOL_GRXCLSRLALL;
697 	info->rule_cnt = rule_cnt;
698 	err = ops->get_rxnfc(dev, info, info->rule_locs);
699 	if (err)
700 		goto err_free_info;
701 
702 	for (i = 0; i < rule_cnt; i++) {
703 		struct ethtool_rxnfc rule_info = {
704 			.cmd = ETHTOOL_GRXCLSRULE,
705 			.fs.location = info->rule_locs[i],
706 		};
707 
708 		err = ops->get_rxnfc(dev, &rule_info, NULL);
709 		if (err)
710 			goto err_free_info;
711 
712 		if (rule_info.fs.ring_cookie != RX_CLS_FLOW_DISC &&
713 		    rule_info.fs.ring_cookie != RX_CLS_FLOW_WAKE &&
714 		    !ethtool_get_flow_spec_ring_vf(rule_info.fs.ring_cookie)) {
715 			u64 ring = rule_info.fs.ring_cookie;
716 
717 			if (rule_info.flow_type & FLOW_RSS) {
718 				struct ethtool_rxfh_context *ctx;
719 
720 				ctx = xa_load(&dev->ethtool->rss_ctx,
721 					      rule_info.rss_context);
722 				ring += ethtool_get_rss_ctx_max_channel(ctx);
723 			}
724 			max_ring = max_t(u64, max_ring, ring);
725 		}
726 	}
727 
728 	kvfree(info);
729 	*max = max_ring;
730 	return 0;
731 
732 err_free_info:
733 	kvfree(info);
734 	return err;
735 }
736 
737 /* Max offset across all of a device's RSS contexts */
738 static u32 ethtool_get_max_rss_ctx_channel(struct net_device *dev)
739 {
740 	struct ethtool_rxfh_context *ctx;
741 	unsigned long context;
742 	u32 max_ring = 0;
743 
744 	mutex_lock(&dev->ethtool->rss_lock);
745 	xa_for_each(&dev->ethtool->rss_ctx, context, ctx)
746 		max_ring = max(max_ring, ethtool_get_rss_ctx_max_channel(ctx));
747 	mutex_unlock(&dev->ethtool->rss_lock);
748 
749 	return max_ring;
750 }
751 
752 static u32 ethtool_get_max_rxfh_channel(struct net_device *dev)
753 {
754 	struct ethtool_rxfh_param rxfh = {};
755 	u32 dev_size, current_max = 0;
756 	int ret;
757 
758 	/* While we do track whether RSS context has an indirection
759 	 * table explicitly set by the user, no driver looks at that bit.
760 	 * Assume drivers won't auto-regenerate the additional tables,
761 	 * to be safe.
762 	 */
763 	current_max = ethtool_get_max_rss_ctx_channel(dev);
764 
765 	if (!netif_is_rxfh_configured(dev))
766 		return current_max;
767 
768 	if (!dev->ethtool_ops->get_rxfh_indir_size ||
769 	    !dev->ethtool_ops->get_rxfh)
770 		return current_max;
771 	dev_size = dev->ethtool_ops->get_rxfh_indir_size(dev);
772 	if (dev_size == 0)
773 		return current_max;
774 
775 	rxfh.indir = kzalloc_objs(rxfh.indir[0], dev_size, GFP_USER);
776 	if (!rxfh.indir)
777 		return U32_MAX;
778 
779 	mutex_lock(&dev->ethtool->rss_lock);
780 	ret = dev->ethtool_ops->get_rxfh(dev, &rxfh);
781 	mutex_unlock(&dev->ethtool->rss_lock);
782 	if (ret) {
783 		current_max = U32_MAX;
784 		goto out_free;
785 	}
786 
787 	while (dev_size--)
788 		current_max = max(current_max, rxfh.indir[dev_size]);
789 
790 out_free:
791 	kfree(rxfh.indir);
792 	return current_max;
793 }
794 
795 int ethtool_check_max_channel(struct net_device *dev,
796 			      struct ethtool_channels channels,
797 			      struct genl_info *info)
798 {
799 	u64 max_rxnfc_in_use;
800 	u32 max_rxfh_in_use;
801 	int max_mp_in_use;
802 
803 	/* ensure the new Rx count fits within the configured Rx flow
804 	 * indirection table/rxnfc settings
805 	 */
806 	if (ethtool_get_max_rxnfc_channel(dev, &max_rxnfc_in_use))
807 		max_rxnfc_in_use = 0;
808 	max_rxfh_in_use = ethtool_get_max_rxfh_channel(dev);
809 	if (channels.combined_count + channels.rx_count <= max_rxfh_in_use) {
810 		if (info)
811 			GENL_SET_ERR_MSG_FMT(info, "requested channel counts are too low for existing indirection table (%d)", max_rxfh_in_use);
812 		return -EINVAL;
813 	}
814 	if (channels.combined_count + channels.rx_count <= max_rxnfc_in_use) {
815 		if (info)
816 			GENL_SET_ERR_MSG(info, "requested channel counts are too low for existing ntuple filter settings");
817 		return -EINVAL;
818 	}
819 
820 	max_mp_in_use = dev_get_min_mp_channel_count(dev);
821 	if (channels.combined_count + channels.rx_count <= max_mp_in_use) {
822 		if (info)
823 			GENL_SET_ERR_MSG_FMT(info, "requested channel counts are too low for existing memory provider setting (%d)", max_mp_in_use);
824 		return -EINVAL;
825 	}
826 
827 	return 0;
828 }
829 
830 int ethtool_check_rss_ctx_busy(struct net_device *dev, u32 rss_context)
831 {
832 	const struct ethtool_ops *ops = dev->ethtool_ops;
833 	struct ethtool_rxnfc *info;
834 	int rc, i, rule_cnt;
835 
836 	if (!ops->get_rxnfc)
837 		return 0;
838 
839 	rule_cnt = ethtool_get_rxnfc_rule_count(dev);
840 	if (!rule_cnt)
841 		return 0;
842 
843 	if (rule_cnt < 0)
844 		return -EINVAL;
845 
846 	info = kvzalloc_flex(*info, rule_locs, rule_cnt);
847 	if (!info)
848 		return -ENOMEM;
849 
850 	info->cmd = ETHTOOL_GRXCLSRLALL;
851 	info->rule_cnt = rule_cnt;
852 	rc = ops->get_rxnfc(dev, info, info->rule_locs);
853 	if (rc)
854 		goto out_free;
855 
856 	for (i = 0; i < rule_cnt; i++) {
857 		struct ethtool_rxnfc rule_info = {
858 			.cmd = ETHTOOL_GRXCLSRULE,
859 			.fs.location = info->rule_locs[i],
860 		};
861 
862 		rc = ops->get_rxnfc(dev, &rule_info, NULL);
863 		if (rc)
864 			goto out_free;
865 
866 		if (rule_info.fs.flow_type & FLOW_RSS &&
867 		    rule_info.rss_context == rss_context) {
868 			rc = -EBUSY;
869 			goto out_free;
870 		}
871 	}
872 
873 out_free:
874 	kvfree(info);
875 	return rc;
876 }
877 
878 struct ethtool_rxfh_context *
879 ethtool_rxfh_ctx_alloc(const struct ethtool_ops *ops,
880 		       u32 indir_size, u32 key_size)
881 {
882 	size_t indir_bytes, flex_len, key_off, size;
883 	struct ethtool_rxfh_context *ctx;
884 	u32 priv_bytes, indir_max;
885 	u16 key_max;
886 
887 	key_max = max(key_size, ops->rxfh_key_space);
888 	indir_max = max(indir_size, ops->rxfh_indir_space);
889 
890 	priv_bytes = ALIGN(ops->rxfh_priv_size, sizeof(u32));
891 	indir_bytes = array_size(indir_max, sizeof(u32));
892 
893 	key_off = size_add(priv_bytes, indir_bytes);
894 	flex_len = size_add(key_off, key_max);
895 	size = struct_size_t(struct ethtool_rxfh_context, data, flex_len);
896 
897 	ctx = kzalloc(size, GFP_KERNEL_ACCOUNT);
898 	if (!ctx)
899 		return NULL;
900 
901 	ctx->indir_size = indir_size;
902 	ctx->key_size = key_size;
903 	ctx->key_off = key_off;
904 	ctx->priv_size = ops->rxfh_priv_size;
905 
906 	return ctx;
907 }
908 
909 /* Check if fields configured for flow hash are symmetric - if src is included
910  * so is dst and vice versa.
911  */
912 int ethtool_rxfh_config_is_sym(u64 rxfh)
913 {
914 	bool sym;
915 
916 	sym = rxfh == (rxfh & (RXH_IP_SRC | RXH_IP_DST |
917 			       RXH_L4_B_0_1 | RXH_L4_B_2_3));
918 	sym &= !!(rxfh & RXH_IP_SRC)   == !!(rxfh & RXH_IP_DST);
919 	sym &= !!(rxfh & RXH_L4_B_0_1) == !!(rxfh & RXH_L4_B_2_3);
920 
921 	return sym;
922 }
923 
924 int ethtool_check_ops(const struct ethtool_ops *ops)
925 {
926 	if (WARN_ON(ops->set_coalesce && !ops->supported_coalesce_params))
927 		return -EINVAL;
928 	if (WARN_ON(ops->rxfh_max_num_contexts == 1))
929 		return -EINVAL;
930 	if (WARN_ON(ops->supported_input_xfrm && !ops->get_rxfh_fields))
931 		return -EINVAL;
932 	if (WARN_ON(ops->supported_input_xfrm &&
933 		    ops->rxfh_per_ctx_fields != ops->rxfh_per_ctx_key))
934 		return -EINVAL;
935 
936 	/* NOTE: sufficiently insane drivers may swap ethtool_ops at runtime,
937 	 * the fact that ops are checked at registration time does not
938 	 * mean the ops attached to a netdev later on are sane.
939 	 */
940 	return 0;
941 }
942 
943 void ethtool_ringparam_get_cfg(struct net_device *dev,
944 			       struct ethtool_ringparam *param,
945 			       struct kernel_ethtool_ringparam *kparam,
946 			       struct netlink_ext_ack *extack)
947 {
948 	memset(param, 0, sizeof(*param));
949 	memset(kparam, 0, sizeof(*kparam));
950 
951 	param->cmd = ETHTOOL_GRINGPARAM;
952 	dev->ethtool_ops->get_ringparam(dev, param, kparam, extack);
953 
954 	/* Driver gives us current state, we want to return current config */
955 	kparam->tcp_data_split = dev->cfg->hds_config;
956 	kparam->hds_thresh = dev->cfg->hds_thresh;
957 }
958 
959 static void ethtool_init_tsinfo(struct kernel_ethtool_ts_info *info)
960 {
961 	memset(info, 0, sizeof(*info));
962 	info->cmd = ETHTOOL_GET_TS_INFO;
963 	info->phc_index = -1;
964 }
965 
966 int ethtool_net_get_ts_info_by_phc(struct net_device *dev,
967 				   struct kernel_ethtool_ts_info *info,
968 				   struct hwtstamp_provider_desc *hwprov_desc)
969 {
970 	const struct ethtool_ops *ops = dev->ethtool_ops;
971 	int err;
972 
973 	if (!ops->get_ts_info)
974 		return -EOPNOTSUPP;
975 
976 	/* Does ptp comes from netdev */
977 	ethtool_init_tsinfo(info);
978 	info->phc_qualifier = hwprov_desc->qualifier;
979 	err = ops->get_ts_info(dev, info);
980 	if (err)
981 		return err;
982 
983 	if (info->phc_index == hwprov_desc->index &&
984 	    net_support_hwtstamp_qualifier(dev, hwprov_desc->qualifier))
985 		return 0;
986 
987 	return -ENODEV;
988 }
989 
990 struct phy_device *
991 ethtool_phy_get_ts_info_by_phc(struct net_device *dev,
992 			       struct kernel_ethtool_ts_info *info,
993 			       struct hwtstamp_provider_desc *hwprov_desc)
994 {
995 	int err;
996 
997 	/* Only precise qualifier is supported in phydev */
998 	if (hwprov_desc->qualifier != HWTSTAMP_PROVIDER_QUALIFIER_PRECISE)
999 		return ERR_PTR(-ENODEV);
1000 
1001 	/* Look in the phy topology */
1002 	if (dev->link_topo) {
1003 		struct phy_device_node *pdn;
1004 		unsigned long phy_index;
1005 
1006 		xa_for_each(&dev->link_topo->phys, phy_index, pdn) {
1007 			if (!phy_has_tsinfo(pdn->phy))
1008 				continue;
1009 
1010 			ethtool_init_tsinfo(info);
1011 			err = phy_ts_info(pdn->phy, info);
1012 			if (err)
1013 				return ERR_PTR(err);
1014 
1015 			if (info->phc_index == hwprov_desc->index)
1016 				return pdn->phy;
1017 		}
1018 		return ERR_PTR(-ENODEV);
1019 	}
1020 
1021 	/* Look on the dev->phydev */
1022 	if (phy_has_tsinfo(dev->phydev)) {
1023 		ethtool_init_tsinfo(info);
1024 		err = phy_ts_info(dev->phydev, info);
1025 		if (err)
1026 			return ERR_PTR(err);
1027 
1028 		if (info->phc_index == hwprov_desc->index)
1029 			return dev->phydev;
1030 	}
1031 
1032 	return ERR_PTR(-ENODEV);
1033 }
1034 
1035 int ethtool_get_ts_info_by_phc(struct net_device *dev,
1036 			       struct kernel_ethtool_ts_info *info,
1037 			       struct hwtstamp_provider_desc *hwprov_desc)
1038 {
1039 	int err;
1040 
1041 	err = ethtool_net_get_ts_info_by_phc(dev, info, hwprov_desc);
1042 	if (err == -ENODEV || err == -EOPNOTSUPP) {
1043 		struct phy_device *phy;
1044 
1045 		phy = ethtool_phy_get_ts_info_by_phc(dev, info, hwprov_desc);
1046 		if (IS_ERR(phy))
1047 			return PTR_ERR(phy);
1048 
1049 		/* Report the phc source only if we have a real
1050 		 * phc source with an index.
1051 		 */
1052 		if (info->phc_index >= 0) {
1053 			info->phc_source = HWTSTAMP_SOURCE_PHYLIB;
1054 			info->phc_phyindex = phy->phyindex;
1055 		}
1056 		err = 0;
1057 	} else if (!err && info->phc_index >= 0) {
1058 		info->phc_source = HWTSTAMP_SOURCE_NETDEV;
1059 	}
1060 
1061 	info->so_timestamping |= SOF_TIMESTAMPING_RX_SOFTWARE |
1062 				 SOF_TIMESTAMPING_SOFTWARE;
1063 
1064 	return err;
1065 }
1066 
1067 int __ethtool_get_ts_info(struct net_device *dev,
1068 			  struct kernel_ethtool_ts_info *info)
1069 {
1070 	struct hwtstamp_provider *hwprov;
1071 	int err = 0;
1072 
1073 	rcu_read_lock();
1074 	hwprov = rcu_dereference(dev->hwprov);
1075 	/* No provider specified, use default behavior */
1076 	if (!hwprov) {
1077 		const struct ethtool_ops *ops = dev->ethtool_ops;
1078 		struct phy_device *phydev = dev->phydev;
1079 
1080 		ethtool_init_tsinfo(info);
1081 		if (phy_is_default_hwtstamp(phydev) &&
1082 		    phy_has_tsinfo(phydev)) {
1083 			err = phy_ts_info(phydev, info);
1084 			/* Report the phc source only if we have a real
1085 			 * phc source with an index.
1086 			 */
1087 			if (!err && info->phc_index >= 0) {
1088 				info->phc_source = HWTSTAMP_SOURCE_PHYLIB;
1089 				info->phc_phyindex = phydev->phyindex;
1090 			}
1091 		} else if (ops->get_ts_info) {
1092 			err = ops->get_ts_info(dev, info);
1093 			if (!err && info->phc_index >= 0)
1094 				info->phc_source = HWTSTAMP_SOURCE_NETDEV;
1095 		}
1096 
1097 		info->so_timestamping |= SOF_TIMESTAMPING_RX_SOFTWARE |
1098 					 SOF_TIMESTAMPING_SOFTWARE;
1099 
1100 		rcu_read_unlock();
1101 		return err;
1102 	}
1103 
1104 	err = ethtool_get_ts_info_by_phc(dev, info, &hwprov->desc);
1105 	rcu_read_unlock();
1106 	return err;
1107 }
1108 
1109 bool net_support_hwtstamp_qualifier(struct net_device *dev,
1110 				    enum hwtstamp_provider_qualifier qualifier)
1111 {
1112 	const struct ethtool_ops *ops = dev->ethtool_ops;
1113 
1114 	if (!ops)
1115 		return false;
1116 
1117 	/* Return true with precise qualifier and with NIC without
1118 	 * qualifier description to not break the old behavior.
1119 	 */
1120 	if (!ops->supported_hwtstamp_qualifiers &&
1121 	    qualifier == HWTSTAMP_PROVIDER_QUALIFIER_PRECISE)
1122 		return true;
1123 
1124 	if (ops->supported_hwtstamp_qualifiers & BIT(qualifier))
1125 		return true;
1126 
1127 	return false;
1128 }
1129 
1130 int ethtool_get_phc_vclocks(struct net_device *dev, int **vclock_index)
1131 {
1132 	struct kernel_ethtool_ts_info info = { };
1133 	int num = 0;
1134 
1135 	if (!__ethtool_get_ts_info(dev, &info))
1136 		num = ptp_get_vclocks_index(info.phc_index, vclock_index);
1137 
1138 	return num;
1139 }
1140 EXPORT_SYMBOL(ethtool_get_phc_vclocks);
1141 
1142 int ethtool_get_ts_info_by_layer(struct net_device *dev, struct kernel_ethtool_ts_info *info)
1143 {
1144 	return __ethtool_get_ts_info(dev, info);
1145 }
1146 EXPORT_SYMBOL(ethtool_get_ts_info_by_layer);
1147 
1148 const struct ethtool_phy_ops *ethtool_phy_ops;
1149 
1150 void ethtool_set_ethtool_phy_ops(const struct ethtool_phy_ops *ops)
1151 {
1152 	ASSERT_RTNL();
1153 	ethtool_phy_ops = ops;
1154 }
1155 EXPORT_SYMBOL_GPL(ethtool_set_ethtool_phy_ops);
1156 
1157 void
1158 ethtool_params_from_link_mode(struct ethtool_link_ksettings *link_ksettings,
1159 			      enum ethtool_link_mode_bit_indices link_mode)
1160 {
1161 	const struct link_mode_info *link_info;
1162 
1163 	if (WARN_ON_ONCE(link_mode >= __ETHTOOL_LINK_MODE_MASK_NBITS))
1164 		return;
1165 
1166 	link_info = &link_mode_params[link_mode];
1167 	link_ksettings->base.speed = link_info->speed;
1168 	link_ksettings->lanes = link_info->lanes;
1169 	link_ksettings->base.duplex = link_info->duplex;
1170 }
1171 EXPORT_SYMBOL_GPL(ethtool_params_from_link_mode);
1172 
1173 /**
1174  * ethtool_forced_speed_maps_init
1175  * @maps: Pointer to an array of Ethtool forced speed map
1176  * @size: Array size
1177  *
1178  * Initialize an array of Ethtool forced speed map to Ethtool link modes. This
1179  * should be called during driver module init.
1180  */
1181 void
1182 ethtool_forced_speed_maps_init(struct ethtool_forced_speed_map *maps, u32 size)
1183 {
1184 	for (u32 i = 0; i < size; i++) {
1185 		struct ethtool_forced_speed_map *map = &maps[i];
1186 
1187 		linkmode_set_bit_array(map->cap_arr, map->arr_size, map->caps);
1188 		map->cap_arr = NULL;
1189 		map->arr_size = 0;
1190 	}
1191 }
1192 EXPORT_SYMBOL_GPL(ethtool_forced_speed_maps_init);
1193 
1194 void ethtool_rxfh_context_lost(struct net_device *dev, u32 context_id)
1195 {
1196 	struct ethtool_rxfh_context *ctx;
1197 
1198 	WARN_ONCE(!rtnl_is_locked() &&
1199 		  !lockdep_is_held_type(&dev->ethtool->rss_lock, -1),
1200 		  "RSS context lock assertion failed\n");
1201 
1202 	netdev_err(dev, "device error, RSS context %d lost\n", context_id);
1203 	ctx = xa_erase(&dev->ethtool->rss_ctx, context_id);
1204 	kfree(ctx);
1205 	ethtool_rss_notify(dev, ETHTOOL_MSG_RSS_DELETE_NTF, context_id);
1206 }
1207 EXPORT_SYMBOL(ethtool_rxfh_context_lost);
1208 
1209 bool netif_is_rxfh_configured(const struct net_device *dev)
1210 {
1211 	return dev->ethtool->rss_indir_user_size;
1212 }
1213 EXPORT_SYMBOL(netif_is_rxfh_configured);
1214 
1215 /**
1216  * ethtool_rxfh_indir_lost - Notify core that the RSS indirection table was lost
1217  * @dev: network device
1218  *
1219  * Drivers should call this when the device can no longer maintain the
1220  * user-configured indirection table, typically after a HW fault recovery
1221  * that reduced the maximum queue count. Marks the default RSS context
1222  * indirection table as unconfigured and sends an %ETHTOOL_MSG_RSS_NTF
1223  * notification.
1224  */
1225 void ethtool_rxfh_indir_lost(struct net_device *dev)
1226 {
1227 	WARN_ONCE(!rtnl_is_locked() &&
1228 		  !lockdep_is_held_type(&dev->ethtool->rss_lock, -1),
1229 		  "RSS context lock assertion failed\n");
1230 
1231 	netdev_err(dev, "device error, RSS indirection table lost\n");
1232 	dev->ethtool->rss_indir_user_size = 0;
1233 	ethtool_rss_notify(dev, ETHTOOL_MSG_RSS_NTF, 0);
1234 }
1235 EXPORT_SYMBOL(ethtool_rxfh_indir_lost);
1236 
1237 static bool ethtool_rxfh_is_periodic(const u32 *tbl, u32 old_size, u32 new_size)
1238 {
1239 	u32 i;
1240 
1241 	for (i = new_size; i < old_size; i++)
1242 		if (tbl[i] != tbl[i % new_size])
1243 			return false;
1244 	return true;
1245 }
1246 
1247 static bool ethtool_rxfh_can_resize(const u32 *tbl, u32 old_size, u32 new_size,
1248 				    u32 user_size)
1249 {
1250 	if (new_size == old_size)
1251 		return true;
1252 
1253 	if (!user_size)
1254 		return true;
1255 
1256 	if (new_size < old_size) {
1257 		if (new_size < user_size)
1258 			return false;
1259 		if (old_size % new_size)
1260 			return false;
1261 		if (!ethtool_rxfh_is_periodic(tbl, old_size, new_size))
1262 			return false;
1263 		return true;
1264 	}
1265 
1266 	if (new_size % old_size)
1267 		return false;
1268 	return true;
1269 }
1270 
1271 /* Resize without validation; caller must have called can_resize first */
1272 static void ethtool_rxfh_resize(u32 *tbl, u32 old_size, u32 new_size)
1273 {
1274 	u32 i;
1275 
1276 	/* Grow: replicate existing pattern; shrink is a no-op on the data */
1277 	for (i = old_size; i < new_size; i++)
1278 		tbl[i] = tbl[i % old_size];
1279 }
1280 
1281 /**
1282  * ethtool_rxfh_indir_can_resize - Check if context 0 indir table can resize
1283  * @dev: network device
1284  * @tbl: indirection table
1285  * @old_size: current number of entries in the table
1286  * @new_size: desired number of entries
1287  *
1288  * Validate that @tbl can be resized from @old_size to @new_size without
1289  * data loss. Uses the user_size floor from context 0. When user_size is
1290  * zero the table is not user-configured and resize always succeeds.
1291  * Read-only; does not modify the table.
1292  *
1293  * Return: true if resize is possible, false otherwise.
1294  */
1295 bool ethtool_rxfh_indir_can_resize(struct net_device *dev, const u32 *tbl,
1296 				   u32 old_size, u32 new_size)
1297 {
1298 	return ethtool_rxfh_can_resize(tbl, old_size, new_size,
1299 				       dev->ethtool->rss_indir_user_size);
1300 }
1301 EXPORT_SYMBOL(ethtool_rxfh_indir_can_resize);
1302 
1303 /**
1304  * ethtool_rxfh_indir_resize - Fold or unfold context 0 indirection table
1305  * @dev: network device
1306  * @tbl: indirection table (must have room for max(old_size, new_size) entries)
1307  * @old_size: current number of entries in the table
1308  * @new_size: desired number of entries
1309  *
1310  * Resize the default RSS context indirection table in place. Caller
1311  * must have validated with ethtool_rxfh_indir_can_resize() first.
1312  */
1313 void ethtool_rxfh_indir_resize(struct net_device *dev, u32 *tbl,
1314 			       u32 old_size, u32 new_size)
1315 {
1316 	if (!dev->ethtool->rss_indir_user_size)
1317 		return;
1318 
1319 	ethtool_rxfh_resize(tbl, old_size, new_size);
1320 }
1321 EXPORT_SYMBOL(ethtool_rxfh_indir_resize);
1322 
1323 /**
1324  * ethtool_rxfh_ctxs_can_resize - Validate resize for all RSS contexts
1325  * @dev: network device
1326  * @new_indir_size: new indirection table size
1327  *
1328  * Validate that the indirection tables of all non-default RSS contexts
1329  * can be resized to @new_indir_size. Read-only; does not modify any
1330  * context. Intended to be paired with ethtool_rxfh_ctxs_resize().
1331  *
1332  * Return: 0 if all contexts can be resized, negative errno on failure.
1333  */
1334 int ethtool_rxfh_ctxs_can_resize(struct net_device *dev, u32 new_indir_size)
1335 {
1336 	struct ethtool_rxfh_context *ctx;
1337 	unsigned long context;
1338 	int ret = 0;
1339 
1340 	if (!dev->ethtool_ops->rxfh_indir_space ||
1341 	    new_indir_size > dev->ethtool_ops->rxfh_indir_space)
1342 		return -EINVAL;
1343 
1344 	mutex_lock(&dev->ethtool->rss_lock);
1345 	xa_for_each(&dev->ethtool->rss_ctx, context, ctx) {
1346 		u32 *indir = ethtool_rxfh_context_indir(ctx);
1347 
1348 		if (!ethtool_rxfh_can_resize(indir, ctx->indir_size,
1349 					     new_indir_size,
1350 					     ctx->indir_user_size)) {
1351 			ret = -EINVAL;
1352 			goto unlock;
1353 		}
1354 	}
1355 unlock:
1356 	mutex_unlock(&dev->ethtool->rss_lock);
1357 	return ret;
1358 }
1359 EXPORT_SYMBOL(ethtool_rxfh_ctxs_can_resize);
1360 
1361 /**
1362  * ethtool_rxfh_ctxs_resize - Resize all RSS context indirection tables
1363  * @dev: network device
1364  * @new_indir_size: new indirection table size
1365  *
1366  * Resize the indirection table of every non-default RSS context to
1367  * @new_indir_size. Caller must have validated with
1368  * ethtool_rxfh_ctxs_can_resize() first. An %ETHTOOL_MSG_RSS_NTF is
1369  * sent for each resized context.
1370  *
1371  * Notifications are sent outside the RSS lock to avoid holding the
1372  * mutex during notification delivery.
1373  */
1374 void ethtool_rxfh_ctxs_resize(struct net_device *dev, u32 new_indir_size)
1375 {
1376 	struct ethtool_rxfh_context *ctx;
1377 	unsigned long context;
1378 
1379 	mutex_lock(&dev->ethtool->rss_lock);
1380 	xa_for_each(&dev->ethtool->rss_ctx, context, ctx) {
1381 		ethtool_rxfh_resize(ethtool_rxfh_context_indir(ctx),
1382 				    ctx->indir_size, new_indir_size);
1383 		ctx->indir_size = new_indir_size;
1384 	}
1385 	mutex_unlock(&dev->ethtool->rss_lock);
1386 
1387 	xa_for_each(&dev->ethtool->rss_ctx, context, ctx)
1388 		ethtool_rss_notify(dev, ETHTOOL_MSG_RSS_NTF, context);
1389 }
1390 EXPORT_SYMBOL(ethtool_rxfh_ctxs_resize);
1391 
1392 enum ethtool_link_medium ethtool_str_to_medium(const char *str)
1393 {
1394 	int i;
1395 
1396 	for (i = 0; i < __ETHTOOL_LINK_MEDIUM_LAST; i++)
1397 		if (!strcmp(ethtool_link_medium_names[i], str))
1398 			return i;
1399 
1400 	return ETHTOOL_LINK_MEDIUM_NONE;
1401 }
1402 EXPORT_SYMBOL_GPL(ethtool_str_to_medium);
1403