diff options
author | Bob Pearson <rpearson@systemfabricworks.com> | 2012-03-23 18:02:23 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-23 19:58:37 -0400 |
commit | 9a1dbf6a29694c9d81b498019f103aee0f8b5b6c (patch) | |
tree | 1f331fa108ea29ccf06a7b5816da4dbcaa12bf2d /lib/crc32.c | |
parent | ce4320ddda4c2520fe77194d3c801ad4e8a8aa11 (diff) |
crc32: make CRC_*_BITS definition correspond to actual bit counts
crc32.c provides a choice of one of several algorithms for computing the
LSB and LSB versions of the CRC32 checksum based on the parameters
CRC_LE_BITS and CRC_BE_BITS.
In the original version the values 1, 2, 4 and 8 respectively selected
versions of the alrogithm that computed the crc 1, 2, 4 and 32 bits as a
time.
This patch series adds a new version that computes the CRC 64 bits at a
time. To make things easier to understand the parameter has been
reinterpreted to actually stand for the number of bits processed in each
step of the algorithm so that the old value 8 has been replaced with the
value 32.
This also allows us to add in a widely used crc algorithm that computes
the crc 8 bits at a time called the Sarwate algorithm.
[djwong@us.ibm.com: Minor changelog tweaks]
Signed-off-by: Bob Pearson <rpearson@systemfabricworks.com>
Signed-off-by: Darrick J. Wong <djwong@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'lib/crc32.c')
-rw-r--r-- | lib/crc32.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/lib/crc32.c b/lib/crc32.c index 7394288c045c..5971f2ad46d5 100644 --- a/lib/crc32.c +++ b/lib/crc32.c | |||
@@ -27,13 +27,13 @@ | |||
27 | #include <linux/types.h> | 27 | #include <linux/types.h> |
28 | #include "crc32defs.h" | 28 | #include "crc32defs.h" |
29 | 29 | ||
30 | #if CRC_LE_BITS == 8 | 30 | #if CRC_LE_BITS > 8 |
31 | # define tole(x) ((__force u32) __constant_cpu_to_le32(x)) | 31 | # define tole(x) ((__force u32) __constant_cpu_to_le32(x)) |
32 | #else | 32 | #else |
33 | # define tole(x) (x) | 33 | # define tole(x) (x) |
34 | #endif | 34 | #endif |
35 | 35 | ||
36 | #if CRC_BE_BITS == 8 | 36 | #if CRC_BE_BITS > 8 |
37 | # define tobe(x) ((__force u32) __constant_cpu_to_be32(x)) | 37 | # define tobe(x) ((__force u32) __constant_cpu_to_be32(x)) |
38 | #else | 38 | #else |
39 | # define tobe(x) (x) | 39 | # define tobe(x) (x) |
@@ -45,7 +45,7 @@ MODULE_AUTHOR("Matt Domsch <Matt_Domsch@dell.com>"); | |||
45 | MODULE_DESCRIPTION("Ethernet CRC32 calculations"); | 45 | MODULE_DESCRIPTION("Ethernet CRC32 calculations"); |
46 | MODULE_LICENSE("GPL"); | 46 | MODULE_LICENSE("GPL"); |
47 | 47 | ||
48 | #if CRC_LE_BITS == 8 || CRC_BE_BITS == 8 | 48 | #if CRC_LE_BITS > 8 || CRC_BE_BITS > 8 |
49 | 49 | ||
50 | static inline u32 | 50 | static inline u32 |
51 | crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256]) | 51 | crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256]) |
@@ -126,6 +126,12 @@ u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len) | |||
126 | crc = (crc >> 4) ^ crc32table_le[0][crc & 15]; | 126 | crc = (crc >> 4) ^ crc32table_le[0][crc & 15]; |
127 | } | 127 | } |
128 | # elif CRC_LE_BITS == 8 | 128 | # elif CRC_LE_BITS == 8 |
129 | /* aka Sarwate algorithm */ | ||
130 | while (len--) { | ||
131 | crc ^= *p++; | ||
132 | crc = (crc >> 8) ^ crc32table_le[0][crc & 255]; | ||
133 | } | ||
134 | # else | ||
129 | const u32 (*tab)[] = crc32table_le; | 135 | const u32 (*tab)[] = crc32table_le; |
130 | 136 | ||
131 | crc = (__force u32) __cpu_to_le32(crc); | 137 | crc = (__force u32) __cpu_to_le32(crc); |
@@ -169,6 +175,11 @@ u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len) | |||
169 | crc = (crc << 4) ^ crc32table_be[0][crc >> 28]; | 175 | crc = (crc << 4) ^ crc32table_be[0][crc >> 28]; |
170 | } | 176 | } |
171 | # elif CRC_BE_BITS == 8 | 177 | # elif CRC_BE_BITS == 8 |
178 | while (len--) { | ||
179 | crc ^= *p++ << 24; | ||
180 | crc = (crc << 8) ^ crc32table_be[0][crc >> 24]; | ||
181 | } | ||
182 | # else | ||
172 | const u32 (*tab)[] = crc32table_be; | 183 | const u32 (*tab)[] = crc32table_be; |
173 | 184 | ||
174 | crc = (__force u32) __cpu_to_be32(crc); | 185 | crc = (__force u32) __cpu_to_be32(crc); |