diff options
author | Lennert Buytenhek <buytenh@wantstofly.org> | 2008-09-18 20:58:50 -0400 |
---|---|---|
committer | Lennert Buytenhek <buytenh@marvell.com> | 2008-09-18 22:47:59 -0400 |
commit | 170e7108a368c52df1ec466966fd1db6e45a7ad2 (patch) | |
tree | 8bfe62f00a3fda957ca22b8a561d4c977ea91719 /drivers/net/mv643xx_eth.c | |
parent | 457b1d5a4b7b8c2b3b6bd032098da600c50dd6b2 (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>
Diffstat (limited to 'drivers/net/mv643xx_eth.c')
-rw-r--r-- | drivers/net/mv643xx_eth.c | 10 |
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. |