Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 8 Jun 2017 14:33:47 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r319696 - stable/11/sys/net
Message-ID:  <201706081433.v58EXlkw025011@repo.freebsd.org>

Next in thread | Raw E-Mail | Index | Archive | Help
Author: mav
Date: Thu Jun  8 14:33:47 2017
New Revision: 319696
URL: https://svnweb.freebsd.org/changeset/base/319696

Log:
  MFC r318966: Improve applying unified capabilities to the lagg ports.
  
  Some NICs have some capabilities dependent, so that disabling one
  require disabling some other (TXCSUM/RXCSUM on em).  This code tries to
  reach the consensus more insistently.
  
  Approved by:	re (marius)

Modified:
  stable/11/sys/net/if_lagg.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/net/if_lagg.c
==============================================================================
--- stable/11/sys/net/if_lagg.c	Thu Jun  8 14:32:42 2017	(r319695)
+++ stable/11/sys/net/if_lagg.c	Thu Jun  8 14:33:47 2017	(r319696)
@@ -561,24 +561,41 @@ static void
 lagg_capabilities(struct lagg_softc *sc)
 {
 	struct lagg_port *lp;
-	int cap = ~0, ena = ~0;
-	u_long hwa = ~0UL;
+	int cap, ena, pena;
+	uint64_t hwa;
 	struct ifnet_hw_tsomax hw_tsomax;
 
 	LAGG_XLOCK_ASSERT(sc);
 
-	memset(&hw_tsomax, 0, sizeof(hw_tsomax));
+	/* Get common enabled capabilities for the lagg ports */
+	ena = ~0;
+	SLIST_FOREACH(lp, &sc->sc_ports, lp_entries)
+		ena &= lp->lp_ifp->if_capenable;
+	ena = (ena == ~0 ? 0 : ena);
 
-	/* Get capabilities from the lagg ports */
+	/*
+	 * Apply common enabled capabilities back to the lagg ports.
+	 * May require several iterations if they are dependent.
+	 */
+	do {
+		pena = ena;
+		SLIST_FOREACH(lp, &sc->sc_ports, lp_entries) {
+			lagg_setcaps(lp, ena);
+			ena &= lp->lp_ifp->if_capenable;
+		}
+	} while (pena != ena);
+
+	/* Get other capabilities from the lagg ports */
+	cap = ~0;
+	hwa = ~(uint64_t)0;
+	memset(&hw_tsomax, 0, sizeof(hw_tsomax));
 	SLIST_FOREACH(lp, &sc->sc_ports, lp_entries) {
 		cap &= lp->lp_ifp->if_capabilities;
-		ena &= lp->lp_ifp->if_capenable;
 		hwa &= lp->lp_ifp->if_hwassist;
 		if_hw_tsomax_common(lp->lp_ifp, &hw_tsomax);
 	}
 	cap = (cap == ~0 ? 0 : cap);
-	ena = (ena == ~0 ? 0 : ena);
-	hwa = (hwa == ~0 ? 0 : hwa);
+	hwa = (hwa == ~(uint64_t)0 ? 0 : hwa);
 
 	if (sc->sc_ifp->if_capabilities != cap ||
 	    sc->sc_ifp->if_capenable != ena ||
@@ -593,10 +610,6 @@ lagg_capabilities(struct lagg_softc *sc)
 			if_printf(sc->sc_ifp,
 			    "capabilities 0x%08x enabled 0x%08x\n", cap, ena);
 	}
-
-	/* Apply unified capabilities back to the lagg ports. */
-	SLIST_FOREACH(lp, &sc->sc_ports, lp_entries)
-		lagg_setcaps(lp, ena);
 }
 
 static int



Want to link to this message? Use this URL: <http://docs.FreeBSD.org/cgi/mid.cgi?201706081433.v58EXlkw025011>