xref: /linux/lib/crc-itu-t.c (revision 77991645)
140b0b3f8SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
23e7cbae7SIvo van Doorn /*
33e7cbae7SIvo van Doorn  *      crc-itu-t.c
43e7cbae7SIvo van Doorn  */
53e7cbae7SIvo van Doorn 
63e7cbae7SIvo van Doorn #include <linux/types.h>
73e7cbae7SIvo van Doorn #include <linux/module.h>
83e7cbae7SIvo van Doorn #include <linux/crc-itu-t.h>
93e7cbae7SIvo van Doorn 
10*77991645SRoger Knecht /* CRC table for the CRC ITU-T V.41 0x1021 (x^16 + x^12 + x^5 + 1) */
113e7cbae7SIvo van Doorn const u16 crc_itu_t_table[256] = {
123e7cbae7SIvo van Doorn 	0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
133e7cbae7SIvo van Doorn 	0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
143e7cbae7SIvo van Doorn 	0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
153e7cbae7SIvo van Doorn 	0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
163e7cbae7SIvo van Doorn 	0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
173e7cbae7SIvo van Doorn 	0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
183e7cbae7SIvo van Doorn 	0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
193e7cbae7SIvo van Doorn 	0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
203e7cbae7SIvo van Doorn 	0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
213e7cbae7SIvo van Doorn 	0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
223e7cbae7SIvo van Doorn 	0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
233e7cbae7SIvo van Doorn 	0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
243e7cbae7SIvo van Doorn 	0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
253e7cbae7SIvo van Doorn 	0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
263e7cbae7SIvo van Doorn 	0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
273e7cbae7SIvo van Doorn 	0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
283e7cbae7SIvo van Doorn 	0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
293e7cbae7SIvo van Doorn 	0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
303e7cbae7SIvo van Doorn 	0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
313e7cbae7SIvo van Doorn 	0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
323e7cbae7SIvo van Doorn 	0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
333e7cbae7SIvo van Doorn 	0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
343e7cbae7SIvo van Doorn 	0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
353e7cbae7SIvo van Doorn 	0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
363e7cbae7SIvo van Doorn 	0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
373e7cbae7SIvo van Doorn 	0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
383e7cbae7SIvo van Doorn 	0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
393e7cbae7SIvo van Doorn 	0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
403e7cbae7SIvo van Doorn 	0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
413e7cbae7SIvo van Doorn 	0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
423e7cbae7SIvo van Doorn 	0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
433e7cbae7SIvo van Doorn 	0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
443e7cbae7SIvo van Doorn };
453e7cbae7SIvo van Doorn 
463e7cbae7SIvo van Doorn EXPORT_SYMBOL(crc_itu_t_table);
473e7cbae7SIvo van Doorn 
483e7cbae7SIvo van Doorn /**
493e7cbae7SIvo van Doorn  * crc_itu_t - Compute the CRC-ITU-T for the data buffer
503e7cbae7SIvo van Doorn  *
513e7cbae7SIvo van Doorn  * @crc:     previous CRC value
523e7cbae7SIvo van Doorn  * @buffer:  data pointer
533e7cbae7SIvo van Doorn  * @len:     number of bytes in the buffer
543e7cbae7SIvo van Doorn  *
553e7cbae7SIvo van Doorn  * Returns the updated CRC value
563e7cbae7SIvo van Doorn  */
crc_itu_t(u16 crc,const u8 * buffer,size_t len)573e7cbae7SIvo van Doorn u16 crc_itu_t(u16 crc, const u8 *buffer, size_t len)
583e7cbae7SIvo van Doorn {
593e7cbae7SIvo van Doorn 	while (len--)
603e7cbae7SIvo van Doorn 		crc = crc_itu_t_byte(crc, *buffer++);
613e7cbae7SIvo van Doorn 	return crc;
623e7cbae7SIvo van Doorn }
633e7cbae7SIvo van Doorn EXPORT_SYMBOL(crc_itu_t);
643e7cbae7SIvo van Doorn 
653e7cbae7SIvo van Doorn MODULE_DESCRIPTION("CRC ITU-T V.41 calculations");
663e7cbae7SIvo van Doorn MODULE_LICENSE("GPL");
673e7cbae7SIvo van Doorn 
68