arch/tile: break out the "csum a long" function to <asm/checksum.h>
Chris Metcalf [Sat, 28 Apr 2012 19:41:39 +0000 (15:41 -0400)]
This makes it available to the tilegx network driver.

Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>

arch/tile/include/asm/checksum.h
arch/tile/lib/checksum.c

index a120766..b21a2fd 100644 (file)
 __wsum do_csum(const unsigned char *buff, int len);
 #define do_csum do_csum
 
+/*
+ * Return the sum of all the 16-bit subwords in a long.
+ * This sums two subwords on a 32-bit machine, and four on 64 bits.
+ * The implementation does two vector adds to capture any overflow.
+ */
+static inline unsigned int csum_long(unsigned long x)
+{
+       unsigned long ret;
+#ifdef __tilegx__
+       ret = __insn_v2sadu(x, 0);
+       ret = __insn_v2sadu(ret, 0);
+#else
+       ret = __insn_sadh_u(x, 0);
+       ret = __insn_sadh_u(ret, 0);
+#endif
+       return ret;
+}
+
 #endif /* _ASM_TILE_CHECKSUM_H */
index e4bab5b..c3ca3e6 100644 (file)
 #include <net/checksum.h>
 #include <linux/module.h>
 
-static inline unsigned int longto16(unsigned long x)
-{
-       unsigned long ret;
-#ifdef __tilegx__
-       ret = __insn_v2sadu(x, 0);
-       ret = __insn_v2sadu(ret, 0);
-#else
-       ret = __insn_sadh_u(x, 0);
-       ret = __insn_sadh_u(ret, 0);
-#endif
-       return ret;
-}
-
 __wsum do_csum(const unsigned char *buff, int len)
 {
        int odd, count;
@@ -94,7 +81,7 @@ __wsum do_csum(const unsigned char *buff, int len)
        }
        if (len & 1)
                result += *buff;
-       result = longto16(result);
+       result = csum_long(result);
        if (odd)
                result = swab16(result);
 out: