Hi:

This patches merges the separate calls to le16_to_cpu and ntohl into one
swab32 call so that it is clear that we're simply changing a little-endian
value from the hardware to big-endian for the networking stack.

Let x be any 16 any 16-bit integer, we have

csum_fold(x << 16) = csum_fold(x).

So on big endian, we have

csum_fold(swab32(x ^ 0xffff)) =
        csum_fold(swab16(x ^ 0xffff) << 16) =
        csum_fold(swab16(x ^ 0xffff)) =
        csum_fold(swab16(x) ^ 0xffff) =
        csum_fold(ntohl(swab16(x) ^ 0xffff)) =
        csum_fold(ntohl(le16_to_cpu(x) ^ 0xffff))

On little endian we have

csum_fold(swab32(x ^ 0xffff)) =
        csum_fold(ntohl(x ^ 0xffff)) =
        csum_fold(ntohl(le16_to_cpu(x) ^ 0xffff))

I used swab32 instead of swab16 because 32-bit arithmetic usually generates
better code.

So this should genereate the same code on little-endian, and slightly better
code for big-endian architectures.

Signed-off-by: Herbert Xu ~{PmV>HI~} <[EMAIL PROTECTED]>

Cheers,
-- 
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[EMAIL PROTECTED]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
index 49cd096..10aec70 100644
--- a/drivers/net/e1000/e1000_main.c
+++ b/drivers/net/e1000/e1000_main.c
@@ -3478,10 +3478,10 @@
        } else if (adapter->hw.mac_type > e1000_82547_rev_2) {
                /* IP fragment with UDP payload */
                /* Hardware complements the payload checksum, so we undo it
-                * and then put the value in host order for further stack use.
+                * and then put the value in network order for further stack
+                * use.
                 */
-               csum = ntohl(csum ^ 0xFFFF);
-               skb->csum = csum;
+               skb->csum = swab32(csum ^ 0xffff);
                skb->ip_summed = CHECKSUM_HW;
        }
        adapter->hw_csum_good++;
@@ -3600,7 +3600,7 @@
                e1000_rx_checksum(adapter,
                                  (uint32_t)(status) |
                                  ((uint32_t)(rx_desc->errors) << 24),
-                                 le16_to_cpu(rx_desc->csum), skb);
+                                 rx_desc->csum, skb);
 
                skb->protocol = eth_type_trans(skb, netdev);
 #ifdef CONFIG_E1000_NAPI
@@ -3773,7 +3773,7 @@
 
 copydone:
                e1000_rx_checksum(adapter, staterr,
-                                 
le16_to_cpu(rx_desc->wb.lower.hi_dword.csum_ip.csum), skb);
+                                 rx_desc->wb.lower.hi_dword.csum_ip.csum, skb);
                skb->protocol = eth_type_trans(skb, netdev);
 
                if (likely(rx_desc->wb.upper.header_status &

Reply via email to