1 /* 1 /* 2 * Cryptographic API. 2 * Cryptographic API. 3 * 3 * 4 * T10 Data Integrity Field CRC16 Crypto Trans 4 * T10 Data Integrity Field CRC16 Crypto Transform 5 * 5 * 6 * Copyright (c) 2007 Oracle Corporation. All 6 * Copyright (c) 2007 Oracle Corporation. All rights reserved. 7 * Written by Martin K. Petersen <martin.peter 7 * Written by Martin K. Petersen <martin.petersen@oracle.com> 8 * Copyright (C) 2013 Intel Corporation 8 * Copyright (C) 2013 Intel Corporation 9 * Author: Tim Chen <tim.c.chen@linux.intel.co 9 * Author: Tim Chen <tim.c.chen@linux.intel.com> 10 * 10 * 11 * This program is free software; you can redi 11 * This program is free software; you can redistribute it and/or modify it 12 * under the terms of the GNU General Public L 12 * under the terms of the GNU General Public License as published by the Free 13 * Software Foundation; either version 2 of th 13 * Software Foundation; either version 2 of the License, or (at your option) 14 * any later version. 14 * any later version. 15 * 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT W 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMIT 17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR P 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTH 19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 20 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER L 20 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 21 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARIS 21 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22 * CONNECTION WITH THE SOFTWARE OR THE USE OR 22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 * SOFTWARE. 23 * SOFTWARE. 24 * 24 * 25 */ 25 */ 26 26 27 #include <linux/crc-t10dif.h> 27 #include <linux/crc-t10dif.h> 28 #include <linux/module.h> 28 #include <linux/module.h> 29 #include <linux/kernel.h> 29 #include <linux/kernel.h> 30 30 31 /* Table generated using the following polynom 31 /* Table generated using the following polynomium: 32 * x^16 + x^15 + x^11 + x^9 + x^8 + x^7 + x^5 32 * x^16 + x^15 + x^11 + x^9 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1 33 * gt: 0x8bb7 33 * gt: 0x8bb7 34 */ 34 */ 35 static const __u16 t10_dif_crc_table[256] = { 35 static const __u16 t10_dif_crc_table[256] = { 36 0x0000, 0x8BB7, 0x9CD9, 0x176E, 0xB205 36 0x0000, 0x8BB7, 0x9CD9, 0x176E, 0xB205, 0x39B2, 0x2EDC, 0xA56B, 37 0xEFBD, 0x640A, 0x7364, 0xF8D3, 0x5DB8 37 0xEFBD, 0x640A, 0x7364, 0xF8D3, 0x5DB8, 0xD60F, 0xC161, 0x4AD6, 38 0x54CD, 0xDF7A, 0xC814, 0x43A3, 0xE6C8 38 0x54CD, 0xDF7A, 0xC814, 0x43A3, 0xE6C8, 0x6D7F, 0x7A11, 0xF1A6, 39 0xBB70, 0x30C7, 0x27A9, 0xAC1E, 0x0975 39 0xBB70, 0x30C7, 0x27A9, 0xAC1E, 0x0975, 0x82C2, 0x95AC, 0x1E1B, 40 0xA99A, 0x222D, 0x3543, 0xBEF4, 0x1B9F 40 0xA99A, 0x222D, 0x3543, 0xBEF4, 0x1B9F, 0x9028, 0x8746, 0x0CF1, 41 0x4627, 0xCD90, 0xDAFE, 0x5149, 0xF422 41 0x4627, 0xCD90, 0xDAFE, 0x5149, 0xF422, 0x7F95, 0x68FB, 0xE34C, 42 0xFD57, 0x76E0, 0x618E, 0xEA39, 0x4F52 42 0xFD57, 0x76E0, 0x618E, 0xEA39, 0x4F52, 0xC4E5, 0xD38B, 0x583C, 43 0x12EA, 0x995D, 0x8E33, 0x0584, 0xA0EF 43 0x12EA, 0x995D, 0x8E33, 0x0584, 0xA0EF, 0x2B58, 0x3C36, 0xB781, 44 0xD883, 0x5334, 0x445A, 0xCFED, 0x6A86 44 0xD883, 0x5334, 0x445A, 0xCFED, 0x6A86, 0xE131, 0xF65F, 0x7DE8, 45 0x373E, 0xBC89, 0xABE7, 0x2050, 0x853B 45 0x373E, 0xBC89, 0xABE7, 0x2050, 0x853B, 0x0E8C, 0x19E2, 0x9255, 46 0x8C4E, 0x07F9, 0x1097, 0x9B20, 0x3E4B 46 0x8C4E, 0x07F9, 0x1097, 0x9B20, 0x3E4B, 0xB5FC, 0xA292, 0x2925, 47 0x63F3, 0xE844, 0xFF2A, 0x749D, 0xD1F6 47 0x63F3, 0xE844, 0xFF2A, 0x749D, 0xD1F6, 0x5A41, 0x4D2F, 0xC698, 48 0x7119, 0xFAAE, 0xEDC0, 0x6677, 0xC31C 48 0x7119, 0xFAAE, 0xEDC0, 0x6677, 0xC31C, 0x48AB, 0x5FC5, 0xD472, 49 0x9EA4, 0x1513, 0x027D, 0x89CA, 0x2CA1 49 0x9EA4, 0x1513, 0x027D, 0x89CA, 0x2CA1, 0xA716, 0xB078, 0x3BCF, 50 0x25D4, 0xAE63, 0xB90D, 0x32BA, 0x97D1 50 0x25D4, 0xAE63, 0xB90D, 0x32BA, 0x97D1, 0x1C66, 0x0B08, 0x80BF, 51 0xCA69, 0x41DE, 0x56B0, 0xDD07, 0x786C 51 0xCA69, 0x41DE, 0x56B0, 0xDD07, 0x786C, 0xF3DB, 0xE4B5, 0x6F02, 52 0x3AB1, 0xB106, 0xA668, 0x2DDF, 0x88B4 52 0x3AB1, 0xB106, 0xA668, 0x2DDF, 0x88B4, 0x0303, 0x146D, 0x9FDA, 53 0xD50C, 0x5EBB, 0x49D5, 0xC262, 0x6709 53 0xD50C, 0x5EBB, 0x49D5, 0xC262, 0x6709, 0xECBE, 0xFBD0, 0x7067, 54 0x6E7C, 0xE5CB, 0xF2A5, 0x7912, 0xDC79 54 0x6E7C, 0xE5CB, 0xF2A5, 0x7912, 0xDC79, 0x57CE, 0x40A0, 0xCB17, 55 0x81C1, 0x0A76, 0x1D18, 0x96AF, 0x33C4 55 0x81C1, 0x0A76, 0x1D18, 0x96AF, 0x33C4, 0xB873, 0xAF1D, 0x24AA, 56 0x932B, 0x189C, 0x0FF2, 0x8445, 0x212E 56 0x932B, 0x189C, 0x0FF2, 0x8445, 0x212E, 0xAA99, 0xBDF7, 0x3640, 57 0x7C96, 0xF721, 0xE04F, 0x6BF8, 0xCE93 57 0x7C96, 0xF721, 0xE04F, 0x6BF8, 0xCE93, 0x4524, 0x524A, 0xD9FD, 58 0xC7E6, 0x4C51, 0x5B3F, 0xD088, 0x75E3 58 0xC7E6, 0x4C51, 0x5B3F, 0xD088, 0x75E3, 0xFE54, 0xE93A, 0x628D, 59 0x285B, 0xA3EC, 0xB482, 0x3F35, 0x9A5E 59 0x285B, 0xA3EC, 0xB482, 0x3F35, 0x9A5E, 0x11E9, 0x0687, 0x8D30, 60 0xE232, 0x6985, 0x7EEB, 0xF55C, 0x5037 60 0xE232, 0x6985, 0x7EEB, 0xF55C, 0x5037, 0xDB80, 0xCCEE, 0x4759, 61 0x0D8F, 0x8638, 0x9156, 0x1AE1, 0xBF8A 61 0x0D8F, 0x8638, 0x9156, 0x1AE1, 0xBF8A, 0x343D, 0x2353, 0xA8E4, 62 0xB6FF, 0x3D48, 0x2A26, 0xA191, 0x04FA 62 0xB6FF, 0x3D48, 0x2A26, 0xA191, 0x04FA, 0x8F4D, 0x9823, 0x1394, 63 0x5942, 0xD2F5, 0xC59B, 0x4E2C, 0xEB47 63 0x5942, 0xD2F5, 0xC59B, 0x4E2C, 0xEB47, 0x60F0, 0x779E, 0xFC29, 64 0x4BA8, 0xC01F, 0xD771, 0x5CC6, 0xF9AD 64 0x4BA8, 0xC01F, 0xD771, 0x5CC6, 0xF9AD, 0x721A, 0x6574, 0xEEC3, 65 0xA415, 0x2FA2, 0x38CC, 0xB37B, 0x1610 65 0xA415, 0x2FA2, 0x38CC, 0xB37B, 0x1610, 0x9DA7, 0x8AC9, 0x017E, 66 0x1F65, 0x94D2, 0x83BC, 0x080B, 0xAD60 66 0x1F65, 0x94D2, 0x83BC, 0x080B, 0xAD60, 0x26D7, 0x31B9, 0xBA0E, 67 0xF0D8, 0x7B6F, 0x6C01, 0xE7B6, 0x42DD 67 0xF0D8, 0x7B6F, 0x6C01, 0xE7B6, 0x42DD, 0xC96A, 0xDE04, 0x55B3 68 }; 68 }; 69 69 70 __u16 crc_t10dif_generic(__u16 crc, const unsi 70 __u16 crc_t10dif_generic(__u16 crc, const unsigned char *buffer, size_t len) 71 { 71 { 72 unsigned int i; 72 unsigned int i; 73 73 74 for (i = 0 ; i < len ; i++) 74 for (i = 0 ; i < len ; i++) 75 crc = (crc << 8) ^ t10_dif_crc 75 crc = (crc << 8) ^ t10_dif_crc_table[((crc >> 8) ^ buffer[i]) & 0xff]; 76 76 77 return crc; 77 return crc; 78 } 78 } 79 EXPORT_SYMBOL(crc_t10dif_generic); 79 EXPORT_SYMBOL(crc_t10dif_generic); 80 80 81 MODULE_DESCRIPTION("T10 DIF CRC calculation co 81 MODULE_DESCRIPTION("T10 DIF CRC calculation common code"); 82 MODULE_LICENSE("GPL"); 82 MODULE_LICENSE("GPL"); 83 83
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.