xref: /illumos-gate/usr/src/uts/common/sys/mac_ether.h (revision 2aaafd60)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  *
25  * Copyright 2015 Garrett D'Amore <garrett@damore.org>
26  * Copyright 2016 Joyent, Inc.
27  * Copyright 2023 Oxide Computer Company
28  */
29 
30 #ifndef	_SYS_MAC_ETHER_H
31 #define	_SYS_MAC_ETHER_H
32 
33 /*
34  * Ethernet MAC Plugin
35  */
36 
37 #ifdef	__cplusplus
38 extern "C" {
39 #endif
40 
41 /*
42  * Ethernet-specific media types for use with MAC_PROP_MEDIA and
43  * ETHER_STAT_XCVR_INUSE. See mac(9E) for more information.
44  */
45 typedef enum {
46 	ETHER_MEDIA_UNKNOWN	= 0,
47 	ETHER_MEDIA_NONE,
48 	ETHER_MEDIA_10BASE_T,
49 	ETHER_MEDIA_100BASE_T4,
50 	/*
51 	 * 100BASE-X is a catchall term defined in 802.3. In 802.3 section
52 	 * 24.1.1 100BASE-X is used to cover the more specific 100BASE-TX and
53 	 * 100BASE-FX realized in copper and fiber. The PCS is shared between
54 	 * the two, but the PMD is different. Use this if you can't determine TX
55 	 * vs. FX.
56 	 */
57 	ETHER_MEDIA_100BASE_X,
58 	/*
59 	 * Note, previously there was never a 100BASE-TX value so some drivers
60 	 * would have returned this for 100BASE-TX.
61 	 */
62 	ETHER_MEDIA_100BASE_T2,
63 	/*
64 	 * 1000BASE-X is a fiber catch all. This is for compatibility with the
65 	 * traditional ETHER_STAT_XCVR_INUSE 1000BASE-X value. More specific
66 	 * variants are listed below. USe this if nothing more specific is
67 	 * feasible.
68 	 */
69 	ETHER_MEDIA_1000BASE_X,
70 	ETHER_MEDIA_1000BASE_T,
71 	ETHER_MEDIA_1000BASE_KX,
72 	ETHER_MEDIA_1000BASE_T1,
73 	ETHER_MEDIA_1000BASE_CX,
74 	ETHER_MEDIA_1000BASE_SX,
75 	ETHER_MEDIA_1000BASE_LX,
76 	ETHER_MEDIA_1000BASE_BX,
77 	ETHER_MEDIA_1000_SGMII,
78 
79 	/*
80 	 * Additional more recent or erroneously skipped 10/100 modes.
81 	 */
82 	ETHER_MEDIA_100BASE_TX,
83 	ETHER_MEDIA_100BASE_FX,
84 	ETHER_MEDIA_100_SGMII,
85 	ETHER_MEDIA_10BASE_T1,
86 	ETHER_MEDIA_100BASE_T1,
87 
88 	/*
89 	 * 2.5 GbE, 5.0 GbE, single lane.
90 	 */
91 	ETHER_MEDIA_2500BASE_T,
92 	ETHER_MEDIA_2500BASE_KX,
93 	ETHER_MEDIA_2500BASE_X,
94 	ETHER_MEDIA_5000BASE_T,
95 	ETHER_MEDIA_5000BASE_KR,
96 
97 	/*
98 	 * 10 GbE, all lane configurations.
99 	 */
100 	ETHER_MEDIA_10GBASE_T,
101 	ETHER_MEDIA_10GBASE_SR,
102 	ETHER_MEDIA_10GBASE_LR,
103 	ETHER_MEDIA_10GBASE_LRM,
104 	ETHER_MEDIA_10GBASE_KR,
105 	ETHER_MEDIA_10GBASE_CX4,
106 	ETHER_MEDIA_10GBASE_KX4,
107 	ETHER_MEDIA_10G_XAUI,
108 	ETHER_MEDIA_10GBASE_AOC,
109 	ETHER_MEDIA_10GBASE_ACC,
110 	ETHER_MEDIA_10GBASE_CR,
111 	ETHER_MEDIA_10GBASE_ER,
112 	ETHER_MEDIA_10G_SFI,
113 	ETHER_MEDIA_10G_XFI,
114 
115 	/*
116 	 * 25 GbE, single lane.
117 	 */
118 	ETHER_MEDIA_25GBASE_T,
119 	ETHER_MEDIA_25GBASE_SR,
120 	ETHER_MEDIA_25GBASE_LR,
121 	ETHER_MEDIA_25GBASE_ER,
122 	ETHER_MEDIA_25GBASE_KR,
123 	ETHER_MEDIA_25GBASE_CR,
124 	ETHER_MEDIA_25GBASE_AOC,
125 	ETHER_MEDIA_25GBASE_ACC,
126 	ETHER_MEDIA_25G_AUI,
127 
128 	/*
129 	 * 40 GbE based on 10 GbE
130 	 */
131 	ETHER_MEDIA_40GBASE_T,
132 	ETHER_MEDIA_40GBASE_CR4,
133 	ETHER_MEDIA_40GBASE_KR4,
134 	ETHER_MEDIA_40GBASE_LR4,
135 	ETHER_MEDIA_40GBASE_SR4,
136 	ETHER_MEDIA_40GBASE_ER4,
137 	ETHER_MEDIA_40GBASE_LM4,
138 	ETHER_MEDIA_40GBASE_AOC4,
139 	ETHER_MEDIA_40GBASE_ACC4,
140 	ETHER_MEDIA_40G_XLAUI,
141 	ETHER_MEDIA_40G_XLPPI,
142 
143 	/*
144 	 * 50 GbE based on 25 GbE
145 	 */
146 	ETHER_MEDIA_50GBASE_KR2,
147 	ETHER_MEDIA_50GBASE_CR2,
148 	ETHER_MEDIA_50GBASE_SR2,
149 	ETHER_MEDIA_50GBASE_LR2,
150 	ETHER_MEDIA_50GBASE_AOC2,
151 	ETHER_MEDIA_50GBASE_ACC2,
152 
153 	/*
154 	 * 50 GbE based on 50 GbE PAM4
155 	 */
156 	ETHER_MEDIA_50GBASE_KR,
157 	ETHER_MEDIA_50GBASE_CR,
158 	ETHER_MEDIA_50GBASE_SR,
159 	ETHER_MEDIA_50GBASE_LR,
160 	ETHER_MEDIA_50GBASE_FR,
161 	ETHER_MEDIA_50GBASE_ER,
162 	ETHER_MEDIA_50GBASE_AOC,
163 	ETHER_MEDIA_50GBASE_ACC,
164 
165 	/*
166 	 * 100 GbE based on 10 GbE
167 	 */
168 	ETHER_MEDIA_100GBASE_CR10,
169 	ETHER_MEDIA_100GBASE_SR10,
170 
171 	/*
172 	 * 100 GbE based on 25 GbE
173 	 */
174 	ETHER_MEDIA_100GBASE_SR4,
175 	ETHER_MEDIA_100GBASE_LR4,
176 	ETHER_MEDIA_100GBASE_ER4,
177 	ETHER_MEDIA_100GBASE_KR4,
178 	ETHER_MEDIA_100GBASE_CR4,
179 	ETHER_MEDIA_100GBASE_CAUI4,
180 	ETHER_MEDIA_100GBASE_AOC4,
181 	ETHER_MEDIA_100GBASE_ACC4,
182 
183 	/*
184 	 * 100 GbE based on 50 GbE
185 	 */
186 	ETHER_MEDIA_100GBASE_KR2,
187 	ETHER_MEDIA_100GBASE_CR2,
188 	ETHER_MEDIA_100GBASE_SR2,
189 
190 	/*
191 	 * 100 GbE based on 100 GbE
192 	 */
193 	ETHER_MEDIA_100GBASE_KR,
194 	ETHER_MEDIA_100GBASE_CR,
195 	ETHER_MEDIA_100GBASE_SR,
196 	ETHER_MEDIA_100GBASE_DR,
197 	ETHER_MEDIA_100GBASE_LR,
198 	ETHER_MEDIA_100GBASE_FR,
199 
200 	/*
201 	 * 200G Ethernet based on 50 GbE
202 	 */
203 	ETHER_MEDIA_200GAUI_4,
204 	ETHER_MEDIA_200GBASE_CR4,
205 	ETHER_MEDIA_200GBASE_KR4,
206 	ETHER_MEDIA_200GBASE_SR4,
207 	ETHER_MEDIA_200GBASE_DR4,
208 	ETHER_MEDIA_200GBASE_FR4,
209 	ETHER_MEDIA_200GBASE_LR4,
210 	ETHER_MEDIA_200GBASE_ER4,
211 
212 	/*
213 	 * 200G Ethernet based on 100 GbE
214 	 */
215 	ETHER_MEDIA_200GAUI_2,
216 	ETHER_MEDIA_200GBASE_KR2,
217 	ETHER_MEDIA_200GBASE_CR2,
218 	ETHER_MEDIA_200GBASE_SR2,
219 
220 	/*
221 	 * 400G based on 50 GbE
222 	 */
223 	ETHER_MEDIA_400GAUI_8,
224 	ETHER_MEDIA_400GBASE_KR8,
225 	ETHER_MEDIA_400GBASE_FR8,
226 	ETHER_MEDIA_400GBASE_LR8,
227 	ETHER_MEDIA_400GBASE_ER8,
228 
229 	/*
230 	 * 400G based on 100 GbE
231 	 */
232 	ETHER_MEDIA_400GAUI_4,
233 	ETHER_MEDIA_400GBASE_KR4,
234 	ETHER_MEDIA_400GBASE_CR4,
235 	ETHER_MEDIA_400GBASE_SR4,
236 	ETHER_MEDIA_400GBASE_DR4,
237 	ETHER_MEDIA_400GBASE_FR4
238 } mac_ether_media_t;
239 
240 #ifdef	_KERNEL
241 
242 #define	MAC_PLUGIN_IDENT_ETHER	"mac_ether"
243 
244 /*
245  * Do not reorder, and add only to the end of this list.
246  */
247 enum ether_stat {
248 	/* RFC 1643 stats */
249 	ETHER_STAT_ALIGN_ERRORS = MACTYPE_STAT_MIN,
250 	ETHER_STAT_FCS_ERRORS,
251 	ETHER_STAT_FIRST_COLLISIONS,
252 	ETHER_STAT_MULTI_COLLISIONS,
253 	ETHER_STAT_SQE_ERRORS,
254 	ETHER_STAT_DEFER_XMTS,
255 	ETHER_STAT_TX_LATE_COLLISIONS,
256 	ETHER_STAT_EX_COLLISIONS,
257 	ETHER_STAT_MACXMT_ERRORS,
258 	ETHER_STAT_CARRIER_ERRORS,
259 	ETHER_STAT_TOOLONG_ERRORS,
260 	ETHER_STAT_MACRCV_ERRORS,
261 
262 	/* MII/GMII stats */
263 	ETHER_STAT_XCVR_ADDR,
264 	ETHER_STAT_XCVR_ID,
265 	ETHER_STAT_XCVR_INUSE,
266 	ETHER_STAT_CAP_1000FDX,
267 	ETHER_STAT_CAP_1000HDX,
268 	ETHER_STAT_CAP_100FDX,
269 	ETHER_STAT_CAP_100HDX,
270 	ETHER_STAT_CAP_10FDX,
271 	ETHER_STAT_CAP_10HDX,
272 	ETHER_STAT_CAP_ASMPAUSE,
273 	ETHER_STAT_CAP_PAUSE,
274 	ETHER_STAT_CAP_AUTONEG,
275 	ETHER_STAT_ADV_CAP_1000FDX,
276 	ETHER_STAT_ADV_CAP_1000HDX,
277 	ETHER_STAT_ADV_CAP_100FDX,
278 	ETHER_STAT_ADV_CAP_100HDX,
279 	ETHER_STAT_ADV_CAP_10FDX,
280 	ETHER_STAT_ADV_CAP_10HDX,
281 	ETHER_STAT_ADV_CAP_ASMPAUSE,
282 	ETHER_STAT_ADV_CAP_PAUSE,
283 	ETHER_STAT_ADV_CAP_AUTONEG,
284 	ETHER_STAT_LP_CAP_1000FDX,
285 	ETHER_STAT_LP_CAP_1000HDX,
286 	ETHER_STAT_LP_CAP_100FDX,
287 	ETHER_STAT_LP_CAP_100HDX,
288 	ETHER_STAT_LP_CAP_10FDX,
289 	ETHER_STAT_LP_CAP_10HDX,
290 	ETHER_STAT_LP_CAP_ASMPAUSE,
291 	ETHER_STAT_LP_CAP_PAUSE,
292 	ETHER_STAT_LP_CAP_AUTONEG,
293 	ETHER_STAT_LINK_ASMPAUSE,
294 	ETHER_STAT_LINK_PAUSE,
295 	ETHER_STAT_LINK_AUTONEG,
296 	ETHER_STAT_LINK_DUPLEX,
297 
298 	ETHER_STAT_TOOSHORT_ERRORS,
299 	ETHER_STAT_CAP_REMFAULT,
300 	ETHER_STAT_ADV_REMFAULT,
301 	ETHER_STAT_LP_REMFAULT,
302 
303 	ETHER_STAT_JABBER_ERRORS,
304 	ETHER_STAT_CAP_100T4,
305 	ETHER_STAT_ADV_CAP_100T4,
306 	ETHER_STAT_LP_CAP_100T4,
307 
308 	ETHER_STAT_CAP_10GFDX,
309 	ETHER_STAT_ADV_CAP_10GFDX,
310 	ETHER_STAT_LP_CAP_10GFDX,
311 
312 	ETHER_STAT_CAP_40GFDX,
313 	ETHER_STAT_ADV_CAP_40GFDX,
314 	ETHER_STAT_LP_CAP_40GFDX,
315 
316 	ETHER_STAT_CAP_100GFDX,
317 	ETHER_STAT_ADV_CAP_100GFDX,
318 	ETHER_STAT_LP_CAP_100GFDX,
319 
320 	ETHER_STAT_CAP_2500FDX,
321 	ETHER_STAT_ADV_CAP_2500FDX,
322 	ETHER_STAT_LP_CAP_2500FDX,
323 
324 	ETHER_STAT_CAP_5000FDX,
325 	ETHER_STAT_ADV_CAP_5000FDX,
326 	ETHER_STAT_LP_CAP_5000FDX,
327 
328 	ETHER_STAT_CAP_25GFDX,
329 	ETHER_STAT_ADV_CAP_25GFDX,
330 	ETHER_STAT_LP_CAP_25GFDX,
331 
332 	ETHER_STAT_CAP_50GFDX,
333 	ETHER_STAT_ADV_CAP_50GFDX,
334 	ETHER_STAT_LP_CAP_50GFDX,
335 
336 	ETHER_STAT_CAP_200GFDX,
337 	ETHER_STAT_ADV_CAP_200GFDX,
338 	ETHER_STAT_LP_CAP_200GFDX,
339 
340 	ETHER_STAT_CAP_400GFDX,
341 	ETHER_STAT_ADV_CAP_400GFDX,
342 	ETHER_STAT_LP_CAP_400GFDX,
343 };
344 
345 #define	ETHER_NSTAT	\
346 	(ETHER_STAT_LP_CAP_400GFDX - ETHER_STAT_ALIGN_ERRORS + 1)
347 
348 #define	ETHER_STAT_ISACOUNTER(_ether_stat)				\
349 	    ((_ether_stat) == ETHER_STAT_ALIGN_ERRORS ||		\
350 		(_ether_stat) == ETHER_STAT_FCS_ERRORS ||		\
351 		(_ether_stat) == ETHER_STAT_FIRST_COLLISIONS ||		\
352 		(_ether_stat) == ETHER_STAT_MULTI_COLLISIONS ||		\
353 		(_ether_stat) == ETHER_STAT_SQE_ERRORS ||		\
354 		(_ether_stat) == ETHER_STAT_DEFER_XMTS ||		\
355 		(_ether_stat) == ETHER_STAT_TX_LATE_COLLISIONS ||	\
356 		(_ether_stat) == ETHER_STAT_EX_COLLISIONS ||		\
357 		(_ether_stat) == ETHER_STAT_MACXMT_ERRORS ||		\
358 		(_ether_stat) == ETHER_STAT_CARRIER_ERRORS ||		\
359 		(_ether_stat) == ETHER_STAT_TOOLONG_ERRORS ||		\
360 		(_ether_stat) == ETHER_STAT_TOOSHORT_ERRORS ||		\
361 		(_ether_stat) == ETHER_STAT_JABBER_ERRORS ||		\
362 		(_ether_stat) == ETHER_STAT_MACRCV_ERRORS)
363 
364 #endif	/* _KERNEL */
365 
366 #ifdef	__cplusplus
367 }
368 #endif
369 
370 #endif /* _SYS_MAC_ETHER_H */
371