|
@@ -1979,6 +1979,7 @@ static int cas_rx_process_pkt(struct cas *cp, struct cas_rx_comp *rxc,
|
|
|
struct cas_page *page;
|
|
|
struct sk_buff *skb;
|
|
|
void *addr, *crcaddr;
|
|
|
+ __sum16 csum;
|
|
|
char *p;
|
|
|
|
|
|
hlen = CAS_VAL(RX_COMP2_HDR_SIZE, words[1]);
|
|
@@ -2158,14 +2159,15 @@ end_copy_pkt:
|
|
|
skb_put(skb, alloclen);
|
|
|
}
|
|
|
|
|
|
- i = CAS_VAL(RX_COMP4_TCP_CSUM, words[3]);
|
|
|
+ csum = (__force __sum16)htons(CAS_VAL(RX_COMP4_TCP_CSUM, words[3]));
|
|
|
if (cp->crc_size) {
|
|
|
/* checksum includes FCS. strip it out. */
|
|
|
- i = csum_fold(csum_partial(crcaddr, cp->crc_size, i));
|
|
|
+ csum = csum_fold(csum_partial(crcaddr, cp->crc_size,
|
|
|
+ csum_unfold(csum)));
|
|
|
if (addr)
|
|
|
cas_page_unmap(addr);
|
|
|
}
|
|
|
- skb->csum = ntohs(i ^ 0xffff);
|
|
|
+ skb->csum = csum_unfold(~csum);
|
|
|
skb->ip_summed = CHECKSUM_COMPLETE;
|
|
|
skb->protocol = eth_type_trans(skb, cp->dev);
|
|
|
return len;
|