// SPDX-License-Identifier: GPL-2.0-only
/*
* T10 Data Integrity Field CRC16 calculation
*
* Copyright (c) 2007 Oracle Corporation. All rights reserved.
* Written by Martin K. Petersen <martin.petersen@oracle.com>
*/
#include <linux/crc-t10dif.h>
#include <linux/export.h>
#include <linux/module.h>
#include <linux/types.h>
/*
* Table generated using the following polynomial:
* x^16 + x^15 + x^11 + x^9 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1
* gt: 0x8bb7
*/
static const u16 t10_dif_crc_table[256 ] = {
0 x0000, 0 x8BB7, 0 x9CD9, 0 x176E, 0 xB205, 0 x39B2, 0 x2EDC, 0 xA56B,
0 xEFBD, 0 x640A, 0 x7364, 0 xF8D3, 0 x5DB8, 0 xD60F, 0 xC161, 0 x4AD6,
0 x54CD, 0 xDF7A, 0 xC814, 0 x43A3, 0 xE6C8, 0 x6D7F, 0 x7A11, 0 xF1A6,
0 xBB70, 0 x30C7, 0 x27A9, 0 xAC1E, 0 x0975, 0 x82C2, 0 x95AC, 0 x1E1B,
0 xA99A, 0 x222D, 0 x3543, 0 xBEF4, 0 x1B9F, 0 x9028, 0 x8746, 0 x0CF1,
0 x4627, 0 xCD90, 0 xDAFE, 0 x5149, 0 xF422, 0 x7F95, 0 x68FB, 0 xE34C,
0 xFD57, 0 x76E0, 0 x618E, 0 xEA39, 0 x4F52, 0 xC4E5, 0 xD38B, 0 x583C,
0 x12EA, 0 x995D, 0 x8E33, 0 x0584, 0 xA0EF, 0 x2B58, 0 x3C36, 0 xB781,
0 xD883, 0 x5334, 0 x445A, 0 xCFED, 0 x6A86, 0 xE131, 0 xF65F, 0 x7DE8,
0 x373E, 0 xBC89, 0 xABE7, 0 x2050, 0 x853B, 0 x0E8C, 0 x19E2, 0 x9255,
0 x8C4E, 0 x07F9, 0 x1097, 0 x9B20, 0 x3E4B, 0 xB5FC, 0 xA292, 0 x2925,
0 x63F3, 0 xE844, 0 xFF2A, 0 x749D, 0 xD1F6, 0 x5A41, 0 x4D2F, 0 xC698,
0 x7119, 0 xFAAE, 0 xEDC0, 0 x6677, 0 xC31C, 0 x48AB, 0 x5FC5, 0 xD472,
0 x9EA4, 0 x1513, 0 x027D, 0 x89CA, 0 x2CA1, 0 xA716, 0 xB078, 0 x3BCF,
0 x25D4, 0 xAE63, 0 xB90D, 0 x32BA, 0 x97D1, 0 x1C66, 0 x0B08, 0 x80BF,
0 xCA69, 0 x41DE, 0 x56B0, 0 xDD07, 0 x786C, 0 xF3DB, 0 xE4B5, 0 x6F02,
0 x3AB1, 0 xB106, 0 xA668, 0 x2DDF, 0 x88B4, 0 x0303, 0 x146D, 0 x9FDA,
0 xD50C, 0 x5EBB, 0 x49D5, 0 xC262, 0 x6709, 0 xECBE, 0 xFBD0, 0 x7067,
0 x6E7C, 0 xE5CB, 0 xF2A5, 0 x7912, 0 xDC79, 0 x57CE, 0 x40A0, 0 xCB17,
0 x81C1, 0 x0A76, 0 x1D18, 0 x96AF, 0 x33C4, 0 xB873, 0 xAF1D, 0 x24AA,
0 x932B, 0 x189C, 0 x0FF2, 0 x8445, 0 x212E, 0 xAA99, 0 xBDF7, 0 x3640,
0 x7C96, 0 xF721, 0 xE04F, 0 x6BF8, 0 xCE93, 0 x4524, 0 x524A, 0 xD9FD,
0 xC7E6, 0 x4C51, 0 x5B3F, 0 xD088, 0 x75E3, 0 xFE54, 0 xE93A, 0 x628D,
0 x285B, 0 xA3EC, 0 xB482, 0 x3F35, 0 x9A5E, 0 x11E9, 0 x0687, 0 x8D30,
0 xE232, 0 x6985, 0 x7EEB, 0 xF55C, 0 x5037, 0 xDB80, 0 xCCEE, 0 x4759,
0 x0D8F, 0 x8638, 0 x9156, 0 x1AE1, 0 xBF8A, 0 x343D, 0 x2353, 0 xA8E4,
0 xB6FF, 0 x3D48, 0 x2A26, 0 xA191, 0 x04FA, 0 x8F4D, 0 x9823, 0 x1394,
0 x5942, 0 xD2F5, 0 xC59B, 0 x4E2C, 0 xEB47, 0 x60F0, 0 x779E, 0 xFC29,
0 x4BA8, 0 xC01F, 0 xD771, 0 x5CC6, 0 xF9AD, 0 x721A, 0 x6574, 0 xEEC3,
0 xA415, 0 x2FA2, 0 x38CC, 0 xB37B, 0 x1610, 0 x9DA7, 0 x8AC9, 0 x017E,
0 x1F65, 0 x94D2, 0 x83BC, 0 x080B, 0 xAD60, 0 x26D7, 0 x31B9, 0 xBA0E,
0 xF0D8, 0 x7B6F, 0 x6C01, 0 xE7B6, 0 x42DD, 0 xC96A, 0 xDE04, 0 x55B3
};
static inline u16 __maybe_unused
crc_t10dif_generic(u16 crc, const u8 *p, size_t len)
{
while (len--)
crc = (crc << 8 ) ^ t10_dif_crc_table[(crc >> 8 ) ^ *p++];
return crc;
}
#ifdef CONFIG_CRC_T10DIF_ARCH
#include "crc-t10dif.h" /* $(SRCARCH)/crc-t10dif.h */
#else
#define crc_t10dif_arch crc_t10dif_generic
#endif
u16 crc_t10dif_update(u16 crc, const u8 *p, size_t len)
{
return crc_t10dif_arch(crc, p, len);
}
EXPORT_SYMBOL(crc_t10dif_update);
#ifdef crc_t10dif_mod_init_arch
static int __init crc_t10dif_mod_init(void )
{
crc_t10dif_mod_init_arch();
return 0 ;
}
subsys_initcall(crc_t10dif_mod_init);
static void __exit crc_t10dif_mod_exit(void )
{
}
module_exit(crc_t10dif_mod_exit);
#endif
MODULE_DESCRIPTION("CRC-T10DIF library functions" );
MODULE_LICENSE("GPL" );
Messung V0.5 in Prozent C=94 H=94 G=93