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 | |
9 | #include "common.h" |
10 | |
11 | const char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN] = { |
12 | [NETIF_F_SG_BIT] = "tx-scatter-gather" , |
13 | [NETIF_F_IP_CSUM_BIT] = "tx-checksum-ipv4" , |
14 | [NETIF_F_HW_CSUM_BIT] = "tx-checksum-ip-generic" , |
15 | [NETIF_F_IPV6_CSUM_BIT] = "tx-checksum-ipv6" , |
16 | [NETIF_F_HIGHDMA_BIT] = "highdma" , |
17 | [NETIF_F_FRAGLIST_BIT] = "tx-scatter-gather-fraglist" , |
18 | [NETIF_F_HW_VLAN_CTAG_TX_BIT] = "tx-vlan-hw-insert" , |
19 | |
20 | [NETIF_F_HW_VLAN_CTAG_RX_BIT] = "rx-vlan-hw-parse" , |
21 | [NETIF_F_HW_VLAN_CTAG_FILTER_BIT] = "rx-vlan-filter" , |
22 | [NETIF_F_HW_VLAN_STAG_TX_BIT] = "tx-vlan-stag-hw-insert" , |
23 | [NETIF_F_HW_VLAN_STAG_RX_BIT] = "rx-vlan-stag-hw-parse" , |
24 | [NETIF_F_HW_VLAN_STAG_FILTER_BIT] = "rx-vlan-stag-filter" , |
25 | [NETIF_F_VLAN_CHALLENGED_BIT] = "vlan-challenged" , |
26 | [NETIF_F_GSO_BIT] = "tx-generic-segmentation" , |
27 | [NETIF_F_LLTX_BIT] = "tx-lockless" , |
28 | [NETIF_F_NETNS_LOCAL_BIT] = "netns-local" , |
29 | [NETIF_F_GRO_BIT] = "rx-gro" , |
30 | [NETIF_F_GRO_HW_BIT] = "rx-gro-hw" , |
31 | [NETIF_F_LRO_BIT] = "rx-lro" , |
32 | |
33 | [NETIF_F_TSO_BIT] = "tx-tcp-segmentation" , |
34 | [NETIF_F_GSO_ROBUST_BIT] = "tx-gso-robust" , |
35 | [NETIF_F_TSO_ECN_BIT] = "tx-tcp-ecn-segmentation" , |
36 | [NETIF_F_TSO_MANGLEID_BIT] = "tx-tcp-mangleid-segmentation" , |
37 | [NETIF_F_TSO6_BIT] = "tx-tcp6-segmentation" , |
38 | [NETIF_F_FSO_BIT] = "tx-fcoe-segmentation" , |
39 | [NETIF_F_GSO_GRE_BIT] = "tx-gre-segmentation" , |
40 | [NETIF_F_GSO_GRE_CSUM_BIT] = "tx-gre-csum-segmentation" , |
41 | [NETIF_F_GSO_IPXIP4_BIT] = "tx-ipxip4-segmentation" , |
42 | [NETIF_F_GSO_IPXIP6_BIT] = "tx-ipxip6-segmentation" , |
43 | [NETIF_F_GSO_UDP_TUNNEL_BIT] = "tx-udp_tnl-segmentation" , |
44 | [NETIF_F_GSO_UDP_TUNNEL_CSUM_BIT] = "tx-udp_tnl-csum-segmentation" , |
45 | [NETIF_F_GSO_PARTIAL_BIT] = "tx-gso-partial" , |
46 | [NETIF_F_GSO_TUNNEL_REMCSUM_BIT] = "tx-tunnel-remcsum-segmentation" , |
47 | [NETIF_F_GSO_SCTP_BIT] = "tx-sctp-segmentation" , |
48 | [NETIF_F_GSO_ESP_BIT] = "tx-esp-segmentation" , |
49 | [NETIF_F_GSO_UDP_L4_BIT] = "tx-udp-segmentation" , |
50 | [NETIF_F_GSO_FRAGLIST_BIT] = "tx-gso-list" , |
51 | |
52 | [NETIF_F_FCOE_CRC_BIT] = "tx-checksum-fcoe-crc" , |
53 | [NETIF_F_SCTP_CRC_BIT] = "tx-checksum-sctp" , |
54 | [NETIF_F_FCOE_MTU_BIT] = "fcoe-mtu" , |
55 | [NETIF_F_NTUPLE_BIT] = "rx-ntuple-filter" , |
56 | [NETIF_F_RXHASH_BIT] = "rx-hashing" , |
57 | [NETIF_F_RXCSUM_BIT] = "rx-checksum" , |
58 | [NETIF_F_NOCACHE_COPY_BIT] = "tx-nocache-copy" , |
59 | [NETIF_F_LOOPBACK_BIT] = "loopback" , |
60 | [NETIF_F_RXFCS_BIT] = "rx-fcs" , |
61 | [NETIF_F_RXALL_BIT] = "rx-all" , |
62 | [NETIF_F_HW_L2FW_DOFFLOAD_BIT] = "l2-fwd-offload" , |
63 | [NETIF_F_HW_TC_BIT] = "hw-tc-offload" , |
64 | [NETIF_F_HW_ESP_BIT] = "esp-hw-offload" , |
65 | [NETIF_F_HW_ESP_TX_CSUM_BIT] = "esp-tx-csum-hw-offload" , |
66 | [NETIF_F_RX_UDP_TUNNEL_PORT_BIT] = "rx-udp_tunnel-port-offload" , |
67 | [NETIF_F_HW_TLS_RECORD_BIT] = "tls-hw-record" , |
68 | [NETIF_F_HW_TLS_TX_BIT] = "tls-hw-tx-offload" , |
69 | [NETIF_F_HW_TLS_RX_BIT] = "tls-hw-rx-offload" , |
70 | [NETIF_F_GRO_FRAGLIST_BIT] = "rx-gro-list" , |
71 | [NETIF_F_HW_MACSEC_BIT] = "macsec-hw-offload" , |
72 | [NETIF_F_GRO_UDP_FWD_BIT] = "rx-udp-gro-forwarding" , |
73 | [NETIF_F_HW_HSR_TAG_INS_BIT] = "hsr-tag-ins-offload" , |
74 | [NETIF_F_HW_HSR_TAG_RM_BIT] = "hsr-tag-rm-offload" , |
75 | [NETIF_F_HW_HSR_FWD_BIT] = "hsr-fwd-offload" , |
76 | [NETIF_F_HW_HSR_DUP_BIT] = "hsr-dup-offload" , |
77 | }; |
78 | |
79 | const char |
80 | [ETH_RSS_HASH_FUNCS_COUNT][ETH_GSTRING_LEN] = { |
81 | [ETH_RSS_HASH_TOP_BIT] = "toeplitz" , |
82 | [ETH_RSS_HASH_XOR_BIT] = "xor" , |
83 | [ETH_RSS_HASH_CRC32_BIT] = "crc32" , |
84 | }; |
85 | |
86 | const char |
87 | tunable_strings[__ETHTOOL_TUNABLE_COUNT][ETH_GSTRING_LEN] = { |
88 | [ETHTOOL_ID_UNSPEC] = "Unspec" , |
89 | [ETHTOOL_RX_COPYBREAK] = "rx-copybreak" , |
90 | [ETHTOOL_TX_COPYBREAK] = "tx-copybreak" , |
91 | [ETHTOOL_PFC_PREVENTION_TOUT] = "pfc-prevention-tout" , |
92 | [ETHTOOL_TX_COPYBREAK_BUF_SIZE] = "tx-copybreak-buf-size" , |
93 | }; |
94 | |
95 | const char |
96 | phy_tunable_strings[__ETHTOOL_PHY_TUNABLE_COUNT][ETH_GSTRING_LEN] = { |
97 | [ETHTOOL_ID_UNSPEC] = "Unspec" , |
98 | [ETHTOOL_PHY_DOWNSHIFT] = "phy-downshift" , |
99 | [ETHTOOL_PHY_FAST_LINK_DOWN] = "phy-fast-link-down" , |
100 | [ETHTOOL_PHY_EDPD] = "phy-energy-detect-power-down" , |
101 | }; |
102 | |
103 | #define __LINK_MODE_NAME(speed, type, duplex) \ |
104 | #speed "base" #type "/" #duplex |
105 | #define __DEFINE_LINK_MODE_NAME(speed, type, duplex) \ |
106 | [ETHTOOL_LINK_MODE(speed, type, duplex)] = \ |
107 | __LINK_MODE_NAME(speed, type, duplex) |
108 | #define __DEFINE_SPECIAL_MODE_NAME(_mode, _name) \ |
109 | [ETHTOOL_LINK_MODE_ ## _mode ## _BIT] = _name |
110 | |
111 | const char link_mode_names[][ETH_GSTRING_LEN] = { |
112 | __DEFINE_LINK_MODE_NAME(10, T, Half), |
113 | __DEFINE_LINK_MODE_NAME(10, T, Full), |
114 | __DEFINE_LINK_MODE_NAME(100, T, Half), |
115 | __DEFINE_LINK_MODE_NAME(100, T, Full), |
116 | __DEFINE_LINK_MODE_NAME(1000, T, Half), |
117 | __DEFINE_LINK_MODE_NAME(1000, T, Full), |
118 | __DEFINE_SPECIAL_MODE_NAME(Autoneg, "Autoneg" ), |
119 | __DEFINE_SPECIAL_MODE_NAME(TP, "TP" ), |
120 | __DEFINE_SPECIAL_MODE_NAME(AUI, "AUI" ), |
121 | __DEFINE_SPECIAL_MODE_NAME(MII, "MII" ), |
122 | __DEFINE_SPECIAL_MODE_NAME(FIBRE, "FIBRE" ), |
123 | __DEFINE_SPECIAL_MODE_NAME(BNC, "BNC" ), |
124 | __DEFINE_LINK_MODE_NAME(10000, T, Full), |
125 | __DEFINE_SPECIAL_MODE_NAME(Pause, "Pause" ), |
126 | __DEFINE_SPECIAL_MODE_NAME(Asym_Pause, "Asym_Pause" ), |
127 | __DEFINE_LINK_MODE_NAME(2500, X, Full), |
128 | __DEFINE_SPECIAL_MODE_NAME(Backplane, "Backplane" ), |
129 | __DEFINE_LINK_MODE_NAME(1000, KX, Full), |
130 | __DEFINE_LINK_MODE_NAME(10000, KX4, Full), |
131 | __DEFINE_LINK_MODE_NAME(10000, KR, Full), |
132 | __DEFINE_SPECIAL_MODE_NAME(10000baseR_FEC, "10000baseR_FEC" ), |
133 | __DEFINE_LINK_MODE_NAME(20000, MLD2, Full), |
134 | __DEFINE_LINK_MODE_NAME(20000, KR2, Full), |
135 | __DEFINE_LINK_MODE_NAME(40000, KR4, Full), |
136 | __DEFINE_LINK_MODE_NAME(40000, CR4, Full), |
137 | __DEFINE_LINK_MODE_NAME(40000, SR4, Full), |
138 | __DEFINE_LINK_MODE_NAME(40000, LR4, Full), |
139 | __DEFINE_LINK_MODE_NAME(56000, KR4, Full), |
140 | __DEFINE_LINK_MODE_NAME(56000, CR4, Full), |
141 | __DEFINE_LINK_MODE_NAME(56000, SR4, Full), |
142 | __DEFINE_LINK_MODE_NAME(56000, LR4, Full), |
143 | __DEFINE_LINK_MODE_NAME(25000, CR, Full), |
144 | __DEFINE_LINK_MODE_NAME(25000, KR, Full), |
145 | __DEFINE_LINK_MODE_NAME(25000, SR, Full), |
146 | __DEFINE_LINK_MODE_NAME(50000, CR2, Full), |
147 | __DEFINE_LINK_MODE_NAME(50000, KR2, Full), |
148 | __DEFINE_LINK_MODE_NAME(100000, KR4, Full), |
149 | __DEFINE_LINK_MODE_NAME(100000, SR4, Full), |
150 | __DEFINE_LINK_MODE_NAME(100000, CR4, Full), |
151 | __DEFINE_LINK_MODE_NAME(100000, LR4_ER4, Full), |
152 | __DEFINE_LINK_MODE_NAME(50000, SR2, Full), |
153 | __DEFINE_LINK_MODE_NAME(1000, X, Full), |
154 | __DEFINE_LINK_MODE_NAME(10000, CR, Full), |
155 | __DEFINE_LINK_MODE_NAME(10000, SR, Full), |
156 | __DEFINE_LINK_MODE_NAME(10000, LR, Full), |
157 | __DEFINE_LINK_MODE_NAME(10000, LRM, Full), |
158 | __DEFINE_LINK_MODE_NAME(10000, ER, Full), |
159 | __DEFINE_LINK_MODE_NAME(2500, T, Full), |
160 | __DEFINE_LINK_MODE_NAME(5000, T, Full), |
161 | __DEFINE_SPECIAL_MODE_NAME(FEC_NONE, "None" ), |
162 | __DEFINE_SPECIAL_MODE_NAME(FEC_RS, "RS" ), |
163 | __DEFINE_SPECIAL_MODE_NAME(FEC_BASER, "BASER" ), |
164 | __DEFINE_LINK_MODE_NAME(50000, KR, Full), |
165 | __DEFINE_LINK_MODE_NAME(50000, SR, Full), |
166 | __DEFINE_LINK_MODE_NAME(50000, CR, Full), |
167 | __DEFINE_LINK_MODE_NAME(50000, LR_ER_FR, Full), |
168 | __DEFINE_LINK_MODE_NAME(50000, DR, Full), |
169 | __DEFINE_LINK_MODE_NAME(100000, KR2, Full), |
170 | __DEFINE_LINK_MODE_NAME(100000, SR2, Full), |
171 | __DEFINE_LINK_MODE_NAME(100000, CR2, Full), |
172 | __DEFINE_LINK_MODE_NAME(100000, LR2_ER2_FR2, Full), |
173 | __DEFINE_LINK_MODE_NAME(100000, DR2, Full), |
174 | __DEFINE_LINK_MODE_NAME(200000, KR4, Full), |
175 | __DEFINE_LINK_MODE_NAME(200000, SR4, Full), |
176 | __DEFINE_LINK_MODE_NAME(200000, LR4_ER4_FR4, Full), |
177 | __DEFINE_LINK_MODE_NAME(200000, DR4, Full), |
178 | __DEFINE_LINK_MODE_NAME(200000, CR4, Full), |
179 | __DEFINE_LINK_MODE_NAME(100, T1, Full), |
180 | __DEFINE_LINK_MODE_NAME(1000, T1, Full), |
181 | __DEFINE_LINK_MODE_NAME(400000, KR8, Full), |
182 | __DEFINE_LINK_MODE_NAME(400000, SR8, Full), |
183 | __DEFINE_LINK_MODE_NAME(400000, LR8_ER8_FR8, Full), |
184 | __DEFINE_LINK_MODE_NAME(400000, DR8, Full), |
185 | __DEFINE_LINK_MODE_NAME(400000, CR8, Full), |
186 | __DEFINE_SPECIAL_MODE_NAME(FEC_LLRS, "LLRS" ), |
187 | __DEFINE_LINK_MODE_NAME(100000, KR, Full), |
188 | __DEFINE_LINK_MODE_NAME(100000, SR, Full), |
189 | __DEFINE_LINK_MODE_NAME(100000, LR_ER_FR, Full), |
190 | __DEFINE_LINK_MODE_NAME(100000, DR, Full), |
191 | __DEFINE_LINK_MODE_NAME(100000, CR, Full), |
192 | __DEFINE_LINK_MODE_NAME(200000, KR2, Full), |
193 | __DEFINE_LINK_MODE_NAME(200000, SR2, Full), |
194 | __DEFINE_LINK_MODE_NAME(200000, LR2_ER2_FR2, Full), |
195 | __DEFINE_LINK_MODE_NAME(200000, DR2, Full), |
196 | __DEFINE_LINK_MODE_NAME(200000, CR2, Full), |
197 | __DEFINE_LINK_MODE_NAME(400000, KR4, Full), |
198 | __DEFINE_LINK_MODE_NAME(400000, SR4, Full), |
199 | __DEFINE_LINK_MODE_NAME(400000, LR4_ER4_FR4, Full), |
200 | __DEFINE_LINK_MODE_NAME(400000, DR4, Full), |
201 | __DEFINE_LINK_MODE_NAME(400000, CR4, Full), |
202 | __DEFINE_LINK_MODE_NAME(100, FX, Half), |
203 | __DEFINE_LINK_MODE_NAME(100, FX, Full), |
204 | __DEFINE_LINK_MODE_NAME(10, T1L, Full), |
205 | __DEFINE_LINK_MODE_NAME(800000, CR8, Full), |
206 | __DEFINE_LINK_MODE_NAME(800000, KR8, Full), |
207 | __DEFINE_LINK_MODE_NAME(800000, DR8, Full), |
208 | __DEFINE_LINK_MODE_NAME(800000, DR8_2, Full), |
209 | __DEFINE_LINK_MODE_NAME(800000, SR8, Full), |
210 | __DEFINE_LINK_MODE_NAME(800000, VR8, Full), |
211 | __DEFINE_LINK_MODE_NAME(10, T1S, Full), |
212 | __DEFINE_LINK_MODE_NAME(10, T1S, Half), |
213 | __DEFINE_LINK_MODE_NAME(10, T1S_P2MP, Half), |
214 | }; |
215 | static_assert(ARRAY_SIZE(link_mode_names) == __ETHTOOL_LINK_MODE_MASK_NBITS); |
216 | |
217 | #define __LINK_MODE_LANES_CR 1 |
218 | #define __LINK_MODE_LANES_CR2 2 |
219 | #define __LINK_MODE_LANES_CR4 4 |
220 | #define __LINK_MODE_LANES_CR8 8 |
221 | #define __LINK_MODE_LANES_DR 1 |
222 | #define __LINK_MODE_LANES_DR2 2 |
223 | #define __LINK_MODE_LANES_DR4 4 |
224 | #define __LINK_MODE_LANES_DR8 8 |
225 | #define __LINK_MODE_LANES_KR 1 |
226 | #define __LINK_MODE_LANES_KR2 2 |
227 | #define __LINK_MODE_LANES_KR4 4 |
228 | #define __LINK_MODE_LANES_KR8 8 |
229 | #define __LINK_MODE_LANES_SR 1 |
230 | #define __LINK_MODE_LANES_SR2 2 |
231 | #define __LINK_MODE_LANES_SR4 4 |
232 | #define __LINK_MODE_LANES_SR8 8 |
233 | #define __LINK_MODE_LANES_ER 1 |
234 | #define __LINK_MODE_LANES_KX 1 |
235 | #define __LINK_MODE_LANES_KX4 4 |
236 | #define __LINK_MODE_LANES_LR 1 |
237 | #define __LINK_MODE_LANES_LR4 4 |
238 | #define __LINK_MODE_LANES_LR4_ER4 4 |
239 | #define __LINK_MODE_LANES_LR_ER_FR 1 |
240 | #define __LINK_MODE_LANES_LR2_ER2_FR2 2 |
241 | #define __LINK_MODE_LANES_LR4_ER4_FR4 4 |
242 | #define __LINK_MODE_LANES_LR8_ER8_FR8 8 |
243 | #define __LINK_MODE_LANES_LRM 1 |
244 | #define __LINK_MODE_LANES_MLD2 2 |
245 | #define __LINK_MODE_LANES_T 1 |
246 | #define __LINK_MODE_LANES_T1 1 |
247 | #define __LINK_MODE_LANES_X 1 |
248 | #define __LINK_MODE_LANES_FX 1 |
249 | #define __LINK_MODE_LANES_T1L 1 |
250 | #define __LINK_MODE_LANES_T1S 1 |
251 | #define __LINK_MODE_LANES_T1S_P2MP 1 |
252 | #define __LINK_MODE_LANES_VR8 8 |
253 | #define __LINK_MODE_LANES_DR8_2 8 |
254 | |
255 | #define __DEFINE_LINK_MODE_PARAMS(_speed, _type, _duplex) \ |
256 | [ETHTOOL_LINK_MODE(_speed, _type, _duplex)] = { \ |
257 | .speed = SPEED_ ## _speed, \ |
258 | .lanes = __LINK_MODE_LANES_ ## _type, \ |
259 | .duplex = __DUPLEX_ ## _duplex \ |
260 | } |
261 | #define __DUPLEX_Half DUPLEX_HALF |
262 | #define __DUPLEX_Full DUPLEX_FULL |
263 | #define __DEFINE_SPECIAL_MODE_PARAMS(_mode) \ |
264 | [ETHTOOL_LINK_MODE_ ## _mode ## _BIT] = { \ |
265 | .speed = SPEED_UNKNOWN, \ |
266 | .lanes = 0, \ |
267 | .duplex = DUPLEX_UNKNOWN, \ |
268 | } |
269 | |
270 | const struct link_mode_info link_mode_params[] = { |
271 | __DEFINE_LINK_MODE_PARAMS(10, T, Half), |
272 | __DEFINE_LINK_MODE_PARAMS(10, T, Full), |
273 | __DEFINE_LINK_MODE_PARAMS(100, T, Half), |
274 | __DEFINE_LINK_MODE_PARAMS(100, T, Full), |
275 | __DEFINE_LINK_MODE_PARAMS(1000, T, Half), |
276 | __DEFINE_LINK_MODE_PARAMS(1000, T, Full), |
277 | __DEFINE_SPECIAL_MODE_PARAMS(Autoneg), |
278 | __DEFINE_SPECIAL_MODE_PARAMS(TP), |
279 | __DEFINE_SPECIAL_MODE_PARAMS(AUI), |
280 | __DEFINE_SPECIAL_MODE_PARAMS(MII), |
281 | __DEFINE_SPECIAL_MODE_PARAMS(FIBRE), |
282 | __DEFINE_SPECIAL_MODE_PARAMS(BNC), |
283 | __DEFINE_LINK_MODE_PARAMS(10000, T, Full), |
284 | __DEFINE_SPECIAL_MODE_PARAMS(Pause), |
285 | __DEFINE_SPECIAL_MODE_PARAMS(Asym_Pause), |
286 | __DEFINE_LINK_MODE_PARAMS(2500, X, Full), |
287 | __DEFINE_SPECIAL_MODE_PARAMS(Backplane), |
288 | __DEFINE_LINK_MODE_PARAMS(1000, KX, Full), |
289 | __DEFINE_LINK_MODE_PARAMS(10000, KX4, Full), |
290 | __DEFINE_LINK_MODE_PARAMS(10000, KR, Full), |
291 | [ETHTOOL_LINK_MODE_10000baseR_FEC_BIT] = { |
292 | .speed = SPEED_10000, |
293 | .lanes = 1, |
294 | .duplex = DUPLEX_FULL, |
295 | }, |
296 | __DEFINE_LINK_MODE_PARAMS(20000, MLD2, Full), |
297 | __DEFINE_LINK_MODE_PARAMS(20000, KR2, Full), |
298 | __DEFINE_LINK_MODE_PARAMS(40000, KR4, Full), |
299 | __DEFINE_LINK_MODE_PARAMS(40000, CR4, Full), |
300 | __DEFINE_LINK_MODE_PARAMS(40000, SR4, Full), |
301 | __DEFINE_LINK_MODE_PARAMS(40000, LR4, Full), |
302 | __DEFINE_LINK_MODE_PARAMS(56000, KR4, Full), |
303 | __DEFINE_LINK_MODE_PARAMS(56000, CR4, Full), |
304 | __DEFINE_LINK_MODE_PARAMS(56000, SR4, Full), |
305 | __DEFINE_LINK_MODE_PARAMS(56000, LR4, Full), |
306 | __DEFINE_LINK_MODE_PARAMS(25000, CR, Full), |
307 | __DEFINE_LINK_MODE_PARAMS(25000, KR, Full), |
308 | __DEFINE_LINK_MODE_PARAMS(25000, SR, Full), |
309 | __DEFINE_LINK_MODE_PARAMS(50000, CR2, Full), |
310 | __DEFINE_LINK_MODE_PARAMS(50000, KR2, Full), |
311 | __DEFINE_LINK_MODE_PARAMS(100000, KR4, Full), |
312 | __DEFINE_LINK_MODE_PARAMS(100000, SR4, Full), |
313 | __DEFINE_LINK_MODE_PARAMS(100000, CR4, Full), |
314 | __DEFINE_LINK_MODE_PARAMS(100000, LR4_ER4, Full), |
315 | __DEFINE_LINK_MODE_PARAMS(50000, SR2, Full), |
316 | __DEFINE_LINK_MODE_PARAMS(1000, X, Full), |
317 | __DEFINE_LINK_MODE_PARAMS(10000, CR, Full), |
318 | __DEFINE_LINK_MODE_PARAMS(10000, SR, Full), |
319 | __DEFINE_LINK_MODE_PARAMS(10000, LR, Full), |
320 | __DEFINE_LINK_MODE_PARAMS(10000, LRM, Full), |
321 | __DEFINE_LINK_MODE_PARAMS(10000, ER, Full), |
322 | __DEFINE_LINK_MODE_PARAMS(2500, T, Full), |
323 | __DEFINE_LINK_MODE_PARAMS(5000, T, Full), |
324 | __DEFINE_SPECIAL_MODE_PARAMS(FEC_NONE), |
325 | __DEFINE_SPECIAL_MODE_PARAMS(FEC_RS), |
326 | __DEFINE_SPECIAL_MODE_PARAMS(FEC_BASER), |
327 | __DEFINE_LINK_MODE_PARAMS(50000, KR, Full), |
328 | __DEFINE_LINK_MODE_PARAMS(50000, SR, Full), |
329 | __DEFINE_LINK_MODE_PARAMS(50000, CR, Full), |
330 | __DEFINE_LINK_MODE_PARAMS(50000, LR_ER_FR, Full), |
331 | __DEFINE_LINK_MODE_PARAMS(50000, DR, Full), |
332 | __DEFINE_LINK_MODE_PARAMS(100000, KR2, Full), |
333 | __DEFINE_LINK_MODE_PARAMS(100000, SR2, Full), |
334 | __DEFINE_LINK_MODE_PARAMS(100000, CR2, Full), |
335 | __DEFINE_LINK_MODE_PARAMS(100000, LR2_ER2_FR2, Full), |
336 | __DEFINE_LINK_MODE_PARAMS(100000, DR2, Full), |
337 | __DEFINE_LINK_MODE_PARAMS(200000, KR4, Full), |
338 | __DEFINE_LINK_MODE_PARAMS(200000, SR4, Full), |
339 | __DEFINE_LINK_MODE_PARAMS(200000, LR4_ER4_FR4, Full), |
340 | __DEFINE_LINK_MODE_PARAMS(200000, DR4, Full), |
341 | __DEFINE_LINK_MODE_PARAMS(200000, CR4, Full), |
342 | __DEFINE_LINK_MODE_PARAMS(100, T1, Full), |
343 | __DEFINE_LINK_MODE_PARAMS(1000, T1, Full), |
344 | __DEFINE_LINK_MODE_PARAMS(400000, KR8, Full), |
345 | __DEFINE_LINK_MODE_PARAMS(400000, SR8, Full), |
346 | __DEFINE_LINK_MODE_PARAMS(400000, LR8_ER8_FR8, Full), |
347 | __DEFINE_LINK_MODE_PARAMS(400000, DR8, Full), |
348 | __DEFINE_LINK_MODE_PARAMS(400000, CR8, Full), |
349 | __DEFINE_SPECIAL_MODE_PARAMS(FEC_LLRS), |
350 | __DEFINE_LINK_MODE_PARAMS(100000, KR, Full), |
351 | __DEFINE_LINK_MODE_PARAMS(100000, SR, Full), |
352 | __DEFINE_LINK_MODE_PARAMS(100000, LR_ER_FR, Full), |
353 | __DEFINE_LINK_MODE_PARAMS(100000, DR, Full), |
354 | __DEFINE_LINK_MODE_PARAMS(100000, CR, Full), |
355 | __DEFINE_LINK_MODE_PARAMS(200000, KR2, Full), |
356 | __DEFINE_LINK_MODE_PARAMS(200000, SR2, Full), |
357 | __DEFINE_LINK_MODE_PARAMS(200000, LR2_ER2_FR2, Full), |
358 | __DEFINE_LINK_MODE_PARAMS(200000, DR2, Full), |
359 | __DEFINE_LINK_MODE_PARAMS(200000, CR2, Full), |
360 | __DEFINE_LINK_MODE_PARAMS(400000, KR4, Full), |
361 | __DEFINE_LINK_MODE_PARAMS(400000, SR4, Full), |
362 | __DEFINE_LINK_MODE_PARAMS(400000, LR4_ER4_FR4, Full), |
363 | __DEFINE_LINK_MODE_PARAMS(400000, DR4, Full), |
364 | __DEFINE_LINK_MODE_PARAMS(400000, CR4, Full), |
365 | __DEFINE_LINK_MODE_PARAMS(100, FX, Half), |
366 | __DEFINE_LINK_MODE_PARAMS(100, FX, Full), |
367 | __DEFINE_LINK_MODE_PARAMS(10, T1L, Full), |
368 | __DEFINE_LINK_MODE_PARAMS(800000, CR8, Full), |
369 | __DEFINE_LINK_MODE_PARAMS(800000, KR8, Full), |
370 | __DEFINE_LINK_MODE_PARAMS(800000, DR8, Full), |
371 | __DEFINE_LINK_MODE_PARAMS(800000, DR8_2, Full), |
372 | __DEFINE_LINK_MODE_PARAMS(800000, SR8, Full), |
373 | __DEFINE_LINK_MODE_PARAMS(800000, VR8, Full), |
374 | __DEFINE_LINK_MODE_PARAMS(10, T1S, Full), |
375 | __DEFINE_LINK_MODE_PARAMS(10, T1S, Half), |
376 | __DEFINE_LINK_MODE_PARAMS(10, T1S_P2MP, Half), |
377 | }; |
378 | static_assert(ARRAY_SIZE(link_mode_params) == __ETHTOOL_LINK_MODE_MASK_NBITS); |
379 | |
380 | const char netif_msg_class_names[][ETH_GSTRING_LEN] = { |
381 | [NETIF_MSG_DRV_BIT] = "drv" , |
382 | [NETIF_MSG_PROBE_BIT] = "probe" , |
383 | [NETIF_MSG_LINK_BIT] = "link" , |
384 | [NETIF_MSG_TIMER_BIT] = "timer" , |
385 | [NETIF_MSG_IFDOWN_BIT] = "ifdown" , |
386 | [NETIF_MSG_IFUP_BIT] = "ifup" , |
387 | [NETIF_MSG_RX_ERR_BIT] = "rx_err" , |
388 | [NETIF_MSG_TX_ERR_BIT] = "tx_err" , |
389 | [NETIF_MSG_TX_QUEUED_BIT] = "tx_queued" , |
390 | [NETIF_MSG_INTR_BIT] = "intr" , |
391 | [NETIF_MSG_TX_DONE_BIT] = "tx_done" , |
392 | [NETIF_MSG_RX_STATUS_BIT] = "rx_status" , |
393 | [NETIF_MSG_PKTDATA_BIT] = "pktdata" , |
394 | [NETIF_MSG_HW_BIT] = "hw" , |
395 | [NETIF_MSG_WOL_BIT] = "wol" , |
396 | }; |
397 | static_assert(ARRAY_SIZE(netif_msg_class_names) == NETIF_MSG_CLASS_COUNT); |
398 | |
399 | const char wol_mode_names[][ETH_GSTRING_LEN] = { |
400 | [const_ilog2(WAKE_PHY)] = "phy" , |
401 | [const_ilog2(WAKE_UCAST)] = "ucast" , |
402 | [const_ilog2(WAKE_MCAST)] = "mcast" , |
403 | [const_ilog2(WAKE_BCAST)] = "bcast" , |
404 | [const_ilog2(WAKE_ARP)] = "arp" , |
405 | [const_ilog2(WAKE_MAGIC)] = "magic" , |
406 | [const_ilog2(WAKE_MAGICSECURE)] = "magicsecure" , |
407 | [const_ilog2(WAKE_FILTER)] = "filter" , |
408 | }; |
409 | static_assert(ARRAY_SIZE(wol_mode_names) == WOL_MODE_COUNT); |
410 | |
411 | const char sof_timestamping_names[][ETH_GSTRING_LEN] = { |
412 | [const_ilog2(SOF_TIMESTAMPING_TX_HARDWARE)] = "hardware-transmit" , |
413 | [const_ilog2(SOF_TIMESTAMPING_TX_SOFTWARE)] = "software-transmit" , |
414 | [const_ilog2(SOF_TIMESTAMPING_RX_HARDWARE)] = "hardware-receive" , |
415 | [const_ilog2(SOF_TIMESTAMPING_RX_SOFTWARE)] = "software-receive" , |
416 | [const_ilog2(SOF_TIMESTAMPING_SOFTWARE)] = "software-system-clock" , |
417 | [const_ilog2(SOF_TIMESTAMPING_SYS_HARDWARE)] = "hardware-legacy-clock" , |
418 | [const_ilog2(SOF_TIMESTAMPING_RAW_HARDWARE)] = "hardware-raw-clock" , |
419 | [const_ilog2(SOF_TIMESTAMPING_OPT_ID)] = "option-id" , |
420 | [const_ilog2(SOF_TIMESTAMPING_TX_SCHED)] = "sched-transmit" , |
421 | [const_ilog2(SOF_TIMESTAMPING_TX_ACK)] = "ack-transmit" , |
422 | [const_ilog2(SOF_TIMESTAMPING_OPT_CMSG)] = "option-cmsg" , |
423 | [const_ilog2(SOF_TIMESTAMPING_OPT_TSONLY)] = "option-tsonly" , |
424 | [const_ilog2(SOF_TIMESTAMPING_OPT_STATS)] = "option-stats" , |
425 | [const_ilog2(SOF_TIMESTAMPING_OPT_PKTINFO)] = "option-pktinfo" , |
426 | [const_ilog2(SOF_TIMESTAMPING_OPT_TX_SWHW)] = "option-tx-swhw" , |
427 | [const_ilog2(SOF_TIMESTAMPING_BIND_PHC)] = "bind-phc" , |
428 | [const_ilog2(SOF_TIMESTAMPING_OPT_ID_TCP)] = "option-id-tcp" , |
429 | }; |
430 | static_assert(ARRAY_SIZE(sof_timestamping_names) == __SOF_TIMESTAMPING_CNT); |
431 | |
432 | const char ts_tx_type_names[][ETH_GSTRING_LEN] = { |
433 | [HWTSTAMP_TX_OFF] = "off" , |
434 | [HWTSTAMP_TX_ON] = "on" , |
435 | [HWTSTAMP_TX_ONESTEP_SYNC] = "onestep-sync" , |
436 | [HWTSTAMP_TX_ONESTEP_P2P] = "onestep-p2p" , |
437 | }; |
438 | static_assert(ARRAY_SIZE(ts_tx_type_names) == __HWTSTAMP_TX_CNT); |
439 | |
440 | const char ts_rx_filter_names[][ETH_GSTRING_LEN] = { |
441 | [HWTSTAMP_FILTER_NONE] = "none" , |
442 | [HWTSTAMP_FILTER_ALL] = "all" , |
443 | [HWTSTAMP_FILTER_SOME] = "some" , |
444 | [HWTSTAMP_FILTER_PTP_V1_L4_EVENT] = "ptpv1-l4-event" , |
445 | [HWTSTAMP_FILTER_PTP_V1_L4_SYNC] = "ptpv1-l4-sync" , |
446 | [HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ] = "ptpv1-l4-delay-req" , |
447 | [HWTSTAMP_FILTER_PTP_V2_L4_EVENT] = "ptpv2-l4-event" , |
448 | [HWTSTAMP_FILTER_PTP_V2_L4_SYNC] = "ptpv2-l4-sync" , |
449 | [HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ] = "ptpv2-l4-delay-req" , |
450 | [HWTSTAMP_FILTER_PTP_V2_L2_EVENT] = "ptpv2-l2-event" , |
451 | [HWTSTAMP_FILTER_PTP_V2_L2_SYNC] = "ptpv2-l2-sync" , |
452 | [HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ] = "ptpv2-l2-delay-req" , |
453 | [HWTSTAMP_FILTER_PTP_V2_EVENT] = "ptpv2-event" , |
454 | [HWTSTAMP_FILTER_PTP_V2_SYNC] = "ptpv2-sync" , |
455 | [HWTSTAMP_FILTER_PTP_V2_DELAY_REQ] = "ptpv2-delay-req" , |
456 | [HWTSTAMP_FILTER_NTP_ALL] = "ntp-all" , |
457 | }; |
458 | static_assert(ARRAY_SIZE(ts_rx_filter_names) == __HWTSTAMP_FILTER_CNT); |
459 | |
460 | const char udp_tunnel_type_names[][ETH_GSTRING_LEN] = { |
461 | [ETHTOOL_UDP_TUNNEL_TYPE_VXLAN] = "vxlan" , |
462 | [ETHTOOL_UDP_TUNNEL_TYPE_GENEVE] = "geneve" , |
463 | [ETHTOOL_UDP_TUNNEL_TYPE_VXLAN_GPE] = "vxlan-gpe" , |
464 | }; |
465 | static_assert(ARRAY_SIZE(udp_tunnel_type_names) == |
466 | __ETHTOOL_UDP_TUNNEL_TYPE_CNT); |
467 | |
468 | /* return false if legacy contained non-0 deprecated fields |
469 | * maxtxpkt/maxrxpkt. rest of ksettings always updated |
470 | */ |
471 | bool |
472 | convert_legacy_settings_to_link_ksettings( |
473 | struct ethtool_link_ksettings *link_ksettings, |
474 | const struct ethtool_cmd *legacy_settings) |
475 | { |
476 | bool retval = true; |
477 | |
478 | memset(link_ksettings, 0, sizeof(*link_ksettings)); |
479 | |
480 | /* This is used to tell users that driver is still using these |
481 | * deprecated legacy fields, and they should not use |
482 | * %ETHTOOL_GLINKSETTINGS/%ETHTOOL_SLINKSETTINGS |
483 | */ |
484 | if (legacy_settings->maxtxpkt || |
485 | legacy_settings->maxrxpkt) |
486 | retval = false; |
487 | |
488 | ethtool_convert_legacy_u32_to_link_mode( |
489 | dst: link_ksettings->link_modes.supported, |
490 | legacy_u32: legacy_settings->supported); |
491 | ethtool_convert_legacy_u32_to_link_mode( |
492 | dst: link_ksettings->link_modes.advertising, |
493 | legacy_u32: legacy_settings->advertising); |
494 | ethtool_convert_legacy_u32_to_link_mode( |
495 | dst: link_ksettings->link_modes.lp_advertising, |
496 | legacy_u32: legacy_settings->lp_advertising); |
497 | link_ksettings->base.speed |
498 | = ethtool_cmd_speed(ep: legacy_settings); |
499 | link_ksettings->base.duplex |
500 | = legacy_settings->duplex; |
501 | link_ksettings->base.port |
502 | = legacy_settings->port; |
503 | link_ksettings->base.phy_address |
504 | = legacy_settings->phy_address; |
505 | link_ksettings->base.autoneg |
506 | = legacy_settings->autoneg; |
507 | link_ksettings->base.mdio_support |
508 | = legacy_settings->mdio_support; |
509 | link_ksettings->base.eth_tp_mdix |
510 | = legacy_settings->eth_tp_mdix; |
511 | link_ksettings->base.eth_tp_mdix_ctrl |
512 | = legacy_settings->eth_tp_mdix_ctrl; |
513 | return retval; |
514 | } |
515 | |
516 | int __ethtool_get_link(struct net_device *dev) |
517 | { |
518 | if (!dev->ethtool_ops->get_link) |
519 | return -EOPNOTSUPP; |
520 | |
521 | return netif_running(dev) && dev->ethtool_ops->get_link(dev); |
522 | } |
523 | |
524 | static int ethtool_get_rxnfc_rule_count(struct net_device *dev) |
525 | { |
526 | const struct ethtool_ops *ops = dev->ethtool_ops; |
527 | struct ethtool_rxnfc info = { |
528 | .cmd = ETHTOOL_GRXCLSRLCNT, |
529 | }; |
530 | int err; |
531 | |
532 | err = ops->get_rxnfc(dev, &info, NULL); |
533 | if (err) |
534 | return err; |
535 | |
536 | return info.rule_cnt; |
537 | } |
538 | |
539 | int ethtool_get_max_rxnfc_channel(struct net_device *dev, u64 *max) |
540 | { |
541 | const struct ethtool_ops *ops = dev->ethtool_ops; |
542 | struct ethtool_rxnfc *info; |
543 | int err, i, rule_cnt; |
544 | u64 max_ring = 0; |
545 | |
546 | if (!ops->get_rxnfc) |
547 | return -EOPNOTSUPP; |
548 | |
549 | rule_cnt = ethtool_get_rxnfc_rule_count(dev); |
550 | if (rule_cnt <= 0) |
551 | return -EINVAL; |
552 | |
553 | info = kvzalloc(struct_size(info, rule_locs, rule_cnt), GFP_KERNEL); |
554 | if (!info) |
555 | return -ENOMEM; |
556 | |
557 | info->cmd = ETHTOOL_GRXCLSRLALL; |
558 | info->rule_cnt = rule_cnt; |
559 | err = ops->get_rxnfc(dev, info, info->rule_locs); |
560 | if (err) |
561 | goto err_free_info; |
562 | |
563 | for (i = 0; i < rule_cnt; i++) { |
564 | struct ethtool_rxnfc rule_info = { |
565 | .cmd = ETHTOOL_GRXCLSRULE, |
566 | .fs.location = info->rule_locs[i], |
567 | }; |
568 | |
569 | err = ops->get_rxnfc(dev, &rule_info, NULL); |
570 | if (err) |
571 | goto err_free_info; |
572 | |
573 | if (rule_info.fs.ring_cookie != RX_CLS_FLOW_DISC && |
574 | rule_info.fs.ring_cookie != RX_CLS_FLOW_WAKE && |
575 | !(rule_info.flow_type & FLOW_RSS) && |
576 | !ethtool_get_flow_spec_ring_vf(ring_cookie: rule_info.fs.ring_cookie)) |
577 | max_ring = |
578 | max_t(u64, max_ring, rule_info.fs.ring_cookie); |
579 | } |
580 | |
581 | kvfree(addr: info); |
582 | *max = max_ring; |
583 | return 0; |
584 | |
585 | err_free_info: |
586 | kvfree(addr: info); |
587 | return err; |
588 | } |
589 | |
590 | int ethtool_get_max_rxfh_channel(struct net_device *dev, u32 *max) |
591 | { |
592 | struct ethtool_rxfh_param rxfh = {}; |
593 | u32 dev_size, current_max = 0; |
594 | int ret; |
595 | |
596 | if (!dev->ethtool_ops->get_rxfh_indir_size || |
597 | !dev->ethtool_ops->get_rxfh) |
598 | return -EOPNOTSUPP; |
599 | dev_size = dev->ethtool_ops->get_rxfh_indir_size(dev); |
600 | if (dev_size == 0) |
601 | return -EOPNOTSUPP; |
602 | |
603 | rxfh.indir = kcalloc(n: dev_size, size: sizeof(rxfh.indir[0]), GFP_USER); |
604 | if (!rxfh.indir) |
605 | return -ENOMEM; |
606 | |
607 | ret = dev->ethtool_ops->get_rxfh(dev, &rxfh); |
608 | if (ret) |
609 | goto out; |
610 | |
611 | while (dev_size--) |
612 | current_max = max(current_max, rxfh.indir[dev_size]); |
613 | |
614 | *max = current_max; |
615 | |
616 | out: |
617 | kfree(objp: rxfh.indir); |
618 | return ret; |
619 | } |
620 | |
621 | int ethtool_check_ops(const struct ethtool_ops *ops) |
622 | { |
623 | if (WARN_ON(ops->set_coalesce && !ops->supported_coalesce_params)) |
624 | return -EINVAL; |
625 | /* NOTE: sufficiently insane drivers may swap ethtool_ops at runtime, |
626 | * the fact that ops are checked at registration time does not |
627 | * mean the ops attached to a netdev later on are sane. |
628 | */ |
629 | return 0; |
630 | } |
631 | |
632 | int __ethtool_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info) |
633 | { |
634 | const struct ethtool_ops *ops = dev->ethtool_ops; |
635 | struct phy_device *phydev = dev->phydev; |
636 | |
637 | memset(info, 0, sizeof(*info)); |
638 | info->cmd = ETHTOOL_GET_TS_INFO; |
639 | |
640 | if (phy_has_tsinfo(phydev)) |
641 | return phy_ts_info(phydev, tsinfo: info); |
642 | if (ops->get_ts_info) |
643 | return ops->get_ts_info(dev, info); |
644 | |
645 | info->so_timestamping = SOF_TIMESTAMPING_RX_SOFTWARE | |
646 | SOF_TIMESTAMPING_SOFTWARE; |
647 | info->phc_index = -1; |
648 | |
649 | return 0; |
650 | } |
651 | |
652 | int ethtool_get_phc_vclocks(struct net_device *dev, int **vclock_index) |
653 | { |
654 | struct ethtool_ts_info info = { }; |
655 | int num = 0; |
656 | |
657 | if (!__ethtool_get_ts_info(dev, info: &info)) |
658 | num = ptp_get_vclocks_index(pclock_index: info.phc_index, vclock_index); |
659 | |
660 | return num; |
661 | } |
662 | EXPORT_SYMBOL(ethtool_get_phc_vclocks); |
663 | |
664 | int ethtool_get_ts_info_by_layer(struct net_device *dev, struct ethtool_ts_info *info) |
665 | { |
666 | return __ethtool_get_ts_info(dev, info); |
667 | } |
668 | EXPORT_SYMBOL(ethtool_get_ts_info_by_layer); |
669 | |
670 | const struct ethtool_phy_ops *ethtool_phy_ops; |
671 | |
672 | void ethtool_set_ethtool_phy_ops(const struct ethtool_phy_ops *ops) |
673 | { |
674 | ASSERT_RTNL(); |
675 | ethtool_phy_ops = ops; |
676 | } |
677 | EXPORT_SYMBOL_GPL(ethtool_set_ethtool_phy_ops); |
678 | |
679 | void |
680 | ethtool_params_from_link_mode(struct ethtool_link_ksettings *link_ksettings, |
681 | enum ethtool_link_mode_bit_indices link_mode) |
682 | { |
683 | const struct link_mode_info *link_info; |
684 | |
685 | if (WARN_ON_ONCE(link_mode >= __ETHTOOL_LINK_MODE_MASK_NBITS)) |
686 | return; |
687 | |
688 | link_info = &link_mode_params[link_mode]; |
689 | link_ksettings->base.speed = link_info->speed; |
690 | link_ksettings->lanes = link_info->lanes; |
691 | link_ksettings->base.duplex = link_info->duplex; |
692 | } |
693 | EXPORT_SYMBOL_GPL(ethtool_params_from_link_mode); |
694 | |
695 | /** |
696 | * ethtool_forced_speed_maps_init |
697 | * @maps: Pointer to an array of Ethtool forced speed map |
698 | * @size: Array size |
699 | * |
700 | * Initialize an array of Ethtool forced speed map to Ethtool link modes. This |
701 | * should be called during driver module init. |
702 | */ |
703 | void |
704 | ethtool_forced_speed_maps_init(struct ethtool_forced_speed_map *maps, u32 size) |
705 | { |
706 | for (u32 i = 0; i < size; i++) { |
707 | struct ethtool_forced_speed_map *map = &maps[i]; |
708 | |
709 | linkmode_set_bit_array(array: map->cap_arr, array_size: map->arr_size, addr: map->caps); |
710 | map->cap_arr = NULL; |
711 | map->arr_size = 0; |
712 | } |
713 | } |
714 | EXPORT_SYMBOL_GPL(ethtool_forced_speed_maps_init); |
715 | |