Skip to content

Commit

Permalink
crypto: qat - fix double release_firmware on error path
Browse files Browse the repository at this point in the history
release_firmware was called twice on error path causing an Oops.

Reported-by: Ahsan Atta  <ahsan.atta@intel.com>
Signed-off-by: Tadeusz Struk <tadeusz.struk@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
  • Loading branch information
Tadeusz Struk authored and Herbert Xu committed Apr 7, 2015
1 parent 8b5cf09 commit b4e9705
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 12 deletions.
14 changes: 10 additions & 4 deletions drivers/crypto/qat/qat_common/adf_accel_engine.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,19 +78,22 @@ int adf_ae_fw_load(struct adf_accel_dev *accel_dev)
return 0;

out_err:
release_firmware(loader_data->uof_fw);
adf_ae_fw_release(accel_dev);
return -EFAULT;
}

int adf_ae_fw_release(struct adf_accel_dev *accel_dev)
void adf_ae_fw_release(struct adf_accel_dev *accel_dev)
{
struct adf_fw_loader_data *loader_data = accel_dev->fw_loader;

release_firmware(loader_data->uof_fw);
qat_uclo_del_uof_obj(loader_data->fw_loader);
qat_hal_deinit(loader_data->fw_loader);

if (loader_data->uof_fw)
release_firmware(loader_data->uof_fw);

loader_data->uof_fw = NULL;
loader_data->fw_loader = NULL;
return 0;
}

int adf_ae_start(struct adf_accel_dev *accel_dev)
Expand Down Expand Up @@ -165,6 +168,9 @@ int adf_ae_init(struct adf_accel_dev *accel_dev)

int adf_ae_shutdown(struct adf_accel_dev *accel_dev)
{
struct adf_fw_loader_data *loader_data = accel_dev->fw_loader;

qat_hal_deinit(loader_data->fw_loader);
kfree(accel_dev->fw_loader);
accel_dev->fw_loader = NULL;
return 0;
Expand Down
2 changes: 1 addition & 1 deletion drivers/crypto/qat/qat_common/adf_common_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ int adf_dev_restarted_notify(struct adf_accel_dev *accel_dev);
int adf_ae_init(struct adf_accel_dev *accel_dev);
int adf_ae_shutdown(struct adf_accel_dev *accel_dev);
int adf_ae_fw_load(struct adf_accel_dev *accel_dev);
int adf_ae_fw_release(struct adf_accel_dev *accel_dev);
void adf_ae_fw_release(struct adf_accel_dev *accel_dev);
int adf_ae_start(struct adf_accel_dev *accel_dev);
int adf_ae_stop(struct adf_accel_dev *accel_dev);

Expand Down
9 changes: 2 additions & 7 deletions drivers/crypto/qat/qat_common/adf_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,6 @@ int adf_dev_init(struct adf_accel_dev *accel_dev)
if (adf_ae_fw_load(accel_dev)) {
dev_err(&GET_DEV(accel_dev),
"Failed to load acceleration FW\n");
adf_ae_fw_release(accel_dev);
return -EFAULT;
}
set_bit(ADF_STATUS_AE_UCODE_LOADED, &accel_dev->status);
Expand Down Expand Up @@ -359,12 +358,8 @@ void adf_dev_shutdown(struct adf_accel_dev *accel_dev)
}

if (test_bit(ADF_STATUS_AE_UCODE_LOADED, &accel_dev->status)) {
if (adf_ae_fw_release(accel_dev))
dev_err(&GET_DEV(accel_dev),
"Failed to release the ucode\n");
else
clear_bit(ADF_STATUS_AE_UCODE_LOADED,
&accel_dev->status);
adf_ae_fw_release(accel_dev);
clear_bit(ADF_STATUS_AE_UCODE_LOADED, &accel_dev->status);
}

if (test_bit(ADF_STATUS_AE_INITIALISED, &accel_dev->status)) {
Expand Down

0 comments on commit b4e9705

Please sign in to comment.