50 lines
944 B
C
50 lines
944 B
C
/* 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 */
|