60 lines
2.0 KiB
C
Executable File
60 lines
2.0 KiB
C
Executable File
/****************************************************************************
|
|
*
|
|
* 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;
|
|
}
|