diff options
author | Stephen Rothwell <sfr@canb.auug.org.au> | 2008-08-01 01:20:30 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2008-08-03 22:02:00 -0400 |
commit | b8b572e1015f81b4e748417be2629dfe51ab99f9 (patch) | |
tree | 7df58667d5ed71d6c8f8f4ce40ca16b6fb776d0b /arch/powerpc/include/asm/checksum.h | |
parent | 2b12a4c524812fb3f6ee590a02e65b95c8c32229 (diff) |
powerpc: Move include files to arch/powerpc/include/asm
from include/asm-powerpc. This is the result of a
mkdir arch/powerpc/include/asm
git mv include/asm-powerpc/* arch/powerpc/include/asm
Followed by a few documentation/comment fixups and a couple of places
where <asm-powepc/...> was being used explicitly. Of the latter only
one was outside the arch code and it is a driver only built for powerpc.
Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc/include/asm/checksum.h')
-rw-r--r-- | arch/powerpc/include/asm/checksum.h | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/arch/powerpc/include/asm/checksum.h b/arch/powerpc/include/asm/checksum.h new file mode 100644 index 000000000000..7cdf358337cf --- /dev/null +++ b/arch/powerpc/include/asm/checksum.h | |||
@@ -0,0 +1,117 @@ | |||
1 | #ifndef _ASM_POWERPC_CHECKSUM_H | ||
2 | #define _ASM_POWERPC_CHECKSUM_H | ||
3 | #ifdef __KERNEL__ | ||
4 | |||
5 | /* | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | /* | ||
13 | * This is a version of ip_compute_csum() optimized for IP headers, | ||
14 | * which always checksum on 4 octet boundaries. ihl is the number | ||
15 | * of 32-bit words and is always >= 5. | ||
16 | */ | ||
17 | extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl); | ||
18 | |||
19 | /* | ||
20 | * computes the checksum of the TCP/UDP pseudo-header | ||
21 | * returns a 16-bit checksum, already complemented | ||
22 | */ | ||
23 | extern __sum16 csum_tcpudp_magic(__be32 saddr, __be32 daddr, | ||
24 | unsigned short len, | ||
25 | unsigned short proto, | ||
26 | __wsum sum); | ||
27 | |||
28 | /* | ||
29 | * computes the checksum of a memory block at buff, length len, | ||
30 | * and adds in "sum" (32-bit) | ||
31 | * | ||
32 | * returns a 32-bit number suitable for feeding into itself | ||
33 | * or csum_tcpudp_magic | ||
34 | * | ||
35 | * this function must be called with even lengths, except | ||
36 | * for the last fragment, which may be odd | ||
37 | * | ||
38 | * it's best to have buff aligned on a 32-bit boundary | ||
39 | */ | ||
40 | extern __wsum csum_partial(const void *buff, int len, __wsum sum); | ||
41 | |||
42 | /* | ||
43 | * Computes the checksum of a memory block at src, length len, | ||
44 | * and adds in "sum" (32-bit), while copying the block to dst. | ||
45 | * If an access exception occurs on src or dst, it stores -EFAULT | ||
46 | * to *src_err or *dst_err respectively (if that pointer is not | ||
47 | * NULL), and, for an error on src, zeroes the rest of dst. | ||
48 | * | ||
49 | * Like csum_partial, this must be called with even lengths, | ||
50 | * except for the last fragment. | ||
51 | */ | ||
52 | extern __wsum csum_partial_copy_generic(const void *src, void *dst, | ||
53 | int len, __wsum sum, | ||
54 | int *src_err, int *dst_err); | ||
55 | /* | ||
56 | * the same as csum_partial, but copies from src to dst while it | ||
57 | * checksums. | ||
58 | */ | ||
59 | #define csum_partial_copy_from_user(src, dst, len, sum, errp) \ | ||
60 | csum_partial_copy_generic((__force const void *)(src), (dst), (len), (sum), (errp), NULL) | ||
61 | |||
62 | #define csum_partial_copy_nocheck(src, dst, len, sum) \ | ||
63 | csum_partial_copy_generic((src), (dst), (len), (sum), NULL, NULL) | ||
64 | |||
65 | |||
66 | /* | ||
67 | * turns a 32-bit partial checksum (e.g. from csum_partial) into a | ||
68 | * 1's complement 16-bit checksum. | ||
69 | */ | ||
70 | static inline __sum16 csum_fold(__wsum sum) | ||
71 | { | ||
72 | unsigned int tmp; | ||
73 | |||
74 | /* swap the two 16-bit halves of sum */ | ||
75 | __asm__("rlwinm %0,%1,16,0,31" : "=r" (tmp) : "r" (sum)); | ||
76 | /* if there is a carry from adding the two 16-bit halves, | ||
77 | it will carry from the lower half into the upper half, | ||
78 | giving us the correct sum in the upper half. */ | ||
79 | return (__force __sum16)(~((__force u32)sum + tmp) >> 16); | ||
80 | } | ||
81 | |||
82 | /* | ||
83 | * this routine is used for miscellaneous IP-like checksums, mainly | ||
84 | * in icmp.c | ||
85 | */ | ||
86 | static inline __sum16 ip_compute_csum(const void *buff, int len) | ||
87 | { | ||
88 | return csum_fold(csum_partial(buff, len, 0)); | ||
89 | } | ||
90 | |||
91 | static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr, | ||
92 | unsigned short len, | ||
93 | unsigned short proto, | ||
94 | __wsum sum) | ||
95 | { | ||
96 | #ifdef __powerpc64__ | ||
97 | unsigned long s = (__force u32)sum; | ||
98 | |||
99 | s += (__force u32)saddr; | ||
100 | s += (__force u32)daddr; | ||
101 | s += proto + len; | ||
102 | s += (s >> 32); | ||
103 | return (__force __wsum) s; | ||
104 | #else | ||
105 | __asm__("\n\ | ||
106 | addc %0,%0,%1 \n\ | ||
107 | adde %0,%0,%2 \n\ | ||
108 | adde %0,%0,%3 \n\ | ||
109 | addze %0,%0 \n\ | ||
110 | " | ||
111 | : "=r" (sum) | ||
112 | : "r" (daddr), "r"(saddr), "r"(proto + len), "0"(sum)); | ||
113 | return sum; | ||
114 | #endif | ||
115 | } | ||
116 | #endif /* __KERNEL__ */ | ||
117 | #endif | ||