This source file includes following definitions.
- dr_crc32_calc_lookup_entry
- mlx5dr_crc32_init_table
- mlx5dr_crc32_slice8_calc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 #include "dr_types.h"
26
27 #define DR_STE_CRC_POLY 0xEDB88320L
28
29 static u32 dr_ste_crc_tab32[8][256];
30
31 static void dr_crc32_calc_lookup_entry(u32 (*tbl)[256], u8 i, u8 j)
32 {
33 tbl[i][j] = (tbl[i - 1][j] >> 8) ^ tbl[0][tbl[i - 1][j] & 0xff];
34 }
35
36 void mlx5dr_crc32_init_table(void)
37 {
38 u32 crc, i, j;
39
40 for (i = 0; i < 256; i++) {
41 crc = i;
42 for (j = 0; j < 8; j++) {
43 if (crc & 0x00000001L)
44 crc = (crc >> 1) ^ DR_STE_CRC_POLY;
45 else
46 crc = crc >> 1;
47 }
48 dr_ste_crc_tab32[0][i] = crc;
49 }
50
51
52 for (i = 0; i < 256; i++) {
53 dr_crc32_calc_lookup_entry(dr_ste_crc_tab32, 1, i);
54 dr_crc32_calc_lookup_entry(dr_ste_crc_tab32, 2, i);
55 dr_crc32_calc_lookup_entry(dr_ste_crc_tab32, 3, i);
56 dr_crc32_calc_lookup_entry(dr_ste_crc_tab32, 4, i);
57 dr_crc32_calc_lookup_entry(dr_ste_crc_tab32, 5, i);
58 dr_crc32_calc_lookup_entry(dr_ste_crc_tab32, 6, i);
59 dr_crc32_calc_lookup_entry(dr_ste_crc_tab32, 7, i);
60 }
61 }
62
63
64 u32 mlx5dr_crc32_slice8_calc(const void *input_data, size_t length)
65 {
66 const u32 *curr = (const u32 *)input_data;
67 const u8 *curr_char;
68 u32 crc = 0, one, two;
69
70 if (!input_data)
71 return 0;
72
73
74 while (length >= 8) {
75 one = *curr++ ^ crc;
76 two = *curr++;
77
78 crc = dr_ste_crc_tab32[0][(two >> 24) & 0xff]
79 ^ dr_ste_crc_tab32[1][(two >> 16) & 0xff]
80 ^ dr_ste_crc_tab32[2][(two >> 8) & 0xff]
81 ^ dr_ste_crc_tab32[3][two & 0xff]
82 ^ dr_ste_crc_tab32[4][(one >> 24) & 0xff]
83 ^ dr_ste_crc_tab32[5][(one >> 16) & 0xff]
84 ^ dr_ste_crc_tab32[6][(one >> 8) & 0xff]
85 ^ dr_ste_crc_tab32[7][one & 0xff];
86
87 length -= 8;
88 }
89
90 curr_char = (const u8 *)curr;
91
92 while (length-- != 0)
93 crc = (crc >> 8) ^ dr_ste_crc_tab32[0][(crc & 0xff)
94 ^ *curr_char++];
95
96 return ((crc >> 24) & 0xff) | ((crc << 8) & 0xff0000) |
97 ((crc >> 8) & 0xff00) | ((crc << 24) & 0xff000000);
98 }