@ -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 <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