23
23
/* see: Documentation/crc32.txt for a description of algorithms */
24
24
25
25
#include <linux/crc32.h>
26
- #include <linux/kernel.h>
27
26
#include <linux/module.h>
28
- #include <linux/compiler.h>
29
27
#include <linux/types.h>
30
- #include <linux/init.h>
31
- #include <linux/atomic.h>
32
28
#include "crc32defs.h"
29
+
33
30
#if CRC_LE_BITS == 8
34
31
# define tole (x ) __constant_cpu_to_le32(x)
35
32
#else
41
38
#else
42
39
# define tobe (x ) (x)
43
40
#endif
41
+
44
42
#include "crc32table.h"
45
43
46
44
MODULE_AUTHOR ("Matt Domsch <Matt_Domsch@dell.com>" );
@@ -96,60 +94,47 @@ crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256])
96
94
#undef DO_CRC4
97
95
}
98
96
#endif
97
+
99
98
/**
100
99
* crc32_le() - Calculate bitwise little-endian Ethernet AUTODIN II CRC32
101
100
* @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for
102
101
* other uses, or the previous crc32 value if computing incrementally.
103
102
* @p: pointer to buffer over which CRC is run
104
103
* @len: length of buffer @p
105
104
*/
106
- u32 __pure crc32_le (u32 crc , unsigned char const * p , size_t len );
107
-
108
- #if CRC_LE_BITS == 1
109
- /*
110
- * In fact, the table-based code will work in this case, but it can be
111
- * simplified by inlining the table in ?: form.
112
- */
113
-
114
105
u32 __pure crc32_le (u32 crc , unsigned char const * p , size_t len )
115
106
{
107
+ #if CRC_LE_BITS == 1
116
108
int i ;
117
109
while (len -- ) {
118
110
crc ^= * p ++ ;
119
111
for (i = 0 ; i < 8 ; i ++ )
120
112
crc = (crc >> 1 ) ^ ((crc & 1 ) ? CRCPOLY_LE : 0 );
121
113
}
122
- return crc ;
123
- }
124
- #else /* Table-based approach */
125
-
126
- u32 __pure crc32_le (u32 crc , unsigned char const * p , size_t len )
127
- {
128
- # if CRC_LE_BITS == 8
129
- const u32 (* tab )[] = crc32table_le ;
130
-
131
- crc = __cpu_to_le32 (crc );
132
- crc = crc32_body (crc , p , len , tab );
133
- return __le32_to_cpu (crc );
134
- # elif CRC_LE_BITS == 4
114
+ # elif CRC_LE_BITS == 2
135
115
while (len -- ) {
136
116
crc ^= * p ++ ;
137
- crc = (crc >> 4 ) ^ crc32table_le [crc & 15 ];
138
- crc = (crc >> 4 ) ^ crc32table_le [crc & 15 ];
117
+ crc = (crc >> 2 ) ^ crc32table_le [0 ][crc & 3 ];
118
+ crc = (crc >> 2 ) ^ crc32table_le [0 ][crc & 3 ];
119
+ crc = (crc >> 2 ) ^ crc32table_le [0 ][crc & 3 ];
120
+ crc = (crc >> 2 ) ^ crc32table_le [0 ][crc & 3 ];
139
121
}
140
- return crc ;
141
- # elif CRC_LE_BITS == 2
122
+ # elif CRC_LE_BITS == 4
142
123
while (len -- ) {
143
124
crc ^= * p ++ ;
144
- crc = (crc >> 2 ) ^ crc32table_le [crc & 3 ];
145
- crc = (crc >> 2 ) ^ crc32table_le [crc & 3 ];
146
- crc = (crc >> 2 ) ^ crc32table_le [crc & 3 ];
147
- crc = (crc >> 2 ) ^ crc32table_le [crc & 3 ];
125
+ crc = (crc >> 4 ) ^ crc32table_le [0 ][crc & 15 ];
126
+ crc = (crc >> 4 ) ^ crc32table_le [0 ][crc & 15 ];
148
127
}
128
+ # elif CRC_LE_BITS == 8
129
+ const u32 (* tab )[] = crc32table_le ;
130
+
131
+ crc = __cpu_to_le32 (crc );
132
+ crc = crc32_body (crc , p , len , tab );
133
+ crc = __le32_to_cpu (crc );
134
+ #endif
149
135
return crc ;
150
- # endif
151
136
}
152
- #endif
137
+ EXPORT_SYMBOL ( crc32_le );
153
138
154
139
/**
155
140
* crc32_be() - Calculate bitwise big-endian Ethernet AUTODIN II CRC32
@@ -158,16 +143,9 @@ u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
158
143
* @p: pointer to buffer over which CRC is run
159
144
* @len: length of buffer @p
160
145
*/
161
- u32 __pure crc32_be (u32 crc , unsigned char const * p , size_t len );
162
-
163
- #if CRC_BE_BITS == 1
164
- /*
165
- * In fact, the table-based code will work in this case, but it can be
166
- * simplified by inlining the table in ?: form.
167
- */
168
-
169
146
u32 __pure crc32_be (u32 crc , unsigned char const * p , size_t len )
170
147
{
148
+ #if CRC_BE_BITS == 1
171
149
int i ;
172
150
while (len -- ) {
173
151
crc ^= * p ++ << 24 ;
@@ -176,39 +154,29 @@ u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)
176
154
(crc << 1 ) ^ ((crc & 0x80000000 ) ? CRCPOLY_BE :
177
155
0 );
178
156
}
179
- return crc ;
180
- }
181
-
182
- #else /* Table-based approach */
183
- u32 __pure crc32_be (u32 crc , unsigned char const * p , size_t len )
184
- {
185
- # if CRC_BE_BITS == 8
186
- const u32 (* tab )[] = crc32table_be ;
187
-
188
- crc = __cpu_to_be32 (crc );
189
- crc = crc32_body (crc , p , len , tab );
190
- return __be32_to_cpu (crc );
191
- # elif CRC_BE_BITS == 4
157
+ # elif CRC_BE_BITS == 2
192
158
while (len -- ) {
193
159
crc ^= * p ++ << 24 ;
194
- crc = (crc << 4 ) ^ crc32table_be [crc >> 28 ];
195
- crc = (crc << 4 ) ^ crc32table_be [crc >> 28 ];
160
+ crc = (crc << 2 ) ^ crc32table_be [0 ][crc >> 30 ];
161
+ crc = (crc << 2 ) ^ crc32table_be [0 ][crc >> 30 ];
162
+ crc = (crc << 2 ) ^ crc32table_be [0 ][crc >> 30 ];
163
+ crc = (crc << 2 ) ^ crc32table_be [0 ][crc >> 30 ];
196
164
}
197
- return crc ;
198
- # elif CRC_BE_BITS == 2
165
+ # elif CRC_BE_BITS == 4
199
166
while (len -- ) {
200
167
crc ^= * p ++ << 24 ;
201
- crc = (crc << 2 ) ^ crc32table_be [crc >> 30 ];
202
- crc = (crc << 2 ) ^ crc32table_be [crc >> 30 ];
203
- crc = (crc << 2 ) ^ crc32table_be [crc >> 30 ];
204
- crc = (crc << 2 ) ^ crc32table_be [crc >> 30 ];
168
+ crc = (crc << 4 ) ^ crc32table_be [0 ][crc >> 28 ];
169
+ crc = (crc << 4 ) ^ crc32table_be [0 ][crc >> 28 ];
205
170
}
206
- return crc ;
171
+ # elif CRC_BE_BITS == 8
172
+ const u32 (* tab )[] = crc32table_be ;
173
+
174
+ crc = __cpu_to_be32 (crc );
175
+ crc = crc32_body (crc , p , len , tab );
176
+ crc = __be32_to_cpu (crc );
207
177
# endif
178
+ return crc ;
208
179
}
209
- #endif
210
-
211
- EXPORT_SYMBOL (crc32_le );
212
180
EXPORT_SYMBOL (crc32_be );
213
181
214
182
#ifdef CONFIG_CRC32_SELFTEST
0 commit comments