mv643xx_eth: fix receive checksumming
authorLennert Buytenhek <buytenh@wantstofly.org>
Fri, 19 Sep 2008 00:58:50 +0000 (02:58 +0200)
committerLennert Buytenhek <buytenh@marvell.com>
Fri, 19 Sep 2008 02:47:59 +0000 (04:47 +0200)
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>
drivers/net/mv643xx_eth.c

index 408827de7d3eb5371379f8de307a4fc7a2f48596..94c13be292a30a80e8c26f519588a82aee202998 100644 (file)
@@ -546,11 +546,8 @@ static int rxq_process(struct rx_queue *rxq, int budget)
                         */
                        skb_put(skb, byte_cnt - 2 - 4);
 
-                       if (cmd_sts & LAYER_4_CHECKSUM_OK) {
+                       if (cmd_sts & LAYER_4_CHECKSUM_OK)
                                skb->ip_summed = CHECKSUM_UNNECESSARY;
-                               skb->csum = htons(
-                                       (cmd_sts & 0x0007fff8) >> 3);
-                       }
                        skb->protocol = eth_type_trans(skb, mp->dev);
                        netif_receive_skb(skb);
                }
@@ -1994,9 +1991,10 @@ static void port_start(struct mv643xx_eth_private *mp)
 
        /*
         * Receive all unmatched unicast, TCP, UDP, BPDU and broadcast
-        * frames to RX queue #0.
+        * frames to RX queue #0, and include the pseudo-header when
+        * calculating receive checksums.
         */
-       wrl(mp, PORT_CONFIG(mp->port_num), 0x00000000);
+       wrl(mp, PORT_CONFIG(mp->port_num), 0x02000000);
 
        /*
         * Treat BPDUs as normal multicasts, and disable partition mode.