1*735ee005SGuo Ren /* SPDX-License-Identifier: GPL-2.0 */
2*735ee005SGuo Ren
3*735ee005SGuo Ren #ifndef __ASM_CSKY_CHECKSUM_H
4*735ee005SGuo Ren #define __ASM_CSKY_CHECKSUM_H
5*735ee005SGuo Ren
6*735ee005SGuo Ren #include <linux/in6.h>
7*735ee005SGuo Ren #include <asm/byteorder.h>
8*735ee005SGuo Ren
csum_fold(__wsum csum)9*735ee005SGuo Ren static inline __sum16 csum_fold(__wsum csum)
10*735ee005SGuo Ren {
11*735ee005SGuo Ren u32 tmp;
12*735ee005SGuo Ren
13*735ee005SGuo Ren asm volatile(
14*735ee005SGuo Ren "mov %1, %0\n"
15*735ee005SGuo Ren "rori %0, 16\n"
16*735ee005SGuo Ren "addu %0, %1\n"
17*735ee005SGuo Ren "lsri %0, 16\n"
18*735ee005SGuo Ren : "=r"(csum), "=r"(tmp)
19*735ee005SGuo Ren : "0"(csum));
20*735ee005SGuo Ren
21*735ee005SGuo Ren return (__force __sum16) ~csum;
22*735ee005SGuo Ren }
23*735ee005SGuo Ren #define csum_fold csum_fold
24*735ee005SGuo Ren
csum_tcpudp_nofold(__be32 saddr,__be32 daddr,unsigned short len,unsigned short proto,__wsum sum)25*735ee005SGuo Ren static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
26*735ee005SGuo Ren unsigned short len, unsigned short proto, __wsum sum)
27*735ee005SGuo Ren {
28*735ee005SGuo Ren asm volatile(
29*735ee005SGuo Ren "clrc\n"
30*735ee005SGuo Ren "addc %0, %1\n"
31*735ee005SGuo Ren "addc %0, %2\n"
32*735ee005SGuo Ren "addc %0, %3\n"
33*735ee005SGuo Ren "inct %0\n"
34*735ee005SGuo Ren : "=r"(sum)
35*735ee005SGuo Ren : "r"((__force u32)saddr), "r"((__force u32)daddr),
36*735ee005SGuo Ren #ifdef __BIG_ENDIAN
37*735ee005SGuo Ren "r"(proto + len),
38*735ee005SGuo Ren #else
39*735ee005SGuo Ren "r"((proto + len) << 8),
40*735ee005SGuo Ren #endif
41*735ee005SGuo Ren "0" ((__force unsigned long)sum)
42*735ee005SGuo Ren : "cc");
43*735ee005SGuo Ren return sum;
44*735ee005SGuo Ren }
45*735ee005SGuo Ren #define csum_tcpudp_nofold csum_tcpudp_nofold
46*735ee005SGuo Ren
47*735ee005SGuo Ren #include <asm-generic/checksum.h>
48*735ee005SGuo Ren
49*735ee005SGuo Ren #endif /* __ASM_CSKY_CHECKSUM_H */
50