Commit b4e97050 authored by Tadeusz Struk's avatar Tadeusz Struk Committed by Herbert Xu

crypto: qat - fix double release_firmware on error path

release_firmware was called twice on error path causing an Oops.
Reported-by: default avatarAhsan Atta  <ahsan.atta@intel.com>
Signed-off-by: default avatarTadeusz Struk <tadeusz.struk@intel.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 8b5cf097
...@@ -78,19 +78,22 @@ int adf_ae_fw_load(struct adf_accel_dev *accel_dev) ...@@ -78,19 +78,22 @@ int adf_ae_fw_load(struct adf_accel_dev *accel_dev)
return 0; return 0;
out_err: out_err:
release_firmware(loader_data->uof_fw); adf_ae_fw_release(accel_dev);
return -EFAULT; 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; 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_uclo_del_uof_obj(loader_data->fw_loader);
qat_hal_deinit(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; loader_data->fw_loader = NULL;
return 0;
} }
int adf_ae_start(struct adf_accel_dev *accel_dev) int adf_ae_start(struct adf_accel_dev *accel_dev)
...@@ -165,6 +168,9 @@ int adf_ae_init(struct adf_accel_dev *accel_dev) ...@@ -165,6 +168,9 @@ int adf_ae_init(struct adf_accel_dev *accel_dev)
int adf_ae_shutdown(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); kfree(accel_dev->fw_loader);
accel_dev->fw_loader = NULL; accel_dev->fw_loader = NULL;
return 0; return 0;
......
...@@ -115,7 +115,7 @@ int adf_dev_restarted_notify(struct adf_accel_dev *accel_dev); ...@@ -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_init(struct adf_accel_dev *accel_dev);
int adf_ae_shutdown(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_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_start(struct adf_accel_dev *accel_dev);
int adf_ae_stop(struct adf_accel_dev *accel_dev); int adf_ae_stop(struct adf_accel_dev *accel_dev);
......
...@@ -160,7 +160,6 @@ int adf_dev_init(struct adf_accel_dev *accel_dev) ...@@ -160,7 +160,6 @@ int adf_dev_init(struct adf_accel_dev *accel_dev)
if (adf_ae_fw_load(accel_dev)) { if (adf_ae_fw_load(accel_dev)) {
dev_err(&GET_DEV(accel_dev), dev_err(&GET_DEV(accel_dev),
"Failed to load acceleration FW\n"); "Failed to load acceleration FW\n");
adf_ae_fw_release(accel_dev);
return -EFAULT; return -EFAULT;
} }
set_bit(ADF_STATUS_AE_UCODE_LOADED, &accel_dev->status); set_bit(ADF_STATUS_AE_UCODE_LOADED, &accel_dev->status);
...@@ -359,12 +358,8 @@ void adf_dev_shutdown(struct adf_accel_dev *accel_dev) ...@@ -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 (test_bit(ADF_STATUS_AE_UCODE_LOADED, &accel_dev->status)) {
if (adf_ae_fw_release(accel_dev)) adf_ae_fw_release(accel_dev);
dev_err(&GET_DEV(accel_dev), clear_bit(ADF_STATUS_AE_UCODE_LOADED, &accel_dev->status);
"Failed to release the ucode\n");
else
clear_bit(ADF_STATUS_AE_UCODE_LOADED,
&accel_dev->status);
} }
if (test_bit(ADF_STATUS_AE_INITIALISED, &accel_dev->status)) { if (test_bit(ADF_STATUS_AE_INITIALISED, &accel_dev->status)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment