crc32: add slice-by-8 algorithm to existing code
[linux-2.6.git] / lib / crc32.c
1 /*
2  * Oct 15, 2000 Matt Domsch <Matt_Domsch@dell.com>
3  * Nicer crc32 functions/docs submitted by linux@horizon.com.  Thanks!
4  * Code was from the public domain, copyright abandoned.  Code was
5  * subsequently included in the kernel, thus was re-licensed under the
6  * GNU GPL v2.
7  *
8  * Oct 12, 2000 Matt Domsch <Matt_Domsch@dell.com>
9  * Same crc32 function was used in 5 other places in the kernel.
10  * I made one version, and deleted the others.
11  * There are various incantations of crc32().  Some use a seed of 0 or ~0.
12  * Some xor at the end with ~0.  The generic crc32() function takes
13  * seed as an argument, and doesn't xor at the end.  Then individual
14  * users can do whatever they need.
15  *   drivers/net/smc9194.c uses seed ~0, doesn't xor with ~0.
16  *   fs/jffs2 uses seed 0, doesn't xor with ~0.
17  *   fs/partitions/efi.c uses seed ~0, xor's with ~0.
18  *
19  * This source code is licensed under the GNU General Public License,
20  * Version 2.  See the file COPYING for more details.
21  */
22
23 /* see: Documentation/crc32.txt for a description of algorithms */
24
25 #include <linux/crc32.h>
26 #include <linux/module.h>
27 #include <linux/types.h>
28 #include "crc32defs.h"
29
30 #if CRC_LE_BITS > 8
31 # define tole(x) ((__force u32) __constant_cpu_to_le32(x))
32 #else
33 # define tole(x) (x)
34 #endif
35
36 #if CRC_BE_BITS > 8
37 # define tobe(x) ((__force u32) __constant_cpu_to_be32(x))
38 #else
39 # define tobe(x) (x)
40 #endif
41
42 #include "crc32table.h"
43
44 MODULE_AUTHOR("Matt Domsch <Matt_Domsch@dell.com>");
45 MODULE_DESCRIPTION("Ethernet CRC32 calculations");
46 MODULE_LICENSE("GPL");
47
48 #if CRC_LE_BITS > 8 || CRC_BE_BITS > 8
49
50 /* implements slicing-by-4 or slicing-by-8 algorithm */
51 static inline u32
52 crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256])
53 {
54 # ifdef __LITTLE_ENDIAN
55 #  define DO_CRC(x) crc = t0[(crc ^ (x)) & 255] ^ (crc >> 8)
56 #  define DO_CRC4 (t3[(q) & 255] ^ t2[(q >> 8) & 255] ^ \
57                    t1[(q >> 16) & 255] ^ t0[(q >> 24) & 255])
58 #  define DO_CRC8 (t7[(q) & 255] ^ t6[(q >> 8) & 255] ^ \
59                    t5[(q >> 16) & 255] ^ t4[(q >> 24) & 255])
60 # else
61 #  define DO_CRC(x) crc = t0[((crc >> 24) ^ (x)) & 255] ^ (crc << 8)
62 #  define DO_CRC4 (t0[(q) & 255] ^ t1[(q >> 8) & 255] ^ \
63                    t2[(q >> 16) & 255] ^ t3[(q >> 24) & 255])
64 #  define DO_CRC8 (t4[(q) & 255] ^ t5[(q >> 8) & 255] ^ \
65                    t6[(q >> 16) & 255] ^ t7[(q >> 24) & 255])
66 # endif
67         const u32 *b;
68         size_t    rem_len;
69         const u32 *t0=tab[0], *t1=tab[1], *t2=tab[2], *t3=tab[3];
70         const u32 *t4 = tab[4], *t5 = tab[5], *t6 = tab[6], *t7 = tab[7];
71         u32 q;
72
73         /* Align it */
74         if (unlikely((long)buf & 3 && len)) {
75                 do {
76                         DO_CRC(*buf++);
77                 } while ((--len) && ((long)buf)&3);
78         }
79
80 # if CRC_LE_BITS == 32
81         rem_len = len & 3;
82         len = len >> 2;
83 # else
84         rem_len = len & 7;
85         len = len >> 3;
86 # endif
87
88         b = (const u32 *)buf;
89         for (--b; len; --len) {
90                 q = crc ^ *++b; /* use pre increment for speed */
91 # if CRC_LE_BITS == 32
92                 crc = DO_CRC4;
93 # else
94                 crc = DO_CRC8;
95                 q = *++b;
96                 crc ^= DO_CRC4;
97 # endif
98         }
99         len = rem_len;
100         /* And the last few bytes */
101         if (len) {
102                 u8 *p = (u8 *)(b + 1) - 1;
103                 do {
104                         DO_CRC(*++p); /* use pre increment for speed */
105                 } while (--len);
106         }
107         return crc;
108 #undef DO_CRC
109 #undef DO_CRC4
110 #undef DO_CRC8
111 }
112 #endif
113
114 /**
115  * crc32_le() - Calculate bitwise little-endian Ethernet AUTODIN II CRC32
116  * @crc: seed value for computation.  ~0 for Ethernet, sometimes 0 for
117  *      other uses, or the previous crc32 value if computing incrementally.
118  * @p: pointer to buffer over which CRC is run
119  * @len: length of buffer @p
120  */
121 u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
122 {
123 #if CRC_LE_BITS == 1
124         int i;
125         while (len--) {
126                 crc ^= *p++;
127                 for (i = 0; i < 8; i++)
128                         crc = (crc >> 1) ^ ((crc & 1) ? CRCPOLY_LE : 0);
129         }
130 # elif CRC_LE_BITS == 2
131         while (len--) {
132                 crc ^= *p++;
133                 crc = (crc >> 2) ^ crc32table_le[0][crc & 3];
134                 crc = (crc >> 2) ^ crc32table_le[0][crc & 3];
135                 crc = (crc >> 2) ^ crc32table_le[0][crc & 3];
136                 crc = (crc >> 2) ^ crc32table_le[0][crc & 3];
137         }
138 # elif CRC_LE_BITS == 4
139         while (len--) {
140                 crc ^= *p++;
141                 crc = (crc >> 4) ^ crc32table_le[0][crc & 15];
142                 crc = (crc >> 4) ^ crc32table_le[0][crc & 15];
143         }
144 # elif CRC_LE_BITS == 8
145         /* aka Sarwate algorithm */
146         while (len--) {
147                 crc ^= *p++;
148                 crc = (crc >> 8) ^ crc32table_le[0][crc & 255];
149         }
150 # else
151         const u32      (*tab)[] = crc32table_le;
152
153         crc = (__force u32) __cpu_to_le32(crc);
154         crc = crc32_body(crc, p, len, tab);
155         crc = __le32_to_cpu((__force __le32)crc);
156 #endif
157         return crc;
158 }
159 EXPORT_SYMBOL(crc32_le);
160
161 /**
162  * crc32_be() - Calculate bitwise big-endian Ethernet AUTODIN II CRC32
163  * @crc: seed value for computation.  ~0 for Ethernet, sometimes 0 for
164  *      other uses, or the previous crc32 value if computing incrementally.
165  * @p: pointer to buffer over which CRC is run
166  * @len: length of buffer @p
167  */
168 u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)
169 {
170 #if CRC_BE_BITS == 1
171         int i;
172         while (len--) {
173                 crc ^= *p++ << 24;
174                 for (i = 0; i < 8; i++)
175                         crc =
176                             (crc << 1) ^ ((crc & 0x80000000) ? CRCPOLY_BE :
177                                           0);
178         }
179 # elif CRC_BE_BITS == 2
180         while (len--) {
181                 crc ^= *p++ << 24;
182                 crc = (crc << 2) ^ crc32table_be[0][crc >> 30];
183                 crc = (crc << 2) ^ crc32table_be[0][crc >> 30];
184                 crc = (crc << 2) ^ crc32table_be[0][crc >> 30];
185                 crc = (crc << 2) ^ crc32table_be[0][crc >> 30];
186         }
187 # elif CRC_BE_BITS == 4
188         while (len--) {
189                 crc ^= *p++ << 24;
190                 crc = (crc << 4) ^ crc32table_be[0][crc >> 28];
191                 crc = (crc << 4) ^ crc32table_be[0][crc >> 28];
192         }
193 # elif CRC_BE_BITS == 8
194         while (len--) {
195                 crc ^= *p++ << 24;
196                 crc = (crc << 8) ^ crc32table_be[0][crc >> 24];
197         }
198 # else
199         const u32      (*tab)[] = crc32table_be;
200
201         crc = (__force u32) __cpu_to_be32(crc);
202         crc = crc32_body(crc, p, len, tab);
203         crc = __be32_to_cpu((__force __be32)crc);
204 # endif
205         return crc;
206 }
207 EXPORT_SYMBOL(crc32_be);
208
209 #ifdef CONFIG_CRC32_SELFTEST
210
211 /* 4096 random bytes */
212 static u8 __attribute__((__aligned__(8))) test_buf[] =
213 {
214         0x5b, 0x85, 0x21, 0xcb, 0x09, 0x68, 0x7d, 0x30,
215         0xc7, 0x69, 0xd7, 0x30, 0x92, 0xde, 0x59, 0xe4,
216         0xc9, 0x6e, 0x8b, 0xdb, 0x98, 0x6b, 0xaa, 0x60,
217         0xa8, 0xb5, 0xbc, 0x6c, 0xa9, 0xb1, 0x5b, 0x2c,
218         0xea, 0xb4, 0x92, 0x6a, 0x3f, 0x79, 0x91, 0xe4,
219         0xe9, 0x70, 0x51, 0x8c, 0x7f, 0x95, 0x6f, 0x1a,
220         0x56, 0xa1, 0x5c, 0x27, 0x03, 0x67, 0x9f, 0x3a,
221         0xe2, 0x31, 0x11, 0x29, 0x6b, 0x98, 0xfc, 0xc4,
222         0x53, 0x24, 0xc5, 0x8b, 0xce, 0x47, 0xb2, 0xb9,
223         0x32, 0xcb, 0xc1, 0xd0, 0x03, 0x57, 0x4e, 0xd4,
224         0xe9, 0x3c, 0xa1, 0x63, 0xcf, 0x12, 0x0e, 0xca,
225         0xe1, 0x13, 0xd1, 0x93, 0xa6, 0x88, 0x5c, 0x61,
226         0x5b, 0xbb, 0xf0, 0x19, 0x46, 0xb4, 0xcf, 0x9e,
227         0xb6, 0x6b, 0x4c, 0x3a, 0xcf, 0x60, 0xf9, 0x7a,
228         0x8d, 0x07, 0x63, 0xdb, 0x40, 0xe9, 0x0b, 0x6f,
229         0xad, 0x97, 0xf1, 0xed, 0xd0, 0x1e, 0x26, 0xfd,
230         0xbf, 0xb7, 0xc8, 0x04, 0x94, 0xf8, 0x8b, 0x8c,
231         0xf1, 0xab, 0x7a, 0xd4, 0xdd, 0xf3, 0xe8, 0x88,
232         0xc3, 0xed, 0x17, 0x8a, 0x9b, 0x40, 0x0d, 0x53,
233         0x62, 0x12, 0x03, 0x5f, 0x1b, 0x35, 0x32, 0x1f,
234         0xb4, 0x7b, 0x93, 0x78, 0x0d, 0xdb, 0xce, 0xa4,
235         0xc0, 0x47, 0xd5, 0xbf, 0x68, 0xe8, 0x5d, 0x74,
236         0x8f, 0x8e, 0x75, 0x1c, 0xb2, 0x4f, 0x9a, 0x60,
237         0xd1, 0xbe, 0x10, 0xf4, 0x5c, 0xa1, 0x53, 0x09,
238         0xa5, 0xe0, 0x09, 0x54, 0x85, 0x5c, 0xdc, 0x07,
239         0xe7, 0x21, 0x69, 0x7b, 0x8a, 0xfd, 0x90, 0xf1,
240         0x22, 0xd0, 0xb4, 0x36, 0x28, 0xe6, 0xb8, 0x0f,
241         0x39, 0xde, 0xc8, 0xf3, 0x86, 0x60, 0x34, 0xd2,
242         0x5e, 0xdf, 0xfd, 0xcf, 0x0f, 0xa9, 0x65, 0xf0,
243         0xd5, 0x4d, 0x96, 0x40, 0xe3, 0xdf, 0x3f, 0x95,
244         0x5a, 0x39, 0x19, 0x93, 0xf4, 0x75, 0xce, 0x22,
245         0x00, 0x1c, 0x93, 0xe2, 0x03, 0x66, 0xf4, 0x93,
246         0x73, 0x86, 0x81, 0x8e, 0x29, 0x44, 0x48, 0x86,
247         0x61, 0x7c, 0x48, 0xa3, 0x43, 0xd2, 0x9c, 0x8d,
248         0xd4, 0x95, 0xdd, 0xe1, 0x22, 0x89, 0x3a, 0x40,
249         0x4c, 0x1b, 0x8a, 0x04, 0xa8, 0x09, 0x69, 0x8b,
250         0xea, 0xc6, 0x55, 0x8e, 0x57, 0xe6, 0x64, 0x35,
251         0xf0, 0xc7, 0x16, 0x9f, 0x5d, 0x5e, 0x86, 0x40,
252         0x46, 0xbb, 0xe5, 0x45, 0x88, 0xfe, 0xc9, 0x63,
253         0x15, 0xfb, 0xf5, 0xbd, 0x71, 0x61, 0xeb, 0x7b,
254         0x78, 0x70, 0x07, 0x31, 0x03, 0x9f, 0xb2, 0xc8,
255         0xa7, 0xab, 0x47, 0xfd, 0xdf, 0xa0, 0x78, 0x72,
256         0xa4, 0x2a, 0xe4, 0xb6, 0xba, 0xc0, 0x1e, 0x86,
257         0x71, 0xe6, 0x3d, 0x18, 0x37, 0x70, 0xe6, 0xff,
258         0xe0, 0xbc, 0x0b, 0x22, 0xa0, 0x1f, 0xd3, 0xed,
259         0xa2, 0x55, 0x39, 0xab, 0xa8, 0x13, 0x73, 0x7c,
260         0x3f, 0xb2, 0xd6, 0x19, 0xac, 0xff, 0x99, 0xed,
261         0xe8, 0xe6, 0xa6, 0x22, 0xe3, 0x9c, 0xf1, 0x30,
262         0xdc, 0x01, 0x0a, 0x56, 0xfa, 0xe4, 0xc9, 0x99,
263         0xdd, 0xa8, 0xd8, 0xda, 0x35, 0x51, 0x73, 0xb4,
264         0x40, 0x86, 0x85, 0xdb, 0x5c, 0xd5, 0x85, 0x80,
265         0x14, 0x9c, 0xfd, 0x98, 0xa9, 0x82, 0xc5, 0x37,
266         0xff, 0x32, 0x5d, 0xd0, 0x0b, 0xfa, 0xdc, 0x04,
267         0x5e, 0x09, 0xd2, 0xca, 0x17, 0x4b, 0x1a, 0x8e,
268         0x15, 0xe1, 0xcc, 0x4e, 0x52, 0x88, 0x35, 0xbd,
269         0x48, 0xfe, 0x15, 0xa0, 0x91, 0xfd, 0x7e, 0x6c,
270         0x0e, 0x5d, 0x79, 0x1b, 0x81, 0x79, 0xd2, 0x09,
271         0x34, 0x70, 0x3d, 0x81, 0xec, 0xf6, 0x24, 0xbb,
272         0xfb, 0xf1, 0x7b, 0xdf, 0x54, 0xea, 0x80, 0x9b,
273         0xc7, 0x99, 0x9e, 0xbd, 0x16, 0x78, 0x12, 0x53,
274         0x5e, 0x01, 0xa7, 0x4e, 0xbd, 0x67, 0xe1, 0x9b,
275         0x4c, 0x0e, 0x61, 0x45, 0x97, 0xd2, 0xf0, 0x0f,
276         0xfe, 0x15, 0x08, 0xb7, 0x11, 0x4c, 0xe7, 0xff,
277         0x81, 0x53, 0xff, 0x91, 0x25, 0x38, 0x7e, 0x40,
278         0x94, 0xe5, 0xe0, 0xad, 0xe6, 0xd9, 0x79, 0xb6,
279         0x92, 0xc9, 0xfc, 0xde, 0xc3, 0x1a, 0x23, 0xbb,
280         0xdd, 0xc8, 0x51, 0x0c, 0x3a, 0x72, 0xfa, 0x73,
281         0x6f, 0xb7, 0xee, 0x61, 0x39, 0x03, 0x01, 0x3f,
282         0x7f, 0x94, 0x2e, 0x2e, 0xba, 0x3a, 0xbb, 0xb4,
283         0xfa, 0x6a, 0x17, 0xfe, 0xea, 0xef, 0x5e, 0x66,
284         0x97, 0x3f, 0x32, 0x3d, 0xd7, 0x3e, 0xb1, 0xf1,
285         0x6c, 0x14, 0x4c, 0xfd, 0x37, 0xd3, 0x38, 0x80,
286         0xfb, 0xde, 0xa6, 0x24, 0x1e, 0xc8, 0xca, 0x7f,
287         0x3a, 0x93, 0xd8, 0x8b, 0x18, 0x13, 0xb2, 0xe5,
288         0xe4, 0x93, 0x05, 0x53, 0x4f, 0x84, 0x66, 0xa7,
289         0x58, 0x5c, 0x7b, 0x86, 0x52, 0x6d, 0x0d, 0xce,
290         0xa4, 0x30, 0x7d, 0xb6, 0x18, 0x9f, 0xeb, 0xff,
291         0x22, 0xbb, 0x72, 0x29, 0xb9, 0x44, 0x0b, 0x48,
292         0x1e, 0x84, 0x71, 0x81, 0xe3, 0x6d, 0x73, 0x26,
293         0x92, 0xb4, 0x4d, 0x2a, 0x29, 0xb8, 0x1f, 0x72,
294         0xed, 0xd0, 0xe1, 0x64, 0x77, 0xea, 0x8e, 0x88,
295         0x0f, 0xef, 0x3f, 0xb1, 0x3b, 0xad, 0xf9, 0xc9,
296         0x8b, 0xd0, 0xac, 0xc6, 0xcc, 0xa9, 0x40, 0xcc,
297         0x76, 0xf6, 0x3b, 0x53, 0xb5, 0x88, 0xcb, 0xc8,
298         0x37, 0xf1, 0xa2, 0xba, 0x23, 0x15, 0x99, 0x09,
299         0xcc, 0xe7, 0x7a, 0x3b, 0x37, 0xf7, 0x58, 0xc8,
300         0x46, 0x8c, 0x2b, 0x2f, 0x4e, 0x0e, 0xa6, 0x5c,
301         0xea, 0x85, 0x55, 0xba, 0x02, 0x0e, 0x0e, 0x48,
302         0xbc, 0xe1, 0xb1, 0x01, 0x35, 0x79, 0x13, 0x3d,
303         0x1b, 0xc0, 0x53, 0x68, 0x11, 0xe7, 0x95, 0x0f,
304         0x9d, 0x3f, 0x4c, 0x47, 0x7b, 0x4d, 0x1c, 0xae,
305         0x50, 0x9b, 0xcb, 0xdd, 0x05, 0x8d, 0x9a, 0x97,
306         0xfd, 0x8c, 0xef, 0x0c, 0x1d, 0x67, 0x73, 0xa8,
307         0x28, 0x36, 0xd5, 0xb6, 0x92, 0x33, 0x40, 0x75,
308         0x0b, 0x51, 0xc3, 0x64, 0xba, 0x1d, 0xc2, 0xcc,
309         0xee, 0x7d, 0x54, 0x0f, 0x27, 0x69, 0xa7, 0x27,
310         0x63, 0x30, 0x29, 0xd9, 0xc8, 0x84, 0xd8, 0xdf,
311         0x9f, 0x68, 0x8d, 0x04, 0xca, 0xa6, 0xc5, 0xc7,
312         0x7a, 0x5c, 0xc8, 0xd1, 0xcb, 0x4a, 0xec, 0xd0,
313         0xd8, 0x20, 0x69, 0xc5, 0x17, 0xcd, 0x78, 0xc8,
314         0x75, 0x23, 0x30, 0x69, 0xc9, 0xd4, 0xea, 0x5c,
315         0x4f, 0x6b, 0x86, 0x3f, 0x8b, 0xfe, 0xee, 0x44,
316         0xc9, 0x7c, 0xb7, 0xdd, 0x3e, 0xe5, 0xec, 0x54,
317         0x03, 0x3e, 0xaa, 0x82, 0xc6, 0xdf, 0xb2, 0x38,
318         0x0e, 0x5d, 0xb3, 0x88, 0xd9, 0xd3, 0x69, 0x5f,
319         0x8f, 0x70, 0x8a, 0x7e, 0x11, 0xd9, 0x1e, 0x7b,
320         0x38, 0xf1, 0x42, 0x1a, 0xc0, 0x35, 0xf5, 0xc7,
321         0x36, 0x85, 0xf5, 0xf7, 0xb8, 0x7e, 0xc7, 0xef,
322         0x18, 0xf1, 0x63, 0xd6, 0x7a, 0xc6, 0xc9, 0x0e,
323         0x4d, 0x69, 0x4f, 0x84, 0xef, 0x26, 0x41, 0x0c,
324         0xec, 0xc7, 0xe0, 0x7e, 0x3c, 0x67, 0x01, 0x4c,
325         0x62, 0x1a, 0x20, 0x6f, 0xee, 0x47, 0x4d, 0xc0,
326         0x99, 0x13, 0x8d, 0x91, 0x4a, 0x26, 0xd4, 0x37,
327         0x28, 0x90, 0x58, 0x75, 0x66, 0x2b, 0x0a, 0xdf,
328         0xda, 0xee, 0x92, 0x25, 0x90, 0x62, 0x39, 0x9e,
329         0x44, 0x98, 0xad, 0xc1, 0x88, 0xed, 0xe4, 0xb4,
330         0xaf, 0xf5, 0x8c, 0x9b, 0x48, 0x4d, 0x56, 0x60,
331         0x97, 0x0f, 0x61, 0x59, 0x9e, 0xa6, 0x27, 0xfe,
332         0xc1, 0x91, 0x15, 0x38, 0xb8, 0x0f, 0xae, 0x61,
333         0x7d, 0x26, 0x13, 0x5a, 0x73, 0xff, 0x1c, 0xa3,
334         0x61, 0x04, 0x58, 0x48, 0x55, 0x44, 0x11, 0xfe,
335         0x15, 0xca, 0xc3, 0xbd, 0xca, 0xc5, 0xb4, 0x40,
336         0x5d, 0x1b, 0x7f, 0x39, 0xb5, 0x9c, 0x35, 0xec,
337         0x61, 0x15, 0x32, 0x32, 0xb8, 0x4e, 0x40, 0x9f,
338         0x17, 0x1f, 0x0a, 0x4d, 0xa9, 0x91, 0xef, 0xb7,
339         0xb0, 0xeb, 0xc2, 0x83, 0x9a, 0x6c, 0xd2, 0x79,
340         0x43, 0x78, 0x5e, 0x2f, 0xe5, 0xdd, 0x1a, 0x3c,
341         0x45, 0xab, 0x29, 0x40, 0x3a, 0x37, 0x5b, 0x6f,
342         0xd7, 0xfc, 0x48, 0x64, 0x3c, 0x49, 0xfb, 0x21,
343         0xbe, 0xc3, 0xff, 0x07, 0xfb, 0x17, 0xe9, 0xc9,
344         0x0c, 0x4c, 0x5c, 0x15, 0x9e, 0x8e, 0x22, 0x30,
345         0x0a, 0xde, 0x48, 0x7f, 0xdb, 0x0d, 0xd1, 0x2b,
346         0x87, 0x38, 0x9e, 0xcc, 0x5a, 0x01, 0x16, 0xee,
347         0x75, 0x49, 0x0d, 0x30, 0x01, 0x34, 0x6a, 0xb6,
348         0x9a, 0x5a, 0x2a, 0xec, 0xbb, 0x48, 0xac, 0xd3,
349         0x77, 0x83, 0xd8, 0x08, 0x86, 0x4f, 0x48, 0x09,
350         0x29, 0x41, 0x79, 0xa1, 0x03, 0x12, 0xc4, 0xcd,
351         0x90, 0x55, 0x47, 0x66, 0x74, 0x9a, 0xcc, 0x4f,
352         0x35, 0x8c, 0xd6, 0x98, 0xef, 0xeb, 0x45, 0xb9,
353         0x9a, 0x26, 0x2f, 0x39, 0xa5, 0x70, 0x6d, 0xfc,
354         0xb4, 0x51, 0xee, 0xf4, 0x9c, 0xe7, 0x38, 0x59,
355         0xad, 0xf4, 0xbc, 0x46, 0xff, 0x46, 0x8e, 0x60,
356         0x9c, 0xa3, 0x60, 0x1d, 0xf8, 0x26, 0x72, 0xf5,
357         0x72, 0x9d, 0x68, 0x80, 0x04, 0xf6, 0x0b, 0xa1,
358         0x0a, 0xd5, 0xa7, 0x82, 0x3a, 0x3e, 0x47, 0xa8,
359         0x5a, 0xde, 0x59, 0x4f, 0x7b, 0x07, 0xb3, 0xe9,
360         0x24, 0x19, 0x3d, 0x34, 0x05, 0xec, 0xf1, 0xab,
361         0x6e, 0x64, 0x8f, 0xd3, 0xe6, 0x41, 0x86, 0x80,
362         0x70, 0xe3, 0x8d, 0x60, 0x9c, 0x34, 0x25, 0x01,
363         0x07, 0x4d, 0x19, 0x41, 0x4e, 0x3d, 0x5c, 0x7e,
364         0xa8, 0xf5, 0xcc, 0xd5, 0x7b, 0xe2, 0x7d, 0x3d,
365         0x49, 0x86, 0x7d, 0x07, 0xb7, 0x10, 0xe3, 0x35,
366         0xb8, 0x84, 0x6d, 0x76, 0xab, 0x17, 0xc6, 0x38,
367         0xb4, 0xd3, 0x28, 0x57, 0xad, 0xd3, 0x88, 0x5a,
368         0xda, 0xea, 0xc8, 0x94, 0xcc, 0x37, 0x19, 0xac,
369         0x9c, 0x9f, 0x4b, 0x00, 0x15, 0xc0, 0xc8, 0xca,
370         0x1f, 0x15, 0xaa, 0xe0, 0xdb, 0xf9, 0x2f, 0x57,
371         0x1b, 0x24, 0xc7, 0x6f, 0x76, 0x29, 0xfb, 0xed,
372         0x25, 0x0d, 0xc0, 0xfe, 0xbd, 0x5a, 0xbf, 0x20,
373         0x08, 0x51, 0x05, 0xec, 0x71, 0xa3, 0xbf, 0xef,
374         0x5e, 0x99, 0x75, 0xdb, 0x3c, 0x5f, 0x9a, 0x8c,
375         0xbb, 0x19, 0x5c, 0x0e, 0x93, 0x19, 0xf8, 0x6a,
376         0xbc, 0xf2, 0x12, 0x54, 0x2f, 0xcb, 0x28, 0x64,
377         0x88, 0xb3, 0x92, 0x0d, 0x96, 0xd1, 0xa6, 0xe4,
378         0x1f, 0xf1, 0x4d, 0xa4, 0xab, 0x1c, 0xee, 0x54,
379         0xf2, 0xad, 0x29, 0x6d, 0x32, 0x37, 0xb2, 0x16,
380         0x77, 0x5c, 0xdc, 0x2e, 0x54, 0xec, 0x75, 0x26,
381         0xc6, 0x36, 0xd9, 0x17, 0x2c, 0xf1, 0x7a, 0xdc,
382         0x4b, 0xf1, 0xe2, 0xd9, 0x95, 0xba, 0xac, 0x87,
383         0xc1, 0xf3, 0x8e, 0x58, 0x08, 0xd8, 0x87, 0x60,
384         0xc9, 0xee, 0x6a, 0xde, 0xa4, 0xd2, 0xfc, 0x0d,
385         0xe5, 0x36, 0xc4, 0x5c, 0x52, 0xb3, 0x07, 0x54,
386         0x65, 0x24, 0xc1, 0xb1, 0xd1, 0xb1, 0x53, 0x13,
387         0x31, 0x79, 0x7f, 0x05, 0x76, 0xeb, 0x37, 0x59,
388         0x15, 0x2b, 0xd1, 0x3f, 0xac, 0x08, 0x97, 0xeb,
389         0x91, 0x98, 0xdf, 0x6c, 0x09, 0x0d, 0x04, 0x9f,
390         0xdc, 0x3b, 0x0e, 0x60, 0x68, 0x47, 0x23, 0x15,
391         0x16, 0xc6, 0x0b, 0x35, 0xf8, 0x77, 0xa2, 0x78,
392         0x50, 0xd4, 0x64, 0x22, 0x33, 0xff, 0xfb, 0x93,
393         0x71, 0x46, 0x50, 0x39, 0x1b, 0x9c, 0xea, 0x4e,
394         0x8d, 0x0c, 0x37, 0xe5, 0x5c, 0x51, 0x3a, 0x31,
395         0xb2, 0x85, 0x84, 0x3f, 0x41, 0xee, 0xa2, 0xc1,
396         0xc6, 0x13, 0x3b, 0x54, 0x28, 0xd2, 0x18, 0x37,
397         0xcc, 0x46, 0x9f, 0x6a, 0x91, 0x3d, 0x5a, 0x15,
398         0x3c, 0x89, 0xa3, 0x61, 0x06, 0x7d, 0x2e, 0x78,
399         0xbe, 0x7d, 0x40, 0xba, 0x2f, 0x95, 0xb1, 0x2f,
400         0x87, 0x3b, 0x8a, 0xbe, 0x6a, 0xf4, 0xc2, 0x31,
401         0x74, 0xee, 0x91, 0xe0, 0x23, 0xaa, 0x5d, 0x7f,
402         0xdd, 0xf0, 0x44, 0x8c, 0x0b, 0x59, 0x2b, 0xfc,
403         0x48, 0x3a, 0xdf, 0x07, 0x05, 0x38, 0x6c, 0xc9,
404         0xeb, 0x18, 0x24, 0x68, 0x8d, 0x58, 0x98, 0xd3,
405         0x31, 0xa3, 0xe4, 0x70, 0x59, 0xb1, 0x21, 0xbe,
406         0x7e, 0x65, 0x7d, 0xb8, 0x04, 0xab, 0xf6, 0xe4,
407         0xd7, 0xda, 0xec, 0x09, 0x8f, 0xda, 0x6d, 0x24,
408         0x07, 0xcc, 0x29, 0x17, 0x05, 0x78, 0x1a, 0xc1,
409         0xb1, 0xce, 0xfc, 0xaa, 0x2d, 0xe7, 0xcc, 0x85,
410         0x84, 0x84, 0x03, 0x2a, 0x0c, 0x3f, 0xa9, 0xf8,
411         0xfd, 0x84, 0x53, 0x59, 0x5c, 0xf0, 0xd4, 0x09,
412         0xf0, 0xd2, 0x6c, 0x32, 0x03, 0xb0, 0xa0, 0x8c,
413         0x52, 0xeb, 0x23, 0x91, 0x88, 0x43, 0x13, 0x46,
414         0xf6, 0x1e, 0xb4, 0x1b, 0xf5, 0x8e, 0x3a, 0xb5,
415         0x3d, 0x00, 0xf6, 0xe5, 0x08, 0x3d, 0x5f, 0x39,
416         0xd3, 0x21, 0x69, 0xbc, 0x03, 0x22, 0x3a, 0xd2,
417         0x5c, 0x84, 0xf8, 0x15, 0xc4, 0x80, 0x0b, 0xbc,
418         0x29, 0x3c, 0xf3, 0x95, 0x98, 0xcd, 0x8f, 0x35,
419         0xbc, 0xa5, 0x3e, 0xfc, 0xd4, 0x13, 0x9e, 0xde,
420         0x4f, 0xce, 0x71, 0x9d, 0x09, 0xad, 0xf2, 0x80,
421         0x6b, 0x65, 0x7f, 0x03, 0x00, 0x14, 0x7c, 0x15,
422         0x85, 0x40, 0x6d, 0x70, 0xea, 0xdc, 0xb3, 0x63,
423         0x35, 0x4f, 0x4d, 0xe0, 0xd9, 0xd5, 0x3c, 0x58,
424         0x56, 0x23, 0x80, 0xe2, 0x36, 0xdd, 0x75, 0x1d,
425         0x94, 0x11, 0x41, 0x8e, 0xe0, 0x81, 0x8e, 0xcf,
426         0xe0, 0xe5, 0xf6, 0xde, 0xd1, 0xe7, 0x04, 0x12,
427         0x79, 0x92, 0x2b, 0x71, 0x2a, 0x79, 0x8b, 0x7c,
428         0x44, 0x79, 0x16, 0x30, 0x4e, 0xf4, 0xf6, 0x9b,
429         0xb7, 0x40, 0xa3, 0x5a, 0xa7, 0x69, 0x3e, 0xc1,
430         0x3a, 0x04, 0xd0, 0x88, 0xa0, 0x3b, 0xdd, 0xc6,
431         0x9e, 0x7e, 0x1e, 0x1e, 0x8f, 0x44, 0xf7, 0x73,
432         0x67, 0x1e, 0x1a, 0x78, 0xfa, 0x62, 0xf4, 0xa9,
433         0xa8, 0xc6, 0x5b, 0xb8, 0xfa, 0x06, 0x7d, 0x5e,
434         0x38, 0x1c, 0x9a, 0x39, 0xe9, 0x39, 0x98, 0x22,
435         0x0b, 0xa7, 0xac, 0x0b, 0xf3, 0xbc, 0xf1, 0xeb,
436         0x8c, 0x81, 0xe3, 0x48, 0x8a, 0xed, 0x42, 0xc2,
437         0x38, 0xcf, 0x3e, 0xda, 0xd2, 0x89, 0x8d, 0x9c,
438         0x53, 0xb5, 0x2f, 0x41, 0x01, 0x26, 0x84, 0x9c,
439         0xa3, 0x56, 0xf6, 0x49, 0xc7, 0xd4, 0x9f, 0x93,
440         0x1b, 0x96, 0x49, 0x5e, 0xad, 0xb3, 0x84, 0x1f,
441         0x3c, 0xa4, 0xe0, 0x9b, 0xd1, 0x90, 0xbc, 0x38,
442         0x6c, 0xdd, 0x95, 0x4d, 0x9d, 0xb1, 0x71, 0x57,
443         0x2d, 0x34, 0xe8, 0xb8, 0x42, 0xc7, 0x99, 0x03,
444         0xc7, 0x07, 0x30, 0x65, 0x91, 0x55, 0xd5, 0x90,
445         0x70, 0x97, 0x37, 0x68, 0xd4, 0x11, 0xf9, 0xe8,
446         0xce, 0xec, 0xdc, 0x34, 0xd5, 0xd3, 0xb7, 0xc4,
447         0xb8, 0x97, 0x05, 0x92, 0xad, 0xf8, 0xe2, 0x36,
448         0x64, 0x41, 0xc9, 0xc5, 0x41, 0x77, 0x52, 0xd7,
449         0x2c, 0xa5, 0x24, 0x2f, 0xd9, 0x34, 0x0b, 0x47,
450         0x35, 0xa7, 0x28, 0x8b, 0xc5, 0xcd, 0xe9, 0x46,
451         0xac, 0x39, 0x94, 0x3c, 0x10, 0xc6, 0x29, 0x73,
452         0x0e, 0x0e, 0x5d, 0xe0, 0x71, 0x03, 0x8a, 0x72,
453         0x0e, 0x26, 0xb0, 0x7d, 0x84, 0xed, 0x95, 0x23,
454         0x49, 0x5a, 0x45, 0x83, 0x45, 0x60, 0x11, 0x4a,
455         0x46, 0x31, 0xd4, 0xd8, 0x16, 0x54, 0x98, 0x58,
456         0xed, 0x6d, 0xcc, 0x5d, 0xd6, 0x50, 0x61, 0x9f,
457         0x9d, 0xc5, 0x3e, 0x9d, 0x32, 0x47, 0xde, 0x96,
458         0xe1, 0x5d, 0xd8, 0xf8, 0xb4, 0x69, 0x6f, 0xb9,
459         0x15, 0x90, 0x57, 0x7a, 0xf6, 0xad, 0xb0, 0x5b,
460         0xf5, 0xa6, 0x36, 0x94, 0xfd, 0x84, 0xce, 0x1c,
461         0x0f, 0x4b, 0xd0, 0xc2, 0x5b, 0x6b, 0x56, 0xef,
462         0x73, 0x93, 0x0b, 0xc3, 0xee, 0xd9, 0xcf, 0xd3,
463         0xa4, 0x22, 0x58, 0xcd, 0x50, 0x6e, 0x65, 0xf4,
464         0xe9, 0xb7, 0x71, 0xaf, 0x4b, 0xb3, 0xb6, 0x2f,
465         0x0f, 0x0e, 0x3b, 0xc9, 0x85, 0x14, 0xf5, 0x17,
466         0xe8, 0x7a, 0x3a, 0xbf, 0x5f, 0x5e, 0xf8, 0x18,
467         0x48, 0xa6, 0x72, 0xab, 0x06, 0x95, 0xe9, 0xc8,
468         0xa7, 0xf4, 0x32, 0x44, 0x04, 0x0c, 0x84, 0x98,
469         0x73, 0xe3, 0x89, 0x8d, 0x5f, 0x7e, 0x4a, 0x42,
470         0x8f, 0xc5, 0x28, 0xb1, 0x82, 0xef, 0x1c, 0x97,
471         0x31, 0x3b, 0x4d, 0xe0, 0x0e, 0x10, 0x10, 0x97,
472         0x93, 0x49, 0x78, 0x2f, 0x0d, 0x86, 0x8b, 0xa1,
473         0x53, 0xa9, 0x81, 0x20, 0x79, 0xe7, 0x07, 0x77,
474         0xb6, 0xac, 0x5e, 0xd2, 0x05, 0xcd, 0xe9, 0xdb,
475         0x8a, 0x94, 0x82, 0x8a, 0x23, 0xb9, 0x3d, 0x1c,
476         0xa9, 0x7d, 0x72, 0x4a, 0xed, 0x33, 0xa3, 0xdb,
477         0x21, 0xa7, 0x86, 0x33, 0x45, 0xa5, 0xaa, 0x56,
478         0x45, 0xb5, 0x83, 0x29, 0x40, 0x47, 0x79, 0x04,
479         0x6e, 0xb9, 0x95, 0xd0, 0x81, 0x77, 0x2d, 0x48,
480         0x1e, 0xfe, 0xc3, 0xc2, 0x1e, 0xe5, 0xf2, 0xbe,
481         0xfd, 0x3b, 0x94, 0x9f, 0xc4, 0xc4, 0x26, 0x9d,
482         0xe4, 0x66, 0x1e, 0x19, 0xee, 0x6c, 0x79, 0x97,
483         0x11, 0x31, 0x4b, 0x0d, 0x01, 0xcb, 0xde, 0xa8,
484         0xf6, 0x6d, 0x7c, 0x39, 0x46, 0x4e, 0x7e, 0x3f,
485         0x94, 0x17, 0xdf, 0xa1, 0x7d, 0xd9, 0x1c, 0x8e,
486         0xbc, 0x7d, 0x33, 0x7d, 0xe3, 0x12, 0x40, 0xca,
487         0xab, 0x37, 0x11, 0x46, 0xd4, 0xae, 0xef, 0x44,
488         0xa2, 0xb3, 0x6a, 0x66, 0x0e, 0x0c, 0x90, 0x7f,
489         0xdf, 0x5c, 0x66, 0x5f, 0xf2, 0x94, 0x9f, 0xa6,
490         0x73, 0x4f, 0xeb, 0x0d, 0xad, 0xbf, 0xc0, 0x63,
491         0x5c, 0xdc, 0x46, 0x51, 0xe8, 0x8e, 0x90, 0x19,
492         0xa8, 0xa4, 0x3c, 0x91, 0x79, 0xfa, 0x7e, 0x58,
493         0x85, 0x13, 0x55, 0xc5, 0x19, 0x82, 0x37, 0x1b,
494         0x0a, 0x02, 0x1f, 0x99, 0x6b, 0x18, 0xf1, 0x28,
495         0x08, 0xa2, 0x73, 0xb8, 0x0f, 0x2e, 0xcd, 0xbf,
496         0xf3, 0x86, 0x7f, 0xea, 0xef, 0xd0, 0xbb, 0xa6,
497         0x21, 0xdf, 0x49, 0x73, 0x51, 0xcc, 0x36, 0xd3,
498         0x3e, 0xa0, 0xf8, 0x44, 0xdf, 0xd3, 0xa6, 0xbe,
499         0x8a, 0xd4, 0x57, 0xdd, 0x72, 0x94, 0x61, 0x0f,
500         0x82, 0xd1, 0x07, 0xb8, 0x7c, 0x18, 0x83, 0xdf,
501         0x3a, 0xe5, 0x50, 0x6a, 0x82, 0x20, 0xac, 0xa9,
502         0xa8, 0xff, 0xd9, 0xf3, 0x77, 0x33, 0x5a, 0x9e,
503         0x7f, 0x6d, 0xfe, 0x5d, 0x33, 0x41, 0x42, 0xe7,
504         0x6c, 0x19, 0xe0, 0x44, 0x8a, 0x15, 0xf6, 0x70,
505         0x98, 0xb7, 0x68, 0x4d, 0xfa, 0x97, 0x39, 0xb0,
506         0x8e, 0xe8, 0x84, 0x8b, 0x75, 0x30, 0xb7, 0x7d,
507         0x92, 0x69, 0x20, 0x9c, 0x81, 0xfb, 0x4b, 0xf4,
508         0x01, 0x50, 0xeb, 0xce, 0x0c, 0x1c, 0x6c, 0xb5,
509         0x4a, 0xd7, 0x27, 0x0c, 0xce, 0xbb, 0xe5, 0x85,
510         0xf0, 0xb6, 0xee, 0xd5, 0x70, 0xdd, 0x3b, 0xfc,
511         0xd4, 0x99, 0xf1, 0x33, 0xdd, 0x8b, 0xc4, 0x2f,
512         0xae, 0xab, 0x74, 0x96, 0x32, 0xc7, 0x4c, 0x56,
513         0x3c, 0x89, 0x0f, 0x96, 0x0b, 0x42, 0xc0, 0xcb,
514         0xee, 0x0f, 0x0b, 0x8c, 0xfb, 0x7e, 0x47, 0x7b,
515         0x64, 0x48, 0xfd, 0xb2, 0x00, 0x80, 0x89, 0xa5,
516         0x13, 0x55, 0x62, 0xfc, 0x8f, 0xe2, 0x42, 0x03,
517         0xb7, 0x4e, 0x2a, 0x79, 0xb4, 0x82, 0xea, 0x23,
518         0x49, 0xda, 0xaf, 0x52, 0x63, 0x1e, 0x60, 0x03,
519         0x89, 0x06, 0x44, 0x46, 0x08, 0xc3, 0xc4, 0x87,
520         0x70, 0x2e, 0xda, 0x94, 0xad, 0x6b, 0xe0, 0xe4,
521         0xd1, 0x8a, 0x06, 0xc2, 0xa8, 0xc0, 0xa7, 0x43,
522         0x3c, 0x47, 0x52, 0x0e, 0xc3, 0x77, 0x81, 0x11,
523         0x67, 0x0e, 0xa0, 0x70, 0x04, 0x47, 0x29, 0x40,
524         0x86, 0x0d, 0x34, 0x56, 0xa7, 0xc9, 0x35, 0x59,
525         0x68, 0xdc, 0x93, 0x81, 0x70, 0xee, 0x86, 0xd9,
526         0x80, 0x06, 0x40, 0x4f, 0x1a, 0x0d, 0x40, 0x30,
527         0x0b, 0xcb, 0x96, 0x47, 0xc1, 0xb7, 0x52, 0xfd,
528         0x56, 0xe0, 0x72, 0x4b, 0xfb, 0xbd, 0x92, 0x45,
529         0x61, 0x71, 0xc2, 0x33, 0x11, 0xbf, 0x52, 0x83,
530         0x79, 0x26, 0xe0, 0x49, 0x6b, 0xb7, 0x05, 0x8b,
531         0xe8, 0x0e, 0x87, 0x31, 0xd7, 0x9d, 0x8a, 0xf5,
532         0xc0, 0x5f, 0x2e, 0x58, 0x4a, 0xdb, 0x11, 0xb3,
533         0x6c, 0x30, 0x2a, 0x46, 0x19, 0xe3, 0x27, 0x84,
534         0x1f, 0x63, 0x6e, 0xf6, 0x57, 0xc7, 0xc9, 0xd8,
535         0x5e, 0xba, 0xb3, 0x87, 0xd5, 0x83, 0x26, 0x34,
536         0x21, 0x9e, 0x65, 0xde, 0x42, 0xd3, 0xbe, 0x7b,
537         0xbc, 0x91, 0x71, 0x44, 0x4d, 0x99, 0x3b, 0x31,
538         0xe5, 0x3f, 0x11, 0x4e, 0x7f, 0x13, 0x51, 0x3b,
539         0xae, 0x79, 0xc9, 0xd3, 0x81, 0x8e, 0x25, 0x40,
540         0x10, 0xfc, 0x07, 0x1e, 0xf9, 0x7b, 0x9a, 0x4b,
541         0x6c, 0xe3, 0xb3, 0xad, 0x1a, 0x0a, 0xdd, 0x9e,
542         0x59, 0x0c, 0xa2, 0xcd, 0xae, 0x48, 0x4a, 0x38,
543         0x5b, 0x47, 0x41, 0x94, 0x65, 0x6b, 0xbb, 0xeb,
544         0x5b, 0xe3, 0xaf, 0x07, 0x5b, 0xd4, 0x4a, 0xa2,
545         0xc9, 0x5d, 0x2f, 0x64, 0x03, 0xd7, 0x3a, 0x2c,
546         0x6e, 0xce, 0x76, 0x95, 0xb4, 0xb3, 0xc0, 0xf1,
547         0xe2, 0x45, 0x73, 0x7a, 0x5c, 0xab, 0xc1, 0xfc,
548         0x02, 0x8d, 0x81, 0x29, 0xb3, 0xac, 0x07, 0xec,
549         0x40, 0x7d, 0x45, 0xd9, 0x7a, 0x59, 0xee, 0x34,
550         0xf0, 0xe9, 0xd5, 0x7b, 0x96, 0xb1, 0x3d, 0x95,
551         0xcc, 0x86, 0xb5, 0xb6, 0x04, 0x2d, 0xb5, 0x92,
552         0x7e, 0x76, 0xf4, 0x06, 0xa9, 0xa3, 0x12, 0x0f,
553         0xb1, 0xaf, 0x26, 0xba, 0x7c, 0xfc, 0x7e, 0x1c,
554         0xbc, 0x2c, 0x49, 0x97, 0x53, 0x60, 0x13, 0x0b,
555         0xa6, 0x61, 0x83, 0x89, 0x42, 0xd4, 0x17, 0x0c,
556         0x6c, 0x26, 0x52, 0xc3, 0xb3, 0xd4, 0x67, 0xf5,
557         0xe3, 0x04, 0xb7, 0xf4, 0xcb, 0x80, 0xb8, 0xcb,
558         0x77, 0x56, 0x3e, 0xaa, 0x57, 0x54, 0xee, 0xb4,
559         0x2c, 0x67, 0xcf, 0xf2, 0xdc, 0xbe, 0x55, 0xf9,
560         0x43, 0x1f, 0x6e, 0x22, 0x97, 0x67, 0x7f, 0xc4,
561         0xef, 0xb1, 0x26, 0x31, 0x1e, 0x27, 0xdf, 0x41,
562         0x80, 0x47, 0x6c, 0xe2, 0xfa, 0xa9, 0x8c, 0x2a,
563         0xf6, 0xf2, 0xab, 0xf0, 0x15, 0xda, 0x6c, 0xc8,
564         0xfe, 0xb5, 0x23, 0xde, 0xa9, 0x05, 0x3f, 0x06,
565         0x54, 0x4c, 0xcd, 0xe1, 0xab, 0xfc, 0x0e, 0x62,
566         0x33, 0x31, 0x73, 0x2c, 0x76, 0xcb, 0xb4, 0x47,
567         0x1e, 0x20, 0xad, 0xd8, 0xf2, 0x31, 0xdd, 0xc4,
568         0x8b, 0x0c, 0x77, 0xbe, 0xe1, 0x8b, 0x26, 0x00,
569         0x02, 0x58, 0xd6, 0x8d, 0xef, 0xad, 0x74, 0x67,
570         0xab, 0x3f, 0xef, 0xcb, 0x6f, 0xb0, 0xcc, 0x81,
571         0x44, 0x4c, 0xaf, 0xe9, 0x49, 0x4f, 0xdb, 0xa0,
572         0x25, 0xa4, 0xf0, 0x89, 0xf1, 0xbe, 0xd8, 0x10,
573         0xff, 0xb1, 0x3b, 0x4b, 0xfa, 0x98, 0xf5, 0x79,
574         0x6d, 0x1e, 0x69, 0x4d, 0x57, 0xb1, 0xc8, 0x19,
575         0x1b, 0xbd, 0x1e, 0x8c, 0x84, 0xb7, 0x7b, 0xe8,
576         0xd2, 0x2d, 0x09, 0x41, 0x41, 0x37, 0x3d, 0xb1,
577         0x6f, 0x26, 0x5d, 0x71, 0x16, 0x3d, 0xb7, 0x83,
578         0x27, 0x2c, 0xa7, 0xb6, 0x50, 0xbd, 0x91, 0x86,
579         0xab, 0x24, 0xa1, 0x38, 0xfd, 0xea, 0x71, 0x55,
580         0x7e, 0x9a, 0x07, 0x77, 0x4b, 0xfa, 0x61, 0x66,
581         0x20, 0x1e, 0x28, 0x95, 0x18, 0x1b, 0xa4, 0xa0,
582         0xfd, 0xc0, 0x89, 0x72, 0x43, 0xd9, 0x3b, 0x49,
583         0x5a, 0x3f, 0x9d, 0xbf, 0xdb, 0xb4, 0x46, 0xea,
584         0x42, 0x01, 0x77, 0x23, 0x68, 0x95, 0xb6, 0x24,
585         0xb3, 0xa8, 0x6c, 0x28, 0x3b, 0x11, 0x40, 0x7e,
586         0x18, 0x65, 0x6d, 0xd8, 0x24, 0x42, 0x7d, 0x88,
587         0xc0, 0x52, 0xd9, 0x05, 0xe4, 0x95, 0x90, 0x87,
588         0x8c, 0xf4, 0xd0, 0x6b, 0xb9, 0x83, 0x99, 0x34,
589         0x6d, 0xfe, 0x54, 0x40, 0x94, 0x52, 0x21, 0x4f,
590         0x14, 0x25, 0xc5, 0xd6, 0x5e, 0x95, 0xdc, 0x0a,
591         0x2b, 0x89, 0x20, 0x11, 0x84, 0x48, 0xd6, 0x3a,
592         0xcd, 0x5c, 0x24, 0xad, 0x62, 0xe3, 0xb1, 0x93,
593         0x25, 0x8d, 0xcd, 0x7e, 0xfc, 0x27, 0xa3, 0x37,
594         0xfd, 0x84, 0xfc, 0x1b, 0xb2, 0xf1, 0x27, 0x38,
595         0x5a, 0xb7, 0xfc, 0xf2, 0xfa, 0x95, 0x66, 0xd4,
596         0xfb, 0xba, 0xa7, 0xd7, 0xa3, 0x72, 0x69, 0x48,
597         0x48, 0x8c, 0xeb, 0x28, 0x89, 0xfe, 0x33, 0x65,
598         0x5a, 0x36, 0x01, 0x7e, 0x06, 0x79, 0x0a, 0x09,
599         0x3b, 0x74, 0x11, 0x9a, 0x6e, 0xbf, 0xd4, 0x9e,
600         0x58, 0x90, 0x49, 0x4f, 0x4d, 0x08, 0xd4, 0xe5,
601         0x4a, 0x09, 0x21, 0xef, 0x8b, 0xb8, 0x74, 0x3b,
602         0x91, 0xdd, 0x36, 0x85, 0x60, 0x2d, 0xfa, 0xd4,
603         0x45, 0x7b, 0x45, 0x53, 0xf5, 0x47, 0x87, 0x7e,
604         0xa6, 0x37, 0xc8, 0x78, 0x7a, 0x68, 0x9d, 0x8d,
605         0x65, 0x2c, 0x0e, 0x91, 0x5c, 0xa2, 0x60, 0xf0,
606         0x8e, 0x3f, 0xe9, 0x1a, 0xcd, 0xaa, 0xe7, 0xd5,
607         0x77, 0x18, 0xaf, 0xc9, 0xbc, 0x18, 0xea, 0x48,
608         0x1b, 0xfb, 0x22, 0x48, 0x70, 0x16, 0x29, 0x9e,
609         0x5b, 0xc1, 0x2c, 0x66, 0x23, 0xbc, 0xf0, 0x1f,
610         0xef, 0xaf, 0xe4, 0xd6, 0x04, 0x19, 0x82, 0x7a,
611         0x0b, 0xba, 0x4b, 0x46, 0xb1, 0x6a, 0x85, 0x5d,
612         0xb4, 0x73, 0xd6, 0x21, 0xa1, 0x71, 0x60, 0x14,
613         0xee, 0x0a, 0x77, 0xc4, 0x66, 0x2e, 0xf9, 0x69,
614         0x30, 0xaf, 0x41, 0x0b, 0xc8, 0x83, 0x3c, 0x53,
615         0x99, 0x19, 0x27, 0x46, 0xf7, 0x41, 0x6e, 0x56,
616         0xdc, 0x94, 0x28, 0x67, 0x4e, 0xb7, 0x25, 0x48,
617         0x8a, 0xc2, 0xe0, 0x60, 0x96, 0xcc, 0x18, 0xf4,
618         0x84, 0xdd, 0xa7, 0x5e, 0x3e, 0x05, 0x0b, 0x26,
619         0x26, 0xb2, 0x5c, 0x1f, 0x57, 0x1a, 0x04, 0x7e,
620         0x6a, 0xe3, 0x2f, 0xb4, 0x35, 0xb6, 0x38, 0x40,
621         0x40, 0xcd, 0x6f, 0x87, 0x2e, 0xef, 0xa3, 0xd7,
622         0xa9, 0xc2, 0xe8, 0x0d, 0x27, 0xdf, 0x44, 0x62,
623         0x99, 0xa0, 0xfc, 0xcf, 0x81, 0x78, 0xcb, 0xfe,
624         0xe5, 0xa0, 0x03, 0x4e, 0x6c, 0xd7, 0xf4, 0xaf,
625         0x7a, 0xbb, 0x61, 0x82, 0xfe, 0x71, 0x89, 0xb2,
626         0x22, 0x7c, 0x8e, 0x83, 0x04, 0xce, 0xf6, 0x5d,
627         0x84, 0x8f, 0x95, 0x6a, 0x7f, 0xad, 0xfd, 0x32,
628         0x9c, 0x5e, 0xe4, 0x9c, 0x89, 0x60, 0x54, 0xaa,
629         0x96, 0x72, 0xd2, 0xd7, 0x36, 0x85, 0xa9, 0x45,
630         0xd2, 0x2a, 0xa1, 0x81, 0x49, 0x6f, 0x7e, 0x04,
631         0xfa, 0xe2, 0xfe, 0x90, 0x26, 0x77, 0x5a, 0x33,
632         0xb8, 0x04, 0x9a, 0x7a, 0xe6, 0x4c, 0x4f, 0xad,
633         0x72, 0x96, 0x08, 0x28, 0x58, 0x13, 0xf8, 0xc4,
634         0x1c, 0xf0, 0xc3, 0x45, 0x95, 0x49, 0x20, 0x8c,
635         0x9f, 0x39, 0x70, 0xe1, 0x77, 0xfe, 0xd5, 0x4b,
636         0xaf, 0x86, 0xda, 0xef, 0x22, 0x06, 0x83, 0x36,
637         0x29, 0x12, 0x11, 0x40, 0xbc, 0x3b, 0x86, 0xaa,
638         0xaa, 0x65, 0x60, 0xc3, 0x80, 0xca, 0xed, 0xa9,
639         0xf3, 0xb0, 0x79, 0x96, 0xa2, 0x55, 0x27, 0x28,
640         0x55, 0x73, 0x26, 0xa5, 0x50, 0xea, 0x92, 0x4b,
641         0x3c, 0x5c, 0x82, 0x33, 0xf0, 0x01, 0x3f, 0x03,
642         0xc1, 0x08, 0x05, 0xbf, 0x98, 0xf4, 0x9b, 0x6d,
643         0xa5, 0xa8, 0xb4, 0x82, 0x0c, 0x06, 0xfa, 0xff,
644         0x2d, 0x08, 0xf3, 0x05, 0x4f, 0x57, 0x2a, 0x39,
645         0xd4, 0x83, 0x0d, 0x75, 0x51, 0xd8, 0x5b, 0x1b,
646         0xd3, 0x51, 0x5a, 0x32, 0x2a, 0x9b, 0x32, 0xb2,
647         0xf2, 0xa4, 0x96, 0x12, 0xf2, 0xae, 0x40, 0x34,
648         0x67, 0xa8, 0xf5, 0x44, 0xd5, 0x35, 0x53, 0xfe,
649         0xa3, 0x60, 0x96, 0x63, 0x0f, 0x1f, 0x6e, 0xb0,
650         0x5a, 0x42, 0xa6, 0xfc, 0x51, 0x0b, 0x60, 0x27,
651         0xbc, 0x06, 0x71, 0xed, 0x65, 0x5b, 0x23, 0x86,
652         0x4a, 0x07, 0x3b, 0x22, 0x07, 0x46, 0xe6, 0x90,
653         0x3e, 0xf3, 0x25, 0x50, 0x1b, 0x4c, 0x7f, 0x03,
654         0x08, 0xa8, 0x36, 0x6b, 0x87, 0xe5, 0xe3, 0xdb,
655         0x9a, 0x38, 0x83, 0xff, 0x9f, 0x1a, 0x9f, 0x57,
656         0xa4, 0x2a, 0xf6, 0x37, 0xbc, 0x1a, 0xff, 0xc9,
657         0x1e, 0x35, 0x0c, 0xc3, 0x7c, 0xa3, 0xb2, 0xe5,
658         0xd2, 0xc6, 0xb4, 0x57, 0x47, 0xe4, 0x32, 0x16,
659         0x6d, 0xa9, 0xae, 0x64, 0xe6, 0x2d, 0x8d, 0xc5,
660         0x8d, 0x50, 0x8e, 0xe8, 0x1a, 0x22, 0x34, 0x2a,
661         0xd9, 0xeb, 0x51, 0x90, 0x4a, 0xb1, 0x41, 0x7d,
662         0x64, 0xf9, 0xb9, 0x0d, 0xf6, 0x23, 0x33, 0xb0,
663         0x33, 0xf4, 0xf7, 0x3f, 0x27, 0x84, 0xc6, 0x0f,
664         0x54, 0xa5, 0xc0, 0x2e, 0xec, 0x0b, 0x3a, 0x48,
665         0x6e, 0x80, 0x35, 0x81, 0x43, 0x9b, 0x90, 0xb1,
666         0xd0, 0x2b, 0xea, 0x21, 0xdc, 0xda, 0x5b, 0x09,
667         0xf4, 0xcc, 0x10, 0xb4, 0xc7, 0xfe, 0x79, 0x51,
668         0xc3, 0xc5, 0xac, 0x88, 0x74, 0x84, 0x0b, 0x4b,
669         0xca, 0x79, 0x16, 0x29, 0xfb, 0x69, 0x54, 0xdf,
670         0x41, 0x7e, 0xe9, 0xc7, 0x8e, 0xea, 0xa5, 0xfe,
671         0xfc, 0x76, 0x0e, 0x90, 0xc4, 0x92, 0x38, 0xad,
672         0x7b, 0x48, 0xe6, 0x6e, 0xf7, 0x21, 0xfd, 0x4e,
673         0x93, 0x0a, 0x7b, 0x41, 0x83, 0x68, 0xfb, 0x57,
674         0x51, 0x76, 0x34, 0xa9, 0x6c, 0x00, 0xaa, 0x4f,
675         0x66, 0x65, 0x98, 0x4a, 0x4f, 0xa3, 0xa0, 0xef,
676         0x69, 0x3f, 0xe3, 0x1c, 0x92, 0x8c, 0xfd, 0xd8,
677         0xe8, 0xde, 0x7c, 0x7f, 0x3e, 0x84, 0x8e, 0x69,
678         0x3c, 0xf1, 0xf2, 0x05, 0x46, 0xdc, 0x2f, 0x9d,
679         0x5e, 0x6e, 0x4c, 0xfb, 0xb5, 0x99, 0x2a, 0x59,
680         0x63, 0xc1, 0x34, 0xbc, 0x57, 0xc0, 0x0d, 0xb9,
681         0x61, 0x25, 0xf3, 0x33, 0x23, 0x51, 0xb6, 0x0d,
682         0x07, 0xa6, 0xab, 0x94, 0x4a, 0xb7, 0x2a, 0xea,
683         0xee, 0xac, 0xa3, 0xc3, 0x04, 0x8b, 0x0e, 0x56,
684         0xfe, 0x44, 0xa7, 0x39, 0xe2, 0xed, 0xed, 0xb4,
685         0x22, 0x2b, 0xac, 0x12, 0x32, 0x28, 0x91, 0xd8,
686         0xa5, 0xab, 0xff, 0x5f, 0xe0, 0x4b, 0xda, 0x78,
687         0x17, 0xda, 0xf1, 0x01, 0x5b, 0xcd, 0xe2, 0x5f,
688         0x50, 0x45, 0x73, 0x2b, 0xe4, 0x76, 0x77, 0xf4,
689         0x64, 0x1d, 0x43, 0xfb, 0x84, 0x7a, 0xea, 0x91,
690         0xae, 0xf9, 0x9e, 0xb7, 0xb4, 0xb0, 0x91, 0x5f,
691         0x16, 0x35, 0x9a, 0x11, 0xb8, 0xc7, 0xc1, 0x8c,
692         0xc6, 0x10, 0x8d, 0x2f, 0x63, 0x4a, 0xa7, 0x57,
693         0x3a, 0x51, 0xd6, 0x32, 0x2d, 0x64, 0x72, 0xd4,
694         0x66, 0xdc, 0x10, 0xa6, 0x67, 0xd6, 0x04, 0x23,
695         0x9d, 0x0a, 0x11, 0x77, 0xdd, 0x37, 0x94, 0x17,
696         0x3c, 0xbf, 0x8b, 0x65, 0xb0, 0x2e, 0x5e, 0x66,
697         0x47, 0x64, 0xac, 0xdd, 0xf0, 0x84, 0xfd, 0x39,
698         0xfa, 0x15, 0x5d, 0xef, 0xae, 0xca, 0xc1, 0x36,
699         0xa7, 0x5c, 0xbf, 0xc7, 0x08, 0xc2, 0x66, 0x00,
700         0x74, 0x74, 0x4e, 0x27, 0x3f, 0x55, 0x8a, 0xb7,
701         0x38, 0x66, 0x83, 0x6d, 0xcf, 0x99, 0x9e, 0x60,
702         0x8f, 0xdd, 0x2e, 0x62, 0x22, 0x0e, 0xef, 0x0c,
703         0x98, 0xa7, 0x85, 0x74, 0x3b, 0x9d, 0xec, 0x9e,
704         0xa9, 0x19, 0x72, 0xa5, 0x7f, 0x2c, 0x39, 0xb7,
705         0x7d, 0xb7, 0xf1, 0x12, 0x65, 0x27, 0x4b, 0x5a,
706         0xde, 0x17, 0xfe, 0xad, 0x44, 0xf3, 0x20, 0x4d,
707         0xfd, 0xe4, 0x1f, 0xb5, 0x81, 0xb0, 0x36, 0x37,
708         0x08, 0x6f, 0xc3, 0x0c, 0xe9, 0x85, 0x98, 0x82,
709         0xa9, 0x62, 0x0c, 0xc4, 0x97, 0xc0, 0x50, 0xc8,
710         0xa7, 0x3c, 0x50, 0x9f, 0x43, 0xb9, 0xcd, 0x5e,
711         0x4d, 0xfa, 0x1c, 0x4b, 0x0b, 0xa9, 0x98, 0x85,
712         0x38, 0x92, 0xac, 0x8d, 0xe4, 0xad, 0x9b, 0x98,
713         0xab, 0xd9, 0x38, 0xac, 0x62, 0x52, 0xa3, 0x22,
714         0x63, 0x0f, 0xbf, 0x95, 0x48, 0xdf, 0x69, 0xe7,
715         0x8b, 0x33, 0xd5, 0xb2, 0xbd, 0x05, 0x49, 0x49,
716         0x9d, 0x57, 0x73, 0x19, 0x33, 0xae, 0xfa, 0x33,
717         0xf1, 0x19, 0xa8, 0x80, 0xce, 0x04, 0x9f, 0xbc,
718         0x1d, 0x65, 0x82, 0x1b, 0xe5, 0x3a, 0x51, 0xc8,
719         0x1c, 0x21, 0xe3, 0x5d, 0xf3, 0x7d, 0x9b, 0x2f,
720         0x2c, 0x1d, 0x4a, 0x7f, 0x9b, 0x68, 0x35, 0xa3,
721         0xb2, 0x50, 0xf7, 0x62, 0x79, 0xcd, 0xf4, 0x98,
722         0x4f, 0xe5, 0x63, 0x7c, 0x3e, 0x45, 0x31, 0x8c,
723         0x16, 0xa0, 0x12, 0xc8, 0x58, 0xce, 0x39, 0xa6,
724         0xbc, 0x54, 0xdb, 0xc5, 0xe0, 0xd5, 0xba, 0xbc,
725         0xb9, 0x04, 0xf4, 0x8d, 0xe8, 0x2f, 0x15, 0x9d,
726 };
727
728 /* 100 test cases */
729 static struct crc_test {
730         u32 crc;        /* random starting crc */
731         u32 start;      /* random 6 bit offset in buf */
732         u32 length;     /* random 11 bit length of test */
733         u32 crc_le;     /* expected crc32_le result */
734         u32 crc_be;     /* expected crc32_be result */
735 } test[] =
736 {
737         {0x674bf11d, 0x00000038, 0x00000542, 0x0af6d466, 0xd8b6e4c1},
738         {0x35c672c6, 0x0000003a, 0x000001aa, 0xc6d3dfba, 0x28aaf3ad},
739         {0x496da28e, 0x00000039, 0x000005af, 0xd933660f, 0x5d57e81f},
740         {0x09a9b90e, 0x00000027, 0x000001f8, 0xb45fe007, 0xf45fca9a},
741         {0xdc97e5a9, 0x00000025, 0x000003b6, 0xf81a3562, 0xe0126ba2},
742         {0x47c58900, 0x0000000a, 0x000000b9, 0x8e58eccf, 0xf3afc793},
743         {0x292561e8, 0x0000000c, 0x00000403, 0xa2ba8aaf, 0x0b797aed},
744         {0x415037f6, 0x00000003, 0x00000676, 0xa17d52e8, 0x7f0fdf35},
745         {0x3466e707, 0x00000026, 0x00000042, 0x258319be, 0x75c484a2},
746         {0xafd1281b, 0x00000023, 0x000002ee, 0x4428eaf8, 0x06c7ad10},
747         {0xd3857b18, 0x00000028, 0x000004a2, 0x5c430821, 0xb062b7cb},
748         {0x1d825a8f, 0x0000002b, 0x0000050b, 0xd2c45f0c, 0xd68634e0},
749         {0x5033e3bc, 0x0000000b, 0x00000078, 0xa3ea4113, 0xac6d31fb},
750         {0x94f1fb5e, 0x0000000f, 0x000003a2, 0xfbfc50b1, 0x3cfe50ed},
751         {0xc9a0fe14, 0x00000009, 0x00000473, 0x5fb61894, 0x87070591},
752         {0x88a034b1, 0x0000001c, 0x000005ad, 0xc1b16053, 0x46f95c67},
753         {0xf0f72239, 0x00000020, 0x0000026d, 0xa6fa58f3, 0xf8c2c1dd},
754         {0xcc20a5e3, 0x0000003b, 0x0000067a, 0x7740185a, 0x308b979a},
755         {0xce589c95, 0x0000002b, 0x00000641, 0xd055e987, 0x40aae25b},
756         {0x78edc885, 0x00000035, 0x000005be, 0xa39cb14b, 0x035b0d1f},
757         {0x9d40a377, 0x0000003b, 0x00000038, 0x1f47ccd2, 0x197fbc9d},
758         {0x703d0e01, 0x0000003c, 0x000006f1, 0x88735e7c, 0xfed57c5a},
759         {0x776bf505, 0x0000000f, 0x000005b2, 0x5cc4fc01, 0xf32efb97},
760         {0x4a3e7854, 0x00000027, 0x000004b8, 0x8d923c82, 0x0cbfb4a2},
761         {0x209172dd, 0x0000003b, 0x00000356, 0xb89e9c2b, 0xd7868138},
762         {0x3ba4cc5b, 0x0000002f, 0x00000203, 0xe51601a9, 0x5b2a1032},
763         {0xfc62f297, 0x00000000, 0x00000079, 0x71a8e1a2, 0x5d88685f},
764         {0x64280b8b, 0x00000016, 0x000007ab, 0x0fa7a30c, 0xda3a455f},
765         {0x97dd724b, 0x00000033, 0x000007ad, 0x5788b2f4, 0xd7326d32},
766         {0x61394b52, 0x00000035, 0x00000571, 0xc66525f1, 0xcabe7fef},
767         {0x29b4faff, 0x00000024, 0x0000006e, 0xca13751e, 0x993648e0},
768         {0x29bfb1dc, 0x0000000b, 0x00000244, 0x436c43f7, 0x429f7a59},
769         {0x86ae934b, 0x00000035, 0x00000104, 0x0760ec93, 0x9cf7d0f4},
770         {0xc4c1024e, 0x0000002e, 0x000006b1, 0x6516a3ec, 0x19321f9c},
771         {0x3287a80a, 0x00000026, 0x00000496, 0x0b257eb1, 0x754ebd51},
772         {0xa4db423e, 0x00000023, 0x0000045d, 0x9b3a66dc, 0x873e9f11},
773         {0x7a1078df, 0x00000015, 0x0000014a, 0x8c2484c5, 0x6a628659},
774         {0x6048bd5b, 0x00000006, 0x0000006a, 0x897e3559, 0xac9961af},
775         {0xd8f9ea20, 0x0000003d, 0x00000277, 0x60eb905b, 0xed2aaf99},
776         {0xea5ec3b4, 0x0000002a, 0x000004fe, 0x869965dc, 0x6c1f833b},
777         {0x2dfb005d, 0x00000016, 0x00000345, 0x6a3b117e, 0xf05e8521},
778         {0x5a214ade, 0x00000020, 0x000005b6, 0x467f70be, 0xcb22ccd3},
779         {0xf0ab9cca, 0x00000032, 0x00000515, 0xed223df3, 0x7f3ef01d},
780         {0x91b444f9, 0x0000002e, 0x000007f8, 0x84e9a983, 0x5676756f},
781         {0x1b5d2ddb, 0x0000002e, 0x0000012c, 0xba638c4c, 0x3f42047b},
782         {0xd824d1bb, 0x0000003a, 0x000007b5, 0x6288653b, 0x3a3ebea0},
783         {0x0470180c, 0x00000034, 0x000001f0, 0x9d5b80d6, 0x3de08195},
784         {0xffaa3a3f, 0x00000036, 0x00000299, 0xf3a82ab8, 0x53e0c13d},
785         {0x6406cfeb, 0x00000023, 0x00000600, 0xa920b8e8, 0xe4e2acf4},
786         {0xb24aaa38, 0x0000003e, 0x000004a1, 0x657cc328, 0x5077b2c3},
787         {0x58b2ab7c, 0x00000039, 0x000002b4, 0x3a17ee7e, 0x9dcb3643},
788         {0x3db85970, 0x00000006, 0x000002b6, 0x95268b59, 0xb9812c10},
789         {0x857830c5, 0x00000003, 0x00000590, 0x4ef439d5, 0xf042161d},
790         {0xe1fcd978, 0x0000003e, 0x000007d8, 0xae8d8699, 0xce0a1ef5},
791         {0xb982a768, 0x00000016, 0x000006e0, 0x62fad3df, 0x5f8a067b},
792         {0x1d581ce8, 0x0000001e, 0x0000058b, 0xf0f5da53, 0x26e39eee},
793         {0x2456719b, 0x00000025, 0x00000503, 0x4296ac64, 0xd50e4c14},
794         {0xfae6d8f2, 0x00000000, 0x0000055d, 0x057fdf2e, 0x2a31391a},
795         {0xcba828e3, 0x00000039, 0x000002ce, 0xe3f22351, 0x8f00877b},
796         {0x13d25952, 0x0000000a, 0x0000072d, 0x76d4b4cc, 0x5eb67ec3},
797         {0x0342be3f, 0x00000015, 0x00000599, 0xec75d9f1, 0x9d4d2826},
798         {0xeaa344e0, 0x00000014, 0x000004d8, 0x72a4c981, 0x2064ea06},
799         {0xbbb52021, 0x0000003b, 0x00000272, 0x04af99fc, 0xaf042d35},
800         {0xb66384dc, 0x0000001d, 0x000007fc, 0xd7629116, 0x782bd801},
801         {0x616c01b6, 0x00000022, 0x000002c8, 0x5b1dab30, 0x783ce7d2},
802         {0xce2bdaad, 0x00000016, 0x0000062a, 0x932535c8, 0x3f02926d},
803         {0x00fe84d7, 0x00000005, 0x00000205, 0x850e50aa, 0x753d649c},
804         {0xbebdcb4c, 0x00000006, 0x0000055d, 0xbeaa37a2, 0x2d8c9eba},
805         {0xd8b1a02a, 0x00000010, 0x00000387, 0x5017d2fc, 0x503541a5},
806         {0x3b96cad2, 0x00000036, 0x00000347, 0x1d2372ae, 0x926cd90b},
807         {0xc94c1ed7, 0x00000005, 0x0000038b, 0x9e9fdb22, 0x144a9178},
808         {0x1aad454e, 0x00000025, 0x000002b2, 0xc3f6315c, 0x5c7a35b3},
809         {0xa4fec9a6, 0x00000000, 0x000006d6, 0x90be5080, 0xa4107605},
810         {0x1bbe71e2, 0x0000001f, 0x000002fd, 0x4e504c3b, 0x284ccaf1},
811         {0x4201c7e4, 0x00000002, 0x000002b7, 0x7822e3f9, 0x0cc912a9},
812         {0x23fddc96, 0x00000003, 0x00000627, 0x8a385125, 0x07767e78},
813         {0xd82ba25c, 0x00000016, 0x0000063e, 0x98e4148a, 0x283330c9},
814         {0x786f2032, 0x0000002d, 0x0000060f, 0xf201600a, 0xf561bfcd},
815         {0xfebe4e1f, 0x0000002a, 0x000004f2, 0x95e51961, 0xfd80dcab},
816         {0x1a6e0a39, 0x00000008, 0x00000672, 0x8af6c2a5, 0x78dd84cb},
817         {0x56000ab8, 0x0000000e, 0x000000e5, 0x36bacb8f, 0x22ee1f77},
818         {0x4717fe0c, 0x00000000, 0x000006ec, 0x8439f342, 0x5c8e03da},
819         {0xd5d5d68e, 0x0000003c, 0x000003a3, 0x46fff083, 0x177d1b39},
820         {0xc25dd6c6, 0x00000024, 0x000006c0, 0x5ceb8eb4, 0x892b0d16},
821         {0xe9b11300, 0x00000023, 0x00000683, 0x07a5d59a, 0x6c6a3208},
822         {0x95cd285e, 0x00000001, 0x00000047, 0x7b3a4368, 0x0202c07e},
823         {0xd9245a25, 0x0000001e, 0x000003a6, 0xd33c1841, 0x1936c0d5},
824         {0x103279db, 0x00000006, 0x0000039b, 0xca09b8a0, 0x77d62892},
825         {0x1cba3172, 0x00000027, 0x000001c8, 0xcb377194, 0xebe682db},
826         {0x8f613739, 0x0000000c, 0x000001df, 0xb4b0bc87, 0x7710bd43},
827         {0x1c6aa90d, 0x0000001b, 0x0000053c, 0x70559245, 0xda7894ac},
828         {0xaabe5b93, 0x0000003d, 0x00000715, 0xcdbf42fa, 0x0c3b99e7},
829         {0xf15dd038, 0x00000006, 0x000006db, 0x6e104aea, 0x8d5967f2},
830         {0x584dd49c, 0x00000020, 0x000007bc, 0x36b6cfd6, 0xad4e23b2},
831         {0x5d8c9506, 0x00000020, 0x00000470, 0x4c62378e, 0x31d92640},
832         {0xb80d17b0, 0x00000032, 0x00000346, 0x22a5bb88, 0x9a7ec89f},
833         {0xdaf0592e, 0x00000023, 0x000007b0, 0x3cab3f99, 0x9b1fdd99},
834         {0x4793cc85, 0x0000000d, 0x00000706, 0xe82e04f6, 0xed3db6b7},
835         {0x82ebf64e, 0x00000009, 0x000007c3, 0x69d590a9, 0x9efa8499},
836         {0xb18a0319, 0x00000026, 0x000007db, 0x1cf98dcc, 0x8fa9ad6a},
837 };
838
839 #include <linux/time.h>
840
841 static int __init crc32_init(void)
842 {
843         int i;
844         int errors = 0;
845         int bytes = 0;
846         struct timespec start, stop;
847         u64 nsec;
848         unsigned long flags;
849
850         /* keep static to prevent cache warming code from
851          * getting eliminated by the compiler */
852         static u32 crc;
853
854         /* pre-warm the cache */
855         for (i = 0; i < 100; i++) {
856                 bytes += 2*test[i].length;
857
858                 crc ^= crc32_le(test[i].crc, test_buf +
859                     test[i].start, test[i].length);
860
861                 crc ^= crc32_be(test[i].crc, test_buf +
862                     test[i].start, test[i].length);
863         }
864
865         /* reduce OS noise */
866         local_irq_save(flags);
867         local_irq_disable();
868
869         getnstimeofday(&start);
870         for (i = 0; i < 100; i++) {
871                 if (test[i].crc_le != crc32_le(test[i].crc, test_buf +
872                     test[i].start, test[i].length))
873                         errors++;
874
875                 if (test[i].crc_be != crc32_be(test[i].crc, test_buf +
876                     test[i].start, test[i].length))
877                         errors++;
878         }
879         getnstimeofday(&stop);
880
881         local_irq_restore(flags);
882         local_irq_enable();
883
884         nsec = stop.tv_nsec - start.tv_nsec +
885                 1000000000 * (stop.tv_sec - start.tv_sec);
886
887         pr_info("crc32: CRC_LE_BITS = %d, CRC_BE BITS = %d\n",
888                  CRC_LE_BITS, CRC_BE_BITS);
889
890         if (errors)
891                 pr_warn("crc32: %d self tests failed\n", errors);
892         else {
893                 pr_info("crc32: self tests passed, processed %d bytes in %lld nsec\n",
894                         bytes, nsec);
895         }
896
897         return 0;
898 }
899
900 static void __exit crc32_exit(void)
901 {
902 }
903
904 module_init(crc32_init);
905 module_exit(crc32_exit);
906 #endif /* CONFIG_CRC32_SELFTEST */