Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 295219
b: refs/heads/master
c: 60e58d5
h: refs/heads/master
i:
  295217: 3839950
  295215: fab31e1
v: v3
  • Loading branch information
Bob Pearson authored and Linus Torvalds committed Mar 23, 2012
1 parent 483cb84 commit 582e413
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 72 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3863ef31dcf04f977a94402348fec06179db58e0
refs/heads/master: 60e58d5c9d8d698600e8ccb44b5a13cf99d0d90f
104 changes: 36 additions & 68 deletions trunk/lib/crc32.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -41,6 +38,7 @@
#else
# define tobe(x) (x)
#endif

#include "crc32table.h"

MODULE_AUTHOR("Matt Domsch <Matt_Domsch@dell.com>");
Expand Down Expand Up @@ -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
Expand All @@ -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;
Expand All @@ -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
Expand Down
6 changes: 3 additions & 3 deletions trunk/lib/gen_crc32table.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
#define LE_TABLE_SIZE (1 << CRC_LE_BITS)
#define BE_TABLE_SIZE (1 << CRC_BE_BITS)

static uint32_t crc32table_le[4][LE_TABLE_SIZE];
static uint32_t crc32table_be[4][BE_TABLE_SIZE];
static uint32_t crc32table_le[4][256];
static uint32_t crc32table_be[4][256];

/**
* crc32init_le() - allocate and initialize LE table data
Expand Down Expand Up @@ -62,7 +62,7 @@ static void crc32init_be(void)
}
}

static void output_table(uint32_t table[4][256], int len, char *trans)
static void output_table(uint32_t (*table)[256], int len, char *trans)
{
int i, j;

Expand Down

0 comments on commit 582e413

Please sign in to comment.