forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Misc cleanup of lib/crc32.c and related files. - remove unnecessary header files. - straighten out some convoluted ifdef's - rewrite some references to 2 dimensional arrays as 1 dimensional arrays to make them correct. I.e. replace tab[i] with tab[0][i]. - a few trivial whitespace changes - fix a warning in gen_crc32tables.c caused by a mismatch in the type of the pointer passed to output table. Since the table is only used at kernel compile time, it is simpler to make the table big enough to hold the largest column size used. One cannot make the column size smaller in output_table because it has to be used by both the le and be tables and they can have different column sizes. [[email protected]: Minor changelog tweaks] Signed-off-by: Bob Pearson <[email protected]> Signed-off-by: Darrick J. Wong <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
- Loading branch information
Showing
2 changed files
with
39 additions
and
71 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -23,13 +23,10 @@ | |
/* 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 <[email protected]>"); | ||
|
@@ -96,60 +94,47 @@ 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 | ||
* other uses, or the previous crc32 value if computing incrementally. | ||
* @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 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters