Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 
0003 #ifndef __ASM_CSKY_CHECKSUM_H
0004 #define __ASM_CSKY_CHECKSUM_H
0005 
0006 #include <linux/in6.h>
0007 #include <asm/byteorder.h>
0008 
0009 static inline __sum16 csum_fold(__wsum csum)
0010 {
0011     u32 tmp;
0012 
0013     asm volatile(
0014     "mov    %1, %0\n"
0015     "rori   %0, 16\n"
0016     "addu   %0, %1\n"
0017     "lsri   %0, 16\n"
0018     : "=r"(csum), "=r"(tmp)
0019     : "0"(csum));
0020 
0021     return (__force __sum16) ~csum;
0022 }
0023 #define csum_fold csum_fold
0024 
0025 static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
0026         unsigned short len, unsigned short proto, __wsum sum)
0027 {
0028     asm volatile(
0029     "clrc\n"
0030     "addc    %0, %1\n"
0031     "addc    %0, %2\n"
0032     "addc    %0, %3\n"
0033     "inct    %0\n"
0034     : "=r"(sum)
0035     : "r"((__force u32)saddr), "r"((__force u32)daddr),
0036 #ifdef __BIG_ENDIAN
0037     "r"(proto + len),
0038 #else
0039     "r"((proto + len) << 8),
0040 #endif
0041     "0" ((__force unsigned long)sum)
0042     : "cc");
0043     return sum;
0044 }
0045 #define csum_tcpudp_nofold csum_tcpudp_nofold
0046 
0047 #include <asm-generic/checksum.h>
0048 
0049 #endif /* __ASM_CSKY_CHECKSUM_H */