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