|
@@ -268,8 +268,10 @@ static int cpt_ucode_load_fw(struct cpt_device *cpt, const u8 *fw, bool is_ae)
|
|
|
mcode = &cpt->mcode[cpt->next_mc_idx];
|
|
|
memcpy(mcode->version, (u8 *)fw_entry->data, CPT_UCODE_VERSION_SZ);
|
|
|
mcode->code_size = ntohl(ucode->code_length) * 2;
|
|
|
- if (!mcode->code_size)
|
|
|
- return -EINVAL;
|
|
|
+ if (!mcode->code_size) {
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto fw_release;
|
|
|
+ }
|
|
|
|
|
|
mcode->is_ae = is_ae;
|
|
|
mcode->core_mask = 0ULL;
|
|
@@ -280,7 +282,8 @@ static int cpt_ucode_load_fw(struct cpt_device *cpt, const u8 *fw, bool is_ae)
|
|
|
&mcode->phys_base, GFP_KERNEL);
|
|
|
if (!mcode->code) {
|
|
|
dev_err(dev, "Unable to allocate space for microcode");
|
|
|
- return -ENOMEM;
|
|
|
+ ret = -ENOMEM;
|
|
|
+ goto fw_release;
|
|
|
}
|
|
|
|
|
|
memcpy((void *)mcode->code, (void *)(fw_entry->data + sizeof(*ucode)),
|
|
@@ -302,12 +305,14 @@ static int cpt_ucode_load_fw(struct cpt_device *cpt, const u8 *fw, bool is_ae)
|
|
|
ret = do_cpt_init(cpt, mcode);
|
|
|
if (ret) {
|
|
|
dev_err(dev, "do_cpt_init failed with ret: %d\n", ret);
|
|
|
- return ret;
|
|
|
+ goto fw_release;
|
|
|
}
|
|
|
|
|
|
dev_info(dev, "Microcode Loaded %s\n", mcode->version);
|
|
|
mcode->is_mc_valid = 1;
|
|
|
cpt->next_mc_idx++;
|
|
|
+
|
|
|
+fw_release:
|
|
|
release_firmware(fw_entry);
|
|
|
|
|
|
return ret;
|