Blame view

lib/crc4.c 1003 Bytes
40b0b3f8f   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-only
0cbaa4484   Jeremy Kerr   lib: Add crc4 module
2
3
  /*
   * crc4.c - simple crc-4 calculations.
0cbaa4484   Jeremy Kerr   lib: Add crc4 module
4
5
6
7
8
9
10
11
12
13
14
15
   */
  
  #include <linux/crc4.h>
  #include <linux/module.h>
  
  static const uint8_t crc4_tab[] = {
  	0x0, 0x7, 0xe, 0x9, 0xb, 0xc, 0x5, 0x2,
  	0x1, 0x6, 0xf, 0x8, 0xa, 0xd, 0x4, 0x3,
  };
  
  /**
   * crc4 - calculate the 4-bit crc of a value.
8a29896a6   Randy Dunlap   docs: clean up an...
16
   * @c:    starting crc4
0cbaa4484   Jeremy Kerr   lib: Add crc4 module
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
   * @x:    value to checksum
   * @bits: number of bits in @x to checksum
   *
   * Returns the crc4 value of @x, using polynomial 0b10111.
   *
   * The @x value is treated as left-aligned, and bits above @bits are ignored
   * in the crc calculations.
   */
  uint8_t crc4(uint8_t c, uint64_t x, int bits)
  {
  	int i;
  
  	/* mask off anything above the top bit */
  	x &= (1ull << bits) - 1;
  
  	/* Align to 4-bits */
  	bits = (bits + 3) & ~0x3;
  
  	/* Calculate crc4 over four-bit nibbles, starting at the MSbit */
  	for (i = bits - 4; i >= 0; i -= 4)
  		c = crc4_tab[c ^ ((x >> i) & 0xf)];
  
  	return c;
  }
  EXPORT_SYMBOL_GPL(crc4);
  
  MODULE_DESCRIPTION("CRC4 calculations");
  MODULE_LICENSE("GPL");