15e111ed8SAndrew Rybchenko /* SPDX-License-Identifier: BSD-3-Clause
25e111ed8SAndrew Rybchenko *
3*672386c1SAndrew Rybchenko * Copyright(c) 2019-2021 Xilinx, Inc.
45e111ed8SAndrew Rybchenko * Copyright(c) 2013-2019 Solarflare Communications Inc.
55e111ed8SAndrew Rybchenko */
65e111ed8SAndrew Rybchenko
75e111ed8SAndrew Rybchenko #include "efx.h"
85e111ed8SAndrew Rybchenko #include "efx_impl.h"
95e111ed8SAndrew Rybchenko
105e111ed8SAndrew Rybchenko /*
115e111ed8SAndrew Rybchenko * Precomputed table for computing IEEE 802.3 CRC32
125e111ed8SAndrew Rybchenko * with polynomial 0x04c11db7 (bit-reversed 0xedb88320)
135e111ed8SAndrew Rybchenko */
145e111ed8SAndrew Rybchenko
155e111ed8SAndrew Rybchenko static const uint32_t efx_crc32_table[256] = {
165e111ed8SAndrew Rybchenko 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
175e111ed8SAndrew Rybchenko 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
185e111ed8SAndrew Rybchenko 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
195e111ed8SAndrew Rybchenko 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
205e111ed8SAndrew Rybchenko 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
215e111ed8SAndrew Rybchenko 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
225e111ed8SAndrew Rybchenko 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
235e111ed8SAndrew Rybchenko 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
245e111ed8SAndrew Rybchenko 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
255e111ed8SAndrew Rybchenko 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
265e111ed8SAndrew Rybchenko 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
275e111ed8SAndrew Rybchenko 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
285e111ed8SAndrew Rybchenko 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
295e111ed8SAndrew Rybchenko 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
305e111ed8SAndrew Rybchenko 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
315e111ed8SAndrew Rybchenko 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
325e111ed8SAndrew Rybchenko 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
335e111ed8SAndrew Rybchenko 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
345e111ed8SAndrew Rybchenko 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
355e111ed8SAndrew Rybchenko 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
365e111ed8SAndrew Rybchenko 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
375e111ed8SAndrew Rybchenko 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
385e111ed8SAndrew Rybchenko 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
395e111ed8SAndrew Rybchenko 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
405e111ed8SAndrew Rybchenko 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
415e111ed8SAndrew Rybchenko 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
425e111ed8SAndrew Rybchenko 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
435e111ed8SAndrew Rybchenko 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
445e111ed8SAndrew Rybchenko 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
455e111ed8SAndrew Rybchenko 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
465e111ed8SAndrew Rybchenko 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
475e111ed8SAndrew Rybchenko 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
485e111ed8SAndrew Rybchenko 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
495e111ed8SAndrew Rybchenko 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
505e111ed8SAndrew Rybchenko 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
515e111ed8SAndrew Rybchenko 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
525e111ed8SAndrew Rybchenko 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
535e111ed8SAndrew Rybchenko 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
545e111ed8SAndrew Rybchenko 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
555e111ed8SAndrew Rybchenko 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
565e111ed8SAndrew Rybchenko 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
575e111ed8SAndrew Rybchenko 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
585e111ed8SAndrew Rybchenko 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
595e111ed8SAndrew Rybchenko 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
605e111ed8SAndrew Rybchenko 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
615e111ed8SAndrew Rybchenko 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
625e111ed8SAndrew Rybchenko 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
635e111ed8SAndrew Rybchenko 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
645e111ed8SAndrew Rybchenko 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
655e111ed8SAndrew Rybchenko 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
665e111ed8SAndrew Rybchenko 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
675e111ed8SAndrew Rybchenko 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
685e111ed8SAndrew Rybchenko 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
695e111ed8SAndrew Rybchenko 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
705e111ed8SAndrew Rybchenko 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
715e111ed8SAndrew Rybchenko 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
725e111ed8SAndrew Rybchenko 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
735e111ed8SAndrew Rybchenko 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
745e111ed8SAndrew Rybchenko 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
755e111ed8SAndrew Rybchenko 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
765e111ed8SAndrew Rybchenko 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
775e111ed8SAndrew Rybchenko 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
785e111ed8SAndrew Rybchenko 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
795e111ed8SAndrew Rybchenko 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
805e111ed8SAndrew Rybchenko };
815e111ed8SAndrew Rybchenko
825e111ed8SAndrew Rybchenko /* Calculate the IEEE 802.3 CRC32 of a MAC addr */
835e111ed8SAndrew Rybchenko __checkReturn uint32_t
efx_crc32_calculate(__in uint32_t crc_init,__in_ecount (length)uint8_t const * input,__in int length)845e111ed8SAndrew Rybchenko efx_crc32_calculate(
855e111ed8SAndrew Rybchenko __in uint32_t crc_init,
865e111ed8SAndrew Rybchenko __in_ecount(length) uint8_t const *input,
875e111ed8SAndrew Rybchenko __in int length)
885e111ed8SAndrew Rybchenko {
895e111ed8SAndrew Rybchenko int index;
905e111ed8SAndrew Rybchenko uint32_t crc = crc_init;
915e111ed8SAndrew Rybchenko
925e111ed8SAndrew Rybchenko for (index = 0; index < length; index++) {
935e111ed8SAndrew Rybchenko uint32_t data = *(input++);
945e111ed8SAndrew Rybchenko crc = (crc >> 8) ^ efx_crc32_table[(crc ^ data) & 0xff];
955e111ed8SAndrew Rybchenko }
965e111ed8SAndrew Rybchenko
975e111ed8SAndrew Rybchenko return (crc);
985e111ed8SAndrew Rybchenko }
99