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
_______________________________________________
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