git: 32fdad17f060 - stable/14 - bnxt_en: 400G speed support
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 27 Apr 2025 22:06:12 UTC
The branch stable/14 has been updated by imp:
URL: https://cgit.FreeBSD.org/src/commit/?id=32fdad17f0603a57ba2b917a7083d77193d06dd8
commit 32fdad17f0603a57ba2b917a7083d77193d06dd8
Author: Sreekanth Reddy <sreekanth.reddy@broadcom.com>
AuthorDate: 2025-04-02 09:39:53 +0000
Commit: Warner Losh <imp@FreeBSD.org>
CommitDate: 2025-04-27 22:02:59 +0000
bnxt_en: 400G speed support
Added 400G speed module support.
MFC-After: 3 days
Differential-Revision: https://reviews.freebsd.org/D49729
(cherry picked from commit dac78335c42dce2ce9daf5856539510a42d7d8cd)
---
sys/dev/bnxt/bnxt_en/bnxt.h | 18 +-
sys/dev/bnxt/bnxt_en/bnxt_hwrm.c | 34 ++-
sys/dev/bnxt/bnxt_en/if_bnxt.c | 524 +++++++++++++++++++++++++++++----------
3 files changed, 441 insertions(+), 135 deletions(-)
diff --git a/sys/dev/bnxt/bnxt_en/bnxt.h b/sys/dev/bnxt/bnxt_en/bnxt.h
index 1b928fa9c2fe..eff1976a7954 100644
--- a/sys/dev/bnxt/bnxt_en/bnxt.h
+++ b/sys/dev/bnxt/bnxt_en/bnxt.h
@@ -411,12 +411,19 @@ struct bnxt_link_info {
uint16_t link_speed;
uint16_t support_speeds;
+ uint16_t support_speeds2;
uint16_t support_pam4_speeds;
uint16_t auto_link_speeds;
+ uint16_t auto_link_speeds2;
uint16_t auto_pam4_link_speeds;
uint16_t force_link_speed;
+ uint16_t force_link_speeds2;
uint16_t force_pam4_link_speed;
- bool force_pam4_speed_set_by_user;
+
+ bool force_pam4_speed;
+ bool force_speed2_nrz;
+ bool force_pam4_56_speed2;
+ bool force_pam4_112_speed2;
uint16_t advertising;
uint16_t advertising_pam4;
@@ -426,8 +433,11 @@ struct bnxt_link_info {
uint16_t support_force_speeds;
uint16_t support_pam4_auto_speeds;
uint16_t support_pam4_force_speeds;
+ uint16_t support_auto_speeds2;
+ uint16_t support_force_speeds2;
#define BNXT_SIG_MODE_NRZ HWRM_PORT_PHY_QCFG_OUTPUT_SIGNAL_MODE_NRZ
#define BNXT_SIG_MODE_PAM4 HWRM_PORT_PHY_QCFG_OUTPUT_SIGNAL_MODE_PAM4
+#define BNXT_SIG_MODE_PAM4_112 HWRM_PORT_PHY_QCFG_OUTPUT_SIGNAL_MODE_PAM4_112
uint8_t req_signal_mode;
uint8_t active_fec_sig_mode;
@@ -447,7 +457,13 @@ enum bnxt_phy_type {
BNXT_MEDIA_CR = 0,
BNXT_MEDIA_LR,
BNXT_MEDIA_SR,
+ BNXT_MEDIA_ER,
BNXT_MEDIA_KR,
+ BNXT_MEDIA_AC,
+ BNXT_MEDIA_BASECX,
+ BNXT_MEDIA_BASET,
+ BNXT_MEDIA_BASEKX,
+ BNXT_MEDIA_BASESGMII,
BNXT_MEDIA_END
};
diff --git a/sys/dev/bnxt/bnxt_en/bnxt_hwrm.c b/sys/dev/bnxt/bnxt_en/bnxt_hwrm.c
index 214866b766db..10c3beac9729 100644
--- a/sys/dev/bnxt/bnxt_en/bnxt_hwrm.c
+++ b/sys/dev/bnxt/bnxt_en/bnxt_hwrm.c
@@ -1369,15 +1369,24 @@ bnxt_hwrm_set_link_common(struct bnxt_softc *softc,
req->flags |=
htole32(HWRM_PORT_PHY_CFG_INPUT_FLAGS_RESTART_AUTONEG);
} else {
- req->flags |= htole32(HWRM_PORT_PHY_CFG_INPUT_FLAGS_FORCE);
- if (link_info->force_pam4_speed_set_by_user) {
+ if (link_info->force_speed2_nrz ||
+ link_info->force_pam4_56_speed2 ||
+ link_info->force_pam4_112_speed2) {
+ req->force_link_speeds2 = htole16(fw_link_speed);
+ req->enables |= htole32(HWRM_PORT_PHY_CFG_INPUT_ENABLES_FORCE_LINK_SPEEDS2);
+ link_info->force_speed2_nrz = false;
+ link_info->force_pam4_56_speed2 = false;
+ link_info->force_pam4_112_speed2 = false;
+ } else if (link_info->force_pam4_speed) {
req->force_pam4_link_speed = htole16(fw_link_speed);
req->enables |= htole32(HWRM_PORT_PHY_CFG_INPUT_ENABLES_FORCE_PAM4_LINK_SPEED);
- link_info->force_pam4_speed_set_by_user = false;
+ link_info->force_pam4_speed = false;
} else {
req->force_link_speed = htole16(fw_link_speed);
}
+
+ req->flags |= htole32(HWRM_PORT_PHY_CFG_INPUT_FLAGS_FORCE);
}
/* tell chimp that the setting takes effect immediately */
@@ -2832,7 +2841,7 @@ int bnxt_read_sfp_module_eeprom_info(struct bnxt_softc *softc, uint16_t i2c_addr
HWRM_PORT_PHY_I2C_READ_INPUT_ENABLES_PAGE_OFFSET : 0) |
(bank_sel_en ?
HWRM_PORT_PHY_I2C_READ_INPUT_ENABLES_BANK_NUMBER : 0));
- rc = hwrm_send_message(softc, &req, sizeof(req));
+ rc = _hwrm_send_message(softc, &req, sizeof(req));
if (!rc)
memcpy(buf + byte_offset, output->data, xfer_size);
byte_offset += xfer_size;
@@ -2932,6 +2941,10 @@ bnxt_hwrm_port_phy_qcfg(struct bnxt_softc *softc)
if (softc->hwrm_spec_code >= 0x10504)
link_info->active_fec_sig_mode = resp->active_fec_signal_mode;
+ link_info->support_speeds2 = le16toh(resp->support_speeds2);
+ link_info->auto_link_speeds2 = le16toh(resp->auto_link_speeds2);
+ link_info->force_link_speeds2 = le16toh(resp->force_link_speeds2);
+
exit:
BNXT_HWRM_UNLOCK(softc);
return rc;
@@ -2943,7 +2956,9 @@ bnxt_phy_qcaps_no_speed(struct hwrm_port_phy_qcaps_output *resp)
if (!resp->supported_speeds_auto_mode &&
!resp->supported_speeds_force_mode &&
!resp->supported_pam4_speeds_auto_mode &&
- !resp->supported_pam4_speeds_force_mode)
+ !resp->supported_pam4_speeds_force_mode &&
+ !resp->supported_speeds2_auto_mode &&
+ !resp->supported_speeds2_force_mode)
return true;
return false;
@@ -2986,6 +3001,7 @@ int bnxt_hwrm_phy_qcaps(struct bnxt_softc *softc)
/* Phy re-enabled, reprobe the speeds */
link_info->support_auto_speeds = 0;
link_info->support_pam4_auto_speeds = 0;
+ link_info->support_auto_speeds2 = 0;
}
}
if (resp->supported_speeds_auto_mode)
@@ -3001,6 +3017,14 @@ int bnxt_hwrm_phy_qcaps(struct bnxt_softc *softc)
link_info->support_pam4_force_speeds =
le16toh(resp->supported_pam4_speeds_force_mode);
+ if (resp->supported_speeds2_auto_mode)
+ link_info->support_auto_speeds2 =
+ le16toh(resp->supported_speeds2_auto_mode);
+
+ if (resp->supported_speeds2_force_mode)
+ link_info->support_force_speeds2 =
+ le16toh(resp->supported_speeds2_force_mode);
+
exit:
BNXT_HWRM_UNLOCK(softc);
return rc;
diff --git a/sys/dev/bnxt/bnxt_en/if_bnxt.c b/sys/dev/bnxt/bnxt_en/if_bnxt.c
index a05a02936e40..e00f59fd390e 100644
--- a/sys/dev/bnxt/bnxt_en/if_bnxt.c
+++ b/sys/dev/bnxt/bnxt_en/if_bnxt.c
@@ -3135,17 +3135,15 @@ bnxt_media_change(if_ctx_t ctx)
struct ifmedia *ifm = iflib_get_media(ctx);
struct ifmediareq ifmr;
int rc;
+ struct bnxt_link_info *link_info = &softc->link_info;
if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
return EINVAL;
- softc->link_info.req_signal_mode =
- HWRM_PORT_PHY_QCFG_OUTPUT_SIGNAL_MODE_PAM4;
-
switch (IFM_SUBTYPE(ifm->ifm_media)) {
case IFM_100_T:
- softc->link_info.autoneg &= ~BNXT_AUTONEG_SPEED;
- softc->link_info.req_link_speed =
+ link_info->autoneg &= ~BNXT_AUTONEG_SPEED;
+ link_info->req_link_speed =
HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_100MB;
break;
case IFM_1000_KX:
@@ -3153,103 +3151,229 @@ bnxt_media_change(if_ctx_t ctx)
case IFM_1000_CX:
case IFM_1000_SX:
case IFM_1000_LX:
- softc->link_info.autoneg &= ~BNXT_AUTONEG_SPEED;
- softc->link_info.req_link_speed =
- HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_1GB;
+
+ link_info->autoneg &= ~BNXT_AUTONEG_SPEED;
+
+ if (link_info->support_speeds & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_1GB) {
+ link_info->req_link_speed = HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_1GB;
+
+ } else if (link_info->support_speeds2 & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS2_1GB) {
+ link_info->req_link_speed = HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEEDS2_1GB;
+ link_info->force_speed2_nrz = true;
+ }
+
break;
+
case IFM_2500_KX:
case IFM_2500_T:
- softc->link_info.autoneg &= ~BNXT_AUTONEG_SPEED;
- softc->link_info.req_link_speed =
+ link_info->autoneg &= ~BNXT_AUTONEG_SPEED;
+ link_info->req_link_speed =
HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_2_5GB;
break;
case IFM_10G_CR1:
case IFM_10G_KR:
case IFM_10G_LR:
case IFM_10G_SR:
- softc->link_info.autoneg &= ~BNXT_AUTONEG_SPEED;
- softc->link_info.req_link_speed =
- HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_10GB;
+
+ link_info->autoneg &= ~BNXT_AUTONEG_SPEED;
+
+ if (link_info->support_speeds & HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_10GB) {
+ link_info->req_link_speed = HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_10GB;
+
+ } else if (link_info->support_speeds2 & HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEEDS2_10GB) {
+ link_info->req_link_speed = HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEEDS2_10GB;
+ link_info->force_speed2_nrz = true;
+ }
+
break;
case IFM_20G_KR2:
- softc->link_info.autoneg &= ~BNXT_AUTONEG_SPEED;
- softc->link_info.req_link_speed =
+ link_info->autoneg &= ~BNXT_AUTONEG_SPEED;
+ link_info->req_link_speed =
HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_20GB;
break;
case IFM_25G_CR:
case IFM_25G_KR:
case IFM_25G_SR:
- softc->link_info.autoneg &= ~BNXT_AUTONEG_SPEED;
- softc->link_info.req_link_speed =
- HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_25GB;
+ case IFM_25G_LR:
+
+ link_info->autoneg &= ~BNXT_AUTONEG_SPEED;
+
+ if (link_info->support_speeds & HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_25GB) {
+ link_info->req_link_speed = HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_25GB;
+
+ } else if (link_info->support_speeds2 & HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEEDS2_25GB) {
+ link_info->req_link_speed = HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEEDS2_25GB;
+ link_info->force_speed2_nrz = true;
+ }
+
break;
+
case IFM_40G_CR4:
case IFM_40G_KR4:
case IFM_40G_LR4:
case IFM_40G_SR4:
case IFM_40G_XLAUI:
case IFM_40G_XLAUI_AC:
- softc->link_info.autoneg &= ~BNXT_AUTONEG_SPEED;
- softc->link_info.req_link_speed =
- HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_40GB;
+
+ link_info->autoneg &= ~BNXT_AUTONEG_SPEED;
+
+ if (link_info->support_speeds & HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_40GB) {
+ link_info->req_link_speed = HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_40GB;
+
+ } else if (link_info->support_speeds2 & HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEEDS2_40GB) {
+ link_info->req_link_speed = HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEEDS2_40GB;
+ link_info->force_speed2_nrz = true;
+ }
+
break;
+
case IFM_50G_CR2:
case IFM_50G_KR2:
+ case IFM_50G_KR4:
case IFM_50G_SR2:
- softc->link_info.autoneg &= ~BNXT_AUTONEG_SPEED;
- softc->link_info.req_link_speed =
- HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_50GB;
+ case IFM_50G_LR2:
+
+ link_info->autoneg &= ~BNXT_AUTONEG_SPEED;
+
+ if (link_info->support_speeds & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_50GB) {
+ link_info->req_link_speed = HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_50GB;
+
+ } else if (link_info->support_speeds2 & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS2_50GB) {
+ link_info->req_link_speed = HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEEDS2_50GB;
+ link_info->force_speed2_nrz = true;
+ }
+
break;
+
case IFM_50G_CP:
case IFM_50G_LR:
case IFM_50G_SR:
case IFM_50G_KR_PAM4:
- softc->link_info.autoneg &= ~BNXT_AUTONEG_SPEED;
- softc->link_info.req_link_speed =
- HWRM_PORT_PHY_CFG_INPUT_FORCE_PAM4_LINK_SPEED_50GB;
- softc->link_info.req_signal_mode =
- HWRM_PORT_PHY_QCFG_OUTPUT_SIGNAL_MODE_PAM4;
- softc->link_info.force_pam4_speed_set_by_user = true;
+
+ link_info->autoneg &= ~BNXT_AUTONEG_SPEED;
+
+ if (link_info->support_pam4_speeds & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_PAM4_SPEEDS_50G) {
+ link_info->req_link_speed = HWRM_PORT_PHY_CFG_INPUT_FORCE_PAM4_LINK_SPEED_50GB;
+ link_info->force_pam4_speed = true;
+
+ } else if (link_info->support_speeds2 & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS2_50GB_PAM4_56) {
+ link_info->req_link_speed = HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEEDS2_50GB_PAM4_56;
+ link_info->force_pam4_56_speed2 = true;
+ }
+
break;
+
case IFM_100G_CR4:
case IFM_100G_KR4:
case IFM_100G_LR4:
case IFM_100G_SR4:
- softc->link_info.autoneg &= ~BNXT_AUTONEG_SPEED;
- softc->link_info.req_link_speed =
- HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_100GB;
+ case IFM_100G_AUI4:
+
+ link_info->autoneg &= ~BNXT_AUTONEG_SPEED;
+
+ if (link_info->support_speeds & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_100GB) {
+ link_info->req_link_speed = HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_100GB;
+
+ } else if (link_info->support_speeds2 & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS2_100GB) {
+ link_info->req_link_speed = HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEEDS2_100GB;
+ link_info->force_speed2_nrz = true;
+ }
+
break;
+
case IFM_100G_CP2:
case IFM_100G_SR2:
- case IFM_100G_KR_PAM4:
case IFM_100G_KR2_PAM4:
- softc->link_info.autoneg &= ~BNXT_AUTONEG_SPEED;
- softc->link_info.req_link_speed =
- HWRM_PORT_PHY_CFG_INPUT_FORCE_PAM4_LINK_SPEED_100GB;
- softc->link_info.req_signal_mode =
- HWRM_PORT_PHY_QCFG_OUTPUT_SIGNAL_MODE_PAM4;
- softc->link_info.force_pam4_speed_set_by_user = true;
+ case IFM_100G_AUI2:
+
+ link_info->autoneg &= ~BNXT_AUTONEG_SPEED;
+
+ if (link_info->support_pam4_speeds & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_PAM4_SPEEDS_100G) {
+ link_info->req_link_speed = HWRM_PORT_PHY_CFG_INPUT_FORCE_PAM4_LINK_SPEED_100GB;
+ link_info->force_pam4_speed = true;
+
+ } else if (link_info->support_speeds2 & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS2_100GB_PAM4_56) {
+ link_info->req_link_speed = HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEEDS2_100GB_PAM4_56;
+ link_info->force_pam4_56_speed2 = true;
+ }
+
+ break;
+
+ case IFM_100G_KR_PAM4:
+ case IFM_100G_CR_PAM4:
+ case IFM_100G_DR:
+ case IFM_100G_AUI2_AC:
+
+ link_info->autoneg &= ~BNXT_AUTONEG_SPEED;
+
+ if (link_info->support_speeds2 & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS2_100GB_PAM4_112) {
+ link_info->req_link_speed = HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEEDS2_100GB_PAM4_112;
+ link_info->force_pam4_112_speed2 = true;
+ }
+
break;
+
case IFM_200G_SR4:
case IFM_200G_FR4:
case IFM_200G_LR4:
case IFM_200G_DR4:
case IFM_200G_CR4_PAM4:
case IFM_200G_KR4_PAM4:
- softc->link_info.autoneg &= ~BNXT_AUTONEG_SPEED;
- softc->link_info.req_link_speed =
- HWRM_PORT_PHY_CFG_INPUT_FORCE_PAM4_LINK_SPEED_200GB;
- softc->link_info.force_pam4_speed_set_by_user = true;
- softc->link_info.req_signal_mode =
- HWRM_PORT_PHY_QCFG_OUTPUT_SIGNAL_MODE_PAM4;
+
+ link_info->autoneg &= ~BNXT_AUTONEG_SPEED;
+
+ if (link_info->support_pam4_speeds & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_PAM4_SPEEDS_200G) {
+ link_info->req_link_speed = HWRM_PORT_PHY_CFG_INPUT_FORCE_PAM4_LINK_SPEED_200GB;
+ link_info->force_pam4_speed = true;
+
+ } else if (link_info->support_speeds2 & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS2_200GB_PAM4_56) {
+ link_info->req_link_speed = HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEEDS2_200GB_PAM4_56;
+ link_info->force_pam4_56_speed2 = true;
+ }
+
+ break;
+
+ case IFM_200G_AUI4:
+
+ link_info->autoneg &= ~BNXT_AUTONEG_SPEED;
+
+ if (link_info->support_speeds2 & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS2_200GB_PAM4_112) {
+ link_info->req_link_speed = HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEEDS2_200GB_PAM4_112;
+ link_info->force_pam4_112_speed2 = true;
+ }
+
break;
+
+ case IFM_400G_FR8:
+ case IFM_400G_LR8:
+ case IFM_400G_AUI8:
+ link_info->autoneg &= ~BNXT_AUTONEG_SPEED;
+
+ if (link_info->support_speeds2 & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS2_400GB_PAM4_56) {
+ link_info->req_link_speed = HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEEDS2_400GB_PAM4_56;
+ link_info->force_pam4_56_speed2 = true;
+ }
+
+ break;
+
+ case IFM_400G_AUI8_AC:
+ case IFM_400G_DR4:
+ link_info->autoneg &= ~BNXT_AUTONEG_SPEED;
+
+ if (link_info->support_speeds2 & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS2_400GB_PAM4_112) {
+ link_info->req_link_speed = HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEEDS2_400GB_PAM4_112;
+ link_info->force_pam4_112_speed2 = true;
+ }
+
+ break;
+
case IFM_1000_T:
- softc->link_info.advertising = HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_MASK_1GB;
- softc->link_info.autoneg |= BNXT_AUTONEG_SPEED;
+ link_info->advertising = HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_MASK_1GB;
+ link_info->autoneg |= BNXT_AUTONEG_SPEED;
break;
case IFM_10G_T:
- softc->link_info.advertising = HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_MASK_10GB;
- softc->link_info.autoneg |= BNXT_AUTONEG_SPEED;
+ link_info->advertising = HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_MASK_10GB;
+ link_info->autoneg |= BNXT_AUTONEG_SPEED;
break;
default:
device_printf(softc->dev,
@@ -3257,9 +3381,10 @@ bnxt_media_change(if_ctx_t ctx)
/* Fall-through */
case IFM_AUTO:
// Auto
- softc->link_info.autoneg |= BNXT_AUTONEG_SPEED;
+ link_info->autoneg |= BNXT_AUTONEG_SPEED;
break;
}
+
rc = bnxt_hwrm_set_link_setting(softc, true, true, true);
bnxt_media_status(softc->ctx, &ifmr);
return rc;
@@ -4031,57 +4156,161 @@ bnxt_probe_phy(struct bnxt_softc *softc)
}
static void
-add_media(struct bnxt_softc *softc, uint8_t media_type, uint16_t supported,
- uint16_t supported_pam4)
+add_media(struct bnxt_softc *softc, u8 media_type, u16 supported_NRZ_speeds,
+ u16 supported_pam4_speeds, u16 supported_speeds2)
{
+
switch (media_type) {
case BNXT_MEDIA_CR:
- BNXT_IFMEDIA_ADD(supported_pam4, PAM4_SPEEDS_50G, IFM_50G_CP);
- BNXT_IFMEDIA_ADD(supported_pam4, PAM4_SPEEDS_100G, IFM_100G_CP2);
- BNXT_IFMEDIA_ADD(supported_pam4, PAM4_SPEEDS_200G, IFM_200G_CR4_PAM4);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_100GB, IFM_100G_CR4);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_50GB, IFM_50G_CR2);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_40GB, IFM_40G_CR4);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_25GB, IFM_25G_CR);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_10GB, IFM_10G_CR1);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_1GB, IFM_1000_CX);
+
+ BNXT_IFMEDIA_ADD(supported_pam4_speeds, PAM4_SPEEDS_50G, IFM_50G_CP);
+ BNXT_IFMEDIA_ADD(supported_pam4_speeds, PAM4_SPEEDS_100G, IFM_100G_CP2);
+ BNXT_IFMEDIA_ADD(supported_pam4_speeds, PAM4_SPEEDS_200G, IFM_200G_CR4_PAM4);
+
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_100GB, IFM_100G_CR4);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_50GB, IFM_50G_CR2);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_40GB, IFM_40G_CR4);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_25GB, IFM_25G_CR);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_10GB, IFM_10G_CR1);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_1GB, IFM_1000_CX);
+ /* thor2 nrz*/
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_100GB, IFM_100G_CR4);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_50GB, IFM_50G_CR2);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_40GB, IFM_40G_CR4);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_25GB, IFM_25G_CR);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_10GB, IFM_10G_CR1);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_1GB, IFM_1000_CX);
+ /* thor2 PAM56 */
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_50GB_PAM4_56, IFM_50G_CP);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_100GB_PAM4_56, IFM_100G_CP2);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_200GB_PAM4_56, IFM_200G_CR4_PAM4);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_400GB_PAM4_56, IFM_400G_AUI8);
+ /* thor2 PAM112 */
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_100GB_PAM4_112, IFM_100G_CR_PAM4);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_200GB_PAM4_112, IFM_200G_AUI4);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_400GB_PAM4_112, IFM_400G_AUI8_AC);
+
break;
case BNXT_MEDIA_LR:
- BNXT_IFMEDIA_ADD(supported_pam4, PAM4_SPEEDS_50G, IFM_50G_LR);
- BNXT_IFMEDIA_ADD(supported_pam4, PAM4_SPEEDS_200G, IFM_200G_LR4);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_100GB, IFM_100G_LR4);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_50GB, IFM_50G_LR2);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_40GB, IFM_40G_LR4);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_25GB, IFM_25G_LR);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_10GB, IFM_10G_LR);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_1GB, IFM_1000_LX);
+ BNXT_IFMEDIA_ADD(supported_pam4_speeds, PAM4_SPEEDS_50G, IFM_50G_LR);
+ BNXT_IFMEDIA_ADD(supported_pam4_speeds, PAM4_SPEEDS_200G, IFM_200G_LR4);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_100GB, IFM_100G_LR4);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_50GB, IFM_50G_LR2);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_40GB, IFM_40G_LR4);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_25GB, IFM_25G_LR);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_10GB, IFM_10G_LR);
+ /* thor2 nrz*/
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_100GB, IFM_100G_LR4);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_50GB, IFM_50G_LR2);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_40GB, IFM_40G_LR4);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_25GB, IFM_25G_LR);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_10GB, IFM_10G_LR);
+ /* thor2 PAM56 */
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_50GB_PAM4_56, IFM_50G_LR);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_100GB_PAM4_56, IFM_100G_AUI2);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_200GB_PAM4_56, IFM_200G_LR4);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_400GB_PAM4_56, IFM_400G_LR8);
+ /* thor2 PAM112 */
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_100GB_PAM4_112, IFM_100G_AUI2_AC);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_200GB_PAM4_112, IFM_200G_AUI4);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_400GB_PAM4_112, IFM_400G_AUI8_AC);
+
break;
case BNXT_MEDIA_SR:
- BNXT_IFMEDIA_ADD(supported_pam4, PAM4_SPEEDS_50G, IFM_50G_SR);
- BNXT_IFMEDIA_ADD(supported_pam4, PAM4_SPEEDS_100G, IFM_100G_SR2);
- BNXT_IFMEDIA_ADD(supported_pam4, PAM4_SPEEDS_200G, IFM_200G_SR4);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_100GB, IFM_100G_SR4);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_50GB, IFM_50G_SR2);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_40GB, IFM_40G_SR4);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_25GB, IFM_25G_SR);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_10GB, IFM_10G_SR);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_1GB, IFM_1000_SX);
+ BNXT_IFMEDIA_ADD(supported_pam4_speeds, PAM4_SPEEDS_50G, IFM_50G_SR);
+ BNXT_IFMEDIA_ADD(supported_pam4_speeds, PAM4_SPEEDS_100G, IFM_100G_SR2);
+ BNXT_IFMEDIA_ADD(supported_pam4_speeds, PAM4_SPEEDS_200G, IFM_200G_SR4);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_100GB, IFM_100G_SR4);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_50GB, IFM_50G_SR2);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_40GB, IFM_40G_SR4);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_25GB, IFM_25G_SR);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_10GB, IFM_10G_SR);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_1GB, IFM_1000_SX);
+ /* thor2 nrz*/
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_100GB, IFM_100G_SR4);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_50GB, IFM_50G_SR2);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_40GB, IFM_40G_SR4);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_25GB, IFM_25G_SR);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_10GB, IFM_10G_SR);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_1GB, IFM_1000_SX);
+ /* thor2 PAM56 */
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_50GB_PAM4_56, IFM_50G_SR);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_100GB_PAM4_56, IFM_100G_SR2);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_200GB_PAM4_56, IFM_200G_SR4);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_400GB_PAM4_56, IFM_400G_AUI8);
+ /* thor2 PAM112 */
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_100GB_PAM4_112, IFM_100G_AUI2_AC);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_200GB_PAM4_112, IFM_200G_AUI4);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_400GB_PAM4_112, IFM_400G_DR4);
+ break;
+
+ case BNXT_MEDIA_ER:
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_40GB, IFM_40G_ER4);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_100GB, IFM_100G_AUI4);
+ /* thor2 PAM56 */
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_50GB_PAM4_56, IFM_50G_LR);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_100GB_PAM4_56, IFM_100G_AUI2);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_200GB_PAM4_56, IFM_200G_LR4);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_400GB_PAM4_56, IFM_400G_FR8);
+ /* thor2 PAM112 */
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_100GB_PAM4_112, IFM_100G_AUI2_AC);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_200GB_PAM4_112, IFM_200G_AUI4_AC);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_400GB_PAM4_112, IFM_400G_AUI8_AC);
break;
case BNXT_MEDIA_KR:
- BNXT_IFMEDIA_ADD(supported_pam4, PAM4_SPEEDS_50G, IFM_50G_KR_PAM4);
- BNXT_IFMEDIA_ADD(supported_pam4, PAM4_SPEEDS_100G, IFM_100G_KR2_PAM4);
- BNXT_IFMEDIA_ADD(supported_pam4, PAM4_SPEEDS_200G, IFM_200G_KR4_PAM4);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_100GB, IFM_100G_KR4);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_50GB, IFM_50G_KR2);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_50GB, IFM_50G_KR4);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_40GB, IFM_40G_KR4);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_25GB, IFM_25G_KR);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_20GB, IFM_20G_KR2);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_10GB, IFM_10G_KR);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_1GB, IFM_1000_KX);
+ BNXT_IFMEDIA_ADD(supported_pam4_speeds, PAM4_SPEEDS_50G, IFM_50G_KR_PAM4);
+ BNXT_IFMEDIA_ADD(supported_pam4_speeds, PAM4_SPEEDS_100G, IFM_100G_KR2_PAM4);
+ BNXT_IFMEDIA_ADD(supported_pam4_speeds, PAM4_SPEEDS_200G, IFM_200G_KR4_PAM4);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_100GB, IFM_100G_KR4);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_50GB, IFM_50G_KR2);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_50GB, IFM_50G_KR4);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_40GB, IFM_40G_KR4);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_25GB, IFM_25G_KR);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_20GB, IFM_20G_KR2);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_10GB, IFM_10G_KR);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_1GB, IFM_1000_KX);
+ break;
+
+ case BNXT_MEDIA_AC:
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_25GB, IFM_25G_ACC);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_10GB, IFM_10G_AOC);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_40GB, IFM_40G_XLAUI);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_40GB, IFM_40G_XLAUI_AC);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_25GB, IFM_25G_ACC);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_10GB, IFM_10G_AOC);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_40GB, IFM_40G_XLAUI);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_40GB, IFM_40G_XLAUI_AC);
+ break;
+
+ case BNXT_MEDIA_BASECX:
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_1GB, IFM_1000_CX);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_1GB, IFM_1000_CX);
+ break;
+
+ case BNXT_MEDIA_BASET:
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_10GB, IFM_10G_T);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_2_5GB, IFM_2500_T);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_1GB, IFM_1000_T);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_100MB, IFM_100_T);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_10MB, IFM_10_T);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_10GB, IFM_10G_T);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_1GB, IFM_1000_T);
+ break;
+
+ case BNXT_MEDIA_BASEKX:
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_10GB, IFM_10G_KR);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_2_5GB, IFM_2500_KX);
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_1GB, IFM_1000_KX);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_10GB, IFM_10G_KR);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_1GB, IFM_1000_KX);
+ break;
+
+ case BNXT_MEDIA_BASESGMII:
+ BNXT_IFMEDIA_ADD(supported_NRZ_speeds, SPEEDS_1GB, IFM_1000_SGMII);
+ BNXT_IFMEDIA_ADD(supported_speeds2, SPEEDS2_1GB, IFM_1000_SGMII);
break;
default:
@@ -4096,11 +4325,12 @@ static void
bnxt_add_media_types(struct bnxt_softc *softc)
{
struct bnxt_link_info *link_info = &softc->link_info;
- uint16_t supported = 0, supported_pam4 = 0;
+ uint16_t supported_NRZ_speeds = 0, supported_pam4_speeds = 0, supported_speeds2 = 0;
uint8_t phy_type = get_phy_type(softc), media_type;
- supported = link_info->support_speeds;
- supported_pam4 = link_info->support_pam4_speeds;
+ supported_NRZ_speeds = link_info->support_speeds;
+ supported_speeds2 = link_info->support_speeds2;
+ supported_pam4_speeds = link_info->support_pam4_speeds;
/* Auto is always supported */
ifmedia_add(softc->media, IFM_ETHER | IFM_AUTO, 0, NULL);
@@ -4109,40 +4339,75 @@ bnxt_add_media_types(struct bnxt_softc *softc)
return;
switch (phy_type) {
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_200G_BASECR4:
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_100G_BASECR4:
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_100G_BASECR2:
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_50G_BASECR:
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_40G_BASECR4:
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_25G_BASECR_CA_L:
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_25G_BASECR_CA_S:
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_25G_BASECR_CA_N:
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASECR:
+
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_50G_BASECR:
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_100G_BASECR2:
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_200G_BASECR4:
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_400G_BASECR8:
+
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_100G_BASECR:
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_200G_BASECR2:
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_400G_BASECR4:
+
media_type = BNXT_MEDIA_CR;
break;
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_200G_BASELR4:
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_100G_BASELR4:
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_50G_BASELR:
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_40G_BASELR4:
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASELR:
+
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_50G_BASELR:
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_100G_BASELR2:
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_200G_BASELR4:
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_400G_BASELR8:
+
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_100G_BASELR:
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_200G_BASELR2:
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_400G_BASELR4:
+
media_type = BNXT_MEDIA_LR;
break;
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_200G_BASESR4:
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_100G_BASESR10:
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_100G_BASESR4:
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_50G_BASESR:
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_40G_BASESR4:
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASESR:
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_40G_BASEER4:
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_100G_BASEER4:
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_200G_BASEER4:
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_25G_BASESR:
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_1G_BASESX:
+
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_50G_BASESR:
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_100G_BASESR2:
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_200G_BASESR4:
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_400G_BASESR8:
+
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_100G_BASESR:
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_200G_BASESR2:
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_400G_BASESR4:
+
media_type = BNXT_MEDIA_SR;
break;
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_40G_BASEER4:
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_100G_BASEER4:
+
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_50G_BASEER:
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_100G_BASEER2:
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_200G_BASEER4:
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_400G_BASEER8:
+
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_100G_BASEER:
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_200G_BASEER2:
+ case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_400G_BASEER4:
+
+ media_type = BNXT_MEDIA_ER;
+ break;
+
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASEKR4:
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASEKR2:
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASEKR:
@@ -4150,34 +4415,25 @@ bnxt_add_media_types(struct bnxt_softc *softc)
break;
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_40G_ACTIVE_CABLE:
- BNXT_IFMEDIA_ADD(supported, SPEEDS_25GB, IFM_25G_ACC);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_10GB, IFM_10G_AOC);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_40GB, IFM_40G_XLAUI);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_40GB, IFM_40G_XLAUI_AC);
+ media_type = BNXT_MEDIA_AC;
return;
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_1G_BASECX:
- BNXT_IFMEDIA_ADD(supported, SPEEDS_1GBHD, IFM_1000_CX);
+ media_type = BNXT_MEDIA_BASECX;
return;
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_1G_BASET:
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASET:
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASETE:
- BNXT_IFMEDIA_ADD(supported, SPEEDS_10GB, IFM_10G_T);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_2_5GB, IFM_2500_T);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_1GB, IFM_1000_T);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_100MB, IFM_100_T);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_10MB, IFM_10_T);
+ media_type = BNXT_MEDIA_BASET;
return;
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASEKX:
- BNXT_IFMEDIA_ADD(supported, SPEEDS_10GB, IFM_10G_KR);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_2_5GB, IFM_2500_KX);
- BNXT_IFMEDIA_ADD(supported, SPEEDS_1GB, IFM_1000_KX);
+ media_type = BNXT_MEDIA_BASEKX;
return;
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_SGMIIEXTPHY:
- BNXT_IFMEDIA_ADD(supported, SPEEDS_1GB, IFM_1000_SGMII);
+ media_type = BNXT_MEDIA_BASESGMII;
return;
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_UNKNOWN:
@@ -4190,17 +4446,22 @@ bnxt_add_media_types(struct bnxt_softc *softc)
return;
}
- /* add_media is invoked twice, once with a firmware speed mask of 0 and a valid
- * value for both NRZ and PAM4 sig mode. This ensures accurate display of all
- * supported medias and currently configured media in the "ifconfig -m" output
- */
-
- if (link_info->sig_mode == BNXT_SIG_MODE_PAM4) {
- add_media(softc, media_type, supported, 0);
- add_media(softc, media_type, 0, supported_pam4);
- } else {
- add_media(softc, media_type, 0, supported_pam4);
- add_media(softc, media_type, supported, 0);
+ switch (link_info->sig_mode) {
+ case BNXT_SIG_MODE_NRZ:
+ if (supported_NRZ_speeds != 0)
+ add_media(softc, media_type, supported_NRZ_speeds, 0, 0);
+ else
+ add_media(softc, media_type, 0, 0, supported_speeds2);
+ break;
+ case BNXT_SIG_MODE_PAM4:
+ if (supported_pam4_speeds != 0)
+ add_media(softc, media_type, 0, supported_pam4_speeds, 0);
+ else
+ add_media(softc, media_type, 0, 0, supported_speeds2);
+ break;
+ case BNXT_SIG_MODE_PAM4_112:
+ add_media(softc, media_type, 0, 0, supported_speeds2);
+ break;
}
return;
@@ -4373,7 +4634,10 @@ bnxt_report_link(struct bnxt_softc *softc)
signal_mode = "(NRZ) ";
break;
case BNXT_SIG_MODE_PAM4:
- signal_mode = "(PAM4) ";
+ signal_mode = "(PAM4 56Gbps) ";
+ break;
+ case BNXT_SIG_MODE_PAM4_112:
+ signal_mode = "(PAM4 112Gbps) ";
break;
default:
break;
@@ -4837,6 +5101,8 @@ bnxt_get_baudrate(struct bnxt_link_info *link)
return IF_Mbps(10);
case HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_200GB:
return IF_Gbps(200);
+ case HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_400GB:
+ return IF_Gbps(400);
}
return IF_Gbps(100);
}