svn commit: r325488 - head/sys/dev/bnxt
Stephen Hurd
shurd at FreeBSD.org
Mon Nov 6 16:41:30 UTC 2017
Author: shurd
Date: Mon Nov 6 16:41:29 2017
New Revision: 325488
URL: https://svnweb.freebsd.org/changeset/base/325488
Log:
bnxt: Add support for new phy_types and speeds - Part #2
Use our ifm_list of supported media types rather than nested switch
statements to find the current media type. Find a supported type that
matches the current speed.
Remove all workarounds while updating ifmr->ifm_active.
For BNXT_IFMEDIA_ADD, added Three more speeds IFM_10G_T, IFM_2500_T & IFM_2500_KX.
Submitted by: Bhargava Chenna Marreddy <bhargava.marreddy at broadcom.com>
Reviewed by: shurd, sbruno
Approved by: sbruno (mentor)
Sponsored by: Broadcom Limited
Differential Revision: https://reviews.freebsd.org/D12896
Modified:
head/sys/dev/bnxt/if_bnxt.c
Modified: head/sys/dev/bnxt/if_bnxt.c
==============================================================================
--- head/sys/dev/bnxt/if_bnxt.c Mon Nov 6 16:23:21 2017 (r325487)
+++ head/sys/dev/bnxt/if_bnxt.c Mon Nov 6 16:41:29 2017 (r325488)
@@ -1198,8 +1198,11 @@ bnxt_media_status(if_ctx_t ctx, struct ifmediareq * if
{
struct bnxt_softc *softc = iflib_get_softc(ctx);
struct bnxt_link_info *link_info = &softc->link_info;
- uint8_t phy_type = get_phy_type(softc);
+ struct ifmedia_entry *next;
+ uint64_t target_baudrate = bnxt_get_baudrate(link_info);
+ int active_media = IFM_UNKNOWN;
+
bnxt_update_link(softc, true);
ifmr->ifm_status = IFM_AVALID;
@@ -1215,171 +1218,17 @@ bnxt_media_status(if_ctx_t ctx, struct ifmediareq * if
else
ifmr->ifm_active |= IFM_HDX;
- switch (link_info->link_speed) {
- case HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_100MB:
- ifmr->ifm_active |= IFM_100_T;
- break;
- case HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_1GB:
- switch (phy_type) {
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASEKX:
- ifmr->ifm_active |= IFM_1000_KX;
+ /*
+ * Go through the list of supported media which got prepared
+ * as part of bnxt_add_media_types() using api ifmedia_add().
+ */
+ LIST_FOREACH(next, &(iflib_get_media(ctx)->ifm_list), ifm_list) {
+ if (ifmedia_baudrate(next->ifm_media) == target_baudrate) {
+ active_media = next->ifm_media;
break;
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASET:
- ifmr->ifm_active |= IFM_1000_T;
- break;
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_SGMIIEXTPHY:
- ifmr->ifm_active |= IFM_1000_SGMII;
- break;
- default:
- /*
- * Workaround:
- * Don't return IFM_UNKNOWN until
- * Stratus return proper media_type
- */
- ifmr->ifm_active |= IFM_1000_KX;
- break;
}
- break;
- case HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_2_5GB:
- switch (phy_type) {
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASEKX:
- ifmr->ifm_active |= IFM_2500_KX;
- break;
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASET:
- ifmr->ifm_active |= IFM_2500_T;
- break;
- default:
- ifmr->ifm_active |= IFM_UNKNOWN;
- break;
- }
- break;
- case HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_10GB:
- switch (phy_type) {
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASECR:
- ifmr->ifm_active |= IFM_10G_CR1;
- 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:
- ifmr->ifm_active |= IFM_10G_KR;
- break;
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASELR:
- ifmr->ifm_active |= IFM_10G_LR;
- break;
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASESR:
- ifmr->ifm_active |= IFM_10G_SR;
- break;
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASEKX:
- ifmr->ifm_active |= IFM_10G_KX4;
- break;
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASET:
- ifmr->ifm_active |= IFM_10G_T;
- break;
- default:
- /*
- * Workaround:
- * Don't return IFM_UNKNOWN until
- * Stratus return proper media_type
- */
- ifmr->ifm_active |= IFM_10G_CR1;
- break;
- }
- break;
- case HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_20GB:
- ifmr->ifm_active |= IFM_20G_KR2;
- break;
- case HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_25GB:
- switch (phy_type) {
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASECR:
- ifmr->ifm_active |= IFM_25G_CR;
- 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:
- ifmr->ifm_active |= IFM_25G_KR;
- break;
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASESR:
- ifmr->ifm_active |= IFM_25G_SR;
- break;
- default:
- /*
- * Workaround:
- * Don't return IFM_UNKNOWN until
- * Stratus return proper media_type
- */
- ifmr->ifm_active |= IFM_25G_CR;
- break;
- }
- break;
- case HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_40GB:
- switch (phy_type) {
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASECR:
- ifmr->ifm_active |= IFM_40G_CR4;
- 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:
- ifmr->ifm_active |= IFM_40G_KR4;
- break;
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASELR:
- ifmr->ifm_active |= IFM_40G_LR4;
- break;
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASESR:
- ifmr->ifm_active |= IFM_40G_SR4;
- break;
- default:
- ifmr->ifm_active |= IFM_UNKNOWN;
- break;
- }
- break;
- case HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_50GB:
- switch (phy_type) {
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASECR:
- ifmr->ifm_active |= IFM_50G_CR2;
- 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:
- ifmr->ifm_active |= IFM_50G_KR2;
- break;
- default:
- /*
- * Workaround:
- * Don't return IFM_UNKNOWN until
- * Stratus return proper media_type
- */
- ifmr->ifm_active |= IFM_50G_CR2;
- break;
- }
- break;
- case HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_100GB:
- switch (phy_type) {
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASECR:
- ifmr->ifm_active |= IFM_100G_CR4;
- 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:
- ifmr->ifm_active |= IFM_100G_KR4;
- break;
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASELR:
- ifmr->ifm_active |= IFM_100G_LR4;
- break;
- case HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASESR:
- ifmr->ifm_active |= IFM_100G_SR4;
- break;
- default:
- /*
- * Workaround:
- * Don't return IFM_UNKNOWN until
- * Stratus return proper media_type
- */
- ifmr->ifm_active |= IFM_100G_CR4;
- break;
- }
- default:
- return;
}
+ ifmr->ifm_active |= active_media;
if (link_info->flow_ctrl.rx)
ifmr->ifm_active |= IFM_ETH_RXPAUSE;
@@ -2184,6 +2033,8 @@ bnxt_add_media_types(struct bnxt_softc *softc)
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);
@@ -2191,6 +2042,7 @@ bnxt_add_media_types(struct bnxt_softc *softc)
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);
break;
More information about the svn-src-head
mailing list