blob: 6e7bd3375fc27f9e2abc6599604f13108f9f1a7d [file] [log] [blame]
/****************************************************************************
*
* Copyright (c) 2014 - 2016 Samsung Electronics Co., Ltd. All rights reserved
*
****************************************************************************/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/crc32.h>
#include <scsc/scsc_logring.h>
#include "fwimage.h"
int fwimage_check_fw_header_crc(char *fw, u32 hdr_length, u32 header_crc32)
{
u32 header_crc32_calculated;
/*
* The last 4-bytes are header CRC
*/
header_crc32_calculated = ether_crc(hdr_length - sizeof(u32), fw);
if (header_crc32_calculated != header_crc32) {
SCSC_TAG_ERR(FW_LOAD, "CRC32 doesn't match: header_crc32_calculated=%d header_crc32=%d\n",
header_crc32_calculated, header_crc32);
return -EINVAL;
}
SCSC_TAG_DEBUG(FW_LOAD, "CRC32 OK: header_crc32_calculated=%d header_crc32=%d\n",
header_crc32_calculated, header_crc32);
return 0;
}
int fwimage_check_fw_const_section_crc(char *fw, u32 const_crc32, u32 const_fw_length, u32 hdr_length)
{
u32 const_crc32_calculated;
const_crc32_calculated = ether_crc(const_fw_length - hdr_length, fw + hdr_length);
if (const_crc32_calculated != const_crc32) {
SCSC_TAG_ERR(FW_LOAD, "CRC32 doesn't match: const_crc32_calculated=%d const_crc32=%d\n",
const_crc32_calculated, const_crc32);
return -EINVAL;
}
SCSC_TAG_DEBUG(FW_LOAD, "CRC32 OK: const_crc32_calculated=%d const_crc32=%d\n",
const_crc32_calculated, const_crc32);
return 0;
}
int fwimage_check_fw_crc(char *fw, u32 fw_image_length, u32 hdr_length, u32 fw_crc32)
{
u32 fw_crc32_calculated;
fw_crc32_calculated = ether_crc(fw_image_length - hdr_length, fw + hdr_length);
if (fw_crc32_calculated != fw_crc32) {
SCSC_TAG_ERR(FW_LOAD, "CRC32 doesn't match: fw_crc32_calculated=%d fw_crc32=%d\n",
fw_crc32_calculated, fw_crc32);
return -EINVAL;
}
SCSC_TAG_DEBUG(FW_LOAD, "CRC32 OK: fw_crc32_calculated=%d fw_crc32=%d\n",
fw_crc32_calculated, fw_crc32);
return 0;
}