Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 16 May 2014 05:10:17 +0000 (UTC)
From:      Pyun YongHyeon <yongari@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: r266212 - stable/10/sys/dev/re
Message-ID:  <201405160510.s4G5AHdD021590@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: yongari
Date: Fri May 16 05:10:16 2014
New Revision: 266212
URL: http://svnweb.freebsd.org/changeset/base/266212

Log:
  MFC r265943:
    Disable TX IP/TCP/UDP checksum offloading for RTL8168C/RTL8168CP.
    Previously only TX IP checksum offloading was disabled but it's
    reported that TX checksum offloading for UDP datagrams with IP
    options also generates corrupted frames.  Reporter's controller is
    RTL8168CP but I guess RTL8168C also have the same issue since it
    shall share the same core.

Modified:
  stable/10/sys/dev/re/if_re.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/re/if_re.c
==============================================================================
--- stable/10/sys/dev/re/if_re.c	Fri May 16 05:06:46 2014	(r266211)
+++ stable/10/sys/dev/re/if_re.c	Fri May 16 05:10:16 2014	(r266212)
@@ -1618,16 +1618,18 @@ re_attach(device_t dev)
 	ifp->if_start = re_start;
 	/*
 	 * RTL8168/8111C generates wrong IP checksummed frame if the
-	 * packet has IP options so disable TX IP checksum offloading.
+	 * packet has IP options so disable TX checksum offloading.
 	 */
 	if (sc->rl_hwrev->rl_rev == RL_HWREV_8168C ||
 	    sc->rl_hwrev->rl_rev == RL_HWREV_8168C_SPIN2 ||
-	    sc->rl_hwrev->rl_rev == RL_HWREV_8168CP)
-		ifp->if_hwassist = CSUM_TCP | CSUM_UDP;
-	else
+	    sc->rl_hwrev->rl_rev == RL_HWREV_8168CP) {
+		ifp->if_hwassist = 0;
+		ifp->if_capabilities = IFCAP_RXCSUM | IFCAP_TSO4;
+	} else {
 		ifp->if_hwassist = CSUM_IP | CSUM_TCP | CSUM_UDP;
+		ifp->if_capabilities = IFCAP_HWCSUM | IFCAP_TSO4;
+	}
 	ifp->if_hwassist |= CSUM_TSO;
-	ifp->if_capabilities = IFCAP_HWCSUM | IFCAP_TSO4;
 	ifp->if_capenable = ifp->if_capabilities;
 	ifp->if_init = re_init;
 	IFQ_SET_MAXLEN(&ifp->if_snd, RL_IFQ_MAXLEN);
@@ -3363,7 +3365,6 @@ re_ioctl(struct ifnet *ifp, u_long comma
 	struct rl_softc		*sc = ifp->if_softc;
 	struct ifreq		*ifr = (struct ifreq *) data;
 	struct mii_data		*mii;
-	uint32_t		rev;
 	int			error = 0;
 
 	switch (command) {
@@ -3452,15 +3453,9 @@ re_ioctl(struct ifnet *ifp, u_long comma
 		if ((mask & IFCAP_TXCSUM) != 0 &&
 		    (ifp->if_capabilities & IFCAP_TXCSUM) != 0) {
 			ifp->if_capenable ^= IFCAP_TXCSUM;
-			if ((ifp->if_capenable & IFCAP_TXCSUM) != 0) {
-				rev = sc->rl_hwrev->rl_rev;
-				if (rev == RL_HWREV_8168C ||
-				    rev == RL_HWREV_8168C_SPIN2 ||
-				    rev == RL_HWREV_8168CP)
-					ifp->if_hwassist |= CSUM_TCP | CSUM_UDP;
-				else
-					ifp->if_hwassist |= RE_CSUM_FEATURES;
-			} else
+			if ((ifp->if_capenable & IFCAP_TXCSUM) != 0)
+				ifp->if_hwassist |= RE_CSUM_FEATURES;
+			else
 				ifp->if_hwassist &= ~RE_CSUM_FEATURES;
 			reinit = 1;
 		}



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