Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * Aug 8, 2011 Bob Pearson with help from Joakim Tjernlund and George Spelvin
0003  * cleaned up code to current version of sparse and added the slicing-by-8
0004  * algorithm to the closely similar existing slicing-by-4 algorithm.
0005  *
0006  * Oct 15, 2000 Matt Domsch <Matt_Domsch@dell.com>
0007  * Nicer crc32 functions/docs submitted by linux@horizon.com.  Thanks!
0008  * Code was from the public domain, copyright abandoned.  Code was
0009  * subsequently included in the kernel, thus was re-licensed under the
0010  * GNU GPL v2.
0011  *
0012  * Oct 12, 2000 Matt Domsch <Matt_Domsch@dell.com>
0013  * Same crc32 function was used in 5 other places in the kernel.
0014  * I made one version, and deleted the others.
0015  * There are various incantations of crc32().  Some use a seed of 0 or ~0.
0016  * Some xor at the end with ~0.  The generic crc32() function takes
0017  * seed as an argument, and doesn't xor at the end.  Then individual
0018  * users can do whatever they need.
0019  *   drivers/net/smc9194.c uses seed ~0, doesn't xor with ~0.
0020  *   fs/jffs2 uses seed 0, doesn't xor with ~0.
0021  *   fs/partitions/efi.c uses seed ~0, xor's with ~0.
0022  *
0023  * This source code is licensed under the GNU General Public License,
0024  * Version 2.  See the file COPYING for more details.
0025  */
0026 
0027 #include <linux/crc32.h>
0028 #include <linux/module.h>
0029 #include <linux/sched.h>
0030 
0031 #include "crc32defs.h"
0032 
0033 /* 4096 random bytes */
0034 static u8 const __aligned(8) test_buf[] __initconst =
0035 {
0036     0x5b, 0x85, 0x21, 0xcb, 0x09, 0x68, 0x7d, 0x30,
0037     0xc7, 0x69, 0xd7, 0x30, 0x92, 0xde, 0x59, 0xe4,
0038     0xc9, 0x6e, 0x8b, 0xdb, 0x98, 0x6b, 0xaa, 0x60,
0039     0xa8, 0xb5, 0xbc, 0x6c, 0xa9, 0xb1, 0x5b, 0x2c,
0040     0xea, 0xb4, 0x92, 0x6a, 0x3f, 0x79, 0x91, 0xe4,
0041     0xe9, 0x70, 0x51, 0x8c, 0x7f, 0x95, 0x6f, 0x1a,
0042     0x56, 0xa1, 0x5c, 0x27, 0x03, 0x67, 0x9f, 0x3a,
0043     0xe2, 0x31, 0x11, 0x29, 0x6b, 0x98, 0xfc, 0xc4,
0044     0x53, 0x24, 0xc5, 0x8b, 0xce, 0x47, 0xb2, 0xb9,
0045     0x32, 0xcb, 0xc1, 0xd0, 0x03, 0x57, 0x4e, 0xd4,
0046     0xe9, 0x3c, 0xa1, 0x63, 0xcf, 0x12, 0x0e, 0xca,
0047     0xe1, 0x13, 0xd1, 0x93, 0xa6, 0x88, 0x5c, 0x61,
0048     0x5b, 0xbb, 0xf0, 0x19, 0x46, 0xb4, 0xcf, 0x9e,
0049     0xb6, 0x6b, 0x4c, 0x3a, 0xcf, 0x60, 0xf9, 0x7a,
0050     0x8d, 0x07, 0x63, 0xdb, 0x40, 0xe9, 0x0b, 0x6f,
0051     0xad, 0x97, 0xf1, 0xed, 0xd0, 0x1e, 0x26, 0xfd,
0052     0xbf, 0xb7, 0xc8, 0x04, 0x94, 0xf8, 0x8b, 0x8c,
0053     0xf1, 0xab, 0x7a, 0xd4, 0xdd, 0xf3, 0xe8, 0x88,
0054     0xc3, 0xed, 0x17, 0x8a, 0x9b, 0x40, 0x0d, 0x53,
0055     0x62, 0x12, 0x03, 0x5f, 0x1b, 0x35, 0x32, 0x1f,
0056     0xb4, 0x7b, 0x93, 0x78, 0x0d, 0xdb, 0xce, 0xa4,
0057     0xc0, 0x47, 0xd5, 0xbf, 0x68, 0xe8, 0x5d, 0x74,
0058     0x8f, 0x8e, 0x75, 0x1c, 0xb2, 0x4f, 0x9a, 0x60,
0059     0xd1, 0xbe, 0x10, 0xf4, 0x5c, 0xa1, 0x53, 0x09,
0060     0xa5, 0xe0, 0x09, 0x54, 0x85, 0x5c, 0xdc, 0x07,
0061     0xe7, 0x21, 0x69, 0x7b, 0x8a, 0xfd, 0x90, 0xf1,
0062     0x22, 0xd0, 0xb4, 0x36, 0x28, 0xe6, 0xb8, 0x0f,
0063     0x39, 0xde, 0xc8, 0xf3, 0x86, 0x60, 0x34, 0xd2,
0064     0x5e, 0xdf, 0xfd, 0xcf, 0x0f, 0xa9, 0x65, 0xf0,
0065     0xd5, 0x4d, 0x96, 0x40, 0xe3, 0xdf, 0x3f, 0x95,
0066     0x5a, 0x39, 0x19, 0x93, 0xf4, 0x75, 0xce, 0x22,
0067     0x00, 0x1c, 0x93, 0xe2, 0x03, 0x66, 0xf4, 0x93,
0068     0x73, 0x86, 0x81, 0x8e, 0x29, 0x44, 0x48, 0x86,
0069     0x61, 0x7c, 0x48, 0xa3, 0x43, 0xd2, 0x9c, 0x8d,
0070     0xd4, 0x95, 0xdd, 0xe1, 0x22, 0x89, 0x3a, 0x40,
0071     0x4c, 0x1b, 0x8a, 0x04, 0xa8, 0x09, 0x69, 0x8b,
0072     0xea, 0xc6, 0x55, 0x8e, 0x57, 0xe6, 0x64, 0x35,
0073     0xf0, 0xc7, 0x16, 0x9f, 0x5d, 0x5e, 0x86, 0x40,
0074     0x46, 0xbb, 0xe5, 0x45, 0x88, 0xfe, 0xc9, 0x63,
0075     0x15, 0xfb, 0xf5, 0xbd, 0x71, 0x61, 0xeb, 0x7b,
0076     0x78, 0x70, 0x07, 0x31, 0x03, 0x9f, 0xb2, 0xc8,
0077     0xa7, 0xab, 0x47, 0xfd, 0xdf, 0xa0, 0x78, 0x72,
0078     0xa4, 0x2a, 0xe4, 0xb6, 0xba, 0xc0, 0x1e, 0x86,
0079     0x71, 0xe6, 0x3d, 0x18, 0x37, 0x70, 0xe6, 0xff,
0080     0xe0, 0xbc, 0x0b, 0x22, 0xa0, 0x1f, 0xd3, 0xed,
0081     0xa2, 0x55, 0x39, 0xab, 0xa8, 0x13, 0x73, 0x7c,
0082     0x3f, 0xb2, 0xd6, 0x19, 0xac, 0xff, 0x99, 0xed,
0083     0xe8, 0xe6, 0xa6, 0x22, 0xe3, 0x9c, 0xf1, 0x30,
0084     0xdc, 0x01, 0x0a, 0x56, 0xfa, 0xe4, 0xc9, 0x99,
0085     0xdd, 0xa8, 0xd8, 0xda, 0x35, 0x51, 0x73, 0xb4,
0086     0x40, 0x86, 0x85, 0xdb, 0x5c, 0xd5, 0x85, 0x80,
0087     0x14, 0x9c, 0xfd, 0x98, 0xa9, 0x82, 0xc5, 0x37,
0088     0xff, 0x32, 0x5d, 0xd0, 0x0b, 0xfa, 0xdc, 0x04,
0089     0x5e, 0x09, 0xd2, 0xca, 0x17, 0x4b, 0x1a, 0x8e,
0090     0x15, 0xe1, 0xcc, 0x4e, 0x52, 0x88, 0x35, 0xbd,
0091     0x48, 0xfe, 0x15, 0xa0, 0x91, 0xfd, 0x7e, 0x6c,
0092     0x0e, 0x5d, 0x79, 0x1b, 0x81, 0x79, 0xd2, 0x09,
0093     0x34, 0x70, 0x3d, 0x81, 0xec, 0xf6, 0x24, 0xbb,
0094     0xfb, 0xf1, 0x7b, 0xdf, 0x54, 0xea, 0x80, 0x9b,
0095     0xc7, 0x99, 0x9e, 0xbd, 0x16, 0x78, 0x12, 0x53,
0096     0x5e, 0x01, 0xa7, 0x4e, 0xbd, 0x67, 0xe1, 0x9b,
0097     0x4c, 0x0e, 0x61, 0x45, 0x97, 0xd2, 0xf0, 0x0f,
0098     0xfe, 0x15, 0x08, 0xb7, 0x11, 0x4c, 0xe7, 0xff,
0099     0x81, 0x53, 0xff, 0x91, 0x25, 0x38, 0x7e, 0x40,
0100     0x94, 0xe5, 0xe0, 0xad, 0xe6, 0xd9, 0x79, 0xb6,
0101     0x92, 0xc9, 0xfc, 0xde, 0xc3, 0x1a, 0x23, 0xbb,
0102     0xdd, 0xc8, 0x51, 0x0c, 0x3a, 0x72, 0xfa, 0x73,
0103     0x6f, 0xb7, 0xee, 0x61, 0x39, 0x03, 0x01, 0x3f,
0104     0x7f, 0x94, 0x2e, 0x2e, 0xba, 0x3a, 0xbb, 0xb4,
0105     0xfa, 0x6a, 0x17, 0xfe, 0xea, 0xef, 0x5e, 0x66,
0106     0x97, 0x3f, 0x32, 0x3d, 0xd7, 0x3e, 0xb1, 0xf1,
0107     0x6c, 0x14, 0x4c, 0xfd, 0x37, 0xd3, 0x38, 0x80,
0108     0xfb, 0xde, 0xa6, 0x24, 0x1e, 0xc8, 0xca, 0x7f,
0109     0x3a, 0x93, 0xd8, 0x8b, 0x18, 0x13, 0xb2, 0xe5,
0110     0xe4, 0x93, 0x05, 0x53, 0x4f, 0x84, 0x66, 0xa7,
0111     0x58, 0x5c, 0x7b, 0x86, 0x52, 0x6d, 0x0d, 0xce,
0112     0xa4, 0x30, 0x7d, 0xb6, 0x18, 0x9f, 0xeb, 0xff,
0113     0x22, 0xbb, 0x72, 0x29, 0xb9, 0x44, 0x0b, 0x48,
0114     0x1e, 0x84, 0x71, 0x81, 0xe3, 0x6d, 0x73, 0x26,
0115     0x92, 0xb4, 0x4d, 0x2a, 0x29, 0xb8, 0x1f, 0x72,
0116     0xed, 0xd0, 0xe1, 0x64, 0x77, 0xea, 0x8e, 0x88,
0117     0x0f, 0xef, 0x3f, 0xb1, 0x3b, 0xad, 0xf9, 0xc9,
0118     0x8b, 0xd0, 0xac, 0xc6, 0xcc, 0xa9, 0x40, 0xcc,
0119     0x76, 0xf6, 0x3b, 0x53, 0xb5, 0x88, 0xcb, 0xc8,
0120     0x37, 0xf1, 0xa2, 0xba, 0x23, 0x15, 0x99, 0x09,
0121     0xcc, 0xe7, 0x7a, 0x3b, 0x37, 0xf7, 0x58, 0xc8,
0122     0x46, 0x8c, 0x2b, 0x2f, 0x4e, 0x0e, 0xa6, 0x5c,
0123     0xea, 0x85, 0x55, 0xba, 0x02, 0x0e, 0x0e, 0x48,
0124     0xbc, 0xe1, 0xb1, 0x01, 0x35, 0x79, 0x13, 0x3d,
0125     0x1b, 0xc0, 0x53, 0x68, 0x11, 0xe7, 0x95, 0x0f,
0126     0x9d, 0x3f, 0x4c, 0x47, 0x7b, 0x4d, 0x1c, 0xae,
0127     0x50, 0x9b, 0xcb, 0xdd, 0x05, 0x8d, 0x9a, 0x97,
0128     0xfd, 0x8c, 0xef, 0x0c, 0x1d, 0x67, 0x73, 0xa8,
0129     0x28, 0x36, 0xd5, 0xb6, 0x92, 0x33, 0x40, 0x75,
0130     0x0b, 0x51, 0xc3, 0x64, 0xba, 0x1d, 0xc2, 0xcc,
0131     0xee, 0x7d, 0x54, 0x0f, 0x27, 0x69, 0xa7, 0x27,
0132     0x63, 0x30, 0x29, 0xd9, 0xc8, 0x84, 0xd8, 0xdf,
0133     0x9f, 0x68, 0x8d, 0x04, 0xca, 0xa6, 0xc5, 0xc7,
0134     0x7a, 0x5c, 0xc8, 0xd1, 0xcb, 0x4a, 0xec, 0xd0,
0135     0xd8, 0x20, 0x69, 0xc5, 0x17, 0xcd, 0x78, 0xc8,
0136     0x75, 0x23, 0x30, 0x69, 0xc9, 0xd4, 0xea, 0x5c,
0137     0x4f, 0x6b, 0x86, 0x3f, 0x8b, 0xfe, 0xee, 0x44,
0138     0xc9, 0x7c, 0xb7, 0xdd, 0x3e, 0xe5, 0xec, 0x54,
0139     0x03, 0x3e, 0xaa, 0x82, 0xc6, 0xdf, 0xb2, 0x38,
0140     0x0e, 0x5d, 0xb3, 0x88, 0xd9, 0xd3, 0x69, 0x5f,
0141     0x8f, 0x70, 0x8a, 0x7e, 0x11, 0xd9, 0x1e, 0x7b,
0142     0x38, 0xf1, 0x42, 0x1a, 0xc0, 0x35, 0xf5, 0xc7,
0143     0x36, 0x85, 0xf5, 0xf7, 0xb8, 0x7e, 0xc7, 0xef,
0144     0x18, 0xf1, 0x63, 0xd6, 0x7a, 0xc6, 0xc9, 0x0e,
0145     0x4d, 0x69, 0x4f, 0x84, 0xef, 0x26, 0x41, 0x0c,
0146     0xec, 0xc7, 0xe0, 0x7e, 0x3c, 0x67, 0x01, 0x4c,
0147     0x62, 0x1a, 0x20, 0x6f, 0xee, 0x47, 0x4d, 0xc0,
0148     0x99, 0x13, 0x8d, 0x91, 0x4a, 0x26, 0xd4, 0x37,
0149     0x28, 0x90, 0x58, 0x75, 0x66, 0x2b, 0x0a, 0xdf,
0150     0xda, 0xee, 0x92, 0x25, 0x90, 0x62, 0x39, 0x9e,
0151     0x44, 0x98, 0xad, 0xc1, 0x88, 0xed, 0xe4, 0xb4,
0152     0xaf, 0xf5, 0x8c, 0x9b, 0x48, 0x4d, 0x56, 0x60,
0153     0x97, 0x0f, 0x61, 0x59, 0x9e, 0xa6, 0x27, 0xfe,
0154     0xc1, 0x91, 0x15, 0x38, 0xb8, 0x0f, 0xae, 0x61,
0155     0x7d, 0x26, 0x13, 0x5a, 0x73, 0xff, 0x1c, 0xa3,
0156     0x61, 0x04, 0x58, 0x48, 0x55, 0x44, 0x11, 0xfe,
0157     0x15, 0xca, 0xc3, 0xbd, 0xca, 0xc5, 0xb4, 0x40,
0158     0x5d, 0x1b, 0x7f, 0x39, 0xb5, 0x9c, 0x35, 0xec,
0159     0x61, 0x15, 0x32, 0x32, 0xb8, 0x4e, 0x40, 0x9f,
0160     0x17, 0x1f, 0x0a, 0x4d, 0xa9, 0x91, 0xef, 0xb7,
0161     0xb0, 0xeb, 0xc2, 0x83, 0x9a, 0x6c, 0xd2, 0x79,
0162     0x43, 0x78, 0x5e, 0x2f, 0xe5, 0xdd, 0x1a, 0x3c,
0163     0x45, 0xab, 0x29, 0x40, 0x3a, 0x37, 0x5b, 0x6f,
0164     0xd7, 0xfc, 0x48, 0x64, 0x3c, 0x49, 0xfb, 0x21,
0165     0xbe, 0xc3, 0xff, 0x07, 0xfb, 0x17, 0xe9, 0xc9,
0166     0x0c, 0x4c, 0x5c, 0x15, 0x9e, 0x8e, 0x22, 0x30,
0167     0x0a, 0xde, 0x48, 0x7f, 0xdb, 0x0d, 0xd1, 0x2b,
0168     0x87, 0x38, 0x9e, 0xcc, 0x5a, 0x01, 0x16, 0xee,
0169     0x75, 0x49, 0x0d, 0x30, 0x01, 0x34, 0x6a, 0xb6,
0170     0x9a, 0x5a, 0x2a, 0xec, 0xbb, 0x48, 0xac, 0xd3,
0171     0x77, 0x83, 0xd8, 0x08, 0x86, 0x4f, 0x48, 0x09,
0172     0x29, 0x41, 0x79, 0xa1, 0x03, 0x12, 0xc4, 0xcd,
0173     0x90, 0x55, 0x47, 0x66, 0x74, 0x9a, 0xcc, 0x4f,
0174     0x35, 0x8c, 0xd6, 0x98, 0xef, 0xeb, 0x45, 0xb9,
0175     0x9a, 0x26, 0x2f, 0x39, 0xa5, 0x70, 0x6d, 0xfc,
0176     0xb4, 0x51, 0xee, 0xf4, 0x9c, 0xe7, 0x38, 0x59,
0177     0xad, 0xf4, 0xbc, 0x46, 0xff, 0x46, 0x8e, 0x60,
0178     0x9c, 0xa3, 0x60, 0x1d, 0xf8, 0x26, 0x72, 0xf5,
0179     0x72, 0x9d, 0x68, 0x80, 0x04, 0xf6, 0x0b, 0xa1,
0180     0x0a, 0xd5, 0xa7, 0x82, 0x3a, 0x3e, 0x47, 0xa8,
0181     0x5a, 0xde, 0x59, 0x4f, 0x7b, 0x07, 0xb3, 0xe9,
0182     0x24, 0x19, 0x3d, 0x34, 0x05, 0xec, 0xf1, 0xab,
0183     0x6e, 0x64, 0x8f, 0xd3, 0xe6, 0x41, 0x86, 0x80,
0184     0x70, 0xe3, 0x8d, 0x60, 0x9c, 0x34, 0x25, 0x01,
0185     0x07, 0x4d, 0x19, 0x41, 0x4e, 0x3d, 0x5c, 0x7e,
0186     0xa8, 0xf5, 0xcc, 0xd5, 0x7b, 0xe2, 0x7d, 0x3d,
0187     0x49, 0x86, 0x7d, 0x07, 0xb7, 0x10, 0xe3, 0x35,
0188     0xb8, 0x84, 0x6d, 0x76, 0xab, 0x17, 0xc6, 0x38,
0189     0xb4, 0xd3, 0x28, 0x57, 0xad, 0xd3, 0x88, 0x5a,
0190     0xda, 0xea, 0xc8, 0x94, 0xcc, 0x37, 0x19, 0xac,
0191     0x9c, 0x9f, 0x4b, 0x00, 0x15, 0xc0, 0xc8, 0xca,
0192     0x1f, 0x15, 0xaa, 0xe0, 0xdb, 0xf9, 0x2f, 0x57,
0193     0x1b, 0x24, 0xc7, 0x6f, 0x76, 0x29, 0xfb, 0xed,
0194     0x25, 0x0d, 0xc0, 0xfe, 0xbd, 0x5a, 0xbf, 0x20,
0195     0x08, 0x51, 0x05, 0xec, 0x71, 0xa3, 0xbf, 0xef,
0196     0x5e, 0x99, 0x75, 0xdb, 0x3c, 0x5f, 0x9a, 0x8c,
0197     0xbb, 0x19, 0x5c, 0x0e, 0x93, 0x19, 0xf8, 0x6a,
0198     0xbc, 0xf2, 0x12, 0x54, 0x2f, 0xcb, 0x28, 0x64,
0199     0x88, 0xb3, 0x92, 0x0d, 0x96, 0xd1, 0xa6, 0xe4,
0200     0x1f, 0xf1, 0x4d, 0xa4, 0xab, 0x1c, 0xee, 0x54,
0201     0xf2, 0xad, 0x29, 0x6d, 0x32, 0x37, 0xb2, 0x16,
0202     0x77, 0x5c, 0xdc, 0x2e, 0x54, 0xec, 0x75, 0x26,
0203     0xc6, 0x36, 0xd9, 0x17, 0x2c, 0xf1, 0x7a, 0xdc,
0204     0x4b, 0xf1, 0xe2, 0xd9, 0x95, 0xba, 0xac, 0x87,
0205     0xc1, 0xf3, 0x8e, 0x58, 0x08, 0xd8, 0x87, 0x60,
0206     0xc9, 0xee, 0x6a, 0xde, 0xa4, 0xd2, 0xfc, 0x0d,
0207     0xe5, 0x36, 0xc4, 0x5c, 0x52, 0xb3, 0x07, 0x54,
0208     0x65, 0x24, 0xc1, 0xb1, 0xd1, 0xb1, 0x53, 0x13,
0209     0x31, 0x79, 0x7f, 0x05, 0x76, 0xeb, 0x37, 0x59,
0210     0x15, 0x2b, 0xd1, 0x3f, 0xac, 0x08, 0x97, 0xeb,
0211     0x91, 0x98, 0xdf, 0x6c, 0x09, 0x0d, 0x04, 0x9f,
0212     0xdc, 0x3b, 0x0e, 0x60, 0x68, 0x47, 0x23, 0x15,
0213     0x16, 0xc6, 0x0b, 0x35, 0xf8, 0x77, 0xa2, 0x78,
0214     0x50, 0xd4, 0x64, 0x22, 0x33, 0xff, 0xfb, 0x93,
0215     0x71, 0x46, 0x50, 0x39, 0x1b, 0x9c, 0xea, 0x4e,
0216     0x8d, 0x0c, 0x37, 0xe5, 0x5c, 0x51, 0x3a, 0x31,
0217     0xb2, 0x85, 0x84, 0x3f, 0x41, 0xee, 0xa2, 0xc1,
0218     0xc6, 0x13, 0x3b, 0x54, 0x28, 0xd2, 0x18, 0x37,
0219     0xcc, 0x46, 0x9f, 0x6a, 0x91, 0x3d, 0x5a, 0x15,
0220     0x3c, 0x89, 0xa3, 0x61, 0x06, 0x7d, 0x2e, 0x78,
0221     0xbe, 0x7d, 0x40, 0xba, 0x2f, 0x95, 0xb1, 0x2f,
0222     0x87, 0x3b, 0x8a, 0xbe, 0x6a, 0xf4, 0xc2, 0x31,
0223     0x74, 0xee, 0x91, 0xe0, 0x23, 0xaa, 0x5d, 0x7f,
0224     0xdd, 0xf0, 0x44, 0x8c, 0x0b, 0x59, 0x2b, 0xfc,
0225     0x48, 0x3a, 0xdf, 0x07, 0x05, 0x38, 0x6c, 0xc9,
0226     0xeb, 0x18, 0x24, 0x68, 0x8d, 0x58, 0x98, 0xd3,
0227     0x31, 0xa3, 0xe4, 0x70, 0x59, 0xb1, 0x21, 0xbe,
0228     0x7e, 0x65, 0x7d, 0xb8, 0x04, 0xab, 0xf6, 0xe4,
0229     0xd7, 0xda, 0xec, 0x09, 0x8f, 0xda, 0x6d, 0x24,
0230     0x07, 0xcc, 0x29, 0x17, 0x05, 0x78, 0x1a, 0xc1,
0231     0xb1, 0xce, 0xfc, 0xaa, 0x2d, 0xe7, 0xcc, 0x85,
0232     0x84, 0x84, 0x03, 0x2a, 0x0c, 0x3f, 0xa9, 0xf8,
0233     0xfd, 0x84, 0x53, 0x59, 0x5c, 0xf0, 0xd4, 0x09,
0234     0xf0, 0xd2, 0x6c, 0x32, 0x03, 0xb0, 0xa0, 0x8c,
0235     0x52, 0xeb, 0x23, 0x91, 0x88, 0x43, 0x13, 0x46,
0236     0xf6, 0x1e, 0xb4, 0x1b, 0xf5, 0x8e, 0x3a, 0xb5,
0237     0x3d, 0x00, 0xf6, 0xe5, 0x08, 0x3d, 0x5f, 0x39,
0238     0xd3, 0x21, 0x69, 0xbc, 0x03, 0x22, 0x3a, 0xd2,
0239     0x5c, 0x84, 0xf8, 0x15, 0xc4, 0x80, 0x0b, 0xbc,
0240     0x29, 0x3c, 0xf3, 0x95, 0x98, 0xcd, 0x8f, 0x35,
0241     0xbc, 0xa5, 0x3e, 0xfc, 0xd4, 0x13, 0x9e, 0xde,
0242     0x4f, 0xce, 0x71, 0x9d, 0x09, 0xad, 0xf2, 0x80,
0243     0x6b, 0x65, 0x7f, 0x03, 0x00, 0x14, 0x7c, 0x15,
0244     0x85, 0x40, 0x6d, 0x70, 0xea, 0xdc, 0xb3, 0x63,
0245     0x35, 0x4f, 0x4d, 0xe0, 0xd9, 0xd5, 0x3c, 0x58,
0246     0x56, 0x23, 0x80, 0xe2, 0x36, 0xdd, 0x75, 0x1d,
0247     0x94, 0x11, 0x41, 0x8e, 0xe0, 0x81, 0x8e, 0xcf,
0248     0xe0, 0xe5, 0xf6, 0xde, 0xd1, 0xe7, 0x04, 0x12,
0249     0x79, 0x92, 0x2b, 0x71, 0x2a, 0x79, 0x8b, 0x7c,
0250     0x44, 0x79, 0x16, 0x30, 0x4e, 0xf4, 0xf6, 0x9b,
0251     0xb7, 0x40, 0xa3, 0x5a, 0xa7, 0x69, 0x3e, 0xc1,
0252     0x3a, 0x04, 0xd0, 0x88, 0xa0, 0x3b, 0xdd, 0xc6,
0253     0x9e, 0x7e, 0x1e, 0x1e, 0x8f, 0x44, 0xf7, 0x73,
0254     0x67, 0x1e, 0x1a, 0x78, 0xfa, 0x62, 0xf4, 0xa9,
0255     0xa8, 0xc6, 0x5b, 0xb8, 0xfa, 0x06, 0x7d, 0x5e,
0256     0x38, 0x1c, 0x9a, 0x39, 0xe9, 0x39, 0x98, 0x22,
0257     0x0b, 0xa7, 0xac, 0x0b, 0xf3, 0xbc, 0xf1, 0xeb,
0258     0x8c, 0x81, 0xe3, 0x48, 0x8a, 0xed, 0x42, 0xc2,
0259     0x38, 0xcf, 0x3e, 0xda, 0xd2, 0x89, 0x8d, 0x9c,
0260     0x53, 0xb5, 0x2f, 0x41, 0x01, 0x26, 0x84, 0x9c,
0261     0xa3, 0x56, 0xf6, 0x49, 0xc7, 0xd4, 0x9f, 0x93,
0262     0x1b, 0x96, 0x49, 0x5e, 0xad, 0xb3, 0x84, 0x1f,
0263     0x3c, 0xa4, 0xe0, 0x9b, 0xd1, 0x90, 0xbc, 0x38,
0264     0x6c, 0xdd, 0x95, 0x4d, 0x9d, 0xb1, 0x71, 0x57,
0265     0x2d, 0x34, 0xe8, 0xb8, 0x42, 0xc7, 0x99, 0x03,
0266     0xc7, 0x07, 0x30, 0x65, 0x91, 0x55, 0xd5, 0x90,
0267     0x70, 0x97, 0x37, 0x68, 0xd4, 0x11, 0xf9, 0xe8,
0268     0xce, 0xec, 0xdc, 0x34, 0xd5, 0xd3, 0xb7, 0xc4,
0269     0xb8, 0x97, 0x05, 0x92, 0xad, 0xf8, 0xe2, 0x36,
0270     0x64, 0x41, 0xc9, 0xc5, 0x41, 0x77, 0x52, 0xd7,
0271     0x2c, 0xa5, 0x24, 0x2f, 0xd9, 0x34, 0x0b, 0x47,
0272     0x35, 0xa7, 0x28, 0x8b, 0xc5, 0xcd, 0xe9, 0x46,
0273     0xac, 0x39, 0x94, 0x3c, 0x10, 0xc6, 0x29, 0x73,
0274     0x0e, 0x0e, 0x5d, 0xe0, 0x71, 0x03, 0x8a, 0x72,
0275     0x0e, 0x26, 0xb0, 0x7d, 0x84, 0xed, 0x95, 0x23,
0276     0x49, 0x5a, 0x45, 0x83, 0x45, 0x60, 0x11, 0x4a,
0277     0x46, 0x31, 0xd4, 0xd8, 0x16, 0x54, 0x98, 0x58,
0278     0xed, 0x6d, 0xcc, 0x5d, 0xd6, 0x50, 0x61, 0x9f,
0279     0x9d, 0xc5, 0x3e, 0x9d, 0x32, 0x47, 0xde, 0x96,
0280     0xe1, 0x5d, 0xd8, 0xf8, 0xb4, 0x69, 0x6f, 0xb9,
0281     0x15, 0x90, 0x57, 0x7a, 0xf6, 0xad, 0xb0, 0x5b,
0282     0xf5, 0xa6, 0x36, 0x94, 0xfd, 0x84, 0xce, 0x1c,
0283     0x0f, 0x4b, 0xd0, 0xc2, 0x5b, 0x6b, 0x56, 0xef,
0284     0x73, 0x93, 0x0b, 0xc3, 0xee, 0xd9, 0xcf, 0xd3,
0285     0xa4, 0x22, 0x58, 0xcd, 0x50, 0x6e, 0x65, 0xf4,
0286     0xe9, 0xb7, 0x71, 0xaf, 0x4b, 0xb3, 0xb6, 0x2f,
0287     0x0f, 0x0e, 0x3b, 0xc9, 0x85, 0x14, 0xf5, 0x17,
0288     0xe8, 0x7a, 0x3a, 0xbf, 0x5f, 0x5e, 0xf8, 0x18,
0289     0x48, 0xa6, 0x72, 0xab, 0x06, 0x95, 0xe9, 0xc8,
0290     0xa7, 0xf4, 0x32, 0x44, 0x04, 0x0c, 0x84, 0x98,
0291     0x73, 0xe3, 0x89, 0x8d, 0x5f, 0x7e, 0x4a, 0x42,
0292     0x8f, 0xc5, 0x28, 0xb1, 0x82, 0xef, 0x1c, 0x97,
0293     0x31, 0x3b, 0x4d, 0xe0, 0x0e, 0x10, 0x10, 0x97,
0294     0x93, 0x49, 0x78, 0x2f, 0x0d, 0x86, 0x8b, 0xa1,
0295     0x53, 0xa9, 0x81, 0x20, 0x79, 0xe7, 0x07, 0x77,
0296     0xb6, 0xac, 0x5e, 0xd2, 0x05, 0xcd, 0xe9, 0xdb,
0297     0x8a, 0x94, 0x82, 0x8a, 0x23, 0xb9, 0x3d, 0x1c,
0298     0xa9, 0x7d, 0x72, 0x4a, 0xed, 0x33, 0xa3, 0xdb,
0299     0x21, 0xa7, 0x86, 0x33, 0x45, 0xa5, 0xaa, 0x56,
0300     0x45, 0xb5, 0x83, 0x29, 0x40, 0x47, 0x79, 0x04,
0301     0x6e, 0xb9, 0x95, 0xd0, 0x81, 0x77, 0x2d, 0x48,
0302     0x1e, 0xfe, 0xc3, 0xc2, 0x1e, 0xe5, 0xf2, 0xbe,
0303     0xfd, 0x3b, 0x94, 0x9f, 0xc4, 0xc4, 0x26, 0x9d,
0304     0xe4, 0x66, 0x1e, 0x19, 0xee, 0x6c, 0x79, 0x97,
0305     0x11, 0x31, 0x4b, 0x0d, 0x01, 0xcb, 0xde, 0xa8,
0306     0xf6, 0x6d, 0x7c, 0x39, 0x46, 0x4e, 0x7e, 0x3f,
0307     0x94, 0x17, 0xdf, 0xa1, 0x7d, 0xd9, 0x1c, 0x8e,
0308     0xbc, 0x7d, 0x33, 0x7d, 0xe3, 0x12, 0x40, 0xca,
0309     0xab, 0x37, 0x11, 0x46, 0xd4, 0xae, 0xef, 0x44,
0310     0xa2, 0xb3, 0x6a, 0x66, 0x0e, 0x0c, 0x90, 0x7f,
0311     0xdf, 0x5c, 0x66, 0x5f, 0xf2, 0x94, 0x9f, 0xa6,
0312     0x73, 0x4f, 0xeb, 0x0d, 0xad, 0xbf, 0xc0, 0x63,
0313     0x5c, 0xdc, 0x46, 0x51, 0xe8, 0x8e, 0x90, 0x19,
0314     0xa8, 0xa4, 0x3c, 0x91, 0x79, 0xfa, 0x7e, 0x58,
0315     0x85, 0x13, 0x55, 0xc5, 0x19, 0x82, 0x37, 0x1b,
0316     0x0a, 0x02, 0x1f, 0x99, 0x6b, 0x18, 0xf1, 0x28,
0317     0x08, 0xa2, 0x73, 0xb8, 0x0f, 0x2e, 0xcd, 0xbf,
0318     0xf3, 0x86, 0x7f, 0xea, 0xef, 0xd0, 0xbb, 0xa6,
0319     0x21, 0xdf, 0x49, 0x73, 0x51, 0xcc, 0x36, 0xd3,
0320     0x3e, 0xa0, 0xf8, 0x44, 0xdf, 0xd3, 0xa6, 0xbe,
0321     0x8a, 0xd4, 0x57, 0xdd, 0x72, 0x94, 0x61, 0x0f,
0322     0x82, 0xd1, 0x07, 0xb8, 0x7c, 0x18, 0x83, 0xdf,
0323     0x3a, 0xe5, 0x50, 0x6a, 0x82, 0x20, 0xac, 0xa9,
0324     0xa8, 0xff, 0xd9, 0xf3, 0x77, 0x33, 0x5a, 0x9e,
0325     0x7f, 0x6d, 0xfe, 0x5d, 0x33, 0x41, 0x42, 0xe7,
0326     0x6c, 0x19, 0xe0, 0x44, 0x8a, 0x15, 0xf6, 0x70,
0327     0x98, 0xb7, 0x68, 0x4d, 0xfa, 0x97, 0x39, 0xb0,
0328     0x8e, 0xe8, 0x84, 0x8b, 0x75, 0x30, 0xb7, 0x7d,
0329     0x92, 0x69, 0x20, 0x9c, 0x81, 0xfb, 0x4b, 0xf4,
0330     0x01, 0x50, 0xeb, 0xce, 0x0c, 0x1c, 0x6c, 0xb5,
0331     0x4a, 0xd7, 0x27, 0x0c, 0xce, 0xbb, 0xe5, 0x85,
0332     0xf0, 0xb6, 0xee, 0xd5, 0x70, 0xdd, 0x3b, 0xfc,
0333     0xd4, 0x99, 0xf1, 0x33, 0xdd, 0x8b, 0xc4, 0x2f,
0334     0xae, 0xab, 0x74, 0x96, 0x32, 0xc7, 0x4c, 0x56,
0335     0x3c, 0x89, 0x0f, 0x96, 0x0b, 0x42, 0xc0, 0xcb,
0336     0xee, 0x0f, 0x0b, 0x8c, 0xfb, 0x7e, 0x47, 0x7b,
0337     0x64, 0x48, 0xfd, 0xb2, 0x00, 0x80, 0x89, 0xa5,
0338     0x13, 0x55, 0x62, 0xfc, 0x8f, 0xe2, 0x42, 0x03,
0339     0xb7, 0x4e, 0x2a, 0x79, 0xb4, 0x82, 0xea, 0x23,
0340     0x49, 0xda, 0xaf, 0x52, 0x63, 0x1e, 0x60, 0x03,
0341     0x89, 0x06, 0x44, 0x46, 0x08, 0xc3, 0xc4, 0x87,
0342     0x70, 0x2e, 0xda, 0x94, 0xad, 0x6b, 0xe0, 0xe4,
0343     0xd1, 0x8a, 0x06, 0xc2, 0xa8, 0xc0, 0xa7, 0x43,
0344     0x3c, 0x47, 0x52, 0x0e, 0xc3, 0x77, 0x81, 0x11,
0345     0x67, 0x0e, 0xa0, 0x70, 0x04, 0x47, 0x29, 0x40,
0346     0x86, 0x0d, 0x34, 0x56, 0xa7, 0xc9, 0x35, 0x59,
0347     0x68, 0xdc, 0x93, 0x81, 0x70, 0xee, 0x86, 0xd9,
0348     0x80, 0x06, 0x40, 0x4f, 0x1a, 0x0d, 0x40, 0x30,
0349     0x0b, 0xcb, 0x96, 0x47, 0xc1, 0xb7, 0x52, 0xfd,
0350     0x56, 0xe0, 0x72, 0x4b, 0xfb, 0xbd, 0x92, 0x45,
0351     0x61, 0x71, 0xc2, 0x33, 0x11, 0xbf, 0x52, 0x83,
0352     0x79, 0x26, 0xe0, 0x49, 0x6b, 0xb7, 0x05, 0x8b,
0353     0xe8, 0x0e, 0x87, 0x31, 0xd7, 0x9d, 0x8a, 0xf5,
0354     0xc0, 0x5f, 0x2e, 0x58, 0x4a, 0xdb, 0x11, 0xb3,
0355     0x6c, 0x30, 0x2a, 0x46, 0x19, 0xe3, 0x27, 0x84,
0356     0x1f, 0x63, 0x6e, 0xf6, 0x57, 0xc7, 0xc9, 0xd8,
0357     0x5e, 0xba, 0xb3, 0x87, 0xd5, 0x83, 0x26, 0x34,
0358     0x21, 0x9e, 0x65, 0xde, 0x42, 0xd3, 0xbe, 0x7b,
0359     0xbc, 0x91, 0x71, 0x44, 0x4d, 0x99, 0x3b, 0x31,
0360     0xe5, 0x3f, 0x11, 0x4e, 0x7f, 0x13, 0x51, 0x3b,
0361     0xae, 0x79, 0xc9, 0xd3, 0x81, 0x8e, 0x25, 0x40,
0362     0x10, 0xfc, 0x07, 0x1e, 0xf9, 0x7b, 0x9a, 0x4b,
0363     0x6c, 0xe3, 0xb3, 0xad, 0x1a, 0x0a, 0xdd, 0x9e,
0364     0x59, 0x0c, 0xa2, 0xcd, 0xae, 0x48, 0x4a, 0x38,
0365     0x5b, 0x47, 0x41, 0x94, 0x65, 0x6b, 0xbb, 0xeb,
0366     0x5b, 0xe3, 0xaf, 0x07, 0x5b, 0xd4, 0x4a, 0xa2,
0367     0xc9, 0x5d, 0x2f, 0x64, 0x03, 0xd7, 0x3a, 0x2c,
0368     0x6e, 0xce, 0x76, 0x95, 0xb4, 0xb3, 0xc0, 0xf1,
0369     0xe2, 0x45, 0x73, 0x7a, 0x5c, 0xab, 0xc1, 0xfc,
0370     0x02, 0x8d, 0x81, 0x29, 0xb3, 0xac, 0x07, 0xec,
0371     0x40, 0x7d, 0x45, 0xd9, 0x7a, 0x59, 0xee, 0x34,
0372     0xf0, 0xe9, 0xd5, 0x7b, 0x96, 0xb1, 0x3d, 0x95,
0373     0xcc, 0x86, 0xb5, 0xb6, 0x04, 0x2d, 0xb5, 0x92,
0374     0x7e, 0x76, 0xf4, 0x06, 0xa9, 0xa3, 0x12, 0x0f,
0375     0xb1, 0xaf, 0x26, 0xba, 0x7c, 0xfc, 0x7e, 0x1c,
0376     0xbc, 0x2c, 0x49, 0x97, 0x53, 0x60, 0x13, 0x0b,
0377     0xa6, 0x61, 0x83, 0x89, 0x42, 0xd4, 0x17, 0x0c,
0378     0x6c, 0x26, 0x52, 0xc3, 0xb3, 0xd4, 0x67, 0xf5,
0379     0xe3, 0x04, 0xb7, 0xf4, 0xcb, 0x80, 0xb8, 0xcb,
0380     0x77, 0x56, 0x3e, 0xaa, 0x57, 0x54, 0xee, 0xb4,
0381     0x2c, 0x67, 0xcf, 0xf2, 0xdc, 0xbe, 0x55, 0xf9,
0382     0x43, 0x1f, 0x6e, 0x22, 0x97, 0x67, 0x7f, 0xc4,
0383     0xef, 0xb1, 0x26, 0x31, 0x1e, 0x27, 0xdf, 0x41,
0384     0x80, 0x47, 0x6c, 0xe2, 0xfa, 0xa9, 0x8c, 0x2a,
0385     0xf6, 0xf2, 0xab, 0xf0, 0x15, 0xda, 0x6c, 0xc8,
0386     0xfe, 0xb5, 0x23, 0xde, 0xa9, 0x05, 0x3f, 0x06,
0387     0x54, 0x4c, 0xcd, 0xe1, 0xab, 0xfc, 0x0e, 0x62,
0388     0x33, 0x31, 0x73, 0x2c, 0x76, 0xcb, 0xb4, 0x47,
0389     0x1e, 0x20, 0xad, 0xd8, 0xf2, 0x31, 0xdd, 0xc4,
0390     0x8b, 0x0c, 0x77, 0xbe, 0xe1, 0x8b, 0x26, 0x00,
0391     0x02, 0x58, 0xd6, 0x8d, 0xef, 0xad, 0x74, 0x67,
0392     0xab, 0x3f, 0xef, 0xcb, 0x6f, 0xb0, 0xcc, 0x81,
0393     0x44, 0x4c, 0xaf, 0xe9, 0x49, 0x4f, 0xdb, 0xa0,
0394     0x25, 0xa4, 0xf0, 0x89, 0xf1, 0xbe, 0xd8, 0x10,
0395     0xff, 0xb1, 0x3b, 0x4b, 0xfa, 0x98, 0xf5, 0x79,
0396     0x6d, 0x1e, 0x69, 0x4d, 0x57, 0xb1, 0xc8, 0x19,
0397     0x1b, 0xbd, 0x1e, 0x8c, 0x84, 0xb7, 0x7b, 0xe8,
0398     0xd2, 0x2d, 0x09, 0x41, 0x41, 0x37, 0x3d, 0xb1,
0399     0x6f, 0x26, 0x5d, 0x71, 0x16, 0x3d, 0xb7, 0x83,
0400     0x27, 0x2c, 0xa7, 0xb6, 0x50, 0xbd, 0x91, 0x86,
0401     0xab, 0x24, 0xa1, 0x38, 0xfd, 0xea, 0x71, 0x55,
0402     0x7e, 0x9a, 0x07, 0x77, 0x4b, 0xfa, 0x61, 0x66,
0403     0x20, 0x1e, 0x28, 0x95, 0x18, 0x1b, 0xa4, 0xa0,
0404     0xfd, 0xc0, 0x89, 0x72, 0x43, 0xd9, 0x3b, 0x49,
0405     0x5a, 0x3f, 0x9d, 0xbf, 0xdb, 0xb4, 0x46, 0xea,
0406     0x42, 0x01, 0x77, 0x23, 0x68, 0x95, 0xb6, 0x24,
0407     0xb3, 0xa8, 0x6c, 0x28, 0x3b, 0x11, 0x40, 0x7e,
0408     0x18, 0x65, 0x6d, 0xd8, 0x24, 0x42, 0x7d, 0x88,
0409     0xc0, 0x52, 0xd9, 0x05, 0xe4, 0x95, 0x90, 0x87,
0410     0x8c, 0xf4, 0xd0, 0x6b, 0xb9, 0x83, 0x99, 0x34,
0411     0x6d, 0xfe, 0x54, 0x40, 0x94, 0x52, 0x21, 0x4f,
0412     0x14, 0x25, 0xc5, 0xd6, 0x5e, 0x95, 0xdc, 0x0a,
0413     0x2b, 0x89, 0x20, 0x11, 0x84, 0x48, 0xd6, 0x3a,
0414     0xcd, 0x5c, 0x24, 0xad, 0x62, 0xe3, 0xb1, 0x93,
0415     0x25, 0x8d, 0xcd, 0x7e, 0xfc, 0x27, 0xa3, 0x37,
0416     0xfd, 0x84, 0xfc, 0x1b, 0xb2, 0xf1, 0x27, 0x38,
0417     0x5a, 0xb7, 0xfc, 0xf2, 0xfa, 0x95, 0x66, 0xd4,
0418     0xfb, 0xba, 0xa7, 0xd7, 0xa3, 0x72, 0x69, 0x48,
0419     0x48, 0x8c, 0xeb, 0x28, 0x89, 0xfe, 0x33, 0x65,
0420     0x5a, 0x36, 0x01, 0x7e, 0x06, 0x79, 0x0a, 0x09,
0421     0x3b, 0x74, 0x11, 0x9a, 0x6e, 0xbf, 0xd4, 0x9e,
0422     0x58, 0x90, 0x49, 0x4f, 0x4d, 0x08, 0xd4, 0xe5,
0423     0x4a, 0x09, 0x21, 0xef, 0x8b, 0xb8, 0x74, 0x3b,
0424     0x91, 0xdd, 0x36, 0x85, 0x60, 0x2d, 0xfa, 0xd4,
0425     0x45, 0x7b, 0x45, 0x53, 0xf5, 0x47, 0x87, 0x7e,
0426     0xa6, 0x37, 0xc8, 0x78, 0x7a, 0x68, 0x9d, 0x8d,
0427     0x65, 0x2c, 0x0e, 0x91, 0x5c, 0xa2, 0x60, 0xf0,
0428     0x8e, 0x3f, 0xe9, 0x1a, 0xcd, 0xaa, 0xe7, 0xd5,
0429     0x77, 0x18, 0xaf, 0xc9, 0xbc, 0x18, 0xea, 0x48,
0430     0x1b, 0xfb, 0x22, 0x48, 0x70, 0x16, 0x29, 0x9e,
0431     0x5b, 0xc1, 0x2c, 0x66, 0x23, 0xbc, 0xf0, 0x1f,
0432     0xef, 0xaf, 0xe4, 0xd6, 0x04, 0x19, 0x82, 0x7a,
0433     0x0b, 0xba, 0x4b, 0x46, 0xb1, 0x6a, 0x85, 0x5d,
0434     0xb4, 0x73, 0xd6, 0x21, 0xa1, 0x71, 0x60, 0x14,
0435     0xee, 0x0a, 0x77, 0xc4, 0x66, 0x2e, 0xf9, 0x69,
0436     0x30, 0xaf, 0x41, 0x0b, 0xc8, 0x83, 0x3c, 0x53,
0437     0x99, 0x19, 0x27, 0x46, 0xf7, 0x41, 0x6e, 0x56,
0438     0xdc, 0x94, 0x28, 0x67, 0x4e, 0xb7, 0x25, 0x48,
0439     0x8a, 0xc2, 0xe0, 0x60, 0x96, 0xcc, 0x18, 0xf4,
0440     0x84, 0xdd, 0xa7, 0x5e, 0x3e, 0x05, 0x0b, 0x26,
0441     0x26, 0xb2, 0x5c, 0x1f, 0x57, 0x1a, 0x04, 0x7e,
0442     0x6a, 0xe3, 0x2f, 0xb4, 0x35, 0xb6, 0x38, 0x40,
0443     0x40, 0xcd, 0x6f, 0x87, 0x2e, 0xef, 0xa3, 0xd7,
0444     0xa9, 0xc2, 0xe8, 0x0d, 0x27, 0xdf, 0x44, 0x62,
0445     0x99, 0xa0, 0xfc, 0xcf, 0x81, 0x78, 0xcb, 0xfe,
0446     0xe5, 0xa0, 0x03, 0x4e, 0x6c, 0xd7, 0xf4, 0xaf,
0447     0x7a, 0xbb, 0x61, 0x82, 0xfe, 0x71, 0x89, 0xb2,
0448     0x22, 0x7c, 0x8e, 0x83, 0x04, 0xce, 0xf6, 0x5d,
0449     0x84, 0x8f, 0x95, 0x6a, 0x7f, 0xad, 0xfd, 0x32,
0450     0x9c, 0x5e, 0xe4, 0x9c, 0x89, 0x60, 0x54, 0xaa,
0451     0x96, 0x72, 0xd2, 0xd7, 0x36, 0x85, 0xa9, 0x45,
0452     0xd2, 0x2a, 0xa1, 0x81, 0x49, 0x6f, 0x7e, 0x04,
0453     0xfa, 0xe2, 0xfe, 0x90, 0x26, 0x77, 0x5a, 0x33,
0454     0xb8, 0x04, 0x9a, 0x7a, 0xe6, 0x4c, 0x4f, 0xad,
0455     0x72, 0x96, 0x08, 0x28, 0x58, 0x13, 0xf8, 0xc4,
0456     0x1c, 0xf0, 0xc3, 0x45, 0x95, 0x49, 0x20, 0x8c,
0457     0x9f, 0x39, 0x70, 0xe1, 0x77, 0xfe, 0xd5, 0x4b,
0458     0xaf, 0x86, 0xda, 0xef, 0x22, 0x06, 0x83, 0x36,
0459     0x29, 0x12, 0x11, 0x40, 0xbc, 0x3b, 0x86, 0xaa,
0460     0xaa, 0x65, 0x60, 0xc3, 0x80, 0xca, 0xed, 0xa9,
0461     0xf3, 0xb0, 0x79, 0x96, 0xa2, 0x55, 0x27, 0x28,
0462     0x55, 0x73, 0x26, 0xa5, 0x50, 0xea, 0x92, 0x4b,
0463     0x3c, 0x5c, 0x82, 0x33, 0xf0, 0x01, 0x3f, 0x03,
0464     0xc1, 0x08, 0x05, 0xbf, 0x98, 0xf4, 0x9b, 0x6d,
0465     0xa5, 0xa8, 0xb4, 0x82, 0x0c, 0x06, 0xfa, 0xff,
0466     0x2d, 0x08, 0xf3, 0x05, 0x4f, 0x57, 0x2a, 0x39,
0467     0xd4, 0x83, 0x0d, 0x75, 0x51, 0xd8, 0x5b, 0x1b,
0468     0xd3, 0x51, 0x5a, 0x32, 0x2a, 0x9b, 0x32, 0xb2,
0469     0xf2, 0xa4, 0x96, 0x12, 0xf2, 0xae, 0x40, 0x34,
0470     0x67, 0xa8, 0xf5, 0x44, 0xd5, 0x35, 0x53, 0xfe,
0471     0xa3, 0x60, 0x96, 0x63, 0x0f, 0x1f, 0x6e, 0xb0,
0472     0x5a, 0x42, 0xa6, 0xfc, 0x51, 0x0b, 0x60, 0x27,
0473     0xbc, 0x06, 0x71, 0xed, 0x65, 0x5b, 0x23, 0x86,
0474     0x4a, 0x07, 0x3b, 0x22, 0x07, 0x46, 0xe6, 0x90,
0475     0x3e, 0xf3, 0x25, 0x50, 0x1b, 0x4c, 0x7f, 0x03,
0476     0x08, 0xa8, 0x36, 0x6b, 0x87, 0xe5, 0xe3, 0xdb,
0477     0x9a, 0x38, 0x83, 0xff, 0x9f, 0x1a, 0x9f, 0x57,
0478     0xa4, 0x2a, 0xf6, 0x37, 0xbc, 0x1a, 0xff, 0xc9,
0479     0x1e, 0x35, 0x0c, 0xc3, 0x7c, 0xa3, 0xb2, 0xe5,
0480     0xd2, 0xc6, 0xb4, 0x57, 0x47, 0xe4, 0x32, 0x16,
0481     0x6d, 0xa9, 0xae, 0x64, 0xe6, 0x2d, 0x8d, 0xc5,
0482     0x8d, 0x50, 0x8e, 0xe8, 0x1a, 0x22, 0x34, 0x2a,
0483     0xd9, 0xeb, 0x51, 0x90, 0x4a, 0xb1, 0x41, 0x7d,
0484     0x64, 0xf9, 0xb9, 0x0d, 0xf6, 0x23, 0x33, 0xb0,
0485     0x33, 0xf4, 0xf7, 0x3f, 0x27, 0x84, 0xc6, 0x0f,
0486     0x54, 0xa5, 0xc0, 0x2e, 0xec, 0x0b, 0x3a, 0x48,
0487     0x6e, 0x80, 0x35, 0x81, 0x43, 0x9b, 0x90, 0xb1,
0488     0xd0, 0x2b, 0xea, 0x21, 0xdc, 0xda, 0x5b, 0x09,
0489     0xf4, 0xcc, 0x10, 0xb4, 0xc7, 0xfe, 0x79, 0x51,
0490     0xc3, 0xc5, 0xac, 0x88, 0x74, 0x84, 0x0b, 0x4b,
0491     0xca, 0x79, 0x16, 0x29, 0xfb, 0x69, 0x54, 0xdf,
0492     0x41, 0x7e, 0xe9, 0xc7, 0x8e, 0xea, 0xa5, 0xfe,
0493     0xfc, 0x76, 0x0e, 0x90, 0xc4, 0x92, 0x38, 0xad,
0494     0x7b, 0x48, 0xe6, 0x6e, 0xf7, 0x21, 0xfd, 0x4e,
0495     0x93, 0x0a, 0x7b, 0x41, 0x83, 0x68, 0xfb, 0x57,
0496     0x51, 0x76, 0x34, 0xa9, 0x6c, 0x00, 0xaa, 0x4f,
0497     0x66, 0x65, 0x98, 0x4a, 0x4f, 0xa3, 0xa0, 0xef,
0498     0x69, 0x3f, 0xe3, 0x1c, 0x92, 0x8c, 0xfd, 0xd8,
0499     0xe8, 0xde, 0x7c, 0x7f, 0x3e, 0x84, 0x8e, 0x69,
0500     0x3c, 0xf1, 0xf2, 0x05, 0x46, 0xdc, 0x2f, 0x9d,
0501     0x5e, 0x6e, 0x4c, 0xfb, 0xb5, 0x99, 0x2a, 0x59,
0502     0x63, 0xc1, 0x34, 0xbc, 0x57, 0xc0, 0x0d, 0xb9,
0503     0x61, 0x25, 0xf3, 0x33, 0x23, 0x51, 0xb6, 0x0d,
0504     0x07, 0xa6, 0xab, 0x94, 0x4a, 0xb7, 0x2a, 0xea,
0505     0xee, 0xac, 0xa3, 0xc3, 0x04, 0x8b, 0x0e, 0x56,
0506     0xfe, 0x44, 0xa7, 0x39, 0xe2, 0xed, 0xed, 0xb4,
0507     0x22, 0x2b, 0xac, 0x12, 0x32, 0x28, 0x91, 0xd8,
0508     0xa5, 0xab, 0xff, 0x5f, 0xe0, 0x4b, 0xda, 0x78,
0509     0x17, 0xda, 0xf1, 0x01, 0x5b, 0xcd, 0xe2, 0x5f,
0510     0x50, 0x45, 0x73, 0x2b, 0xe4, 0x76, 0x77, 0xf4,
0511     0x64, 0x1d, 0x43, 0xfb, 0x84, 0x7a, 0xea, 0x91,
0512     0xae, 0xf9, 0x9e, 0xb7, 0xb4, 0xb0, 0x91, 0x5f,
0513     0x16, 0x35, 0x9a, 0x11, 0xb8, 0xc7, 0xc1, 0x8c,
0514     0xc6, 0x10, 0x8d, 0x2f, 0x63, 0x4a, 0xa7, 0x57,
0515     0x3a, 0x51, 0xd6, 0x32, 0x2d, 0x64, 0x72, 0xd4,
0516     0x66, 0xdc, 0x10, 0xa6, 0x67, 0xd6, 0x04, 0x23,
0517     0x9d, 0x0a, 0x11, 0x77, 0xdd, 0x37, 0x94, 0x17,
0518     0x3c, 0xbf, 0x8b, 0x65, 0xb0, 0x2e, 0x5e, 0x66,
0519     0x47, 0x64, 0xac, 0xdd, 0xf0, 0x84, 0xfd, 0x39,
0520     0xfa, 0x15, 0x5d, 0xef, 0xae, 0xca, 0xc1, 0x36,
0521     0xa7, 0x5c, 0xbf, 0xc7, 0x08, 0xc2, 0x66, 0x00,
0522     0x74, 0x74, 0x4e, 0x27, 0x3f, 0x55, 0x8a, 0xb7,
0523     0x38, 0x66, 0x83, 0x6d, 0xcf, 0x99, 0x9e, 0x60,
0524     0x8f, 0xdd, 0x2e, 0x62, 0x22, 0x0e, 0xef, 0x0c,
0525     0x98, 0xa7, 0x85, 0x74, 0x3b, 0x9d, 0xec, 0x9e,
0526     0xa9, 0x19, 0x72, 0xa5, 0x7f, 0x2c, 0x39, 0xb7,
0527     0x7d, 0xb7, 0xf1, 0x12, 0x65, 0x27, 0x4b, 0x5a,
0528     0xde, 0x17, 0xfe, 0xad, 0x44, 0xf3, 0x20, 0x4d,
0529     0xfd, 0xe4, 0x1f, 0xb5, 0x81, 0xb0, 0x36, 0x37,
0530     0x08, 0x6f, 0xc3, 0x0c, 0xe9, 0x85, 0x98, 0x82,
0531     0xa9, 0x62, 0x0c, 0xc4, 0x97, 0xc0, 0x50, 0xc8,
0532     0xa7, 0x3c, 0x50, 0x9f, 0x43, 0xb9, 0xcd, 0x5e,
0533     0x4d, 0xfa, 0x1c, 0x4b, 0x0b, 0xa9, 0x98, 0x85,
0534     0x38, 0x92, 0xac, 0x8d, 0xe4, 0xad, 0x9b, 0x98,
0535     0xab, 0xd9, 0x38, 0xac, 0x62, 0x52, 0xa3, 0x22,
0536     0x63, 0x0f, 0xbf, 0x95, 0x48, 0xdf, 0x69, 0xe7,
0537     0x8b, 0x33, 0xd5, 0xb2, 0xbd, 0x05, 0x49, 0x49,
0538     0x9d, 0x57, 0x73, 0x19, 0x33, 0xae, 0xfa, 0x33,
0539     0xf1, 0x19, 0xa8, 0x80, 0xce, 0x04, 0x9f, 0xbc,
0540     0x1d, 0x65, 0x82, 0x1b, 0xe5, 0x3a, 0x51, 0xc8,
0541     0x1c, 0x21, 0xe3, 0x5d, 0xf3, 0x7d, 0x9b, 0x2f,
0542     0x2c, 0x1d, 0x4a, 0x7f, 0x9b, 0x68, 0x35, 0xa3,
0543     0xb2, 0x50, 0xf7, 0x62, 0x79, 0xcd, 0xf4, 0x98,
0544     0x4f, 0xe5, 0x63, 0x7c, 0x3e, 0x45, 0x31, 0x8c,
0545     0x16, 0xa0, 0x12, 0xc8, 0x58, 0xce, 0x39, 0xa6,
0546     0xbc, 0x54, 0xdb, 0xc5, 0xe0, 0xd5, 0xba, 0xbc,
0547     0xb9, 0x04, 0xf4, 0x8d, 0xe8, 0x2f, 0x15, 0x9d,
0548 };
0549 
0550 /* 100 test cases */
0551 static struct crc_test {
0552     u32 crc;    /* random starting crc */
0553     u32 start;  /* random 6 bit offset in buf */
0554     u32 length; /* random 11 bit length of test */
0555     u32 crc_le; /* expected crc32_le result */
0556     u32 crc_be; /* expected crc32_be result */
0557     u32 crc32c_le;  /* expected crc32c_le result */
0558 } const test[] __initconst =
0559 {
0560     {0x674bf11d, 0x00000038, 0x00000542, 0x0af6d466, 0xd8b6e4c1, 0xf6e93d6c},
0561     {0x35c672c6, 0x0000003a, 0x000001aa, 0xc6d3dfba, 0x28aaf3ad, 0x0fe92aca},
0562     {0x496da28e, 0x00000039, 0x000005af, 0xd933660f, 0x5d57e81f, 0x52e1ebb8},
0563     {0x09a9b90e, 0x00000027, 0x000001f8, 0xb45fe007, 0xf45fca9a, 0x0798af9a},
0564     {0xdc97e5a9, 0x00000025, 0x000003b6, 0xf81a3562, 0xe0126ba2, 0x18eb3152},
0565     {0x47c58900, 0x0000000a, 0x000000b9, 0x8e58eccf, 0xf3afc793, 0xd00d08c7},
0566     {0x292561e8, 0x0000000c, 0x00000403, 0xa2ba8aaf, 0x0b797aed, 0x8ba966bc},
0567     {0x415037f6, 0x00000003, 0x00000676, 0xa17d52e8, 0x7f0fdf35, 0x11d694a2},
0568     {0x3466e707, 0x00000026, 0x00000042, 0x258319be, 0x75c484a2, 0x6ab3208d},
0569     {0xafd1281b, 0x00000023, 0x000002ee, 0x4428eaf8, 0x06c7ad10, 0xba4603c5},
0570     {0xd3857b18, 0x00000028, 0x000004a2, 0x5c430821, 0xb062b7cb, 0xe6071c6f},
0571     {0x1d825a8f, 0x0000002b, 0x0000050b, 0xd2c45f0c, 0xd68634e0, 0x179ec30a},
0572     {0x5033e3bc, 0x0000000b, 0x00000078, 0xa3ea4113, 0xac6d31fb, 0x0903beb8},
0573     {0x94f1fb5e, 0x0000000f, 0x000003a2, 0xfbfc50b1, 0x3cfe50ed, 0x6a7cb4fa},
0574     {0xc9a0fe14, 0x00000009, 0x00000473, 0x5fb61894, 0x87070591, 0xdb535801},
0575     {0x88a034b1, 0x0000001c, 0x000005ad, 0xc1b16053, 0x46f95c67, 0x92bed597},
0576     {0xf0f72239, 0x00000020, 0x0000026d, 0xa6fa58f3, 0xf8c2c1dd, 0x192a3f1b},
0577     {0xcc20a5e3, 0x0000003b, 0x0000067a, 0x7740185a, 0x308b979a, 0xccbaec1a},
0578     {0xce589c95, 0x0000002b, 0x00000641, 0xd055e987, 0x40aae25b, 0x7eabae4d},
0579     {0x78edc885, 0x00000035, 0x000005be, 0xa39cb14b, 0x035b0d1f, 0x28c72982},
0580     {0x9d40a377, 0x0000003b, 0x00000038, 0x1f47ccd2, 0x197fbc9d, 0xc3cd4d18},
0581     {0x703d0e01, 0x0000003c, 0x000006f1, 0x88735e7c, 0xfed57c5a, 0xbca8f0e7},
0582     {0x776bf505, 0x0000000f, 0x000005b2, 0x5cc4fc01, 0xf32efb97, 0x713f60b3},
0583     {0x4a3e7854, 0x00000027, 0x000004b8, 0x8d923c82, 0x0cbfb4a2, 0xebd08fd5},
0584     {0x209172dd, 0x0000003b, 0x00000356, 0xb89e9c2b, 0xd7868138, 0x64406c59},
0585     {0x3ba4cc5b, 0x0000002f, 0x00000203, 0xe51601a9, 0x5b2a1032, 0x7421890e},
0586     {0xfc62f297, 0x00000000, 0x00000079, 0x71a8e1a2, 0x5d88685f, 0xe9347603},
0587     {0x64280b8b, 0x00000016, 0x000007ab, 0x0fa7a30c, 0xda3a455f, 0x1bef9060},
0588     {0x97dd724b, 0x00000033, 0x000007ad, 0x5788b2f4, 0xd7326d32, 0x34720072},
0589     {0x61394b52, 0x00000035, 0x00000571, 0xc66525f1, 0xcabe7fef, 0x48310f59},
0590     {0x29b4faff, 0x00000024, 0x0000006e, 0xca13751e, 0x993648e0, 0x783a4213},
0591     {0x29bfb1dc, 0x0000000b, 0x00000244, 0x436c43f7, 0x429f7a59, 0x9e8efd41},
0592     {0x86ae934b, 0x00000035, 0x00000104, 0x0760ec93, 0x9cf7d0f4, 0xfc3d34a5},
0593     {0xc4c1024e, 0x0000002e, 0x000006b1, 0x6516a3ec, 0x19321f9c, 0x17a52ae2},
0594     {0x3287a80a, 0x00000026, 0x00000496, 0x0b257eb1, 0x754ebd51, 0x886d935a},
0595     {0xa4db423e, 0x00000023, 0x0000045d, 0x9b3a66dc, 0x873e9f11, 0xeaaeaeb2},
0596     {0x7a1078df, 0x00000015, 0x0000014a, 0x8c2484c5, 0x6a628659, 0x8e900a4b},
0597     {0x6048bd5b, 0x00000006, 0x0000006a, 0x897e3559, 0xac9961af, 0xd74662b1},
0598     {0xd8f9ea20, 0x0000003d, 0x00000277, 0x60eb905b, 0xed2aaf99, 0xd26752ba},
0599     {0xea5ec3b4, 0x0000002a, 0x000004fe, 0x869965dc, 0x6c1f833b, 0x8b1fcd62},
0600     {0x2dfb005d, 0x00000016, 0x00000345, 0x6a3b117e, 0xf05e8521, 0xf54342fe},
0601     {0x5a214ade, 0x00000020, 0x000005b6, 0x467f70be, 0xcb22ccd3, 0x5b95b988},
0602     {0xf0ab9cca, 0x00000032, 0x00000515, 0xed223df3, 0x7f3ef01d, 0x2e1176be},
0603     {0x91b444f9, 0x0000002e, 0x000007f8, 0x84e9a983, 0x5676756f, 0x66120546},
0604     {0x1b5d2ddb, 0x0000002e, 0x0000012c, 0xba638c4c, 0x3f42047b, 0xf256a5cc},
0605     {0xd824d1bb, 0x0000003a, 0x000007b5, 0x6288653b, 0x3a3ebea0, 0x4af1dd69},
0606     {0x0470180c, 0x00000034, 0x000001f0, 0x9d5b80d6, 0x3de08195, 0x56f0a04a},
0607     {0xffaa3a3f, 0x00000036, 0x00000299, 0xf3a82ab8, 0x53e0c13d, 0x74f6b6b2},
0608     {0x6406cfeb, 0x00000023, 0x00000600, 0xa920b8e8, 0xe4e2acf4, 0x085951fd},
0609     {0xb24aaa38, 0x0000003e, 0x000004a1, 0x657cc328, 0x5077b2c3, 0xc65387eb},
0610     {0x58b2ab7c, 0x00000039, 0x000002b4, 0x3a17ee7e, 0x9dcb3643, 0x1ca9257b},
0611     {0x3db85970, 0x00000006, 0x000002b6, 0x95268b59, 0xb9812c10, 0xfd196d76},
0612     {0x857830c5, 0x00000003, 0x00000590, 0x4ef439d5, 0xf042161d, 0x5ef88339},
0613     {0xe1fcd978, 0x0000003e, 0x000007d8, 0xae8d8699, 0xce0a1ef5, 0x2c3714d9},
0614     {0xb982a768, 0x00000016, 0x000006e0, 0x62fad3df, 0x5f8a067b, 0x58576548},
0615     {0x1d581ce8, 0x0000001e, 0x0000058b, 0xf0f5da53, 0x26e39eee, 0xfd7c57de},
0616     {0x2456719b, 0x00000025, 0x00000503, 0x4296ac64, 0xd50e4c14, 0xd5fedd59},
0617     {0xfae6d8f2, 0x00000000, 0x0000055d, 0x057fdf2e, 0x2a31391a, 0x1cc3b17b},
0618     {0xcba828e3, 0x00000039, 0x000002ce, 0xe3f22351, 0x8f00877b, 0x270eed73},
0619     {0x13d25952, 0x0000000a, 0x0000072d, 0x76d4b4cc, 0x5eb67ec3, 0x91ecbb11},
0620     {0x0342be3f, 0x00000015, 0x00000599, 0xec75d9f1, 0x9d4d2826, 0x05ed8d0c},
0621     {0xeaa344e0, 0x00000014, 0x000004d8, 0x72a4c981, 0x2064ea06, 0x0b09ad5b},
0622     {0xbbb52021, 0x0000003b, 0x00000272, 0x04af99fc, 0xaf042d35, 0xf8d511fb},
0623     {0xb66384dc, 0x0000001d, 0x000007fc, 0xd7629116, 0x782bd801, 0x5ad832cc},
0624     {0x616c01b6, 0x00000022, 0x000002c8, 0x5b1dab30, 0x783ce7d2, 0x1214d196},
0625     {0xce2bdaad, 0x00000016, 0x0000062a, 0x932535c8, 0x3f02926d, 0x5747218a},
0626     {0x00fe84d7, 0x00000005, 0x00000205, 0x850e50aa, 0x753d649c, 0xde8f14de},
0627     {0xbebdcb4c, 0x00000006, 0x0000055d, 0xbeaa37a2, 0x2d8c9eba, 0x3563b7b9},
0628     {0xd8b1a02a, 0x00000010, 0x00000387, 0x5017d2fc, 0x503541a5, 0x071475d0},
0629     {0x3b96cad2, 0x00000036, 0x00000347, 0x1d2372ae, 0x926cd90b, 0x54c79d60},
0630     {0xc94c1ed7, 0x00000005, 0x0000038b, 0x9e9fdb22, 0x144a9178, 0x4c53eee6},
0631     {0x1aad454e, 0x00000025, 0x000002b2, 0xc3f6315c, 0x5c7a35b3, 0x10137a3c},
0632     {0xa4fec9a6, 0x00000000, 0x000006d6, 0x90be5080, 0xa4107605, 0xaa9d6c73},
0633     {0x1bbe71e2, 0x0000001f, 0x000002fd, 0x4e504c3b, 0x284ccaf1, 0xb63d23e7},
0634     {0x4201c7e4, 0x00000002, 0x000002b7, 0x7822e3f9, 0x0cc912a9, 0x7f53e9cf},
0635     {0x23fddc96, 0x00000003, 0x00000627, 0x8a385125, 0x07767e78, 0x13c1cd83},
0636     {0xd82ba25c, 0x00000016, 0x0000063e, 0x98e4148a, 0x283330c9, 0x49ff5867},
0637     {0x786f2032, 0x0000002d, 0x0000060f, 0xf201600a, 0xf561bfcd, 0x8467f211},
0638     {0xfebe4e1f, 0x0000002a, 0x000004f2, 0x95e51961, 0xfd80dcab, 0x3f9683b2},
0639     {0x1a6e0a39, 0x00000008, 0x00000672, 0x8af6c2a5, 0x78dd84cb, 0x76a3f874},
0640     {0x56000ab8, 0x0000000e, 0x000000e5, 0x36bacb8f, 0x22ee1f77, 0x863b702f},
0641     {0x4717fe0c, 0x00000000, 0x000006ec, 0x8439f342, 0x5c8e03da, 0xdc6c58ff},
0642     {0xd5d5d68e, 0x0000003c, 0x000003a3, 0x46fff083, 0x177d1b39, 0x0622cc95},
0643     {0xc25dd6c6, 0x00000024, 0x000006c0, 0x5ceb8eb4, 0x892b0d16, 0xe85605cd},
0644     {0xe9b11300, 0x00000023, 0x00000683, 0x07a5d59a, 0x6c6a3208, 0x31da5f06},
0645     {0x95cd285e, 0x00000001, 0x00000047, 0x7b3a4368, 0x0202c07e, 0xa1f2e784},
0646     {0xd9245a25, 0x0000001e, 0x000003a6, 0xd33c1841, 0x1936c0d5, 0xb07cc616},
0647     {0x103279db, 0x00000006, 0x0000039b, 0xca09b8a0, 0x77d62892, 0xbf943b6c},
0648     {0x1cba3172, 0x00000027, 0x000001c8, 0xcb377194, 0xebe682db, 0x2c01af1c},
0649     {0x8f613739, 0x0000000c, 0x000001df, 0xb4b0bc87, 0x7710bd43, 0x0fe5f56d},
0650     {0x1c6aa90d, 0x0000001b, 0x0000053c, 0x70559245, 0xda7894ac, 0xf8943b2d},
0651     {0xaabe5b93, 0x0000003d, 0x00000715, 0xcdbf42fa, 0x0c3b99e7, 0xe4d89272},
0652     {0xf15dd038, 0x00000006, 0x000006db, 0x6e104aea, 0x8d5967f2, 0x7c2f6bbb},
0653     {0x584dd49c, 0x00000020, 0x000007bc, 0x36b6cfd6, 0xad4e23b2, 0xabbf388b},
0654     {0x5d8c9506, 0x00000020, 0x00000470, 0x4c62378e, 0x31d92640, 0x1dca1f4e},
0655     {0xb80d17b0, 0x00000032, 0x00000346, 0x22a5bb88, 0x9a7ec89f, 0x5c170e23},
0656     {0xdaf0592e, 0x00000023, 0x000007b0, 0x3cab3f99, 0x9b1fdd99, 0xc0e9d672},
0657     {0x4793cc85, 0x0000000d, 0x00000706, 0xe82e04f6, 0xed3db6b7, 0xc18bdc86},
0658     {0x82ebf64e, 0x00000009, 0x000007c3, 0x69d590a9, 0x9efa8499, 0xa874fcdd},
0659     {0xb18a0319, 0x00000026, 0x000007db, 0x1cf98dcc, 0x8fa9ad6a, 0x9dc0bb48},
0660 };
0661 
0662 #include <linux/time.h>
0663 
0664 static int __init crc32c_test(void)
0665 {
0666     int i;
0667     int errors = 0;
0668     int bytes = 0;
0669     u64 nsec;
0670     unsigned long flags;
0671 
0672     /* keep static to prevent cache warming code from
0673      * getting eliminated by the compiler */
0674     static u32 crc;
0675 
0676     /* pre-warm the cache */
0677     for (i = 0; i < 100; i++) {
0678         bytes += test[i].length;
0679 
0680         crc ^= __crc32c_le(test[i].crc, test_buf +
0681             test[i].start, test[i].length);
0682     }
0683 
0684     /* reduce OS noise */
0685     local_irq_save(flags);
0686 
0687     nsec = ktime_get_ns();
0688     for (i = 0; i < 100; i++) {
0689         if (test[i].crc32c_le != __crc32c_le(test[i].crc, test_buf +
0690             test[i].start, test[i].length))
0691             errors++;
0692     }
0693     nsec = ktime_get_ns() - nsec;
0694 
0695     local_irq_restore(flags);
0696 
0697     pr_info("crc32c: CRC_LE_BITS = %d\n", CRC_LE_BITS);
0698 
0699     if (errors)
0700         pr_warn("crc32c: %d self tests failed\n", errors);
0701     else {
0702         pr_info("crc32c: self tests passed, processed %d bytes in %lld nsec\n",
0703             bytes, nsec);
0704     }
0705 
0706     return 0;
0707 }
0708 
0709 static int __init crc32c_combine_test(void)
0710 {
0711     int i, j;
0712     int errors = 0, runs = 0;
0713 
0714     for (i = 0; i < 10; i++) {
0715         u32 crc_full;
0716 
0717         crc_full = __crc32c_le(test[i].crc, test_buf + test[i].start,
0718                        test[i].length);
0719         for (j = 0; j <= test[i].length; ++j) {
0720             u32 crc1, crc2;
0721             u32 len1 = j, len2 = test[i].length - j;
0722 
0723             crc1 = __crc32c_le(test[i].crc, test_buf +
0724                        test[i].start, len1);
0725             crc2 = __crc32c_le(0, test_buf + test[i].start +
0726                        len1, len2);
0727 
0728             if (!(crc_full == __crc32c_le_combine(crc1, crc2, len2) &&
0729                   crc_full == test[i].crc32c_le))
0730                 errors++;
0731             runs++;
0732             cond_resched();
0733         }
0734     }
0735 
0736     if (errors)
0737         pr_warn("crc32c_combine: %d/%d self tests failed\n", errors, runs);
0738     else
0739         pr_info("crc32c_combine: %d self tests passed\n", runs);
0740 
0741     return 0;
0742 }
0743 
0744 static int __init crc32_test(void)
0745 {
0746     int i;
0747     int errors = 0;
0748     int bytes = 0;
0749     u64 nsec;
0750     unsigned long flags;
0751 
0752     /* keep static to prevent cache warming code from
0753      * getting eliminated by the compiler */
0754     static u32 crc;
0755 
0756     /* pre-warm the cache */
0757     for (i = 0; i < 100; i++) {
0758         bytes += 2*test[i].length;
0759 
0760         crc ^= crc32_le(test[i].crc, test_buf +
0761             test[i].start, test[i].length);
0762 
0763         crc ^= crc32_be(test[i].crc, test_buf +
0764             test[i].start, test[i].length);
0765     }
0766 
0767     /* reduce OS noise */
0768     local_irq_save(flags);
0769 
0770     nsec = ktime_get_ns();
0771     for (i = 0; i < 100; i++) {
0772         if (test[i].crc_le != crc32_le(test[i].crc, test_buf +
0773             test[i].start, test[i].length))
0774             errors++;
0775 
0776         if (test[i].crc_be != crc32_be(test[i].crc, test_buf +
0777             test[i].start, test[i].length))
0778             errors++;
0779     }
0780     nsec = ktime_get_ns() - nsec;
0781 
0782     local_irq_restore(flags);
0783 
0784     pr_info("crc32: CRC_LE_BITS = %d, CRC_BE BITS = %d\n",
0785          CRC_LE_BITS, CRC_BE_BITS);
0786 
0787     if (errors)
0788         pr_warn("crc32: %d self tests failed\n", errors);
0789     else {
0790         pr_info("crc32: self tests passed, processed %d bytes in %lld nsec\n",
0791             bytes, nsec);
0792     }
0793 
0794     return 0;
0795 }
0796 
0797 static int __init crc32_combine_test(void)
0798 {
0799     int i, j;
0800     int errors = 0, runs = 0;
0801 
0802     for (i = 0; i < 10; i++) {
0803         u32 crc_full;
0804 
0805         crc_full = crc32_le(test[i].crc, test_buf + test[i].start,
0806                     test[i].length);
0807         for (j = 0; j <= test[i].length; ++j) {
0808             u32 crc1, crc2;
0809             u32 len1 = j, len2 = test[i].length - j;
0810 
0811             crc1 = crc32_le(test[i].crc, test_buf +
0812                     test[i].start, len1);
0813             crc2 = crc32_le(0, test_buf + test[i].start +
0814                     len1, len2);
0815 
0816             if (!(crc_full == crc32_le_combine(crc1, crc2, len2) &&
0817                   crc_full == test[i].crc_le))
0818                 errors++;
0819             runs++;
0820             cond_resched();
0821         }
0822     }
0823 
0824     if (errors)
0825         pr_warn("crc32_combine: %d/%d self tests failed\n", errors, runs);
0826     else
0827         pr_info("crc32_combine: %d self tests passed\n", runs);
0828 
0829     return 0;
0830 }
0831 
0832 static int __init crc32test_init(void)
0833 {
0834     crc32_test();
0835     crc32c_test();
0836 
0837     crc32_combine_test();
0838     crc32c_combine_test();
0839 
0840     return 0;
0841 }
0842 
0843 static void __exit crc32_exit(void)
0844 {
0845 }
0846 
0847 module_init(crc32test_init);
0848 module_exit(crc32_exit);
0849 
0850 MODULE_AUTHOR("Matt Domsch <Matt_Domsch@dell.com>");
0851 MODULE_DESCRIPTION("CRC32 selftest");
0852 MODULE_LICENSE("GPL");