12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- /* SPDX-License-Identifier: GPL-2.0 */
- #ifndef __ASM_CSKY_CHECKSUM_H
- #define __ASM_CSKY_CHECKSUM_H
- #include <linux/in6.h>
- #include <asm/byteorder.h>
- static inline __sum16 csum_fold(__wsum csum)
- {
- u32 tmp;
- asm volatile(
- "mov %1, %0\n"
- "rori %0, 16\n"
- "addu %0, %1\n"
- "lsri %0, 16\n"
- : "=r"(csum), "=r"(tmp)
- : "0"(csum));
- return (__force __sum16) ~csum;
- }
- #define csum_fold csum_fold
- static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
- unsigned short len, unsigned short proto, __wsum sum)
- {
- asm volatile(
- "clrc\n"
- "addc %0, %1\n"
- "addc %0, %2\n"
- "addc %0, %3\n"
- "inct %0\n"
- : "=r"(sum)
- : "r"((__force u32)saddr), "r"((__force u32)daddr),
- #ifdef __BIG_ENDIAN
- "r"(proto + len),
- #else
- "r"((proto + len) << 8),
- #endif
- "0" ((__force unsigned long)sum)
- : "cc");
- return sum;
- }
- #define csum_tcpudp_nofold csum_tcpudp_nofold
- #include <asm-generic/checksum.h>
- #endif /* __ASM_CSKY_CHECKSUM_H */
|