xref: /openbmc/qemu/include/qemu/crc-ccitt.h (revision f703f1ef)
10b73ce30SBin Meng /*
20b73ce30SBin Meng  * CRC16 (CCITT) Checksum Algorithm
30b73ce30SBin Meng  *
40b73ce30SBin Meng  * Copyright (c) 2021 Wind River Systems, Inc.
50b73ce30SBin Meng  *
60b73ce30SBin Meng  * Author:
70b73ce30SBin Meng  *   Bin Meng <bin.meng@windriver.com>
80b73ce30SBin Meng  *
90b73ce30SBin Meng  * From Linux kernel v5.10 include/linux/crc-ccitt.h
100b73ce30SBin Meng  *
110b73ce30SBin Meng  * SPDX-License-Identifier: GPL-2.0
120b73ce30SBin Meng  */
130b73ce30SBin Meng 
149c092804SMarkus Armbruster #ifndef CRC_CCITT_H
159c092804SMarkus Armbruster #define CRC_CCITT_H
160b73ce30SBin Meng 
170b73ce30SBin Meng extern uint16_t const crc_ccitt_table[256];
180b73ce30SBin Meng extern uint16_t const crc_ccitt_false_table[256];
190b73ce30SBin Meng 
20*f703f1efSPhilippe Mathieu-Daudé uint16_t crc_ccitt(uint16_t crc, const uint8_t *buffer, size_t len);
21*f703f1efSPhilippe Mathieu-Daudé uint16_t crc_ccitt_false(uint16_t crc, const uint8_t *buffer, size_t len);
220b73ce30SBin Meng 
crc_ccitt_byte(uint16_t crc,const uint8_t c)230b73ce30SBin Meng static inline uint16_t crc_ccitt_byte(uint16_t crc, const uint8_t c)
240b73ce30SBin Meng {
250b73ce30SBin Meng     return (crc >> 8) ^ crc_ccitt_table[(crc ^ c) & 0xff];
260b73ce30SBin Meng }
270b73ce30SBin Meng 
crc_ccitt_false_byte(uint16_t crc,const uint8_t c)280b73ce30SBin Meng static inline uint16_t crc_ccitt_false_byte(uint16_t crc, const uint8_t c)
290b73ce30SBin Meng {
300b73ce30SBin Meng     return (crc << 8) ^ crc_ccitt_false_table[(crc >> 8) ^ c];
310b73ce30SBin Meng }
320b73ce30SBin Meng 
339c092804SMarkus Armbruster #endif /* CRC_CCITT_H */
34