Vendor Unique iSCSI CRC32C
264 T10000: Interface Reference Manual August 2016
int align;
int length;
/* calc crc for unaligned memory addresses */
if ((align = ((intptr_t)addr & CRC32C_ALIGN)) > 0) {
align = CRC32C_SIZE - align;
align = (align > len) ? len : align;
crc = calc_crc32c_sw((char *)addr, align, crc);
crc ^= CRC32C_XOR;
addr = &addr[align];
len -= align;
}
/* calc crc for word aligned memory addresses */
if ((length = len / CRC32C_SIZE) > 0) {
uint64_t lcrc = crc;
uint64_t *data = (uint64_t *)addr;
_t4_crc32c(&lcrc, data, length);
crc = (uint32_t)lcrc;
addr = (uint8_t *)&data[length];
len -= length * CRC32C_SIZE;
}
/* calculate crc for remaining data */
if (len > 0) {
crc = calc_crc32c_sw((char *)addr, len, crc);
return (crc);
}
return (crc ^ CRC32C_XOR);
}
#endif