Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 6 Nov 2017 16:41:29 +0000 (UTC)
From:      Stephen Hurd <shurd@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r325488 - head/sys/dev/bnxt
Message-ID:  <201711061641.vA6GfTAZ070129@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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@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;
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201711061641.vA6GfTAZ070129>