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