140b0b3f8SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2ad241528SJan Nikitenko /*
3ad241528SJan Nikitenko * crc7.c
4ad241528SJan Nikitenko */
5ad241528SJan Nikitenko
6ad241528SJan Nikitenko #include <linux/types.h>
7ad241528SJan Nikitenko #include <linux/module.h>
8ad241528SJan Nikitenko #include <linux/crc7.h>
9ad241528SJan Nikitenko
10ad241528SJan Nikitenko
111836eea2SGeorge Spelvin /*
121836eea2SGeorge Spelvin * Table for CRC-7 (polynomial x^7 + x^3 + 1).
131836eea2SGeorge Spelvin * This is a big-endian CRC (msbit is highest power of x),
141836eea2SGeorge Spelvin * aligned so the msbit of the byte is the x^6 coefficient
151836eea2SGeorge Spelvin * and the lsbit is not used.
161836eea2SGeorge Spelvin */
171836eea2SGeorge Spelvin const u8 crc7_be_syndrome_table[256] = {
181836eea2SGeorge Spelvin 0x00, 0x12, 0x24, 0x36, 0x48, 0x5a, 0x6c, 0x7e,
191836eea2SGeorge Spelvin 0x90, 0x82, 0xb4, 0xa6, 0xd8, 0xca, 0xfc, 0xee,
201836eea2SGeorge Spelvin 0x32, 0x20, 0x16, 0x04, 0x7a, 0x68, 0x5e, 0x4c,
211836eea2SGeorge Spelvin 0xa2, 0xb0, 0x86, 0x94, 0xea, 0xf8, 0xce, 0xdc,
221836eea2SGeorge Spelvin 0x64, 0x76, 0x40, 0x52, 0x2c, 0x3e, 0x08, 0x1a,
231836eea2SGeorge Spelvin 0xf4, 0xe6, 0xd0, 0xc2, 0xbc, 0xae, 0x98, 0x8a,
241836eea2SGeorge Spelvin 0x56, 0x44, 0x72, 0x60, 0x1e, 0x0c, 0x3a, 0x28,
251836eea2SGeorge Spelvin 0xc6, 0xd4, 0xe2, 0xf0, 0x8e, 0x9c, 0xaa, 0xb8,
261836eea2SGeorge Spelvin 0xc8, 0xda, 0xec, 0xfe, 0x80, 0x92, 0xa4, 0xb6,
271836eea2SGeorge Spelvin 0x58, 0x4a, 0x7c, 0x6e, 0x10, 0x02, 0x34, 0x26,
281836eea2SGeorge Spelvin 0xfa, 0xe8, 0xde, 0xcc, 0xb2, 0xa0, 0x96, 0x84,
291836eea2SGeorge Spelvin 0x6a, 0x78, 0x4e, 0x5c, 0x22, 0x30, 0x06, 0x14,
301836eea2SGeorge Spelvin 0xac, 0xbe, 0x88, 0x9a, 0xe4, 0xf6, 0xc0, 0xd2,
311836eea2SGeorge Spelvin 0x3c, 0x2e, 0x18, 0x0a, 0x74, 0x66, 0x50, 0x42,
321836eea2SGeorge Spelvin 0x9e, 0x8c, 0xba, 0xa8, 0xd6, 0xc4, 0xf2, 0xe0,
331836eea2SGeorge Spelvin 0x0e, 0x1c, 0x2a, 0x38, 0x46, 0x54, 0x62, 0x70,
341836eea2SGeorge Spelvin 0x82, 0x90, 0xa6, 0xb4, 0xca, 0xd8, 0xee, 0xfc,
351836eea2SGeorge Spelvin 0x12, 0x00, 0x36, 0x24, 0x5a, 0x48, 0x7e, 0x6c,
361836eea2SGeorge Spelvin 0xb0, 0xa2, 0x94, 0x86, 0xf8, 0xea, 0xdc, 0xce,
371836eea2SGeorge Spelvin 0x20, 0x32, 0x04, 0x16, 0x68, 0x7a, 0x4c, 0x5e,
381836eea2SGeorge Spelvin 0xe6, 0xf4, 0xc2, 0xd0, 0xae, 0xbc, 0x8a, 0x98,
391836eea2SGeorge Spelvin 0x76, 0x64, 0x52, 0x40, 0x3e, 0x2c, 0x1a, 0x08,
401836eea2SGeorge Spelvin 0xd4, 0xc6, 0xf0, 0xe2, 0x9c, 0x8e, 0xb8, 0xaa,
411836eea2SGeorge Spelvin 0x44, 0x56, 0x60, 0x72, 0x0c, 0x1e, 0x28, 0x3a,
421836eea2SGeorge Spelvin 0x4a, 0x58, 0x6e, 0x7c, 0x02, 0x10, 0x26, 0x34,
431836eea2SGeorge Spelvin 0xda, 0xc8, 0xfe, 0xec, 0x92, 0x80, 0xb6, 0xa4,
441836eea2SGeorge Spelvin 0x78, 0x6a, 0x5c, 0x4e, 0x30, 0x22, 0x14, 0x06,
451836eea2SGeorge Spelvin 0xe8, 0xfa, 0xcc, 0xde, 0xa0, 0xb2, 0x84, 0x96,
461836eea2SGeorge Spelvin 0x2e, 0x3c, 0x0a, 0x18, 0x66, 0x74, 0x42, 0x50,
471836eea2SGeorge Spelvin 0xbe, 0xac, 0x9a, 0x88, 0xf6, 0xe4, 0xd2, 0xc0,
481836eea2SGeorge Spelvin 0x1c, 0x0e, 0x38, 0x2a, 0x54, 0x46, 0x70, 0x62,
491836eea2SGeorge Spelvin 0x8c, 0x9e, 0xa8, 0xba, 0xc4, 0xd6, 0xe0, 0xf2
50ad241528SJan Nikitenko };
511836eea2SGeorge Spelvin EXPORT_SYMBOL(crc7_be_syndrome_table);
52ad241528SJan Nikitenko
53ad241528SJan Nikitenko /**
54*8276d3b4SMauro Carvalho Chehab * crc7_be - update the CRC7 for the data buffer
55ad241528SJan Nikitenko * @crc: previous CRC7 value
56ad241528SJan Nikitenko * @buffer: data pointer
57ad241528SJan Nikitenko * @len: number of bytes in the buffer
58ad241528SJan Nikitenko * Context: any
59ad241528SJan Nikitenko *
60ad241528SJan Nikitenko * Returns the updated CRC7 value.
611836eea2SGeorge Spelvin * The CRC7 is left-aligned in the byte (the lsbit is always 0), as that
621836eea2SGeorge Spelvin * makes the computation easier, and all callers want it in that form.
631836eea2SGeorge Spelvin *
64ad241528SJan Nikitenko */
crc7_be(u8 crc,const u8 * buffer,size_t len)651836eea2SGeorge Spelvin u8 crc7_be(u8 crc, const u8 *buffer, size_t len)
66ad241528SJan Nikitenko {
67ad241528SJan Nikitenko while (len--)
681836eea2SGeorge Spelvin crc = crc7_be_byte(crc, *buffer++);
69ad241528SJan Nikitenko return crc;
70ad241528SJan Nikitenko }
711836eea2SGeorge Spelvin EXPORT_SYMBOL(crc7_be);
72ad241528SJan Nikitenko
73ad241528SJan Nikitenko MODULE_DESCRIPTION("CRC7 calculations");
74ad241528SJan Nikitenko MODULE_LICENSE("GPL");
75