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