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