xref: /linux/lib/crc8.c (revision e18baa7c)
17150962dSArend van Spriel /*
27150962dSArend van Spriel  * Copyright (c) 2011 Broadcom Corporation
37150962dSArend van Spriel  *
47150962dSArend van Spriel  * Permission to use, copy, modify, and/or distribute this software for any
57150962dSArend van Spriel  * purpose with or without fee is hereby granted, provided that the above
67150962dSArend van Spriel  * copyright notice and this permission notice appear in all copies.
77150962dSArend van Spriel  *
87150962dSArend van Spriel  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
97150962dSArend van Spriel  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
107150962dSArend van Spriel  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
117150962dSArend van Spriel  * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
127150962dSArend van Spriel  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
137150962dSArend van Spriel  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
147150962dSArend van Spriel  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
157150962dSArend van Spriel  */
167150962dSArend van Spriel 
177150962dSArend van Spriel #define pr_fmt(fmt)		KBUILD_MODNAME ": " fmt
187150962dSArend van Spriel 
197150962dSArend van Spriel #include <linux/module.h>
207150962dSArend van Spriel #include <linux/crc8.h>
217150962dSArend van Spriel #include <linux/printk.h>
227150962dSArend van Spriel 
238a29896aSRandy Dunlap /**
247150962dSArend van Spriel  * crc8_populate_msb - fill crc table for given polynomial in reverse bit order.
257150962dSArend van Spriel  *
268a29896aSRandy Dunlap  * @table:	table to be filled.
278a29896aSRandy Dunlap  * @polynomial:	polynomial for which table is to be filled.
287150962dSArend van Spriel  */
crc8_populate_msb(u8 table[CRC8_TABLE_SIZE],u8 polynomial)297150962dSArend van Spriel void crc8_populate_msb(u8 table[CRC8_TABLE_SIZE], u8 polynomial)
307150962dSArend van Spriel {
317150962dSArend van Spriel 	int i, j;
327150962dSArend van Spriel 	const u8 msbit = 0x80;
337150962dSArend van Spriel 	u8 t = msbit;
347150962dSArend van Spriel 
357150962dSArend van Spriel 	table[0] = 0;
367150962dSArend van Spriel 
377150962dSArend van Spriel 	for (i = 1; i < CRC8_TABLE_SIZE; i *= 2) {
387150962dSArend van Spriel 		t = (t << 1) ^ (t & msbit ? polynomial : 0);
397150962dSArend van Spriel 		for (j = 0; j < i; j++)
407150962dSArend van Spriel 			table[i+j] = table[j] ^ t;
417150962dSArend van Spriel 	}
427150962dSArend van Spriel }
437150962dSArend van Spriel EXPORT_SYMBOL(crc8_populate_msb);
447150962dSArend van Spriel 
458a29896aSRandy Dunlap /**
467150962dSArend van Spriel  * crc8_populate_lsb - fill crc table for given polynomial in regular bit order.
477150962dSArend van Spriel  *
488a29896aSRandy Dunlap  * @table:	table to be filled.
498a29896aSRandy Dunlap  * @polynomial:	polynomial for which table is to be filled.
507150962dSArend van Spriel  */
crc8_populate_lsb(u8 table[CRC8_TABLE_SIZE],u8 polynomial)517150962dSArend van Spriel void crc8_populate_lsb(u8 table[CRC8_TABLE_SIZE], u8 polynomial)
527150962dSArend van Spriel {
537150962dSArend van Spriel 	int i, j;
547150962dSArend van Spriel 	u8 t = 1;
557150962dSArend van Spriel 
567150962dSArend van Spriel 	table[0] = 0;
577150962dSArend van Spriel 
587150962dSArend van Spriel 	for (i = (CRC8_TABLE_SIZE >> 1); i; i >>= 1) {
597150962dSArend van Spriel 		t = (t >> 1) ^ (t & 1 ? polynomial : 0);
607150962dSArend van Spriel 		for (j = 0; j < CRC8_TABLE_SIZE; j += 2*i)
617150962dSArend van Spriel 			table[i+j] = table[j] ^ t;
627150962dSArend van Spriel 	}
637150962dSArend van Spriel }
647150962dSArend van Spriel EXPORT_SYMBOL(crc8_populate_lsb);
657150962dSArend van Spriel 
668a29896aSRandy Dunlap /**
677150962dSArend van Spriel  * crc8 - calculate a crc8 over the given input data.
687150962dSArend van Spriel  *
698a29896aSRandy Dunlap  * @table: crc table used for calculation.
708a29896aSRandy Dunlap  * @pdata: pointer to data buffer.
718a29896aSRandy Dunlap  * @nbytes: number of bytes in data buffer.
728a29896aSRandy Dunlap  * @crc: previous returned crc8 value.
737150962dSArend van Spriel  */
crc8(const u8 table[CRC8_TABLE_SIZE],const u8 * pdata,size_t nbytes,u8 crc)74*e18baa7cSRichard Fitzgerald u8 crc8(const u8 table[CRC8_TABLE_SIZE], const u8 *pdata, size_t nbytes, u8 crc)
757150962dSArend van Spriel {
767150962dSArend van Spriel 	/* loop over the buffer data */
777150962dSArend van Spriel 	while (nbytes-- > 0)
787150962dSArend van Spriel 		crc = table[(crc ^ *pdata++) & 0xff];
797150962dSArend van Spriel 
807150962dSArend van Spriel 	return crc;
817150962dSArend van Spriel }
827150962dSArend van Spriel EXPORT_SYMBOL(crc8);
837150962dSArend van Spriel 
847150962dSArend van Spriel MODULE_DESCRIPTION("CRC8 (by Williams, Ross N.) function");
857150962dSArend van Spriel MODULE_AUTHOR("Broadcom Corporation");
867150962dSArend van Spriel MODULE_LICENSE("Dual BSD/GPL");
87