aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAnders Roxell <anders.roxell@linaro.org>2015-03-20 21:03:53 +0100
committerAnders Roxell <anders.roxell@linaro.org>2015-03-20 21:03:53 +0100
commite20e8b472345ea5babd805db6726d1a7000f7673 (patch)
tree1aaff25991578806a867ba3efcb0f7fd59940388 /lib
parent588956edf5bb33741de41687677f21f5c37671da (diff)
parentc59ecb2edfc11b725a0fa4cb5420c4dbae482c17 (diff)
Merge tag 'v3.14.36-rt31-lno1' into linux-linaro-lsk-v3.14-rt
Linux 3.14.36-rt31 Signed-off-by: Anders Roxell <anders.roxell@linaro.org> Conflicts: arch/arm64/kernel/setup.c arch/x86/kernel/traps.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