15c48b108SAl Viro /*
25c48b108SAl Viro * Licensed under the GPL
35c48b108SAl Viro */
45c48b108SAl Viro
55c48b108SAl Viro #ifndef __UM_SYSDEP_CHECKSUM_H
65c48b108SAl Viro #define __UM_SYSDEP_CHECKSUM_H
75c48b108SAl Viro
ip_compute_csum(const void * buff,int len)85c48b108SAl Viro static inline __sum16 ip_compute_csum(const void *buff, int len)
95c48b108SAl Viro {
105c48b108SAl Viro return csum_fold (csum_partial(buff, len, 0));
115c48b108SAl Viro }
125c48b108SAl Viro
135c48b108SAl Viro #define _HAVE_ARCH_IPV6_CSUM
csum_ipv6_magic(const struct in6_addr * saddr,const struct in6_addr * daddr,__u32 len,__u8 proto,__wsum sum)145c48b108SAl Viro static __inline__ __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
155c48b108SAl Viro const struct in6_addr *daddr,
161e940829SAlexander Duyck __u32 len, __u8 proto,
175c48b108SAl Viro __wsum sum)
185c48b108SAl Viro {
195c48b108SAl Viro __asm__(
205c48b108SAl Viro "addl 0(%1), %0 ;\n"
215c48b108SAl Viro "adcl 4(%1), %0 ;\n"
225c48b108SAl Viro "adcl 8(%1), %0 ;\n"
235c48b108SAl Viro "adcl 12(%1), %0 ;\n"
245c48b108SAl Viro "adcl 0(%2), %0 ;\n"
255c48b108SAl Viro "adcl 4(%2), %0 ;\n"
265c48b108SAl Viro "adcl 8(%2), %0 ;\n"
275c48b108SAl Viro "adcl 12(%2), %0 ;\n"
285c48b108SAl Viro "adcl %3, %0 ;\n"
295c48b108SAl Viro "adcl %4, %0 ;\n"
305c48b108SAl Viro "adcl $0, %0 ;\n"
315c48b108SAl Viro : "=&r" (sum)
325c48b108SAl Viro : "r" (saddr), "r" (daddr),
335c48b108SAl Viro "r"(htonl(len)), "r"(htonl(proto)), "0"(sum));
345c48b108SAl Viro
355c48b108SAl Viro return csum_fold(sum);
365c48b108SAl Viro }
375c48b108SAl Viro
385c48b108SAl Viro #endif
39