Module Name: src Committed By: riz Date: Sun Apr 24 16:27:25 UTC 2011
Modified Files: src/sys/dev/pci [netbsd-5]: if_bge.c Log Message: Pull up following revision(s) (requested by buhrow in ticket #1601): sys/dev/pci/if_bge.c: revision 1.194 Fixes for kern/40018. Our driver initializes the Broadcom hardware to peform a tcp and udp checksum on only the payload of the tcp or udp packet, rather than the entire packet. The FreeBSD, OpenBSD and Linux drivers instruct the hardware to compute the checksum for the entire packet. I believe the bug is that some revisions of the BCM hardware, under certain circumstances, revert to doing the complete checksum calculation, as the FreeBSD, OpenBSD and Linux drivers request, while things are running. As a result, when we pull the computed checksum from the hardware and pass it up to the upper layers, we assume the checksum is the more minimal one, and the upper layers perform the appropriate checks, which, when this happens, cause the packet to be rejected because the resultant checksum is decidedly incorrect. This patch changes the driver to instruct the hardware to perform the checksum over the entire packet, just as the FreeBSD, OpenBSD and Linux drivers do, and to notify the upper layers appropriately. This patch appears to work on all revisions of the hardware that have been tested. (See the list in the bug report.) this patch is approved by tls. To generate a diff of this commit: cvs rdiff -u -r1.152.4.5 -r1.152.4.6 src/sys/dev/pci/if_bge.c 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/pci/if_bge.c diff -u src/sys/dev/pci/if_bge.c:1.152.4.5 src/sys/dev/pci/if_bge.c:1.152.4.6 --- src/sys/dev/pci/if_bge.c:1.152.4.5 Fri Nov 19 23:58:40 2010 +++ src/sys/dev/pci/if_bge.c Sun Apr 24 16:27:24 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: if_bge.c,v 1.152.4.5 2010/11/19 23:58:40 riz Exp $ */ +/* $NetBSD: if_bge.c,v 1.152.4.6 2011/04/24 16:27:24 riz Exp $ */ /* * Copyright (c) 2001 Wind River Systems @@ -79,7 +79,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_bge.c,v 1.152.4.5 2010/11/19 23:58:40 riz Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_bge.c,v 1.152.4.6 2011/04/24 16:27:24 riz Exp $"); #include "bpfilter.h" #include "vlan.h" @@ -1870,7 +1870,7 @@ */ CSR_WRITE_4(sc, BGE_MODE_CTL, BGE_DMA_SWAP_OPTIONS | BGE_MODECTL_MAC_ATTN_INTR | BGE_MODECTL_HOST_SEND_BDS | - BGE_MODECTL_TX_NO_PHDR_CSUM | BGE_MODECTL_RX_NO_PHDR_CSUM); + BGE_MODECTL_TX_NO_PHDR_CSUM); /* * BCM5701 B5 have a bug causing data corruption when using @@ -3451,7 +3451,7 @@ cur_rx->bge_tcp_udp_csum; m->m_pkthdr.csum_flags |= (M_CSUM_TCPv4|M_CSUM_UDPv4| - M_CSUM_DATA|M_CSUM_NO_PSEUDOHDR); + M_CSUM_DATA); } /*