]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - lib/crc32.c
crc32: miscellaneous cleanups
[karo-tx-linux.git] / lib / crc32.c
index 996115d4f377ad6910082e7552507e6045072a3c..bf03922c5d69d763899a8ccb0343e0cb6d2d2ef0 100644 (file)
 /* see: Documentation/crc32.txt for a description of algorithms */
 
 #include <linux/crc32.h>
-#include <linux/kernel.h>
 #include <linux/module.h>
-#include <linux/compiler.h>
 #include <linux/types.h>
-#include <linux/init.h>
-#include <linux/atomic.h>
 #include "crc32defs.h"
+
 #if CRC_LE_BITS == 8
 # define tole(x) __constant_cpu_to_le32(x)
 #else
@@ -41,6 +38,7 @@
 #else
 # define tobe(x) (x)
 #endif
+
 #include "crc32table.h"
 
 MODULE_AUTHOR("Matt Domsch <Matt_Domsch@dell.com>");
@@ -96,6 +94,7 @@ crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256])
 #undef DO_CRC4
 }
 #endif
+
 /**
  * crc32_le() - Calculate bitwise little-endian Ethernet AUTODIN II CRC32
  * @crc: seed value for computation.  ~0 for Ethernet, sometimes 0 for
@@ -103,53 +102,39 @@ crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256])
  * @p: pointer to buffer over which CRC is run
  * @len: length of buffer @p
  */
-u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len);
-
-#if CRC_LE_BITS == 1
-/*
- * In fact, the table-based code will work in this case, but it can be
- * simplified by inlining the table in ?: form.
- */
-
 u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
 {
+#if CRC_LE_BITS == 1
        int i;
        while (len--) {
                crc ^= *p++;
                for (i = 0; i < 8; i++)
                        crc = (crc >> 1) ^ ((crc & 1) ? CRCPOLY_LE : 0);
        }
-       return crc;
-}
-#else                          /* Table-based approach */
-
-u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
-{
-# if CRC_LE_BITS == 8
-       const u32      (*tab)[] = crc32table_le;
-
-       crc = __cpu_to_le32(crc);
-       crc = crc32_body(crc, p, len, tab);
-       return __le32_to_cpu(crc);
-# elif CRC_LE_BITS == 4
+# elif CRC_LE_BITS == 2
        while (len--) {
                crc ^= *p++;
-               crc = (crc >> 4) ^ crc32table_le[crc & 15];
-               crc = (crc >> 4) ^ crc32table_le[crc & 15];
+               crc = (crc >> 2) ^ crc32table_le[0][crc & 3];
+               crc = (crc >> 2) ^ crc32table_le[0][crc & 3];
+               crc = (crc >> 2) ^ crc32table_le[0][crc & 3];
+               crc = (crc >> 2) ^ crc32table_le[0][crc & 3];
        }
-       return crc;
-# elif CRC_LE_BITS == 2
+# elif CRC_LE_BITS == 4
        while (len--) {
                crc ^= *p++;
-               crc = (crc >> 2) ^ crc32table_le[crc & 3];
-               crc = (crc >> 2) ^ crc32table_le[crc & 3];
-               crc = (crc >> 2) ^ crc32table_le[crc & 3];
-               crc = (crc >> 2) ^ crc32table_le[crc & 3];
+               crc = (crc >> 4) ^ crc32table_le[0][crc & 15];
+               crc = (crc >> 4) ^ crc32table_le[0][crc & 15];
        }
+# elif CRC_LE_BITS == 8
+       const u32      (*tab)[] = crc32table_le;
+
+       crc = __cpu_to_le32(crc);
+       crc = crc32_body(crc, p, len, tab);
+       crc = __le32_to_cpu(crc);
+#endif
        return crc;
-# endif
 }
-#endif
+EXPORT_SYMBOL(crc32_le);
 
 /**
  * crc32_be() - Calculate bitwise big-endian Ethernet AUTODIN II CRC32
@@ -158,16 +143,9 @@ u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
  * @p: pointer to buffer over which CRC is run
  * @len: length of buffer @p
  */
-u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len);
-
-#if CRC_BE_BITS == 1
-/*
- * In fact, the table-based code will work in this case, but it can be
- * simplified by inlining the table in ?: form.
- */
-
 u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)
 {
+#if CRC_BE_BITS == 1
        int i;
        while (len--) {
                crc ^= *p++ << 24;
@@ -176,39 +154,29 @@ u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)
                            (crc << 1) ^ ((crc & 0x80000000) ? CRCPOLY_BE :
                                          0);
        }
-       return crc;
-}
-
-#else                          /* Table-based approach */
-u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)
-{
-# if CRC_BE_BITS == 8
-       const u32      (*tab)[] = crc32table_be;
-
-       crc = __cpu_to_be32(crc);
-       crc = crc32_body(crc, p, len, tab);
-       return __be32_to_cpu(crc);
-# elif CRC_BE_BITS == 4
+# elif CRC_BE_BITS == 2
        while (len--) {
                crc ^= *p++ << 24;
-               crc = (crc << 4) ^ crc32table_be[crc >> 28];
-               crc = (crc << 4) ^ crc32table_be[crc >> 28];
+               crc = (crc << 2) ^ crc32table_be[0][crc >> 30];
+               crc = (crc << 2) ^ crc32table_be[0][crc >> 30];
+               crc = (crc << 2) ^ crc32table_be[0][crc >> 30];
+               crc = (crc << 2) ^ crc32table_be[0][crc >> 30];
        }
-       return crc;
-# elif CRC_BE_BITS == 2
+# elif CRC_BE_BITS == 4
        while (len--) {
                crc ^= *p++ << 24;
-               crc = (crc << 2) ^ crc32table_be[crc >> 30];
-               crc = (crc << 2) ^ crc32table_be[crc >> 30];
-               crc = (crc << 2) ^ crc32table_be[crc >> 30];
-               crc = (crc << 2) ^ crc32table_be[crc >> 30];
+               crc = (crc << 4) ^ crc32table_be[0][crc >> 28];
+               crc = (crc << 4) ^ crc32table_be[0][crc >> 28];
        }
-       return crc;
+# elif CRC_BE_BITS == 8
+       const u32      (*tab)[] = crc32table_be;
+
+       crc = __cpu_to_be32(crc);
+       crc = crc32_body(crc, p, len, tab);
+       crc = __be32_to_cpu(crc);
 # endif
+       return crc;
 }
-#endif
-
-EXPORT_SYMBOL(crc32_le);
 EXPORT_SYMBOL(crc32_be);
 
 #ifdef CONFIG_CRC32_SELFTEST