xref: /OK3568_Linux_fs/kernel/arch/microblaze/include/asm/checksum.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (C) 2008 Michal Simek <monstr@monstr.eu>
4*4882a593Smuzhiyun  * Copyright (C) 2006 Atmark Techno, Inc.
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #ifndef _ASM_MICROBLAZE_CHECKSUM_H
8*4882a593Smuzhiyun #define _ASM_MICROBLAZE_CHECKSUM_H
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun /*
11*4882a593Smuzhiyun  * computes the checksum of the TCP/UDP pseudo-header
12*4882a593Smuzhiyun  * returns a 16-bit checksum, already complemented
13*4882a593Smuzhiyun  */
14*4882a593Smuzhiyun #define csum_tcpudp_nofold	csum_tcpudp_nofold
15*4882a593Smuzhiyun static inline __wsum
csum_tcpudp_nofold(__be32 saddr,__be32 daddr,__u32 len,__u8 proto,__wsum sum)16*4882a593Smuzhiyun csum_tcpudp_nofold(__be32 saddr, __be32 daddr, __u32 len,
17*4882a593Smuzhiyun 		   __u8 proto, __wsum sum)
18*4882a593Smuzhiyun {
19*4882a593Smuzhiyun 	__asm__("add %0, %0, %1\n\t"
20*4882a593Smuzhiyun 		"addc %0, %0, %2\n\t"
21*4882a593Smuzhiyun 		"addc %0, %0, %3\n\t"
22*4882a593Smuzhiyun 		"addc %0, %0, r0\n\t"
23*4882a593Smuzhiyun 		: "+&d" (sum)
24*4882a593Smuzhiyun 		: "d" (saddr), "d" (daddr),
25*4882a593Smuzhiyun #ifdef __MICROBLAZEEL__
26*4882a593Smuzhiyun 	"d" ((len + proto) << 8)
27*4882a593Smuzhiyun #else
28*4882a593Smuzhiyun 	"d" (len + proto)
29*4882a593Smuzhiyun #endif
30*4882a593Smuzhiyun );
31*4882a593Smuzhiyun 	return sum;
32*4882a593Smuzhiyun }
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #include <asm-generic/checksum.h>
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #endif /* _ASM_MICROBLAZE_CHECKSUM_H */
37