Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 7 Apr 2015 15:32:44 +0000 (UTC)
From:      Navdeep Parhar <np@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r281207 - in stable/10/sys/dev/cxgbe: . common
Message-ID:  <201504071532.t37FWi7o091425@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: np
Date: Tue Apr  7 15:32:43 2015
New Revision: 281207
URL: https://svnweb.freebsd.org/changeset/base/281207

Log:
  MFC r274456:
  
  Fix some bad interaction between cxgbe(4) and lacp lagg(4) that could
  leave a port permanently disabled when a copper cable is unplugged and
  then plugged right back in.
  
  lacp_linkstate goes looking for the current ifmedia on a link state
  change and it could get stale information from cxgbe(4) on a module
  unplug followed by replug.  The fix is to process module events before
  link-state events within the driver, and to always rebuild the ifmedia
  list on a module change event (instead of rebuilding it lazily).
  
  Thanks to asomers@ for the problem report and detailed analysis to go
  with it.

Modified:
  stable/10/sys/dev/cxgbe/common/t4_hw.c
  stable/10/sys/dev/cxgbe/t4_main.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/cxgbe/common/t4_hw.c
==============================================================================
--- stable/10/sys/dev/cxgbe/common/t4_hw.c	Tue Apr  7 15:32:25 2015	(r281206)
+++ stable/10/sys/dev/cxgbe/common/t4_hw.c	Tue Apr  7 15:32:43 2015	(r281207)
@@ -5417,6 +5417,10 @@ int t4_handle_fw_rpl(struct adapter *ada
 		}
 		lc = &pi->link_cfg;
 
+		if (mod != pi->mod_type) {
+			pi->mod_type = mod;
+			t4_os_portmod_changed(adap, i);
+		}
 		if (link_ok != lc->link_ok || speed != lc->speed ||
 		    fc != lc->fc) {                    /* something changed */
 			int reason;
@@ -5432,10 +5436,6 @@ int t4_handle_fw_rpl(struct adapter *ada
 			lc->supported = ntohs(p->u.info.pcap);
 			t4_os_link_changed(adap, i, link_ok, reason);
 		}
-		if (mod != pi->mod_type) {
-			pi->mod_type = mod;
-			t4_os_portmod_changed(adap, i);
-		}
 	} else {
 		CH_WARN_RATELIMIT(adap,
 		    "Unknown firmware reply 0x%x (0x%x)\n", opcode, action);

Modified: stable/10/sys/dev/cxgbe/t4_main.c
==============================================================================
--- stable/10/sys/dev/cxgbe/t4_main.c	Tue Apr  7 15:32:25 2015	(r281206)
+++ stable/10/sys/dev/cxgbe/t4_main.c	Tue Apr  7 15:32:43 2015	(r281207)
@@ -1483,7 +1483,9 @@ cxgbe_media_status(struct ifnet *ifp, st
 	struct ifmedia *media = NULL;
 	struct ifmedia_entry *cur;
 	int speed = pi->link_cfg.speed;
+#ifdef INVARIANTS
 	int data = (pi->port_type << 8) | pi->mod_type;
+#endif
 
 	if (ifp == pi->ifp)
 		media = &pi->media;
@@ -1494,10 +1496,7 @@ cxgbe_media_status(struct ifnet *ifp, st
 	MPASS(media != NULL);
 
 	cur = media->ifm_cur;
-	if (cur->ifm_data != data) {
-		build_medialist(pi, media);
-		cur = media->ifm_cur;
-	}
+	MPASS(cur->ifm_data == data);
 
 	ifmr->ifm_status = IFM_AVALID;
 	if (!pi->link_cfg.link_ok)
@@ -7903,6 +7902,11 @@ t4_os_portmod_changed(const struct adapt
 		NULL, "LR", "SR", "ER", "TWINAX", "active TWINAX", "LRM"
 	};
 
+	build_medialist(pi, &pi->media);
+#ifdef DEV_NETMAP
+	build_medialist(pi, &pi->nm_media);
+#endif
+
 	if (pi->mod_type == FW_PORT_MOD_TYPE_NONE)
 		if_printf(pi->ifp, "transceiver unplugged.\n");
 	else if (pi->mod_type == FW_PORT_MOD_TYPE_UNKNOWN)



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