1f01a2161SJakub Kicinski /*
2f01a2161SJakub Kicinski  * Copyright (C) 2015-2017 Netronome Systems, Inc.
3f01a2161SJakub Kicinski  *
4f01a2161SJakub Kicinski  * This software is dual licensed under the GNU General License Version 2,
5f01a2161SJakub Kicinski  * June 1991 as shown in the file COPYING in the top-level directory of this
6f01a2161SJakub Kicinski  * source tree or the BSD 2-Clause License provided below.  You have the
7f01a2161SJakub Kicinski  * option to license this software under the complete terms of either license.
8f01a2161SJakub Kicinski  *
9f01a2161SJakub Kicinski  * The BSD 2-Clause License:
10f01a2161SJakub Kicinski  *
11f01a2161SJakub Kicinski  *     Redistribution and use in source and binary forms, with or
12f01a2161SJakub Kicinski  *     without modification, are permitted provided that the following
13f01a2161SJakub Kicinski  *     conditions are met:
14f01a2161SJakub Kicinski  *
15f01a2161SJakub Kicinski  *      1. Redistributions of source code must retain the above
16f01a2161SJakub Kicinski  *         copyright notice, this list of conditions and the following
17f01a2161SJakub Kicinski  *         disclaimer.
18f01a2161SJakub Kicinski  *
19f01a2161SJakub Kicinski  *      2. Redistributions in binary form must reproduce the above
20f01a2161SJakub Kicinski  *         copyright notice, this list of conditions and the following
21f01a2161SJakub Kicinski  *         disclaimer in the documentation and/or other materials
22f01a2161SJakub Kicinski  *         provided with the distribution.
23f01a2161SJakub Kicinski  *
24f01a2161SJakub Kicinski  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25f01a2161SJakub Kicinski  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26f01a2161SJakub Kicinski  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27f01a2161SJakub Kicinski  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
28f01a2161SJakub Kicinski  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
29f01a2161SJakub Kicinski  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30f01a2161SJakub Kicinski  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31f01a2161SJakub Kicinski  * SOFTWARE.
32f01a2161SJakub Kicinski  */
33f01a2161SJakub Kicinski 
34f01a2161SJakub Kicinski #ifndef NFP_CRC32_H
35f01a2161SJakub Kicinski #define NFP_CRC32_H
36f01a2161SJakub Kicinski 
37f01a2161SJakub Kicinski #include <linux/kernel.h>
38f01a2161SJakub Kicinski #include <linux/crc32.h>
39f01a2161SJakub Kicinski 
40f01a2161SJakub Kicinski /**
41f01a2161SJakub Kicinski  * crc32_posix_end() - Finalize POSIX CRC32 working state
42f01a2161SJakub Kicinski  * @crc:	Current CRC32 working state
43f01a2161SJakub Kicinski  * @total_len:	Total length of data that was CRC32'd
44f01a2161SJakub Kicinski  *
45f01a2161SJakub Kicinski  * Return: Final POSIX CRC32 value
46f01a2161SJakub Kicinski  */
47f01a2161SJakub Kicinski static inline u32 crc32_posix_end(u32 crc, size_t total_len)
48f01a2161SJakub Kicinski {
49f01a2161SJakub Kicinski 	/* Extend with the length of the string. */
50f01a2161SJakub Kicinski 	while (total_len != 0) {
51f01a2161SJakub Kicinski 		u8 c = total_len & 0xff;
52f01a2161SJakub Kicinski 
53f01a2161SJakub Kicinski 		crc = crc32_be(crc, &c, 1);
54f01a2161SJakub Kicinski 		total_len >>= 8;
55f01a2161SJakub Kicinski 	}
56f01a2161SJakub Kicinski 
57f01a2161SJakub Kicinski 	return ~crc;
58f01a2161SJakub Kicinski }
59f01a2161SJakub Kicinski 
60f01a2161SJakub Kicinski static inline u32 crc32_posix(const void *buff, size_t len)
61f01a2161SJakub Kicinski {
62f01a2161SJakub Kicinski 	return crc32_posix_end(crc32_be(0, buff, len), len);
63f01a2161SJakub Kicinski }
64f01a2161SJakub Kicinski 
65f01a2161SJakub Kicinski #endif /* NFP_CRC32_H */
66