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