checksum.h 944 B

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