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