bnxt: Add support for new phy_types and speeds

1) Add new phy_types and speeds from the latest firmware header.
2) Introduced a macro to avoid code duplication and improve readability for
   the invocation of ifmedia_add().

Submitted by:	Bhargava Chenna Marreddy <bhargava.marreddy@broadcom.com>
Reviewed by:	shurd, sbruno
Approved by:	sbruno (mentor)
Sponsored by:	Broadcom Limited
Differential Revision:	https://reviews.freebsd.org/D12423
This commit is contained in:
Stephen Hurd 2017-10-30 21:26:23 +00:00
parent 09b57b7f40
commit d81ba165a2
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=325169
2 changed files with 70 additions and 108 deletions

View File

@ -231,6 +231,11 @@ __FBSDID("$FreeBSD$");
#define clamp_t(type, _x, min, max) min_t(type, max_t(type, _x, min), max)
#define BNXT_IFMEDIA_ADD(supported, fw_speed, ifm_speed) do { \
if ((supported) & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_ ## fw_speed) \
ifmedia_add(softc->media, IFM_ETHER | (ifm_speed), 0, NULL); \
} while(0)
/* NVRAM access */
enum bnxt_nvm_directory_type {
BNX_DIR_TYPE_UNUSED = 0,

View File

@ -2121,129 +2121,86 @@ bnxt_add_media_types(struct bnxt_softc *softc)
return;
switch (phy_type) {
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_100G_BASECR4:
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:
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_100GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_100G_CR4, 0,
NULL);
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_50GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_50G_CR2, 0,
NULL);
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_40GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_40G_CR4, 0,
NULL);
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_25GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_25G_CR, 0,
NULL);
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_10GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_10G_CR1, 0,
NULL);
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_T);
break;
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_100G_BASELR4:
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_40G_BASELR4:
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASELR:
BNXT_IFMEDIA_ADD(supported, SPEEDS_100GB, IFM_100G_LR4);
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);
break;
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_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_25G_BASESR:
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_1G_BASESX:
BNXT_IFMEDIA_ADD(supported, SPEEDS_100GB, IFM_100G_SR4);
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);
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:
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_100GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_100G_KR4, 0,
NULL);
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_50GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_50G_KR2, 0,
NULL);
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_40GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_40G_KR4, 0,
NULL);
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_25GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_25G_KR, 0,
NULL);
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_20GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_20G_KR2, 0,
NULL);
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_10GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_10G_KR, 0,
NULL);
BNXT_IFMEDIA_ADD(supported, SPEEDS_100GB, IFM_100G_KR4);
BNXT_IFMEDIA_ADD(supported, SPEEDS_50GB, IFM_50G_KR2);
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);
break;
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASELR:
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_100GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_100G_LR4, 0,
NULL);
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_40GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_40G_LR4, 0,
NULL);
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_10GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_10G_LR, 0,
NULL);
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);
break;
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASESR:
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_100GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_100G_SR4, 0,
NULL);
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_40GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_40G_SR4, 0,
NULL);
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_25GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_25G_SR, 0,
NULL);
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_10GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_10G_SR, 0,
NULL);
break;
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASEKX:
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_10GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_10G_KX4, 0,
NULL);
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_2_5GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_2500_KX, 0,
NULL);
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_1GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_1000_KX, 0,
NULL);
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_1G_BASECX:
BNXT_IFMEDIA_ADD(supported, SPEEDS_1GBHD, IFM_1000_CX);
break;
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:
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_10MB)
ifmedia_add(softc->media, IFM_ETHER | IFM_10_T, 0,
NULL);
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_100MB)
ifmedia_add(softc->media, IFM_ETHER | IFM_100_T, 0,
NULL);
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_1GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_1000_T, 0,
NULL);
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_2_5GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_2500_T, 0,
NULL);
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_10GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_10G_T, 0,
NULL);
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);
break;
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASEKX:
BNXT_IFMEDIA_ADD(supported, SPEEDS_10GB, IFM_10G_KR);
BNXT_IFMEDIA_ADD(supported, SPEEDS_1GB, IFM_1000_KX);
break;
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_SGMIIEXTPHY:
if (supported & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_1GB)
ifmedia_add(softc->media, IFM_ETHER | IFM_1000_SGMII, 0,
NULL);
BNXT_IFMEDIA_ADD(supported, SPEEDS_1GB, IFM_1000_SGMII);
break;
case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_UNKNOWN:
default:
/*
* Workaround for Cumulus & Stratus
* For Stratus:
* media_type is being returned as 0x0
* Return support speeds as 10G, 25G, 50G & 100G
*
* For Cumulus:
* phy_type is being returned as 0x14 (PHY_TYPE_40G_BASECR4)
* Return support speeds as 1G, 10G, 25G & 50G
*/
if (pci_get_device(softc->dev) == BCM57454) {
/* For Stratus: 10G, 25G, 50G & 100G */
ifmedia_add(softc->media, IFM_ETHER | IFM_100G_CR4, 0, NULL);
ifmedia_add(softc->media, IFM_ETHER | IFM_50G_CR2, 0, NULL);
ifmedia_add(softc->media, IFM_ETHER | IFM_25G_CR, 0, NULL);
ifmedia_add(softc->media, IFM_ETHER | IFM_10G_CR1, 0, NULL);
} else if (pci_get_device(softc->dev) == BCM57414) {
/* For Cumulus: 1G, 10G, 25G & 50G */
ifmedia_add(softc->media, IFM_ETHER | IFM_50G_CR2, 0, NULL);
ifmedia_add(softc->media, IFM_ETHER | IFM_25G_CR, 0, NULL);
ifmedia_add(softc->media, IFM_ETHER | IFM_10G_CR1, 0, NULL);
ifmedia_add(softc->media, IFM_ETHER | IFM_1000_T, 0, NULL);
}
/* Only Autoneg is supported for TYPE_UNKNOWN */
break;
}