1 | */** |

2 | * * crc4.c - simple crc-4 calculations.* |

3 | * ** |

4 | * * This source code is licensed under the GNU General Public License, Version* |

5 | * * 2. See the file COPYING for more details.* |

6 | * */* |

7 | |

8 | __#include <linux/crc4.h>__ |

9 | __#include <linux/module.h>__ |

10 | |

11 | *static* *const* uint8_t crc4_tab[] = { |

12 | `0x0`, `0x7`, `0xe`, `0x9`, `0xb`, `0xc`, `0x5`, `0x2`, |

13 | `0x1`, `0x6`, `0xf`, `0x8`, `0xa`, `0xd`, `0x4`, `0x3`, |

14 | }; |

15 | |

16 | */*** |

17 | * * crc4 - calculate the 4-bit crc of a value.* |

18 | * * @c: starting crc4* |

19 | * * @x: value to checksum* |

20 | * * @bits: number of bits in @x to checksum* |

21 | * ** |

22 | * * Returns the crc4 value of @x, using polynomial 0b10111.* |

23 | * ** |

24 | * * The @x value is treated as left-aligned, and bits above @bits are ignored* |

25 | * * in the crc calculations.* |

26 | * */* |

27 | uint8_t crc4(uint8_t c, uint64_t x, *int* bits) |

28 | { |

29 | *int* i; |

30 | |

31 | */* mask off anything above the top bit */* |

32 | x &= (`1ull` << bits) - `1`; |

33 | |

34 | */* Align to 4-bits */* |

35 | bits = (bits + `3`) & ~`0x3`; |

36 | |

37 | */* Calculate crc4 over four-bit nibbles, starting at the MSbit */* |

38 | **for** (i = bits - `4`; i >= `0`; i -= `4`) |

39 | c = crc4_tab[c ^ ((x >> i) & `0xf`)]; |

40 | |

41 | **return** c; |

42 | } |

43 | EXPORT_SYMBOL_GPL(crc4); |

44 | |

45 | MODULE_DESCRIPTION("CRC4 calculations" ); |

46 | MODULE_LICENSE("GPL" ); |

47 | |