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