Skip to content

Commit 60e1f13

Browse files
rmustaccdanmcd
authored andcommitted
15445 mlxcx MAC_PROP_MEDIA support
Change-Id: I4b63e2b4ccb6f0a11c25e69cb99459e28a994b6c
1 parent 3a4adfa commit 60e1f13

File tree

1 file changed

+121
-0
lines changed

1 file changed

+121
-0
lines changed

usr/src/uts/common/io/mlxcx/mlxcx_gld.c

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
* Copyright (c) 2021, the University of Queensland
1414
* Copyright 2020 RackTop Systems, Inc.
1515
* Copyright 2023 MNX Cloud, Inc.
16+
* Copyright 2023 Oxide Computer Company
1617
*/
1718

1819
/*
@@ -29,6 +30,7 @@
2930
#include <sys/dlpi.h>
3031

3132
#include <sys/mac_provider.h>
33+
#include <sys/mac_ether.h>
3234

3335
/* Need these for mac_vlan_header_info() */
3436
#include <sys/mac_client.h>
@@ -200,6 +202,119 @@ mlxcx_link_fec_cap(link_fec_t fec, mlxcx_pplm_fec_caps_t *pfecp)
200202
return (B_TRUE);
201203
}
202204

205+
static mac_ether_media_t
206+
mlxcx_mac_media(mlxcx_port_t *port)
207+
{
208+
switch (port->mlp_oper_status) {
209+
case MLXCX_PORT_STATUS_UP:
210+
case MLXCX_PORT_STATUS_UP_ONCE:
211+
break;
212+
case MLXCX_PORT_STATUS_DOWN:
213+
return (ETHER_MEDIA_NONE);
214+
case MLXCX_PORT_STATUS_DISABLED:
215+
return (ETHER_MEDIA_UNKNOWN);
216+
}
217+
218+
switch (port->mlp_oper_proto) {
219+
case MLXCX_PROTO_SGMII:
220+
return (ETHER_MEDIA_1000_SGMII);
221+
case MLXCX_PROTO_1000BASE_KX:
222+
return (ETHER_MEDIA_1000BASE_KX);
223+
case MLXCX_PROTO_10GBASE_CX4:
224+
return (ETHER_MEDIA_10GBASE_CX4);
225+
case MLXCX_PROTO_10GBASE_KX4:
226+
return (ETHER_MEDIA_10GBASE_KX4);
227+
case MLXCX_PROTO_10GBASE_KR:
228+
return (ETHER_MEDIA_10GBASE_KR);
229+
case MLXCX_PROTO_40GBASE_CR4:
230+
return (ETHER_MEDIA_40GBASE_CR4);
231+
case MLXCX_PROTO_40GBASE_KR4:
232+
return (ETHER_MEDIA_40GBASE_KR4);
233+
case MLXCX_PROTO_SGMII_100BASE:
234+
return (ETHER_MEDIA_100_SGMII);
235+
case MLXCX_PROTO_10GBASE_CR:
236+
return (ETHER_MEDIA_10GBASE_CR);
237+
case MLXCX_PROTO_10GBASE_SR:
238+
return (ETHER_MEDIA_10GBASE_SR);
239+
case MLXCX_PROTO_10GBASE_ER_LR:
240+
return (ETHER_MEDIA_10GBASE_LR);
241+
case MLXCX_PROTO_40GBASE_SR4:
242+
return (ETHER_MEDIA_40GBASE_SR4);
243+
case MLXCX_PROTO_40GBASE_LR4_ER4:
244+
return (ETHER_MEDIA_40GBASE_LR4);
245+
case MLXCX_PROTO_50GBASE_SR2:
246+
return (ETHER_MEDIA_50GBASE_SR2);
247+
case MLXCX_PROTO_100GBASE_CR4:
248+
return (ETHER_MEDIA_100GBASE_CR4);
249+
case MLXCX_PROTO_100GBASE_SR4:
250+
return (ETHER_MEDIA_100GBASE_SR4);
251+
case MLXCX_PROTO_100GBASE_KR4:
252+
return (ETHER_MEDIA_100GBASE_KR4);
253+
case MLXCX_PROTO_25GBASE_CR:
254+
return (ETHER_MEDIA_25GBASE_CR);
255+
case MLXCX_PROTO_25GBASE_KR:
256+
return (ETHER_MEDIA_25GBASE_KR);
257+
case MLXCX_PROTO_25GBASE_SR:
258+
return (ETHER_MEDIA_25GBASE_SR);
259+
case MLXCX_PROTO_50GBASE_CR2:
260+
return (ETHER_MEDIA_50GBASE_CR2);
261+
case MLXCX_PROTO_50GBASE_KR2:
262+
return (ETHER_MEDIA_50GBASE_KR2);
263+
default:
264+
/* FALLTHRU */
265+
break;
266+
}
267+
268+
switch (port->mlp_ext_oper_proto) {
269+
case MLXCX_EXTPROTO_SGMII_100BASE:
270+
return (ETHER_MEDIA_100_SGMII);
271+
case MLXCX_EXTPROTO_1000BASE_X_SGMII:
272+
return (ETHER_MEDIA_1000_SGMII);
273+
case MLXCX_EXTPROTO_5GBASE_R:
274+
return (ETHER_MEDIA_5000BASE_KR); /* XXX KEBE ASKS use _KR ? */
275+
case MLXCX_EXTPROTO_10GBASE_XFI_XAUI_1:
276+
return (ETHER_MEDIA_10G_XAUI);
277+
case MLXCX_EXTPROTO_40GBASE_XLAUI_4_XLPPI_4:
278+
return (ETHER_MEDIA_40G_XLPPI);
279+
case MLXCX_EXTPROTO_25GAUI_1_25GBASE_CR_KR:
280+
return (ETHER_MEDIA_25G_AUI);
281+
case MLXCX_EXTPROTO_50GAUI_2_LAUI_2_50GBASE_CR2_KR2:
282+
case MLXCX_EXTPROTO_50GAUI_1_LAUI_1_50GBASE_CR_KR:
283+
/* No type for 50G AUI as far as I can see. */
284+
return (ETHER_MEDIA_UNKNOWN);
285+
case MLXCX_EXTPROTO_CAUI_4_100GBASE_CR4_KR4:
286+
return (ETHER_MEDIA_100GBASE_CAUI4);
287+
case MLXCX_EXTPROTO_100GAUI_2_100GBASE_CR2_KR2:
288+
case MLXCX_EXTPROTO_100GAUI_1_100GBASE_CR_KR:
289+
/* No type for 100G AUI as far as I can see. */
290+
return (ETHER_MEDIA_UNKNOWN);
291+
/*
292+
* NOTE: These report unsupported but keeping them in active code for
293+
* detection purposes.
294+
*/
295+
case MLXCX_EXTPROTO_200GAUI_4_200GBASE_CR4_KR4:
296+
return (ETHER_MEDIA_200GAUI_4);
297+
case MLXCX_EXTPROTO_200GAUI_2_200GBASE_CR2_KR2:
298+
return (ETHER_MEDIA_200GAUI_2);
299+
case MLXCX_EXTPROTO_400GAUI_8_400GBASE_CR8:
300+
return (ETHER_MEDIA_400GAUI_8);
301+
case MLXCX_EXTPROTO_400GAUI_4_400GBASE_CR4:
302+
return (ETHER_MEDIA_400GAUI_4);
303+
default:
304+
/*
305+
* There ARE legitimate single-bit values we don't support,
306+
* and should just return 0 immediately. We will ASSERT()
307+
* that it's a single-bit value, however.
308+
*/
309+
/* This check should work okay for 0 too. */
310+
ASSERT0((uint32_t)port->mlp_ext_oper_proto &
311+
((uint32_t)port->mlp_ext_oper_proto - 1U));
312+
break;
313+
}
314+
315+
return (ETHER_MEDIA_UNKNOWN);
316+
}
317+
203318
static int
204319
mlxcx_mac_stat_rfc_2863(mlxcx_t *mlxp, mlxcx_port_t *port, uint_t stat,
205320
uint64_t *val)
@@ -340,6 +455,9 @@ mlxcx_mac_stat(void *arg, uint_t stat, uint64_t *val)
340455
case MAC_STAT_NORCVBUF:
341456
*val = port->mlp_stats.mlps_rx_drops;
342457
break;
458+
case ETHER_STAT_XCVR_INUSE:
459+
*val = (uint64_t)mlxcx_mac_media(port);
460+
break;
343461
default:
344462
ret = ENOTSUP;
345463
}
@@ -1453,6 +1571,9 @@ mlxcx_mac_getprop(void *arg, const char *pr_name, mac_prop_id_t pr_num,
14531571
*(link_state_t *)pr_val = LINK_STATE_UNKNOWN;
14541572
}
14551573
break;
1574+
case MAC_PROP_MEDIA:
1575+
*(mac_ether_media_t *)pr_val = mlxcx_mac_media(port);
1576+
break;
14561577
case MAC_PROP_AUTONEG:
14571578
if (pr_valsize < sizeof (uint8_t)) {
14581579
ret = EOVERFLOW;

0 commit comments

Comments
 (0)