2011-05-31 13:22:15 +04:00
/*
* Copyright ( c ) 2011 Broadcom Corporation
*
* Permission to use , copy , modify , and / or distribute this software for any
* purpose with or without fee is hereby granted , provided that the above
* copyright notice and this permission notice appear in all copies .
*
* THE SOFTWARE IS PROVIDED " AS IS " AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS . IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* SPECIAL , DIRECT , INDIRECT , OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE , DATA OR PROFITS , WHETHER IN AN ACTION
* OF CONTRACT , NEGLIGENCE OR OTHER TORTIOUS ACTION , ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE .
*/
# define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
# include <linux/module.h>
# include <linux/crc8.h>
# include <linux/printk.h>
2017-09-09 02:35:55 +03:00
/**
2011-05-31 13:22:15 +04:00
* crc8_populate_msb - fill crc table for given polynomial in reverse bit order .
*
2017-09-09 02:35:55 +03:00
* @ table : table to be filled .
* @ polynomial : polynomial for which table is to be filled .
2011-05-31 13:22:15 +04:00
*/
void crc8_populate_msb ( u8 table [ CRC8_TABLE_SIZE ] , u8 polynomial )
{
int i , j ;
const u8 msbit = 0x80 ;
u8 t = msbit ;
table [ 0 ] = 0 ;
for ( i = 1 ; i < CRC8_TABLE_SIZE ; i * = 2 ) {
t = ( t < < 1 ) ^ ( t & msbit ? polynomial : 0 ) ;
for ( j = 0 ; j < i ; j + + )
table [ i + j ] = table [ j ] ^ t ;
}
}
EXPORT_SYMBOL ( crc8_populate_msb ) ;
2017-09-09 02:35:55 +03:00
/**
2011-05-31 13:22:15 +04:00
* crc8_populate_lsb - fill crc table for given polynomial in regular bit order .
*
2017-09-09 02:35:55 +03:00
* @ table : table to be filled .
* @ polynomial : polynomial for which table is to be filled .
2011-05-31 13:22:15 +04:00
*/
void crc8_populate_lsb ( u8 table [ CRC8_TABLE_SIZE ] , u8 polynomial )
{
int i , j ;
u8 t = 1 ;
table [ 0 ] = 0 ;
for ( i = ( CRC8_TABLE_SIZE > > 1 ) ; i ; i > > = 1 ) {
t = ( t > > 1 ) ^ ( t & 1 ? polynomial : 0 ) ;
for ( j = 0 ; j < CRC8_TABLE_SIZE ; j + = 2 * i )
table [ i + j ] = table [ j ] ^ t ;
}
}
EXPORT_SYMBOL ( crc8_populate_lsb ) ;
2017-09-09 02:35:55 +03:00
/**
2011-05-31 13:22:15 +04:00
* crc8 - calculate a crc8 over the given input data .
*
2017-09-09 02:35:55 +03:00
* @ table : crc table used for calculation .
* @ pdata : pointer to data buffer .
* @ nbytes : number of bytes in data buffer .
* @ crc : previous returned crc8 value .
2011-05-31 13:22:15 +04:00
*/
2021-05-07 04:03:37 +03:00
u8 crc8 ( const u8 table [ CRC8_TABLE_SIZE ] , const u8 * pdata , size_t nbytes , u8 crc )
2011-05-31 13:22:15 +04:00
{
/* loop over the buffer data */
while ( nbytes - - > 0 )
crc = table [ ( crc ^ * pdata + + ) & 0xff ] ;
return crc ;
}
EXPORT_SYMBOL ( crc8 ) ;
MODULE_DESCRIPTION ( " CRC8 (by Williams, Ross N.) function " ) ;
MODULE_AUTHOR ( " Broadcom Corporation " ) ;
MODULE_LICENSE ( " Dual BSD/GPL " ) ;