Merge branch 'timers-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6] / drivers / staging / vt6655 / tcrc.c
1 /*
2  * Copyright (c) 2003 VIA Networking, Inc. All rights reserved.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  *
18  *
19  * File: tcrc.c
20  *
21  * Purpose: Implement functions to caculate CRC
22  *
23  * Author: Tevin Chen
24  *
25  * Date: May 21, 1996
26  *
27  * Functions:
28  *      CRCdwCrc32 -
29  *      CRCdwGetCrc32 -
30  *      CRCdwGetCrc32Ex -
31  *
32  * Revision History:
33  *
34  */
35
36
37 #if !defined(__TBIT_H__)
38 #include "tbit.h"
39 #endif
40 #if !defined(__TCRC_H__)
41 #include "tcrc.h"
42 #endif
43
44
45
46
47 /*---------------------  Static Definitions -------------------------*/
48
49 /*---------------------  Static Classes  ----------------------------*/
50
51 /*---------------------  Static Variables  --------------------------*/
52
53 // 32-bit CRC table
54 static const DWORD s_adwCrc32Table[256] = {
55     0x00000000L, 0x77073096L, 0xEE0E612CL, 0x990951BAL,
56     0x076DC419L, 0x706AF48FL, 0xE963A535L, 0x9E6495A3L,
57     0x0EDB8832L, 0x79DCB8A4L, 0xE0D5E91EL, 0x97D2D988L,
58     0x09B64C2BL, 0x7EB17CBDL, 0xE7B82D07L, 0x90BF1D91L,
59     0x1DB71064L, 0x6AB020F2L, 0xF3B97148L, 0x84BE41DEL,
60     0x1ADAD47DL, 0x6DDDE4EBL, 0xF4D4B551L, 0x83D385C7L,
61     0x136C9856L, 0x646BA8C0L, 0xFD62F97AL, 0x8A65C9ECL,
62     0x14015C4FL, 0x63066CD9L, 0xFA0F3D63L, 0x8D080DF5L,
63     0x3B6E20C8L, 0x4C69105EL, 0xD56041E4L, 0xA2677172L,
64     0x3C03E4D1L, 0x4B04D447L, 0xD20D85FDL, 0xA50AB56BL,
65     0x35B5A8FAL, 0x42B2986CL, 0xDBBBC9D6L, 0xACBCF940L,
66     0x32D86CE3L, 0x45DF5C75L, 0xDCD60DCFL, 0xABD13D59L,
67     0x26D930ACL, 0x51DE003AL, 0xC8D75180L, 0xBFD06116L,
68     0x21B4F4B5L, 0x56B3C423L, 0xCFBA9599L, 0xB8BDA50FL,
69     0x2802B89EL, 0x5F058808L, 0xC60CD9B2L, 0xB10BE924L,
70     0x2F6F7C87L, 0x58684C11L, 0xC1611DABL, 0xB6662D3DL,
71     0x76DC4190L, 0x01DB7106L, 0x98D220BCL, 0xEFD5102AL,
72     0x71B18589L, 0x06B6B51FL, 0x9FBFE4A5L, 0xE8B8D433L,
73     0x7807C9A2L, 0x0F00F934L, 0x9609A88EL, 0xE10E9818L,
74     0x7F6A0DBBL, 0x086D3D2DL, 0x91646C97L, 0xE6635C01L,
75     0x6B6B51F4L, 0x1C6C6162L, 0x856530D8L, 0xF262004EL,
76     0x6C0695EDL, 0x1B01A57BL, 0x8208F4C1L, 0xF50FC457L,
77     0x65B0D9C6L, 0x12B7E950L, 0x8BBEB8EAL, 0xFCB9887CL,
78     0x62DD1DDFL, 0x15DA2D49L, 0x8CD37CF3L, 0xFBD44C65L,
79     0x4DB26158L, 0x3AB551CEL, 0xA3BC0074L, 0xD4BB30E2L,
80     0x4ADFA541L, 0x3DD895D7L, 0xA4D1C46DL, 0xD3D6F4FBL,
81     0x4369E96AL, 0x346ED9FCL, 0xAD678846L, 0xDA60B8D0L,
82     0x44042D73L, 0x33031DE5L, 0xAA0A4C5FL, 0xDD0D7CC9L,
83     0x5005713CL, 0x270241AAL, 0xBE0B1010L, 0xC90C2086L,
84     0x5768B525L, 0x206F85B3L, 0xB966D409L, 0xCE61E49FL,
85     0x5EDEF90EL, 0x29D9C998L, 0xB0D09822L, 0xC7D7A8B4L,
86     0x59B33D17L, 0x2EB40D81L, 0xB7BD5C3BL, 0xC0BA6CADL,
87     0xEDB88320L, 0x9ABFB3B6L, 0x03B6E20CL, 0x74B1D29AL,
88     0xEAD54739L, 0x9DD277AFL, 0x04DB2615L, 0x73DC1683L,
89     0xE3630B12L, 0x94643B84L, 0x0D6D6A3EL, 0x7A6A5AA8L,
90     0xE40ECF0BL, 0x9309FF9DL, 0x0A00AE27L, 0x7D079EB1L,
91     0xF00F9344L, 0x8708A3D2L, 0x1E01F268L, 0x6906C2FEL,
92     0xF762575DL, 0x806567CBL, 0x196C3671L, 0x6E6B06E7L,
93     0xFED41B76L, 0x89D32BE0L, 0x10DA7A5AL, 0x67DD4ACCL,
94     0xF9B9DF6FL, 0x8EBEEFF9L, 0x17B7BE43L, 0x60B08ED5L,
95     0xD6D6A3E8L, 0xA1D1937EL, 0x38D8C2C4L, 0x4FDFF252L,
96     0xD1BB67F1L, 0xA6BC5767L, 0x3FB506DDL, 0x48B2364BL,
97     0xD80D2BDAL, 0xAF0A1B4CL, 0x36034AF6L, 0x41047A60L,
98     0xDF60EFC3L, 0xA867DF55L, 0x316E8EEFL, 0x4669BE79L,
99     0xCB61B38CL, 0xBC66831AL, 0x256FD2A0L, 0x5268E236L,
100     0xCC0C7795L, 0xBB0B4703L, 0x220216B9L, 0x5505262FL,
101     0xC5BA3BBEL, 0xB2BD0B28L, 0x2BB45A92L, 0x5CB36A04L,
102     0xC2D7FFA7L, 0xB5D0CF31L, 0x2CD99E8BL, 0x5BDEAE1DL,
103     0x9B64C2B0L, 0xEC63F226L, 0x756AA39CL, 0x026D930AL,
104     0x9C0906A9L, 0xEB0E363FL, 0x72076785L, 0x05005713L,
105     0x95BF4A82L, 0xE2B87A14L, 0x7BB12BAEL, 0x0CB61B38L,
106     0x92D28E9BL, 0xE5D5BE0DL, 0x7CDCEFB7L, 0x0BDBDF21L,
107     0x86D3D2D4L, 0xF1D4E242L, 0x68DDB3F8L, 0x1FDA836EL,
108     0x81BE16CDL, 0xF6B9265BL, 0x6FB077E1L, 0x18B74777L,
109     0x88085AE6L, 0xFF0F6A70L, 0x66063BCAL, 0x11010B5CL,
110     0x8F659EFFL, 0xF862AE69L, 0x616BFFD3L, 0x166CCF45L,
111     0xA00AE278L, 0xD70DD2EEL, 0x4E048354L, 0x3903B3C2L,
112     0xA7672661L, 0xD06016F7L, 0x4969474DL, 0x3E6E77DBL,
113     0xAED16A4AL, 0xD9D65ADCL, 0x40DF0B66L, 0x37D83BF0L,
114     0xA9BCAE53L, 0xDEBB9EC5L, 0x47B2CF7FL, 0x30B5FFE9L,
115     0xBDBDF21CL, 0xCABAC28AL, 0x53B39330L, 0x24B4A3A6L,
116     0xBAD03605L, 0xCDD70693L, 0x54DE5729L, 0x23D967BFL,
117     0xB3667A2EL, 0xC4614AB8L, 0x5D681B02L, 0x2A6F2B94L,
118     0xB40BBE37L, 0xC30C8EA1L, 0x5A05DF1BL, 0x2D02EF8DL
119 };
120
121 /*---------------------  Static Functions  --------------------------*/
122
123 /*---------------------  Export Variables  --------------------------*/
124
125
126
127
128 /*+
129  *
130  * Description:
131  *    Generate a CRC-32 from the data stream
132  *
133  * Parameters:
134  *  In:
135  *      pbyData     - the data stream
136  *      cbByte      - the length of the stream
137  *      dwCrcSeed   - Seed for CRC32
138  *  Out:
139  *      none
140  *
141  * Return Value: CRC-32
142  *
143 -*/
144 DWORD CRCdwCrc32 (PBYTE pbyData, UINT cbByte, DWORD dwCrcSeed)
145 {
146     DWORD dwCrc;
147
148     dwCrc = dwCrcSeed;
149     while (cbByte--) {
150         dwCrc = s_adwCrc32Table[(BYTE)((dwCrc ^ (*pbyData)) & 0xFF)] ^ (dwCrc >> 8);
151         pbyData++;
152     }
153
154     return dwCrc;
155 }
156
157
158 /*+
159  *
160  * Description:
161  * To test CRC generator, input 8 bytes packet
162  *      -- 0xff 0xff 0xff 0xff 0x00 0x00 0x00 0x00
163  * the generated CRC should be
164  *      -- 0xff 0xff 0xff 0xff
165  *
166  * Parameters:
167  *  In:
168  *      pbyData     - the data stream
169  *      cbByte      - the length of the stream
170  *  Out:
171  *      none
172  *
173  * Return Value: CRC-32
174  *
175 -*/
176 DWORD CRCdwGetCrc32 (PBYTE pbyData, UINT cbByte)
177 {
178     return ~CRCdwCrc32(pbyData, cbByte, 0xFFFFFFFFL);
179 }
180
181
182 /*+
183  *
184  * Description:
185  *
186  * NOTE.... Because CRCdwGetCrc32Ex() is an iteration function,
187  *          this means we will use the output of CRCdwGetCrc32Ex()
188  *          to be a new argument to do next CRCdwGetCrc32Ex() calculation.
189  *          Thus, the final result must be inverted to be the
190  *          correct answer.
191  *
192  * Parameters:
193  *  In:
194  *      pbyData     - the data stream
195  *      cbByte      - the length of the stream
196  *  Out:
197  *      none
198  *
199  * Return Value: CRC-32
200  *
201 -*/
202 DWORD CRCdwGetCrc32Ex(PBYTE pbyData, UINT cbByte, DWORD dwPreCRC)
203 {
204     return CRCdwCrc32(pbyData, cbByte, dwPreCRC);
205 }
206
207