Author: yongari
Date: Tue May 13 05:19:29 2014
New Revision: 265943
URL: http://svnweb.freebsd.org/changeset/base/265943

Log:
  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.
  
  Reported and tested by:       tuexen

Modified:
  head/sys/dev/re/if_re.c

Modified: head/sys/dev/re/if_re.c
==============================================================================
--- head/sys/dev/re/if_re.c     Tue May 13 05:07:03 2014        (r265942)
+++ head/sys/dev/re/if_re.c     Tue May 13 05:19:29 2014        (r265943)
@@ -1619,16 +1619,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);
@@ -3364,7 +3366,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) {
@@ -3453,15 +3454,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;
                }
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to