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