1/*
2 * Copyright 2008-2012 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
34/*------------------------------------------------------*/
35/*                                                      */
36/* File: crc_mac_addr_ext.h                             */
37/*                                                      */
38/* Description:                                         */
39/*    Define a macro that calculate the crc value of    */
40/*    an Ethernet MAC address (48 bitd address          */
41/*------------------------------------------------------*/
42
43#ifndef __crc_mac_addr_ext_h
44#define __crc_mac_addr_ext_h
45
46#include "std_ext.h"
47
48
49static uint32_t crc_table[256] =
50{
51    0x00000000,
52    0x77073096,
53    0xee0e612c,
54    0x990951ba,
55    0x076dc419,
56    0x706af48f,
57    0xe963a535,
58    0x9e6495a3,
59    0x0edb8832,
60    0x79dcb8a4,
61    0xe0d5e91e,
62    0x97d2d988,
63    0x09b64c2b,
64    0x7eb17cbd,
65    0xe7b82d07,
66    0x90bf1d91,
67    0x1db71064,
68    0x6ab020f2,
69    0xf3b97148,
70    0x84be41de,
71    0x1adad47d,
72    0x6ddde4eb,
73    0xf4d4b551,
74    0x83d385c7,
75    0x136c9856,
76    0x646ba8c0,
77    0xfd62f97a,
78    0x8a65c9ec,
79    0x14015c4f,
80    0x63066cd9,
81    0xfa0f3d63,
82    0x8d080df5,
83    0x3b6e20c8,
84    0x4c69105e,
85    0xd56041e4,
86    0xa2677172,
87    0x3c03e4d1,
88    0x4b04d447,
89    0xd20d85fd,
90    0xa50ab56b,
91    0x35b5a8fa,
92    0x42b2986c,
93    0xdbbbc9d6,
94    0xacbcf940,
95    0x32d86ce3,
96    0x45df5c75,
97    0xdcd60dcf,
98    0xabd13d59,
99    0x26d930ac,
100    0x51de003a,
101    0xc8d75180,
102    0xbfd06116,
103    0x21b4f4b5,
104    0x56b3c423,
105    0xcfba9599,
106    0xb8bda50f,
107    0x2802b89e,
108    0x5f058808,
109    0xc60cd9b2,
110    0xb10be924,
111    0x2f6f7c87,
112    0x58684c11,
113    0xc1611dab,
114    0xb6662d3d,
115    0x76dc4190,
116    0x01db7106,
117    0x98d220bc,
118    0xefd5102a,
119    0x71b18589,
120    0x06b6b51f,
121    0x9fbfe4a5,
122    0xe8b8d433,
123    0x7807c9a2,
124    0x0f00f934,
125    0x9609a88e,
126    0xe10e9818,
127    0x7f6a0dbb,
128    0x086d3d2d,
129    0x91646c97,
130    0xe6635c01,
131    0x6b6b51f4,
132    0x1c6c6162,
133    0x856530d8,
134    0xf262004e,
135    0x6c0695ed,
136    0x1b01a57b,
137    0x8208f4c1,
138    0xf50fc457,
139    0x65b0d9c6,
140    0x12b7e950,
141    0x8bbeb8ea,
142    0xfcb9887c,
143    0x62dd1ddf,
144    0x15da2d49,
145    0x8cd37cf3,
146    0xfbd44c65,
147    0x4db26158,
148    0x3ab551ce,
149    0xa3bc0074,
150    0xd4bb30e2,
151    0x4adfa541,
152    0x3dd895d7,
153    0xa4d1c46d,
154    0xd3d6f4fb,
155    0x4369e96a,
156    0x346ed9fc,
157    0xad678846,
158    0xda60b8d0,
159    0x44042d73,
160    0x33031de5,
161    0xaa0a4c5f,
162    0xdd0d7cc9,
163    0x5005713c,
164    0x270241aa,
165    0xbe0b1010,
166    0xc90c2086,
167    0x5768b525,
168    0x206f85b3,
169    0xb966d409,
170    0xce61e49f,
171    0x5edef90e,
172    0x29d9c998,
173    0xb0d09822,
174    0xc7d7a8b4,
175    0x59b33d17,
176    0x2eb40d81,
177    0xb7bd5c3b,
178    0xc0ba6cad,
179    0xedb88320,
180    0x9abfb3b6,
181    0x03b6e20c,
182    0x74b1d29a,
183    0xead54739,
184    0x9dd277af,
185    0x04db2615,
186    0x73dc1683,
187    0xe3630b12,
188    0x94643b84,
189    0x0d6d6a3e,
190    0x7a6a5aa8,
191    0xe40ecf0b,
192    0x9309ff9d,
193    0x0a00ae27,
194    0x7d079eb1,
195    0xf00f9344,
196    0x8708a3d2,
197    0x1e01f268,
198    0x6906c2fe,
199    0xf762575d,
200    0x806567cb,
201    0x196c3671,
202    0x6e6b06e7,
203    0xfed41b76,
204    0x89d32be0,
205    0x10da7a5a,
206    0x67dd4acc,
207    0xf9b9df6f,
208    0x8ebeeff9,
209    0x17b7be43,
210    0x60b08ed5,
211    0xd6d6a3e8,
212    0xa1d1937e,
213    0x38d8c2c4,
214    0x4fdff252,
215    0xd1bb67f1,
216    0xa6bc5767,
217    0x3fb506dd,
218    0x48b2364b,
219    0xd80d2bda,
220    0xaf0a1b4c,
221    0x36034af6,
222    0x41047a60,
223    0xdf60efc3,
224    0xa867df55,
225    0x316e8eef,
226    0x4669be79,
227    0xcb61b38c,
228    0xbc66831a,
229    0x256fd2a0,
230    0x5268e236,
231    0xcc0c7795,
232    0xbb0b4703,
233    0x220216b9,
234    0x5505262f,
235    0xc5ba3bbe,
236    0xb2bd0b28,
237    0x2bb45a92,
238    0x5cb36a04,
239    0xc2d7ffa7,
240    0xb5d0cf31,
241    0x2cd99e8b,
242    0x5bdeae1d,
243    0x9b64c2b0,
244    0xec63f226,
245    0x756aa39c,
246    0x026d930a,
247    0x9c0906a9,
248    0xeb0e363f,
249    0x72076785,
250    0x05005713,
251    0x95bf4a82,
252    0xe2b87a14,
253    0x7bb12bae,
254    0x0cb61b38,
255    0x92d28e9b,
256    0xe5d5be0d,
257    0x7cdcefb7,
258    0x0bdbdf21,
259    0x86d3d2d4,
260    0xf1d4e242,
261    0x68ddb3f8,
262    0x1fda836e,
263    0x81be16cd,
264    0xf6b9265b,
265    0x6fb077e1,
266    0x18b74777,
267    0x88085ae6,
268    0xff0f6a70,
269    0x66063bca,
270    0x11010b5c,
271    0x8f659eff,
272    0xf862ae69,
273    0x616bffd3,
274    0x166ccf45,
275    0xa00ae278,
276    0xd70dd2ee,
277    0x4e048354,
278    0x3903b3c2,
279    0xa7672661,
280    0xd06016f7,
281    0x4969474d,
282    0x3e6e77db,
283    0xaed16a4a,
284    0xd9d65adc,
285    0x40df0b66,
286    0x37d83bf0,
287    0xa9bcae53,
288    0xdebb9ec5,
289    0x47b2cf7f,
290    0x30b5ffe9,
291    0xbdbdf21c,
292    0xcabac28a,
293    0x53b39330,
294    0x24b4a3a6,
295    0xbad03605,
296    0xcdd70693,
297    0x54de5729,
298    0x23d967bf,
299    0xb3667a2e,
300    0xc4614ab8,
301    0x5d681b02,
302    0x2a6f2b94,
303    0xb40bbe37,
304    0xc30c8ea1,
305    0x5a05df1b,
306    0x2d02ef8d
307};
308
309
310#define GET_MAC_ADDR_CRC(addr, crc)             \
311{                                               \
312    uint32_t    i;                              \
313    uint8_t     data;                           \
314                                                \
315    /* CRC calculation */                       \
316    crc = 0xffffffff;                           \
317    for (i=0; i < 6; i++)                       \
318    {                                           \
319        data = (uint8_t)(addr >> ((5-i)*8));    \
320        crc = crc^data;                         \
321        crc = crc_table[crc&0xff] ^ (crc>>8);   \
322    }                                           \
323}                                               \
324
325/*    Define a macro for getting the mirrored value of      */
326/*    a byte size number. (0x11010011 --> 0x11001011)       */
327/*    Sometimes the mirrored value of the CRC is required   */
328static __inline__ uint8_t GetMirror(uint8_t n)
329{
330    uint8_t mirror[16] =
331        {
332            0x00,
333            0x08,
334            0x04,
335            0x0c,
336            0x02,
337            0x0a,
338            0x06,
339            0x0e,
340            0x01,
341            0x09,
342            0x05,
343            0x0d,
344            0x03,
345            0x0b,
346            0x07,
347            0x0f
348        };
349    return ((uint8_t)(((mirror[n & 0x0f] << 4) | (mirror[n >> 4]))));
350}
351
352static __inline__ uint32_t GetMirror32(uint32_t n)
353{
354    return (((uint32_t)GetMirror((uint8_t)(n))<<24) |
355            ((uint32_t)GetMirror((uint8_t)(n>>8))<<16) |
356            ((uint32_t)GetMirror((uint8_t)(n>>16))<<8) |
357            ((uint32_t)GetMirror((uint8_t)(n>>24))));
358}
359
360#define MIRROR      GetMirror
361#define MIRROR_32   GetMirror32
362
363
364#endif /* __crc_mac_addr_ext_h */
365