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.marre...@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;
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to