brintos

brintos / linux-shallow public Read only

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