aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMark Brown <broonie@kernel.org>2015-03-03 09:36:44 +0000
committerMark Brown <broonie@kernel.org>2015-03-03 09:36:44 +0000
commita0d6a47ed69978c84ba8859c3cdbbbd04e79eb2d (patch)
tree30cf64632dd0c25fb07c1ab8dd590efa6991f1a3 /lib
parent3af2dae32ca1108e47a435eaeec276a1c8289a36 (diff)
parent413cb08cebe9fd8107f556eee48b2d40773cacde (diff)
Merge tag 'v3.14.34' into linux-linaro-lsk-v3.14
This is the 3.14.34 stable release Conflicts: arch/arm64/kernel/setup.c
Diffstat (limited to 'lib')
-rw-r--r--lib/checksum.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/lib/checksum.c b/lib/checksum.c
index 129775eb6de6..8b39e86dbab5 100644
--- a/lib/checksum.c
+++ b/lib/checksum.c
@@ -181,6 +181,15 @@ csum_partial_copy(const void *src, void *dst, int len, __wsum sum)
EXPORT_SYMBOL(csum_partial_copy);
#ifndef csum_tcpudp_nofold
+static inline u32 from64to32(u64 x)
+{
+ /* add up 32-bit and 32-bit for 32+c bit */
+ x = (x & 0xffffffff) + (x >> 32);
+ /* add up carry.. */
+ x = (x & 0xffffffff) + (x >> 32);
+ return (u32)x;
+}
+
__wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
unsigned short len,
unsigned short proto,
@@ -195,8 +204,7 @@ __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
#else
s += (proto + len) << 8;
#endif
- s += (s >> 32);
- return (__force __wsum)s;
+ return (__force __wsum)from64to32(s);
}
EXPORT_SYMBOL(csum_tcpudp_nofold);
#endif