|
30 | 30 | #include <linux/crc32poly.h>
|
31 | 31 | #include <linux/module.h>
|
32 | 32 | #include <linux/types.h>
|
33 |
| -#include <linux/sched.h> |
34 |
| -#include "crc32defs.h" |
35 |
| - |
36 |
| -#if CRC_LE_BITS > 8 |
37 |
| -# define tole(x) ((__force u32) cpu_to_le32(x)) |
38 |
| -#else |
39 |
| -# define tole(x) (x) |
40 |
| -#endif |
41 |
| - |
42 |
| -#if CRC_BE_BITS > 8 |
43 |
| -# define tobe(x) ((__force u32) cpu_to_be32(x)) |
44 |
| -#else |
45 |
| -# define tobe(x) (x) |
46 |
| -#endif |
47 | 33 |
|
48 | 34 | #include "crc32table.h"
|
49 | 35 |
|
50 | 36 | MODULE_AUTHOR("Matt Domsch <Matt_Domsch@dell.com>");
|
51 | 37 | MODULE_DESCRIPTION("Various CRC32 calculations");
|
52 | 38 | MODULE_LICENSE("GPL");
|
53 | 39 |
|
54 |
| -#if CRC_LE_BITS > 8 || CRC_BE_BITS > 8 |
55 |
| - |
56 |
| -/* implements slicing-by-4 or slicing-by-8 algorithm */ |
57 |
| -static inline u32 __pure |
58 |
| -crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256]) |
59 |
| -{ |
60 |
| -# ifdef __LITTLE_ENDIAN |
61 |
| -# define DO_CRC(x) crc = t0[(crc ^ (x)) & 255] ^ (crc >> 8) |
62 |
| -# define DO_CRC4 (t3[(q) & 255] ^ t2[(q >> 8) & 255] ^ \ |
63 |
| - t1[(q >> 16) & 255] ^ t0[(q >> 24) & 255]) |
64 |
| -# define DO_CRC8 (t7[(q) & 255] ^ t6[(q >> 8) & 255] ^ \ |
65 |
| - t5[(q >> 16) & 255] ^ t4[(q >> 24) & 255]) |
66 |
| -# else |
67 |
| -# define DO_CRC(x) crc = t0[((crc >> 24) ^ (x)) & 255] ^ (crc << 8) |
68 |
| -# define DO_CRC4 (t0[(q) & 255] ^ t1[(q >> 8) & 255] ^ \ |
69 |
| - t2[(q >> 16) & 255] ^ t3[(q >> 24) & 255]) |
70 |
| -# define DO_CRC8 (t4[(q) & 255] ^ t5[(q >> 8) & 255] ^ \ |
71 |
| - t6[(q >> 16) & 255] ^ t7[(q >> 24) & 255]) |
72 |
| -# endif |
73 |
| - const u32 *b; |
74 |
| - size_t rem_len; |
75 |
| -# ifdef CONFIG_X86 |
76 |
| - size_t i; |
77 |
| -# endif |
78 |
| - const u32 *t0=tab[0], *t1=tab[1], *t2=tab[2], *t3=tab[3]; |
79 |
| -# if CRC_LE_BITS != 32 |
80 |
| - const u32 *t4 = tab[4], *t5 = tab[5], *t6 = tab[6], *t7 = tab[7]; |
81 |
| -# endif |
82 |
| - u32 q; |
83 |
| - |
84 |
| - /* Align it */ |
85 |
| - if (unlikely((long)buf & 3 && len)) { |
86 |
| - do { |
87 |
| - DO_CRC(*buf++); |
88 |
| - } while ((--len) && ((long)buf)&3); |
89 |
| - } |
90 |
| - |
91 |
| -# if CRC_LE_BITS == 32 |
92 |
| - rem_len = len & 3; |
93 |
| - len = len >> 2; |
94 |
| -# else |
95 |
| - rem_len = len & 7; |
96 |
| - len = len >> 3; |
97 |
| -# endif |
98 |
| - |
99 |
| - b = (const u32 *)buf; |
100 |
| -# ifdef CONFIG_X86 |
101 |
| - --b; |
102 |
| - for (i = 0; i < len; i++) { |
103 |
| -# else |
104 |
| - for (--b; len; --len) { |
105 |
| -# endif |
106 |
| - q = crc ^ *++b; /* use pre increment for speed */ |
107 |
| -# if CRC_LE_BITS == 32 |
108 |
| - crc = DO_CRC4; |
109 |
| -# else |
110 |
| - crc = DO_CRC8; |
111 |
| - q = *++b; |
112 |
| - crc ^= DO_CRC4; |
113 |
| -# endif |
114 |
| - } |
115 |
| - len = rem_len; |
116 |
| - /* And the last few bytes */ |
117 |
| - if (len) { |
118 |
| - u8 *p = (u8 *)(b + 1) - 1; |
119 |
| -# ifdef CONFIG_X86 |
120 |
| - for (i = 0; i < len; i++) |
121 |
| - DO_CRC(*++p); /* use pre increment for speed */ |
122 |
| -# else |
123 |
| - do { |
124 |
| - DO_CRC(*++p); /* use pre increment for speed */ |
125 |
| - } while (--len); |
126 |
| -# endif |
127 |
| - } |
128 |
| - return crc; |
129 |
| -#undef DO_CRC |
130 |
| -#undef DO_CRC4 |
131 |
| -#undef DO_CRC8 |
132 |
| -} |
133 |
| -#endif |
134 |
| - |
135 |
| - |
136 |
| -/** |
137 |
| - * crc32_le_generic() - Calculate bitwise little-endian Ethernet AUTODIN II |
138 |
| - * CRC32/CRC32C |
139 |
| - * @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for other |
140 |
| - * uses, or the previous crc32/crc32c value if computing incrementally. |
141 |
| - * @p: pointer to buffer over which CRC32/CRC32C is run |
142 |
| - * @len: length of buffer @p |
143 |
| - * @tab: little-endian Ethernet table |
144 |
| - * @polynomial: CRC32/CRC32c LE polynomial |
145 |
| - */ |
146 |
| -static inline u32 __pure crc32_le_generic(u32 crc, unsigned char const *p, |
147 |
| - size_t len, const u32 (*tab)[256], |
148 |
| - u32 polynomial) |
| 40 | +u32 __pure crc32_le_base(u32 crc, const u8 *p, size_t len) |
149 | 41 | {
|
150 |
| -#if CRC_LE_BITS == 1 |
151 |
| - int i; |
152 |
| - while (len--) { |
153 |
| - crc ^= *p++; |
154 |
| - for (i = 0; i < 8; i++) |
155 |
| - crc = (crc >> 1) ^ ((crc & 1) ? polynomial : 0); |
156 |
| - } |
157 |
| -# elif CRC_LE_BITS == 2 |
158 |
| - while (len--) { |
159 |
| - crc ^= *p++; |
160 |
| - crc = (crc >> 2) ^ tab[0][crc & 3]; |
161 |
| - crc = (crc >> 2) ^ tab[0][crc & 3]; |
162 |
| - crc = (crc >> 2) ^ tab[0][crc & 3]; |
163 |
| - crc = (crc >> 2) ^ tab[0][crc & 3]; |
164 |
| - } |
165 |
| -# elif CRC_LE_BITS == 4 |
166 |
| - while (len--) { |
167 |
| - crc ^= *p++; |
168 |
| - crc = (crc >> 4) ^ tab[0][crc & 15]; |
169 |
| - crc = (crc >> 4) ^ tab[0][crc & 15]; |
170 |
| - } |
171 |
| -# elif CRC_LE_BITS == 8 |
172 |
| - /* aka Sarwate algorithm */ |
173 |
| - while (len--) { |
174 |
| - crc ^= *p++; |
175 |
| - crc = (crc >> 8) ^ tab[0][crc & 255]; |
176 |
| - } |
177 |
| -# else |
178 |
| - crc = (__force u32) __cpu_to_le32(crc); |
179 |
| - crc = crc32_body(crc, p, len, tab); |
180 |
| - crc = __le32_to_cpu((__force __le32)crc); |
181 |
| -#endif |
| 42 | + while (len--) |
| 43 | + crc = (crc >> 8) ^ crc32table_le[(crc & 255) ^ *p++]; |
182 | 44 | return crc;
|
183 | 45 | }
|
| 46 | +EXPORT_SYMBOL(crc32_le_base); |
184 | 47 |
|
185 |
| -#if CRC_LE_BITS == 1 |
186 |
| -u32 __pure crc32_le_base(u32 crc, const u8 *p, size_t len) |
187 |
| -{ |
188 |
| - return crc32_le_generic(crc, p, len, NULL, CRC32_POLY_LE); |
189 |
| -} |
190 |
| -u32 __pure crc32c_le_base(u32 crc, const u8 *p, size_t len) |
191 |
| -{ |
192 |
| - return crc32_le_generic(crc, p, len, NULL, CRC32C_POLY_LE); |
193 |
| -} |
194 |
| -#else |
195 |
| -u32 __pure crc32_le_base(u32 crc, const u8 *p, size_t len) |
196 |
| -{ |
197 |
| - return crc32_le_generic(crc, p, len, crc32table_le, CRC32_POLY_LE); |
198 |
| -} |
199 | 48 | u32 __pure crc32c_le_base(u32 crc, const u8 *p, size_t len)
|
200 | 49 | {
|
201 |
| - return crc32_le_generic(crc, p, len, crc32ctable_le, CRC32C_POLY_LE); |
| 50 | + while (len--) |
| 51 | + crc = (crc >> 8) ^ crc32ctable_le[(crc & 255) ^ *p++]; |
| 52 | + return crc; |
202 | 53 | }
|
203 |
| -#endif |
204 |
| -EXPORT_SYMBOL(crc32_le_base); |
205 | 54 | EXPORT_SYMBOL(crc32c_le_base);
|
206 | 55 |
|
207 | 56 | /*
|
@@ -277,64 +126,10 @@ u32 __attribute_const__ __crc32c_le_shift(u32 crc, size_t len)
|
277 | 126 | EXPORT_SYMBOL(crc32_le_shift);
|
278 | 127 | EXPORT_SYMBOL(__crc32c_le_shift);
|
279 | 128 |
|
280 |
| -/** |
281 |
| - * crc32_be_generic() - Calculate bitwise big-endian Ethernet AUTODIN II CRC32 |
282 |
| - * @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for |
283 |
| - * other uses, or the previous crc32 value if computing incrementally. |
284 |
| - * @p: pointer to buffer over which CRC32 is run |
285 |
| - * @len: length of buffer @p |
286 |
| - * @tab: big-endian Ethernet table |
287 |
| - * @polynomial: CRC32 BE polynomial |
288 |
| - */ |
289 |
| -static inline u32 __pure crc32_be_generic(u32 crc, unsigned char const *p, |
290 |
| - size_t len, const u32 (*tab)[256], |
291 |
| - u32 polynomial) |
292 |
| -{ |
293 |
| -#if CRC_BE_BITS == 1 |
294 |
| - int i; |
295 |
| - while (len--) { |
296 |
| - crc ^= *p++ << 24; |
297 |
| - for (i = 0; i < 8; i++) |
298 |
| - crc = |
299 |
| - (crc << 1) ^ ((crc & 0x80000000) ? polynomial : |
300 |
| - 0); |
301 |
| - } |
302 |
| -# elif CRC_BE_BITS == 2 |
303 |
| - while (len--) { |
304 |
| - crc ^= *p++ << 24; |
305 |
| - crc = (crc << 2) ^ tab[0][crc >> 30]; |
306 |
| - crc = (crc << 2) ^ tab[0][crc >> 30]; |
307 |
| - crc = (crc << 2) ^ tab[0][crc >> 30]; |
308 |
| - crc = (crc << 2) ^ tab[0][crc >> 30]; |
309 |
| - } |
310 |
| -# elif CRC_BE_BITS == 4 |
311 |
| - while (len--) { |
312 |
| - crc ^= *p++ << 24; |
313 |
| - crc = (crc << 4) ^ tab[0][crc >> 28]; |
314 |
| - crc = (crc << 4) ^ tab[0][crc >> 28]; |
315 |
| - } |
316 |
| -# elif CRC_BE_BITS == 8 |
317 |
| - while (len--) { |
318 |
| - crc ^= *p++ << 24; |
319 |
| - crc = (crc << 8) ^ tab[0][crc >> 24]; |
320 |
| - } |
321 |
| -# else |
322 |
| - crc = (__force u32) __cpu_to_be32(crc); |
323 |
| - crc = crc32_body(crc, p, len, tab); |
324 |
| - crc = __be32_to_cpu((__force __be32)crc); |
325 |
| -# endif |
326 |
| - return crc; |
327 |
| -} |
328 |
| - |
329 |
| -#if CRC_BE_BITS == 1 |
330 |
| -u32 __pure crc32_be_base(u32 crc, const u8 *p, size_t len) |
331 |
| -{ |
332 |
| - return crc32_be_generic(crc, p, len, NULL, CRC32_POLY_BE); |
333 |
| -} |
334 |
| -#else |
335 | 129 | u32 __pure crc32_be_base(u32 crc, const u8 *p, size_t len)
|
336 | 130 | {
|
337 |
| - return crc32_be_generic(crc, p, len, crc32table_be, CRC32_POLY_BE); |
| 131 | + while (len--) |
| 132 | + crc = (crc << 8) ^ crc32table_be[(crc >> 24) ^ *p++]; |
| 133 | + return crc; |
338 | 134 | }
|
339 |
| -#endif |
340 | 135 | EXPORT_SYMBOL(crc32_be_base);
|
0 commit comments