svn commit: r308345 - head/sys/dev/e1000

Sean Bruno sbruno at FreeBSD.org
Sat Nov 5 16:30:44 UTC 2016


Author: sbruno
Date: Sat Nov  5 16:30:42 2016
New Revision: 308345
URL: https://svnweb.freebsd.org/changeset/base/308345

Log:
  r295133 attempted to deactivate TSO in the 100Mbit link case with this
  adapter to work around bugs in TSO handling at this speed.
  
  em_init_locked is called during first boot of the adapter and will
  see that link_speed is unitialized, effectively turning off tso for
  all cards at all speeds, which I believe was *not* the intent.
  
  Move the handling of TSO deactivation to the link handler where we can
  more effectively make the decision about what to do.  In addition,
  completely purge the TSO capabilities instead of disabling just CSUM_TSO.
  
  Thanks to jhb for explanation of the hw capabilites api.
  
  Thanks to royger and cognet for testing the 100Mbit failure case to
  ensure that their adapters do indeed still work.
  
  MFC after:	1 week
  Sponsored by:	Limelight Networks

Modified:
  head/sys/dev/e1000/if_em.c

Modified: head/sys/dev/e1000/if_em.c
==============================================================================
--- head/sys/dev/e1000/if_em.c	Sat Nov  5 16:23:33 2016	(r308344)
+++ head/sys/dev/e1000/if_em.c	Sat Nov  5 16:30:42 2016	(r308345)
@@ -369,11 +369,6 @@ MODULE_DEPEND(em, netmap, 1, 1, 1);
 #define MAX_INTS_PER_SEC	8000
 #define DEFAULT_ITR		(1000000000/(MAX_INTS_PER_SEC * 256))
 
-/* Allow common code without TSO */
-#ifndef CSUM_TSO
-#define CSUM_TSO	0
-#endif
-
 #define TSO_WORKAROUND	4
 
 static SYSCTL_NODE(_hw, OID_AUTO, em, CTLFLAG_RD, 0, "EM driver parameters");
@@ -1396,15 +1391,9 @@ em_init_locked(struct adapter *adapter)
 	if_clearhwassist(ifp);
 	if (if_getcapenable(ifp) & IFCAP_TXCSUM)
 		if_sethwassistbits(ifp, CSUM_TCP | CSUM_UDP, 0);
-	/* 
-	** There have proven to be problems with TSO when not
-	** at full gigabit speed, so disable the assist automatically
-	** when at lower speeds.  -jfv
-	*/
-	if (if_getcapenable(ifp) & IFCAP_TSO4) {
-		if (adapter->link_speed == SPEED_1000)
-			if_sethwassistbits(ifp, CSUM_TSO, 0);
-	}
+
+	if (if_getcapenable(ifp) & IFCAP_TSO4)
+		if_sethwassistbits(ifp, CSUM_TSO, 0);
 
 	/* Configure for OS presence */
 	em_init_manageability(adapter);
@@ -2412,6 +2401,18 @@ em_update_link_status(struct adapter *ad
 	if (link_check && (adapter->link_active == 0)) {
 		e1000_get_speed_and_duplex(hw, &adapter->link_speed,
 		    &adapter->link_duplex);
+		/* 
+		** There have proven to be problems with TSO when not
+		** at full gigabit speed, so disable the assist automatically
+		** when at lower speeds.  -jfv
+		*/
+		if (adapter->link_speed != SPEED_1000) {
+			if_sethwassistbits(ifp, 0, CSUM_TSO);
+			if_setcapenablebit(ifp, 0, IFCAP_TSO4);
+        		if_setcapabilitiesbit(ifp, 0, IFCAP_TSO4);
+
+		}
+
 		/* Check if we must disable SPEED_MODE bit on PCI-E */
 		if ((adapter->link_speed != SPEED_1000) &&
 		    ((hw->mac.type == e1000_82571) ||


More information about the svn-src-head mailing list