Commit | Line | Data |
---|---|---|
274081c0 MC |
1 | /* |
2 | * Copyright 2013 Freescale Semiconductor Inc. | |
3 | * | |
4 | * Redistribution and use in source and binary forms, with or without | |
5 | * modification, are permitted provided that the following conditions are met: | |
6 | * * Redistributions of source code must retain the above copyright | |
7 | * notice, this list of conditions and the following disclaimer. | |
8 | * * Redistributions in binary form must reproduce the above copyright | |
9 | * notice, this list of conditions and the following disclaimer in the | |
10 | * documentation and/or other materials provided with the distribution. | |
11 | * * Neither the name of Freescale Semiconductor nor the | |
12 | * names of its contributors may be used to endorse or promote products | |
13 | * derived from this software without specific prior written permission. | |
14 | * | |
15 | * | |
16 | * ALTERNATIVELY, this software may be distributed under the terms of the | |
17 | * GNU General Public License ("GPL") as published by the Free Software | |
18 | * Foundation, either version 2 of that License or (at your option) any | |
19 | * later version. | |
20 | * | |
21 | * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY | |
22 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
23 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
24 | * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY | |
25 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
26 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
27 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |
28 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
29 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
30 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
31 | */ | |
32 | ||
33 | #include <linux/module.h> | |
34 | #include <linux/crc64_ecma.h> | |
35 | ||
36 | ||
37 | #define CRC64_BYTE_MASK 0xFF | |
38 | #define CRC64_TABLE_SIZE 256 | |
39 | ||
40 | ||
41 | struct crc64_table { | |
42 | u64 seed; | |
43 | u64 table[CRC64_TABLE_SIZE]; | |
44 | }; | |
45 | ||
46 | ||
47 | static struct crc64_table CRC64_ECMA_182 = { | |
48 | CRC64_DEFAULT_INITVAL, | |
49 | { | |
50 | 0x0000000000000000ULL, | |
51 | 0xb32e4cbe03a75f6fULL, | |
52 | 0xf4843657a840a05bULL, | |
53 | 0x47aa7ae9abe7ff34ULL, | |
54 | 0x7bd0c384ff8f5e33ULL, | |
55 | 0xc8fe8f3afc28015cULL, | |
56 | 0x8f54f5d357cffe68ULL, | |
57 | 0x3c7ab96d5468a107ULL, | |
58 | 0xf7a18709ff1ebc66ULL, | |
59 | 0x448fcbb7fcb9e309ULL, | |
60 | 0x0325b15e575e1c3dULL, | |
61 | 0xb00bfde054f94352ULL, | |
62 | 0x8c71448d0091e255ULL, | |
63 | 0x3f5f08330336bd3aULL, | |
64 | 0x78f572daa8d1420eULL, | |
65 | 0xcbdb3e64ab761d61ULL, | |
66 | 0x7d9ba13851336649ULL, | |
67 | 0xceb5ed8652943926ULL, | |
68 | 0x891f976ff973c612ULL, | |
69 | 0x3a31dbd1fad4997dULL, | |
70 | 0x064b62bcaebc387aULL, | |
71 | 0xb5652e02ad1b6715ULL, | |
72 | 0xf2cf54eb06fc9821ULL, | |
73 | 0x41e11855055bc74eULL, | |
74 | 0x8a3a2631ae2dda2fULL, | |
75 | 0x39146a8fad8a8540ULL, | |
76 | 0x7ebe1066066d7a74ULL, | |
77 | 0xcd905cd805ca251bULL, | |
78 | 0xf1eae5b551a2841cULL, | |
79 | 0x42c4a90b5205db73ULL, | |
80 | 0x056ed3e2f9e22447ULL, | |
81 | 0xb6409f5cfa457b28ULL, | |
82 | 0xfb374270a266cc92ULL, | |
83 | 0x48190ecea1c193fdULL, | |
84 | 0x0fb374270a266cc9ULL, | |
85 | 0xbc9d3899098133a6ULL, | |
86 | 0x80e781f45de992a1ULL, | |
87 | 0x33c9cd4a5e4ecdceULL, | |
88 | 0x7463b7a3f5a932faULL, | |
89 | 0xc74dfb1df60e6d95ULL, | |
90 | 0x0c96c5795d7870f4ULL, | |
91 | 0xbfb889c75edf2f9bULL, | |
92 | 0xf812f32ef538d0afULL, | |
93 | 0x4b3cbf90f69f8fc0ULL, | |
94 | 0x774606fda2f72ec7ULL, | |
95 | 0xc4684a43a15071a8ULL, | |
96 | 0x83c230aa0ab78e9cULL, | |
97 | 0x30ec7c140910d1f3ULL, | |
98 | 0x86ace348f355aadbULL, | |
99 | 0x3582aff6f0f2f5b4ULL, | |
100 | 0x7228d51f5b150a80ULL, | |
101 | 0xc10699a158b255efULL, | |
102 | 0xfd7c20cc0cdaf4e8ULL, | |
103 | 0x4e526c720f7dab87ULL, | |
104 | 0x09f8169ba49a54b3ULL, | |
105 | 0xbad65a25a73d0bdcULL, | |
106 | 0x710d64410c4b16bdULL, | |
107 | 0xc22328ff0fec49d2ULL, | |
108 | 0x85895216a40bb6e6ULL, | |
109 | 0x36a71ea8a7ace989ULL, | |
110 | 0x0adda7c5f3c4488eULL, | |
111 | 0xb9f3eb7bf06317e1ULL, | |
112 | 0xfe5991925b84e8d5ULL, | |
113 | 0x4d77dd2c5823b7baULL, | |
114 | 0x64b62bcaebc387a1ULL, | |
115 | 0xd7986774e864d8ceULL, | |
116 | 0x90321d9d438327faULL, | |
117 | 0x231c512340247895ULL, | |
118 | 0x1f66e84e144cd992ULL, | |
119 | 0xac48a4f017eb86fdULL, | |
120 | 0xebe2de19bc0c79c9ULL, | |
121 | 0x58cc92a7bfab26a6ULL, | |
122 | 0x9317acc314dd3bc7ULL, | |
123 | 0x2039e07d177a64a8ULL, | |
124 | 0x67939a94bc9d9b9cULL, | |
125 | 0xd4bdd62abf3ac4f3ULL, | |
126 | 0xe8c76f47eb5265f4ULL, | |
127 | 0x5be923f9e8f53a9bULL, | |
128 | 0x1c4359104312c5afULL, | |
129 | 0xaf6d15ae40b59ac0ULL, | |
130 | 0x192d8af2baf0e1e8ULL, | |
131 | 0xaa03c64cb957be87ULL, | |
132 | 0xeda9bca512b041b3ULL, | |
133 | 0x5e87f01b11171edcULL, | |
134 | 0x62fd4976457fbfdbULL, | |
135 | 0xd1d305c846d8e0b4ULL, | |
136 | 0x96797f21ed3f1f80ULL, | |
137 | 0x2557339fee9840efULL, | |
138 | 0xee8c0dfb45ee5d8eULL, | |
139 | 0x5da24145464902e1ULL, | |
140 | 0x1a083bacedaefdd5ULL, | |
141 | 0xa9267712ee09a2baULL, | |
142 | 0x955cce7fba6103bdULL, | |
143 | 0x267282c1b9c65cd2ULL, | |
144 | 0x61d8f8281221a3e6ULL, | |
145 | 0xd2f6b4961186fc89ULL, | |
146 | 0x9f8169ba49a54b33ULL, | |
147 | 0x2caf25044a02145cULL, | |
148 | 0x6b055fede1e5eb68ULL, | |
149 | 0xd82b1353e242b407ULL, | |
150 | 0xe451aa3eb62a1500ULL, | |
151 | 0x577fe680b58d4a6fULL, | |
152 | 0x10d59c691e6ab55bULL, | |
153 | 0xa3fbd0d71dcdea34ULL, | |
154 | 0x6820eeb3b6bbf755ULL, | |
155 | 0xdb0ea20db51ca83aULL, | |
156 | 0x9ca4d8e41efb570eULL, | |
157 | 0x2f8a945a1d5c0861ULL, | |
158 | 0x13f02d374934a966ULL, | |
159 | 0xa0de61894a93f609ULL, | |
160 | 0xe7741b60e174093dULL, | |
161 | 0x545a57dee2d35652ULL, | |
162 | 0xe21ac88218962d7aULL, | |
163 | 0x5134843c1b317215ULL, | |
164 | 0x169efed5b0d68d21ULL, | |
165 | 0xa5b0b26bb371d24eULL, | |
166 | 0x99ca0b06e7197349ULL, | |
167 | 0x2ae447b8e4be2c26ULL, | |
168 | 0x6d4e3d514f59d312ULL, | |
169 | 0xde6071ef4cfe8c7dULL, | |
170 | 0x15bb4f8be788911cULL, | |
171 | 0xa6950335e42fce73ULL, | |
172 | 0xe13f79dc4fc83147ULL, | |
173 | 0x521135624c6f6e28ULL, | |
174 | 0x6e6b8c0f1807cf2fULL, | |
175 | 0xdd45c0b11ba09040ULL, | |
176 | 0x9aefba58b0476f74ULL, | |
177 | 0x29c1f6e6b3e0301bULL, | |
178 | 0xc96c5795d7870f42ULL, | |
179 | 0x7a421b2bd420502dULL, | |
180 | 0x3de861c27fc7af19ULL, | |
181 | 0x8ec62d7c7c60f076ULL, | |
182 | 0xb2bc941128085171ULL, | |
183 | 0x0192d8af2baf0e1eULL, | |
184 | 0x4638a2468048f12aULL, | |
185 | 0xf516eef883efae45ULL, | |
186 | 0x3ecdd09c2899b324ULL, | |
187 | 0x8de39c222b3eec4bULL, | |
188 | 0xca49e6cb80d9137fULL, | |
189 | 0x7967aa75837e4c10ULL, | |
190 | 0x451d1318d716ed17ULL, | |
191 | 0xf6335fa6d4b1b278ULL, | |
192 | 0xb199254f7f564d4cULL, | |
193 | 0x02b769f17cf11223ULL, | |
194 | 0xb4f7f6ad86b4690bULL, | |
195 | 0x07d9ba1385133664ULL, | |
196 | 0x4073c0fa2ef4c950ULL, | |
197 | 0xf35d8c442d53963fULL, | |
198 | 0xcf273529793b3738ULL, | |
199 | 0x7c0979977a9c6857ULL, | |
200 | 0x3ba3037ed17b9763ULL, | |
201 | 0x888d4fc0d2dcc80cULL, | |
202 | 0x435671a479aad56dULL, | |
203 | 0xf0783d1a7a0d8a02ULL, | |
204 | 0xb7d247f3d1ea7536ULL, | |
205 | 0x04fc0b4dd24d2a59ULL, | |
206 | 0x3886b22086258b5eULL, | |
207 | 0x8ba8fe9e8582d431ULL, | |
208 | 0xcc0284772e652b05ULL, | |
209 | 0x7f2cc8c92dc2746aULL, | |
210 | 0x325b15e575e1c3d0ULL, | |
211 | 0x8175595b76469cbfULL, | |
212 | 0xc6df23b2dda1638bULL, | |
213 | 0x75f16f0cde063ce4ULL, | |
214 | 0x498bd6618a6e9de3ULL, | |
215 | 0xfaa59adf89c9c28cULL, | |
216 | 0xbd0fe036222e3db8ULL, | |
217 | 0x0e21ac88218962d7ULL, | |
218 | 0xc5fa92ec8aff7fb6ULL, | |
219 | 0x76d4de52895820d9ULL, | |
220 | 0x317ea4bb22bfdfedULL, | |
221 | 0x8250e80521188082ULL, | |
222 | 0xbe2a516875702185ULL, | |
223 | 0x0d041dd676d77eeaULL, | |
224 | 0x4aae673fdd3081deULL, | |
225 | 0xf9802b81de97deb1ULL, | |
226 | 0x4fc0b4dd24d2a599ULL, | |
227 | 0xfceef8632775faf6ULL, | |
228 | 0xbb44828a8c9205c2ULL, | |
229 | 0x086ace348f355aadULL, | |
230 | 0x34107759db5dfbaaULL, | |
231 | 0x873e3be7d8faa4c5ULL, | |
232 | 0xc094410e731d5bf1ULL, | |
233 | 0x73ba0db070ba049eULL, | |
234 | 0xb86133d4dbcc19ffULL, | |
235 | 0x0b4f7f6ad86b4690ULL, | |
236 | 0x4ce50583738cb9a4ULL, | |
237 | 0xffcb493d702be6cbULL, | |
238 | 0xc3b1f050244347ccULL, | |
239 | 0x709fbcee27e418a3ULL, | |
240 | 0x3735c6078c03e797ULL, | |
241 | 0x841b8ab98fa4b8f8ULL, | |
242 | 0xadda7c5f3c4488e3ULL, | |
243 | 0x1ef430e13fe3d78cULL, | |
244 | 0x595e4a08940428b8ULL, | |
245 | 0xea7006b697a377d7ULL, | |
246 | 0xd60abfdbc3cbd6d0ULL, | |
247 | 0x6524f365c06c89bfULL, | |
248 | 0x228e898c6b8b768bULL, | |
249 | 0x91a0c532682c29e4ULL, | |
250 | 0x5a7bfb56c35a3485ULL, | |
251 | 0xe955b7e8c0fd6beaULL, | |
252 | 0xaeffcd016b1a94deULL, | |
253 | 0x1dd181bf68bdcbb1ULL, | |
254 | 0x21ab38d23cd56ab6ULL, | |
255 | 0x9285746c3f7235d9ULL, | |
256 | 0xd52f0e859495caedULL, | |
257 | 0x6601423b97329582ULL, | |
258 | 0xd041dd676d77eeaaULL, | |
259 | 0x636f91d96ed0b1c5ULL, | |
260 | 0x24c5eb30c5374ef1ULL, | |
261 | 0x97eba78ec690119eULL, | |
262 | 0xab911ee392f8b099ULL, | |
263 | 0x18bf525d915feff6ULL, | |
264 | 0x5f1528b43ab810c2ULL, | |
265 | 0xec3b640a391f4fadULL, | |
266 | 0x27e05a6e926952ccULL, | |
267 | 0x94ce16d091ce0da3ULL, | |
268 | 0xd3646c393a29f297ULL, | |
269 | 0x604a2087398eadf8ULL, | |
270 | 0x5c3099ea6de60cffULL, | |
271 | 0xef1ed5546e415390ULL, | |
272 | 0xa8b4afbdc5a6aca4ULL, | |
273 | 0x1b9ae303c601f3cbULL, | |
274 | 0x56ed3e2f9e224471ULL, | |
275 | 0xe5c372919d851b1eULL, | |
276 | 0xa26908783662e42aULL, | |
277 | 0x114744c635c5bb45ULL, | |
278 | 0x2d3dfdab61ad1a42ULL, | |
279 | 0x9e13b115620a452dULL, | |
280 | 0xd9b9cbfcc9edba19ULL, | |
281 | 0x6a978742ca4ae576ULL, | |
282 | 0xa14cb926613cf817ULL, | |
283 | 0x1262f598629ba778ULL, | |
284 | 0x55c88f71c97c584cULL, | |
285 | 0xe6e6c3cfcadb0723ULL, | |
286 | 0xda9c7aa29eb3a624ULL, | |
287 | 0x69b2361c9d14f94bULL, | |
288 | 0x2e184cf536f3067fULL, | |
289 | 0x9d36004b35545910ULL, | |
290 | 0x2b769f17cf112238ULL, | |
291 | 0x9858d3a9ccb67d57ULL, | |
292 | 0xdff2a94067518263ULL, | |
293 | 0x6cdce5fe64f6dd0cULL, | |
294 | 0x50a65c93309e7c0bULL, | |
295 | 0xe388102d33392364ULL, | |
296 | 0xa4226ac498dedc50ULL, | |
297 | 0x170c267a9b79833fULL, | |
298 | 0xdcd7181e300f9e5eULL, | |
299 | 0x6ff954a033a8c131ULL, | |
300 | 0x28532e49984f3e05ULL, | |
301 | 0x9b7d62f79be8616aULL, | |
302 | 0xa707db9acf80c06dULL, | |
303 | 0x14299724cc279f02ULL, | |
304 | 0x5383edcd67c06036ULL, | |
305 | 0xe0ada17364673f59ULL | |
306 | } | |
307 | }; | |
308 | ||
309 | ||
310 | /* | |
311 | * crc64_ecma_seed - Initializes the CRC64 ECMA seed. | |
312 | */ | |
313 | u64 crc64_ecma_seed(void) | |
314 | { | |
315 | return CRC64_ECMA_182.seed; | |
316 | } | |
317 | EXPORT_SYMBOL(crc64_ecma_seed); | |
318 | ||
319 | /* | |
320 | * crc64_ecma - Computes the 64 bit ECMA CRC. | |
321 | * | |
322 | * pdata: pointer to the data to compute checksum for. | |
323 | * nbytes: number of bytes in data buffer. | |
324 | * seed: CRC seed. | |
325 | */ | |
326 | u64 crc64_ecma(u8 const *pdata, u32 nbytes, u64 seed) | |
327 | { | |
328 | unsigned int i; | |
329 | u64 crc = seed; | |
330 | ||
331 | for (i = 0; i < nbytes; i++) | |
332 | crc = CRC64_ECMA_182.table[(crc ^ pdata[i]) & CRC64_BYTE_MASK] ^ | |
333 | (crc >> 8); | |
334 | ||
335 | return crc; | |
336 | } | |
337 | EXPORT_SYMBOL(crc64_ecma); | |
338 | ||
339 | MODULE_DESCRIPTION("CRC64 ECMA function"); | |
340 | MODULE_AUTHOR("Freescale Semiconductor Inc."); | |
341 | MODULE_LICENSE("GPL"); |