git: 32fdad17f060 - stable/14 - bnxt_en: 400G speed support

From: Warner Losh <imp_at_FreeBSD.org>
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);
 }