at master 87 lines 2.5 kB view raw
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 */ 30void 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} 44EXPORT_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 */ 52void 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} 65EXPORT_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 */ 75u8 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} 83EXPORT_SYMBOL(crc8); 84 85MODULE_DESCRIPTION("CRC8 (by Williams, Ross N.) function"); 86MODULE_AUTHOR("Broadcom Corporation"); 87MODULE_LICENSE("Dual BSD/GPL");