aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennert Buytenhek <buytenh@wantstofly.org>2008-09-18 20:58:50 -0400
committerLennert Buytenhek <buytenh@marvell.com>2008-09-18 22:47:59 -0400
commit170e7108a368c52df1ec466966fd1db6e45a7ad2 (patch)
tree8bfe62f00a3fda957ca22b8a561d4c977ea91719
parent457b1d5a4b7b8c2b3b6bd032098da600c50dd6b2 (diff)
mv643xx_eth: fix receive checksumming
We have to explicitly tell the hardware to include the pseudo-header when doing receive checksumming, otherwise hardware checksumming will fail for every received packet and we'll end up setting CHECKSUM_NONE on every received packet. While we're at it, when skb->ip_summed is set to CHECKSUM_UNNECESSARY on received packets, skb->csum is supposed to be undefined, and thus there is no need to set it. Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
-rw-r--r--drivers/net/mv643xx_eth.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c
index 408827de7d3e..94c13be292a3 100644
--- a/drivers/net/mv643xx_eth.c
+++ b/drivers/net/mv643xx_eth.c
@@ -546,11 +546,8 @@ static int rxq_process(struct rx_queue *rxq, int budget)
546 */ 546 */
547 skb_put(skb, byte_cnt - 2 - 4); 547 skb_put(skb, byte_cnt - 2 - 4);
548 548
549 if (cmd_sts & LAYER_4_CHECKSUM_OK) { 549 if (cmd_sts & LAYER_4_CHECKSUM_OK)
550 skb->ip_summed = CHECKSUM_UNNECESSARY; 550 skb->ip_summed = CHECKSUM_UNNECESSARY;
551 skb->csum = htons(
552 (cmd_sts & 0x0007fff8) >> 3);
553 }
554 skb->protocol = eth_type_trans(skb, mp->dev); 551 skb->protocol = eth_type_trans(skb, mp->dev);
555 netif_receive_skb(skb); 552 netif_receive_skb(skb);
556 } 553 }
@@ -1994,9 +1991,10 @@ static void port_start(struct mv643xx_eth_private *mp)
1994 1991
1995 /* 1992 /*
1996 * Receive all unmatched unicast, TCP, UDP, BPDU and broadcast 1993 * Receive all unmatched unicast, TCP, UDP, BPDU and broadcast
1997 * frames to RX queue #0. 1994 * frames to RX queue #0, and include the pseudo-header when
1995 * calculating receive checksums.
1998 */ 1996 */
1999 wrl(mp, PORT_CONFIG(mp->port_num), 0x00000000); 1997 wrl(mp, PORT_CONFIG(mp->port_num), 0x02000000);
2000 1998
2001 /* 1999 /*
2002 * Treat BPDUs as normal multicasts, and disable partition mode. 2000 * Treat BPDUs as normal multicasts, and disable partition mode.