1/*
2 *  arch/s390/lib/checksum.c
3 *    S390 fast network checksum routines
4 *
5 *  S390 version
6 *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
7 *    Author(s): Ulrich Hild        (first version),
8 *               Martin Schwidefsky (schwidefsky@de.ibm.com),
9 *               Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),
10 *
11 * This file contains network checksum routines
12 */
13
14#include <linux/string.h>
15#include <linux/types.h>
16#include <asm/uaccess.h>
17#include <asm/byteorder.h>
18#include <asm/checksum.h>
19
20/*
21 * computes a partial checksum, e.g. for TCP/UDP fragments
22 */
23unsigned int
24csum_partial (const unsigned char *buff, int len, unsigned int sum)
25{
26	  /*
27	   * Experiments with ethernet and slip connections show that buff
28	   * is aligned on either a 2-byte or 4-byte boundary.
29	   */
30        __asm__ __volatile__ (
31                "    lgr  2,%1\n"    /* address in gpr 2 */
32                "    lgfr 3,%2\n"    /* length in gpr 3 */
33                "0:  cksm %0,2\n"    /* do checksum on longs */
34                "    jo   0b\n"
35                : "+&d" (sum)
36                : "d" (buff), "d" (len)
37                : "cc", "2", "3" );
38        return sum;
39}
40
41