[S390] Fix TCP/UDP pseudo header checksum computation.
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Mon, 26 Mar 2007 18:42:39 +0000 (20:42 +0200)
committerHeiko Carstens <heiko.carstens@de.ibm.com>
Mon, 26 Mar 2007 18:43:46 +0000 (20:43 +0200)
commitafbc1e994ddcf3b6fe2dc928ee8dc31a5d0c3118
tree95ccefc1b49aa275d06c39f9bd386a7d2ceb7d6a
parent04439694ea82fed62a97fd474147966381201954
[S390] Fix TCP/UDP pseudo header checksum computation.

git commit f994aae1bd8e4813d59a2ed64d17585fe42d03fc changed the
function declaration of csum_tcpudp_nofold. Argument types were
changed from unsigned long to __be32 (unsigned int). Therefore we
lost the implicit type conversion that zeroed the upper half of the
registers that are used to pass parameters. Since the inline assembly
relied on this we ended up adding random values and wrong checksums
were created.
Showed only up on machines with more than 4GB since gcc produced code
where the registers that are used to pass 'saddr' and 'daddr' previously
contained addresses before calling this function.
Fix this by using 32 bit arithmetics and convert code to C, since gcc
produces better code than these hand-optimized versions.

Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
include/asm-s390/checksum.h