1*7150962dSArend van Spriel /* 2*7150962dSArend van Spriel * Copyright (c) 2011 Broadcom Corporation 3*7150962dSArend van Spriel * 4*7150962dSArend van Spriel * Permission to use, copy, modify, and/or distribute this software for any 5*7150962dSArend van Spriel * purpose with or without fee is hereby granted, provided that the above 6*7150962dSArend van Spriel * copyright notice and this permission notice appear in all copies. 7*7150962dSArend van Spriel * 8*7150962dSArend van Spriel * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9*7150962dSArend van Spriel * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10*7150962dSArend van Spriel * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 11*7150962dSArend van Spriel * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12*7150962dSArend van Spriel * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 13*7150962dSArend van Spriel * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 14*7150962dSArend van Spriel * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15*7150962dSArend van Spriel */ 16*7150962dSArend van Spriel 17*7150962dSArend van Spriel #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 18*7150962dSArend van Spriel 19*7150962dSArend van Spriel #include <linux/module.h> 20*7150962dSArend van Spriel #include <linux/crc8.h> 21*7150962dSArend van Spriel #include <linux/printk.h> 22*7150962dSArend van Spriel 23*7150962dSArend van Spriel /* 24*7150962dSArend van Spriel * crc8_populate_msb - fill crc table for given polynomial in reverse bit order. 25*7150962dSArend van Spriel * 26*7150962dSArend van Spriel * table: table to be filled. 27*7150962dSArend van Spriel * polynomial: polynomial for which table is to be filled. 28*7150962dSArend van Spriel */ 29*7150962dSArend van Spriel void crc8_populate_msb(u8 table[CRC8_TABLE_SIZE], u8 polynomial) 30*7150962dSArend van Spriel { 31*7150962dSArend van Spriel int i, j; 32*7150962dSArend van Spriel const u8 msbit = 0x80; 33*7150962dSArend van Spriel u8 t = msbit; 34*7150962dSArend van Spriel 35*7150962dSArend van Spriel table[0] = 0; 36*7150962dSArend van Spriel 37*7150962dSArend van Spriel for (i = 1; i < CRC8_TABLE_SIZE; i *= 2) { 38*7150962dSArend van Spriel t = (t << 1) ^ (t & msbit ? polynomial : 0); 39*7150962dSArend van Spriel for (j = 0; j < i; j++) 40*7150962dSArend van Spriel table[i+j] = table[j] ^ t; 41*7150962dSArend van Spriel } 42*7150962dSArend van Spriel } 43*7150962dSArend van Spriel EXPORT_SYMBOL(crc8_populate_msb); 44*7150962dSArend van Spriel 45*7150962dSArend van Spriel /* 46*7150962dSArend van Spriel * crc8_populate_lsb - fill crc table for given polynomial in regular bit order. 47*7150962dSArend van Spriel * 48*7150962dSArend van Spriel * table: table to be filled. 49*7150962dSArend van Spriel * polynomial: polynomial for which table is to be filled. 50*7150962dSArend van Spriel */ 51*7150962dSArend van Spriel void crc8_populate_lsb(u8 table[CRC8_TABLE_SIZE], u8 polynomial) 52*7150962dSArend van Spriel { 53*7150962dSArend van Spriel int i, j; 54*7150962dSArend van Spriel u8 t = 1; 55*7150962dSArend van Spriel 56*7150962dSArend van Spriel table[0] = 0; 57*7150962dSArend van Spriel 58*7150962dSArend van Spriel for (i = (CRC8_TABLE_SIZE >> 1); i; i >>= 1) { 59*7150962dSArend van Spriel t = (t >> 1) ^ (t & 1 ? polynomial : 0); 60*7150962dSArend van Spriel for (j = 0; j < CRC8_TABLE_SIZE; j += 2*i) 61*7150962dSArend van Spriel table[i+j] = table[j] ^ t; 62*7150962dSArend van Spriel } 63*7150962dSArend van Spriel } 64*7150962dSArend van Spriel EXPORT_SYMBOL(crc8_populate_lsb); 65*7150962dSArend van Spriel 66*7150962dSArend van Spriel /* 67*7150962dSArend van Spriel * crc8 - calculate a crc8 over the given input data. 68*7150962dSArend van Spriel * 69*7150962dSArend van Spriel * table: crc table used for calculation. 70*7150962dSArend van Spriel * pdata: pointer to data buffer. 71*7150962dSArend van Spriel * nbytes: number of bytes in data buffer. 72*7150962dSArend van Spriel * crc: previous returned crc8 value. 73*7150962dSArend van Spriel */ 74*7150962dSArend van Spriel u8 crc8(const u8 table[CRC8_TABLE_SIZE], u8 *pdata, size_t nbytes, u8 crc) 75*7150962dSArend van Spriel { 76*7150962dSArend van Spriel /* loop over the buffer data */ 77*7150962dSArend van Spriel while (nbytes-- > 0) 78*7150962dSArend van Spriel crc = table[(crc ^ *pdata++) & 0xff]; 79*7150962dSArend van Spriel 80*7150962dSArend van Spriel return crc; 81*7150962dSArend van Spriel } 82*7150962dSArend van Spriel EXPORT_SYMBOL(crc8); 83*7150962dSArend van Spriel 84*7150962dSArend van Spriel MODULE_DESCRIPTION("CRC8 (by Williams, Ross N.) function"); 85*7150962dSArend van Spriel MODULE_AUTHOR("Broadcom Corporation"); 86*7150962dSArend van Spriel MODULE_LICENSE("Dual BSD/GPL"); 87