Module Name:    src
Committed By:   msaitoh
Date:           Thu Oct  4 14:21:00 UTC 2012

Modified Files:
        src/sys/dev/marvell: if_mvgbe.c mvgbereg.h

Log Message:
Fix udpcsum-rx bug on fragmented case this time.
  - Fix the usage of a local variable for csum_flags.
  - It seemd that sometimes MVGBE_RX_L4_CHECKSUM_OK bit were set to 0
    even if the checksum is correct and the packet was not fragmented.
    So we don't set M_CSUM_TCP_UDP_BAD even if csum bit is 0.


To generate a diff of this commit:
cvs rdiff -u -r1.21 -r1.22 src/sys/dev/marvell/if_mvgbe.c
cvs rdiff -u -r1.3 -r1.4 src/sys/dev/marvell/mvgbereg.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/marvell/if_mvgbe.c
diff -u src/sys/dev/marvell/if_mvgbe.c:1.21 src/sys/dev/marvell/if_mvgbe.c:1.22
--- src/sys/dev/marvell/if_mvgbe.c:1.21	Tue Oct  2 15:22:46 2012
+++ src/sys/dev/marvell/if_mvgbe.c	Thu Oct  4 14:21:00 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_mvgbe.c,v 1.21 2012/10/02 15:22:46 msaitoh Exp $	*/
+/*	$NetBSD: if_mvgbe.c,v 1.22 2012/10/04 14:21:00 msaitoh Exp $	*/
 /*
  * Copyright (c) 2007, 2008 KIYOHARA Takashi
  * All rights reserved.
@@ -25,7 +25,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_mvgbe.c,v 1.21 2012/10/02 15:22:46 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_mvgbe.c,v 1.22 2012/10/04 14:21:00 msaitoh Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -1748,26 +1748,31 @@ mvgbe_rxeof(struct mvgbe_softc *sc)
 			int flgs = 0;
 
 			/* Check IPv4 header checksum */
-			m->m_pkthdr.csum_flags |= M_CSUM_IPv4;
+			flgs |= M_CSUM_IPv4;
 			if (!(rxstat & MVGBE_RX_IP_HEADER_OK))
 				flgs |= M_CSUM_IPv4_BAD;
-
-			/* Check TCPv4/UDPv4 checksum */
-			if ((bufsize & MVGBE_RX_MAX_FRAME_LEN_ERROR) == 0) {
-				/* Not fragmented */
-
-				if ((rxstat & MVGBE_RX_L4_TYPE_MASK) ==
-				    MVGBE_RX_L4_TYPE_TCP)
+			else if ((bufsize & MVGBE_RX_MAX_FRAME_LEN_ERROR)
+			    == 0) {
+				/*
+				 * Check TCPv4/UDPv4 checksum for
+				 * non-fragmented packet only.
+				 *
+				 * It seemd that sometimes
+				 * MVGBE_RX_L4_CHECKSUM_OK bit was set to 0
+				 * even if the checksum is correct and the
+				 * packet was not fragmented. So we don't set
+				 * M_CSUM_TCP_UDP_BAD even if csum bit is 0.
+				 */
+
+				if (((rxstat & MVGBE_RX_L4_TYPE_MASK) ==
+					MVGBE_RX_L4_TYPE_TCP) &&
+				    ((rxstat & MVGBE_RX_L4_CHECKSUM_OK) != 0))
 					flgs |= M_CSUM_TCPv4;
-				else if ((rxstat & MVGBE_RX_L4_TYPE_MASK) ==
-				    MVGBE_RX_L4_TYPE_UDP)
+				else if (((rxstat & MVGBE_RX_L4_TYPE_MASK) ==
+					MVGBE_RX_L4_TYPE_UDP) &&
+				    ((rxstat & MVGBE_RX_L4_CHECKSUM_OK) != 0))
 					flgs |= M_CSUM_UDPv4;
-
-				if (((flgs & (M_CSUM_TCPv4|M_CSUM_UDPv4)) != 0)
-				    && !(rxstat & MVGBE_RX_L4_CHECKSUM))
-					flgs |= M_CSUM_TCP_UDP_BAD;
 			}
-
 			m->m_pkthdr.csum_flags = flgs;
 		}
 sw_csum:

Index: src/sys/dev/marvell/mvgbereg.h
diff -u src/sys/dev/marvell/mvgbereg.h:1.3 src/sys/dev/marvell/mvgbereg.h:1.4
--- src/sys/dev/marvell/mvgbereg.h:1.3	Tue Feb  1 23:40:12 2011
+++ src/sys/dev/marvell/mvgbereg.h	Thu Oct  4 14:21:00 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: mvgbereg.h,v 1.3 2011/02/01 23:40:12 jakllsch Exp $	*/
+/*	$NetBSD: mvgbereg.h,v 1.4 2012/10/04 14:21:00 msaitoh Exp $	*/
 /*
  * Copyright (c) 2007 KIYOHARA Takashi
  * All rights reserved.
@@ -429,6 +429,6 @@ struct mvgbe_rx_desc {
 #define MVGBE_RX_FIRST_DESC		(1 << 27)
 #define MVGBE_RX_UNKNOWN_DA		(1 << 28)
 #define MVGBE_RX_ENABLE_INTERRUPT	(1 << 29)
-#define MVGBE_RX_L4_CHECKSUM		(1 << 30)
+#define MVGBE_RX_L4_CHECKSUM_OK		(1 << 30)
 
 #endif	/* _MVGEREG_H_ */

Reply via email to