Skip to content

Commit

Permalink
Wire up cable_type plumbing for CX-6+ (may need cleanup)
Browse files Browse the repository at this point in the history
  • Loading branch information
danmcd committed Oct 30, 2023
1 parent 59d1bb0 commit 38303ff
Show file tree
Hide file tree
Showing 4 changed files with 176 additions and 23 deletions.
2 changes: 1 addition & 1 deletion usr/src/uts/common/io/mlxcx/mlxcx.h
Original file line number Diff line number Diff line change
Expand Up @@ -396,7 +396,7 @@ struct mlxcx_port {
mlxcx_ext_eth_proto_t mlp_ext_oper_proto;
mlxcx_pplm_fec_active_t mlp_fec_active;
link_fec_t mlp_fec_requested;

mlxcx_cable_type_t mlp_cable_type;
mlxcx_eth_inline_mode_t mlp_wqe_min_inline;

/* Root flow tables */
Expand Down
18 changes: 17 additions & 1 deletion usr/src/uts/common/io/mlxcx/mlxcx_cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -2025,7 +2025,23 @@ mlxcx_cmd_query_port_speed(mlxcx_t *mlxp, mlxcx_port_t *mlp)
* Cache results, maybe even in a form we can directly
* report back in combination with mlp{,_ext}_*_proto.
*/
/* XXX KEBE SAYS FILL ME IN! */

/*
* This is a register where we need to specify a page
* index.
*/
mlxcx_reg_pddr_t *pddr = &data.mlrd_pddr;

bzero(&data, sizeof (data));
pddr->mlrc_pddr_local_port = mlp->mlp_num + 1;

/* XXX KEBE SAYS nicer #define or enum here... */
pddr->mlrd_pddr_page_select = 0x8;
ret = mlxcx_cmd_access_register(mlxp,
MLXCX_CMD_ACCESS_REGISTER_READ, &data);
/* XXX KEBE SAYS here too... */
mlp->mlp_cable_type =
pddr->mlrd_pddr_pages.pddr_modinfo.cable_type;
}
}

Expand Down
167 changes: 147 additions & 20 deletions usr/src/uts/common/io/mlxcx/mlxcx_gld.c
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,8 @@ mlxcx_link_fec_cap(link_fec_t fec, mlxcx_pplm_fec_caps_t *pfecp)
static mac_ether_media_t
mlxcx_mac_media(mlxcx_port_t *port)
{
mlxcx_cable_type_t cable_type = port->mlxcx_cable_type;

switch (port->mlp_oper_status) {
case MLXCX_PORT_STATUS_UP:
case MLXCX_PORT_STATUS_UP_ONCE:
Expand All @@ -208,55 +210,179 @@ mlxcx_mac_media(mlxcx_port_t *port)
return (ETHER_MEDIA_UNKNOWN);
}


/* XXX KEBE SAYS Uggh, pardon the goto. Trading it for less indents. */
if (!port->mlp_mlx->mlx_caps->mlc_ext)
goto skip_ext;

/*
* Same issue as mlxcx_speed_to_bits(): this information can be in one
* of two different bit vectors. Same approach as well, check new ones
* first, as we have known parts that set one bit in oper_proto AND
* one bit in ext_oper_proto.
*
* NOTE: FreeBSD has a table lookup for ext_proto based on both
* ext_oper_proto AND the cable type. For now we do second-level
* check on port->mlp_cable_type in certain cases.
*
* XXX KEBE SAYS FOR NOW be identical to FreeBSD's behavior unless
* noted.
*/

switch (port->mlp_ext_oper_proto) {
case MLXCX_EXTPROTO_NONE: /* Aka 0 */
break;
case MLXCX_EXTPROTO_SGMII_100BASE:
return (ETHER_MEDIA_100_SGMII);
case MLXCX_EXTPROTO_1000BASE_X_SGMII:
return (ETHER_MEDIA_1000_SGMII);
/* XXX KEBE SAYS FreeBSD returns 1000_CX by default here... */
return (cable_type == MLXCX_CABLE_TYPE_OPTICAL_MODULE ?
ETHER_MEDIA_1000_SX : ETHER_MEDIA_1000_SGMII);
case MLXCX_EXTPROTO_5GBASE_R:
return (ETHER_MEDIA_5000BASE_KR); /* XXX KEBE ASKS use _KR ? */
return (cable_type == MLXCX_CABLE_TYPE_TWISTED_PAIR ?
ETHER_MEDIA_5000BASE_T : ETHER_MEDIA_5000BASE_KR);
case MLXCX_EXTPROTO_10GBASE_XFI_XAUI_1:
return (ETHER_MEDIA_10G_XAUI);
switch (cable_type) {
case MLXCX_CABLE_TYPE_PASSIVE_COPPER:
return (ETHER_MEDIA_10GBASE_CR);
case MLXCX_CABLE_TYPE_OPTICAL_MODULE:
return (ETHER_MEDIA_10GBASE_SR);
case MLXCX_CABLE_TYPE_ACTIVE:
case MLXCX_CABLE_TYPE_TWISTED_PAIR:
default:
/* XXX KEBE SAYS FreeBSD returns 10GBASE_KR here. */
/* return (ETHER_MEDIA_10G_XAUI); */
return (ETHER_MEDIA_10G_KR);
}
case MLXCX_EXTPROTO_40GBASE_XLAUI_4_XLPPI_4:
return (ETHER_MEDIA_40G_XLPPI);
switch (cable_type) {
case MLXCX_CABLE_TYPE_PASSIVE_COPPER:
return (ETHER_MEDIA_40GBASE_CR4);
case MLXCX_CABLE_TYPE_OPTICAL_MODULE:
return (ETHER_MEDIA_40GBASE_SR4);
case MLXCX_CABLE_TYPE_ACTIVE:
case MLXCX_CABLE_TYPE_TWISTED_PAIR:
default:
/* XXX KEBE SAYS FreeBSD returns 40GBASE_KR4 here. */
/* return (ETHER_MEDIA_40G_XLAUI); */
return (ETHER_MEDIA_40G_KR4);
}
case MLXCX_EXTPROTO_25GAUI_1_25GBASE_CR_KR:
return (ETHER_MEDIA_25G_AUI);
switch (cable_type) {
case MLXCX_CABLE_TYPE_PASSIVE_COPPER:
return (ETHER_MEDIA_25GBASE_CR);
case MLXCX_CABLE_TYPE_OPTICAL_MODULE:
return (ETHER_MEDIA_25GBASE_SR);
case MLXCX_CABLE_TYPE_TWISTED_PAIR:
return (ETHER_MEDIA_25GBASE_T);
case MLXCX_CABLE_TYPE_ACTIVE:
default:
/* XXX KEBE SAYS FreeBSD returns 25GBASE_KR here. */
return (ETHER_MEDIA_25G_AUI);
}
case MLXCX_EXTPROTO_50GAUI_2_LAUI_2_50GBASE_CR2_KR2:
/* No type for 50G AUI2 as far as I can see. */
/* XXX KEBE ASKS, add new one like CAUI4 (e.g. LAUI2?) */
return (ETHER_MEDIA_50GBASE_CR2);
switch (cable_type) {
case MLXCX_CABLE_TYPE_PASSIVE_COPPER:
return (ETHER_MEDIA_50GBASE_CR2);
case MLXCX_CABLE_TYPE_OPTICAL_MODULE:
return (ETHER_MEDIA_50GBASE_SR2);
case MLXCX_CABLE_TYPE_ACTIVE:
case MLXCX_CABLE_TYPE_TWISTED_PAIR:
default:
return (ETHER_MEDIA_50GBASE_KR2);
}
case MLXCX_EXTPROTO_50GAUI_1_LAUI_1_50GBASE_CR_KR:
/* No type for 50G AUI as far as I can see. */
/* XXX KEBE ASKS, add new one like CAUI4 (e.g. LAUI?) */
return (ETHER_MEDIA_50GBASE_CR);
/* XXX KEBE SAYS FreeBSD returns "_PAM4" values here. */
switch (cable_type) {
case MLXCX_CABLE_TYPE_PASSIVE_COPPER:
return (ETHER_MEDIA_50GBASE_CR);
case MLXCX_CABLE_TYPE_OPTICAL_MODULE:
return (ETHER_MEDIA_50GBASE_SR);
case MLXCX_CABLE_TYPE_ACTIVE:
case MLXCX_CABLE_TYPE_TWISTED_PAIR:
default:
return (ETHER_MEDIA_50GBASE_KR);
}
case MLXCX_EXTPROTO_CAUI_4_100GBASE_CR4_KR4:
/* XXX KEBE ASKS, or return 100GBASE_CR4? */
return (ETHER_MEDIA_100GBASE_CAUI4);
switch (cable_type) {
case MLXCX_CABLE_TYPE_PASSIVE_COPPER:
return (ETHER_MEDIA_100GBASE_CR4);
case MLXCX_CABLE_TYPE_OPTICAL_MODULE:
return (ETHER_MEDIA_100GBASE_SR4);
case MLXCX_CABLE_TYPE_ACTIVE:
case MLXCX_CABLE_TYPE_TWISTED_PAIR:
default:
/* XXX KEBE SAYS FreeBSD returns 100GBASE_KR4 here. */
/* return (ETHER_MEDIA_100GBASE_CAUI4); */
return (ETHER_MEDIA_100GBASE_KR);
}
case MLXCX_EXTPROTO_100GAUI_2_100GBASE_CR2_KR2:
switch (cable_type) {
case MLXCX_CABLE_TYPE_PASSIVE_COPPER:
/* XXX FreeBSD returns 100GBASE_CP2 (PAM4 notation?) */
return (ETHER_MEDIA_100GBASE_CR2);
case MLXCX_CABLE_TYPE_OPTICAL_MODULE:
return (ETHER_MEDIA_100GBASE_SR2);
case MLXCX_CABLE_TYPE_ACTIVE:
case MLXCX_CABLE_TYPE_TWISTED_PAIR:
default:
/* XXX FreeBSD returns 100GBASE_KR4 (FreeBSD typo?) */
return (ETHER_MEDIA_100GBASE_KR2);
}
case MLXCX_EXTPROTO_100GAUI_1_100GBASE_CR_KR:
/* No type for 100G AUI as far as I can see. */
return (ETHER_MEDIA_UNKNOWN);
switch (cable_type) {
case MLXCX_CABLE_TYPE_PASSIVE_COPPER:
/* XXX FreeBSD returns 100GBASE_CR_PAM4 */
return (ETHER_MEDIA_100GBASE_CR);
case MLXCX_CABLE_TYPE_OPTICAL_MODULE:
/* XXX FreeBSD returns 100GBASE_SR2 (FreeBSD typo?) */
return (ETHER_MEDIA_100GBASE_SR);
case MLXCX_CABLE_TYPE_ACTIVE:
case MLXCX_CABLE_TYPE_TWISTED_PAIR:
default:
return (ETHER_MEDIA_100GBASE_KR);
}
/*
* NOTE: These report unsupported but keeping them in active code for
* detection purposes.
*/
case MLXCX_EXTPROTO_200GAUI_4_200GBASE_CR4_KR4:
return (ETHER_MEDIA_200GAUI_4);
switch (cable_type) {
case MLXCX_CABLE_TYPE_PASSIVE_COPPER:
/* XXX FreeBSD returns 200GBASE_CR_PAM4 */
return (ETHER_MEDIA_200GBASE_CR4);
case MLXCX_CABLE_TYPE_OPTICAL_MODULE:
return (ETHER_MEDIA_200GBASE_SR4);
case MLXCX_CABLE_TYPE_ACTIVE:
case MLXCX_CABLE_TYPE_TWISTED_PAIR:
default:
return (ETHER_MEDIA_200GBASE_KR4);
}
case MLXCX_EXTPROTO_200GAUI_2_200GBASE_CR2_KR2:
return (ETHER_MEDIA_200GAUI_2);
switch (cable_type) {
case MLXCX_CABLE_TYPE_PASSIVE_COPPER:
/* XXX FreeBSD returns 200GBASE_CR_PAM4 */
return (ETHER_MEDIA_200GBASE_CR2);
case MLXCX_CABLE_TYPE_OPTICAL_MODULE:
return (ETHER_MEDIA_200GBASE_SR2);
case MLXCX_CABLE_TYPE_ACTIVE:
case MLXCX_CABLE_TYPE_TWISTED_PAIR:
default:
return (ETHER_MEDIA_200GBASE_KR2);
}
case MLXCX_EXTPROTO_400GAUI_8:
return (ETHER_MEDIA_400GAUI_8);
return (ETHER_MEDIA_400GBASE_LR8);
case MLXCX_EXTPROTO_400GAUI_4_400GBASE_CR4_KR4:
return (ETHER_MEDIA_400GAUI_4);
/* XXX FreeBSD returns 400GBASE_LR8 in all cases. */
switch (cable_type) {
case MLXCX_CABLE_TYPE_PASSIVE_COPPER:
return (ETHER_MEDIA_400GBASE_CR4);
case MLXCX_CABLE_TYPE_OPTICAL_MODULE:
return (ETHER_MEDIA_400GBASE_SR4);
case MLXCX_CABLE_TYPE_ACTIVE:
case MLXCX_CABLE_TYPE_TWISTED_PAIR:
default:
return (ETHER_MEDIA_400GBASE_KR4);
}
default:
/*
* We've checked for 0 explicitly above, so don't worry here.
Expand All @@ -270,6 +396,7 @@ mlxcx_mac_media(mlxcx_port_t *port)
break;
}

skip_ext:
switch (port->mlp_oper_proto) {
case MLXCX_PROTO_SGMII:
return (ETHER_MEDIA_1000_SGMII);
Expand Down
12 changes: 11 additions & 1 deletion usr/src/uts/common/io/mlxcx/mlxcx_reg.h
Original file line number Diff line number Diff line change
Expand Up @@ -2328,6 +2328,15 @@ typedef enum {
MLXCX_EXTPROTO_SGMII = 1UL << 31,
} mlxcx_ext_eth_proto_t;

typedef enum {
MLXCX_CABLE_TYPE_UNKNOWN = 0,
MLXCX_CABLE_TYPE_ACTIVE = 1,
MLXCX_CABLE_TYPE_OPTICAL_MODULE = 2,
MLXCX_CABLE_TYPE_PASSIVE_COPPER = 3,
MLXCX_CABLE_TYPE_UNPLUGGED = 4,
MLXCX_CABLE_TYPE_TWISTED_PAIR = 5,
} mlxcx_cable_type_t;

#define MLXCX_PROTO_100M (MLXCX_PROTO_SGMII_100BASE | \
MLXCX_PROTO_100BASE_T)
#define MLXCX_EXTPROTO_100M MLXCX_EXTPROTO_SGMII_100BASE
Expand Down Expand Up @@ -2432,7 +2441,8 @@ typedef struct {
uint8_t ext_ethernet_compliance_code;
uint8_t ethernet_compliance_code;
/* High four bits are type, low four are vendor. */
uint8_t cable_type_and_vendor;
uint8_t cable_type : 4;
uint8_t cable_vendor : 4;
uint8_t cable_length;
uint8_t cable_identifier;
uint8_t cable_power_class;
Expand Down

0 comments on commit 38303ff

Please sign in to comment.