1#ifndef _ASM_CRIS_ARCH_CHECKSUM_H 2#define _ASM_CRIS_ARCH_CHECKSUM_H 3 4/* 5 * Check values used in TCP/UDP headers. 6 * 7 * The gain of doing this in assembler instead of C, is that C doesn't 8 * generate carry-additions for the 32-bit components of the 9 * checksum. Which means it would be necessary to split all those into 10 * 16-bit components and then add. 11 */ 12static inline __wsum 13csum_tcpudp_nofold(__be32 saddr, __be32 daddr, 14 unsigned short len, unsigned short proto, __wsum sum) 15{ 16 __wsum res; 17 18 __asm__ __volatile__ ("add.d %2, %0\n\t" 19 "addc %3, %0\n\t" 20 "addc %4, %0\n\t" 21 "addc 0, %0\n\t" 22 : "=r" (res) 23 : "0" (sum), "r" (daddr), "r" (saddr), \ 24 "r" ((len + proto) << 8)); 25 26 return res; 27} 28 29#endif /* _ASM_CRIS_ARCH_CHECKSUM_H */ 30