unsigned int __skb_checksum_complete(struct sk_buff *skb)
 {
-       unsigned int sum;
+       __sum16 sum;
 
-       sum = (u16)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum));
+       sum = csum_fold(skb_checksum(skb, 0, skb->len, skb->csum));
        if (likely(!sum)) {
                if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE))
                        netdev_rx_csum_fault(skb->dev);
 int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb,
                                     int hlen, struct iovec *iov)
 {
-       unsigned int csum;
+       __wsum csum;
        int chunk = skb->len - hlen;
 
        /* Skip filled elements.
                if (skb_copy_and_csum_datagram(skb, hlen, iov->iov_base,
                                               chunk, &csum))
                        goto fault;
-               if ((unsigned short)csum_fold(csum))
+               if (csum_fold(csum))
                        goto csum_error;
                if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE))
                        netdev_rx_csum_fault(skb->dev);
 
  */
 int skb_checksum_help(struct sk_buff *skb)
 {
-       unsigned int csum;
+       __wsum csum;
        int ret = 0, offset = skb->h.raw - skb->data;
 
        if (skb->ip_summed == CHECKSUM_COMPLETE)
        BUG_ON(offset <= 0);
        BUG_ON(skb->csum + 2 > offset);
 
-       *(u16*)(skb->h.raw + skb->csum) = csum_fold(csum);
+       *(__sum16*)(skb->h.raw + skb->csum) = csum_fold(csum);
 
 out_set_summed:
        skb->ip_summed = CHECKSUM_NONE;
 
        psum = csum_tcpudp_nofold(saddr, daddr, ulen, IPPROTO_UDP, 0);
 
        if (skb->ip_summed == CHECKSUM_COMPLETE &&
-           !(u16)csum_fold(csum_add(psum, skb->csum)))
+           !csum_fold(csum_add(psum, skb->csum)))
                return 0;
 
        skb->csum = psum;
 
 
 void skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to)
 {
-       unsigned int csum;
+       __wsum csum;
        long csstart;
 
        if (skb->ip_summed == CHECKSUM_PARTIAL)
        if (skb->ip_summed == CHECKSUM_PARTIAL) {
                long csstuff = csstart + skb->csum;
 
-               *((unsigned short *)(to + csstuff)) = csum_fold(csum);
+               *((__sum16 *)(to + csstuff)) = csum_fold(csum);
        }
 }
 
 
                ip_flush_pending_frames(icmp_socket->sk);
        else if ((skb = skb_peek(&icmp_socket->sk->sk_write_queue)) != NULL) {
                struct icmphdr *icmph = skb->h.icmph;
-               unsigned int csum = 0;
+               __wsum csum = 0;
                struct sk_buff *skb1;
 
                skb_queue_walk(&icmp_socket->sk->sk_write_queue, skb1) {
 
        switch (skb->ip_summed) {
        case CHECKSUM_COMPLETE:
-               if (!(u16)csum_fold(skb->csum))
+               if (!csum_fold(skb->csum))
                        break;
                /* fall through */
        case CHECKSUM_NONE:
 
 
        switch (skb->ip_summed) {
        case CHECKSUM_COMPLETE:
-               if (!(u16)csum_fold(skb->csum))
+               if (!csum_fold(skb->csum))
                        break;
                /* fall through */
        case CHECKSUM_NONE:
 
        struct iphdr *iph;
        u8     *h;
        __be16    flags;
-       u16    csum = 0;
+       __sum16   csum = 0;
        __be32 key = 0;
        u32    seqno = 0;
        struct ip_tunnel *tunnel;
                if (flags&GRE_CSUM) {
                        switch (skb->ip_summed) {
                        case CHECKSUM_COMPLETE:
-                               csum = (u16)csum_fold(skb->csum);
+                               csum = csum_fold(skb->csum);
                                if (!csum)
                                        break;
                                /* fall through */
 
                       &ipc, rt, MSG_DONTWAIT);
        if ((skb = skb_peek(&sk->sk_write_queue)) != NULL) {
                if (arg->csumoffset >= 0)
-                       *((u16 *)skb->h.raw + arg->csumoffset) = csum_fold(csum_add(skb->csum, arg->csum));
+                       *((__sum16 *)skb->h.raw + arg->csumoffset) = csum_fold(csum_add(skb->csum, arg->csum));
                skb->ip_summed = CHECKSUM_NONE;
                ip_push_pending_frames(sk);
        }
 
         if (pim->type != ((PIM_VERSION<<4)|(PIM_REGISTER)) ||
            (pim->flags&PIM_NULL_REGISTER) ||
            (ip_compute_csum((void *)pim, sizeof(*pim)) != 0 && 
-            (u16)csum_fold(skb_checksum(skb, 0, skb->len, 0)))) 
+            csum_fold(skb_checksum(skb, 0, skb->len, 0))))
                goto drop;
 
        /* check if the inner packet is destined to mcast group */
 
 
 u16 ip_vs_checksum_complete(struct sk_buff *skb, int offset)
 {
-       return (u16) csum_fold(skb_checksum(skb, offset, skb->len - offset, 0));
+       return csum_fold(skb_checksum(skb, offset, skb->len - offset, 0));
 }
 
 static inline struct sk_buff *
 
        case CHECKSUM_COMPLETE:
                if (hook != NF_IP_PRE_ROUTING && hook != NF_IP_LOCAL_IN)
                        break;
-               if ((protocol == 0 && !(u16)csum_fold(skb->csum)) ||
+               if ((protocol == 0 && !csum_fold(skb->csum)) ||
                    !csum_tcpudp_magic(iph->saddr, iph->daddr,
                                       skb->len - dataoff, protocol,
                                       skb->csum)) {
 
        struct tcphdr *th;
        unsigned thlen;
        unsigned int seq;
-       unsigned int delta;
+       __be32 delta;
        unsigned int oldlen;
        unsigned int len;
 
        do {
                th->fin = th->psh = 0;
 
-               th->check = ~csum_fold(th->check + delta);
+               th->check = ~csum_fold((__force __wsum)((__force u32)th->check +
+                                      (__force u32)delta));
                if (skb->ip_summed != CHECKSUM_PARTIAL)
                        th->check = csum_fold(csum_partial(skb->h.raw, thlen,
                                                           skb->csum));
        } while (skb->next);
 
        delta = htonl(oldlen + (skb->tail - skb->h.raw) + skb->data_len);
-       th->check = ~csum_fold(th->check + delta);
+       th->check = ~csum_fold((__force __wsum)((__force u32)th->check +
+                               (__force u32)delta));
        if (skb->ip_summed != CHECKSUM_PARTIAL)
                th->check = csum_fold(csum_partial(skb->h.raw, thlen,
                                                   skb->csum));
 
        }
        if (desc.count)
                return -1;
-       if ((unsigned short)csum_fold(desc.csum))
+       if (csum_fold(desc.csum))
                return -1;
        if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE))
                netdev_rx_csum_fault(skb->dev);