Subject: csum_ipv6_magic()

From: Machida Hiroyuki <[email-masked]>
Date: Mon, 22 Oct 2001 15:16:06 +0900

I guess that csum_ipv6_magic() in include/asm-mips/checksum.h 
needs "addu %0, $1" at the next of "sltu $1, %0, $1".
Without this, you cannot add a carry of the last addtion.

--- checksum.h.ORG      Mon Oct 22 15:09:32 2001
+++ checksum.h  Mon Oct 22 15:09:51 2001
@@ -249,6 +249,7 @@ static __inline__ unsigned short int csu
        "addu\t%0, $1\n\t"
        "addu\t%0, %1\n\t"
        "sltu\t$1, %0, $1\n\t"
+       "addu\t%0, $1\n\t"
        ".set\tnoat\n\t"
        ".set\tnoreorder"
        : "=r" (sum), "=r" (proto)

---
Hiroyuki Machida
Sony Corp.

---

From: Alan Cox <[email-masked]>
Date: Mon, 22 Oct 2001 08:55:35 +0100 (BST)

> Without this, you cannot add a carry of the last addtion.

Is that actually needed. The final end around carry cannot itself cause
a second carry.

---

From: Machida Hiroyuki <[email-masked]>
Date: Mon, 22 Oct 2001 19:56:19 +0900

From: Alan Cox <[email-masked]>
Subject: Re: csum_ipv6_magic()
Date: Mon, 22 Oct 2001 08:55:35 +0100 (BST)

> Is that actually needed. The final end around carry cannot itself cause

I don't know csum_ipv6_magic() in include/asm-mips/checksum.h works
fine or not. But if csum_ipv6_magic() doesn't need "addu %0, $1" at
next of the final "sltu $1, %0, $1", you can remove the final 
"sltu $1, %0, $1".

---
Hiroyuki Machida
Sony Corp.

---

From: Machida Hiroyuki <[email-masked]>
Date: Mon, 22 Oct 2001 20:33:24 +0900

I found bugs in checksum.h. A sample fix is attached below.

I perfer to use generic csum_ipv6_magic() in net/checksum.h
than this fix. Please someone show me improvements for this asm
version of csum_ipv6_magic(). 

---
Hiroyuki Machida
Sony Corp.

ChangLog entry:

* (csum_ipv6_magic): Have same paramter types as net/checksum.h.
  Correct carry computation.  Add a final carry.

Index: checksum.h
===================================================================
RCS file: /cvs/linux/include/asm-mips/checksum.h,v
retrieving revision 1.12
diff -u -p -r1.12 checksum.h
--- checksum.h	2001/10/06 19:29:25	1.12
+++ checksum.h	2001/10/22 11:16:05
@@ -197,7 +197,7 @@ static inline unsigned short ip_compute_
 #define _HAVE_ARCH_IPV6_CSUM
 static __inline__ unsigned short int csum_ipv6_magic(struct in6_addr *saddr,
 						     struct in6_addr *daddr,
-						     __u32 len,
+						     unsigned short len,
 						     unsigned short proto,
 						     unsigned int sum) 
 {
@@ -211,49 +211,51 @@ static __inline__ unsigned short int csu
 	"addu\t%0, %6\t\t\t# csum\n\t"
 	"sltu\t$1, %0, %6\n\t"
 	"lw\t%1, 0(%2)\t\t\t# four words source address\n\t"
-	"addu\t%0, $1\n\t"
+	" addu\t%0, $1\n\t"
 	"addu\t%0, %1\n\t"
-	"sltu\t$1, %0, $1\n\t"
+	"sltu\t$1, %0, %1\n\t"
 
 	"lw\t%1, 4(%2)\n\t"
-	"addu\t%0, $1\n\t"
+	" addu\t%0, $1\n\t"
 	"addu\t%0, %1\n\t"
-	"sltu\t$1, %0, $1\n\t"
+	"sltu\t$1, %0, %1\n\t"
 
 	"lw\t%1, 8(%2)\n\t"
-	"addu\t%0, $1\n\t"
+	" addu\t%0, $1\n\t"
 	"addu\t%0, %1\n\t"
-	"sltu\t$1, %0, $1\n\t"
+	"sltu\t$1, %0, %1\n\t"
 
 	"lw\t%1, 12(%2)\n\t"
-	"addu\t%0, $1\n\t"
+	" addu\t%0, $1\n\t"
 	"addu\t%0, %1\n\t"
-	"sltu\t$1, %0, $1\n\t"
+	"sltu\t$1, %0, %1\n\t"
 
 	"lw\t%1, 0(%3)\n\t"
-	"addu\t%0, $1\n\t"
+	" addu\t%0, $1\n\t"
 	"addu\t%0, %1\n\t"
-	"sltu\t$1, %0, $1\n\t"
+	"sltu\t$1, %0, %1\n\t"
 
 	"lw\t%1, 4(%3)\n\t"
-	"addu\t%0, $1\n\t"
+	" addu\t%0, $1\n\t"
 	"addu\t%0, %1\n\t"
-	"sltu\t$1, %0, $1\n\t"
+	"sltu\t$1, %0, %1\n\t"
 
 	"lw\t%1, 8(%3)\n\t"
-	"addu\t%0, $1\n\t"
+	" addu\t%0, $1\n\t"
 	"addu\t%0, %1\n\t"
-	"sltu\t$1, %0, $1\n\t"
+	"sltu\t$1, %0, %1\n\t"
 
 	"lw\t%1, 12(%3)\n\t"
-	"addu\t%0, $1\n\t"
+	" addu\t%0, $1\n\t"
 	"addu\t%0, %1\n\t"
-	"sltu\t$1, %0, $1\n\t"
+	"sltu\t$1, %0, %1\n\t"
+	" addu\t%0, $1\n\t"
+
 	".set\tnoat\n\t"
 	".set\tnoreorder"
 	: "=r" (sum), "=r" (proto)
 	: "r" (saddr), "r" (daddr),
-	  "0" (htonl(len)), "1" (htonl(proto)), "r" (sum));
+	  "0" (htonl((__u32)len)), "1" (htonl(proto)), "r" (sum));
 
 	return csum_fold(sum);
 }

---

From: Ralf Baechle <[email-masked]>
Date: Mon, 22 Oct 2001 22:48:28 +0200

> version of csum_ipv6_magic(). 

The C version should produce code that performs identically on MIPS.  As
such we have no good reason to keep the assembler version.

>   Correct carry computation.  Add a final carry.

The len argument of that prototype should be __u32 because of IPv6
jumbograms.

  Ralf

---

From: Machida Hiroyuki <[email-masked]>
Date: Tue, 23 Oct 2001 14:07:22 +0900

From: Ralf Baechle <[email-masked]>
Subject: Re: csum_ipv6_magic()
Date: Mon, 22 Oct 2001 22:48:28 +0200

> The len argument of that prototype should be __u32 because of IPv6

I suppose csum_ipv6_magic() in include/net/checksum.h should have __u32
len. Please update include/net/checksum.h to avoid confusion.

Thanks.

---
Hiroyuki Machida
Sony Corp.

---

From: Ralf Baechle <[email-masked]>
Date: Tue, 23 Oct 2001 13:18:49 +0200

> len. Please update include/net/checksum.h to avoid confusion.

Will do.

  Ralf