From nobody Wed Apr 23 22:43:30 2025 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4ZjYzl2WRXz5t1pw; Wed, 23 Apr 2025 22:43:31 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4ZjYzk3DDZz3nXg; Wed, 23 Apr 2025 22:43:30 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1745448210; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=GA0/aCk117dyi3VxPzstEuepCP/PfiyucW9vz5Ax5f0=; b=ORs2gCH0FU4y//X26+RfY2uBn2vXd33IDeV0kZI1bc3MhkOyJGLnSiBzV9+4C4eQ2HCOxb KczrWByc/nE/kr7CKAlqxFHFXcK3sV8Kd0AXZYERfuni04a1v/9d9z1LulTpP6vBXsif0/ CAg6jbMZOJ/q0UeWkHunFFuLBohHlmV2RXeOaY2iWpedoWV2uJrjWbgQRyu6WX26h1z9PP 2fXcen1Mre5Eqa6sSWm1BZBGvl0lHJAV77Enw2xA5hZF5N5hAqaPNwXlfn0csiVSObMPBZ 6wUSTRwZ2U9Tq4TykYwPZ06yA3e8dIYyOrZK1KDO6Imr5NWGyGscgcetnpCqUQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1745448210; a=rsa-sha256; cv=none; b=iwhuLhJFImazFeMTGbuPP/ug7T6f+RjAGxIVZzDtnen9Izr8eA72ptKEkm/BStKs/ZQKHR sixyj8NXoC3H+yHqLODgbUU+u8Po0mqbLIYTmcJk6e58i6KwEw37BurQWab5kphH9XqoE9 joVcJFI5VyOpxG2EMGFfrYUFv6VRw8hWrI6tr6uXq7y5NaQasmRhhizUT+45zWwym+ZVrm EqVZv+DTy4UP7M4SZmh+ZFg4lpeOBSYR3v0V86UPvrJESJHRSDCffhZ+vWZOv9e2CEBsxq f7Zkcmg5PzBxleGB+Bgl+1U9ahuh9nTPH8xkmGuw2WKlTL9LgzOJZaPAOhoQBA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1745448210; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=GA0/aCk117dyi3VxPzstEuepCP/PfiyucW9vz5Ax5f0=; b=xr63YJlqpkW7yWIs4+hMJkVSfMBXv+MBdyu8z+5+Olt5+O6hEGpGBSB+KhGCcsDmanUJvb v+ZLxlqF9qhw1bTXesdDzXOD2uFFTJzMaWxJB619E0O7AcnSRJusSs+HjY5Dqe9txsmHT7 cuLbcQ24js1/Vwh/DzEu0LLfyRTJB4lvxdheLQi/iWWf1wOyN6PjJ7hmfwkH7tS5zPJyNi vB8o1Z1w4jNfxAC7vJn6Soofph16Pu/sioTnGdCbf/uvqV2BcE9WV5CyduHJwMi6FHkbpT lDMXjcEEEwmwMHigrdZJBlEpTX+vqJlr6Ci6MZLcutBWHYsPF3gBg/NJW1i4WQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4ZjYzk2XLyz7nK; Wed, 23 Apr 2025 22:43:30 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 53NMhU4N094863; Wed, 23 Apr 2025 22:43:30 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 53NMhUo0094860; Wed, 23 Apr 2025 22:43:30 GMT (envelope-from git) Date: Wed, 23 Apr 2025 22:43:30 GMT Message-Id: <202504232243.53NMhUo0094860@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Warner Losh Subject: git: dac78335c42d - main - bnxt_en: 400G speed support List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: imp X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: dac78335c42dce2ce9daf5856539510a42d7d8cd Auto-Submitted: auto-generated The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=dac78335c42dce2ce9daf5856539510a42d7d8cd commit dac78335c42dce2ce9daf5856539510a42d7d8cd Author: Sreekanth Reddy AuthorDate: 2025-04-02 09:39:53 +0000 Commit: Warner Losh CommitDate: 2025-04-23 22:41:48 +0000 bnxt_en: 400G speed support Added 400G speed module support. MFC-After: 3 days Differential-Revision: https://reviews.freebsd.org/D49729 --- 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 7c969c82f8fe..93966617c742 100644 --- a/sys/dev/bnxt/bnxt_en/if_bnxt.c +++ b/sys/dev/bnxt/bnxt_en/if_bnxt.c @@ -3134,17 +3134,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: @@ -3152,103 +3150,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, @@ -3256,9 +3380,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; @@ -4030,57 +4155,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: @@ -4095,11 +4324,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); @@ -4108,40 +4338,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: @@ -4149,34 +4414,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: @@ -4189,17 +4445,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; @@ -4372,7 +4633,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; @@ -4836,6 +5100,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); }