aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/crypto
diff options
context:
space:
mode:
authorTadeusz Struk <tadeusz.struk@intel.com>2015-04-03 11:41:17 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2015-04-07 09:34:22 -0400
commitb4e97050248d9cbf84a5fd023eb20c253b7ab35b (patch)
tree1bedf74072b77a25b54ec43275a7b10f46c279be /drivers/crypto
parent8b5cf097c3b0940f2be0d20dd16178405ebb63ec (diff)
crypto: qat - fix double release_firmware on error path
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>
Diffstat (limited to 'drivers/crypto')
-rw-r--r--drivers/crypto/qat/qat_common/adf_accel_engine.c14
-rw-r--r--drivers/crypto/qat/qat_common/adf_common_drv.h2
-rw-r--r--drivers/crypto/qat/qat_common/adf_init.c9
3 files changed, 13 insertions, 12 deletions
diff --git a/drivers/crypto/qat/qat_common/adf_accel_engine.c b/drivers/crypto/qat/qat_common/adf_accel_engine.c
index 97e8ea5d928c..7f8b66c915ed 100644
--- a/drivers/crypto/qat/qat_common/adf_accel_engine.c
+++ b/drivers/crypto/qat/qat_common/adf_accel_engine.c
@@ -78,19 +78,22 @@ int adf_ae_fw_load(struct adf_accel_dev *accel_dev)
78 return 0; 78 return 0;
79 79
80out_err: 80out_err:
81 release_firmware(loader_data->uof_fw); 81 adf_ae_fw_release(accel_dev);
82 return -EFAULT; 82 return -EFAULT;
83} 83}
84 84
85int adf_ae_fw_release(struct adf_accel_dev *accel_dev) 85void adf_ae_fw_release(struct adf_accel_dev *accel_dev)
86{ 86{
87 struct adf_fw_loader_data *loader_data = accel_dev->fw_loader; 87 struct adf_fw_loader_data *loader_data = accel_dev->fw_loader;
88 88
89 release_firmware(loader_data->uof_fw);
90 qat_uclo_del_uof_obj(loader_data->fw_loader); 89 qat_uclo_del_uof_obj(loader_data->fw_loader);
91 qat_hal_deinit(loader_data->fw_loader); 90 qat_hal_deinit(loader_data->fw_loader);
91
92 if (loader_data->uof_fw)
93 release_firmware(loader_data->uof_fw);
94
95 loader_data->uof_fw = NULL;
92 loader_data->fw_loader = NULL; 96 loader_data->fw_loader = NULL;
93 return 0;
94} 97}
95 98
96int adf_ae_start(struct adf_accel_dev *accel_dev) 99int adf_ae_start(struct adf_accel_dev *accel_dev)
@@ -165,6 +168,9 @@ int adf_ae_init(struct adf_accel_dev *accel_dev)
165 168
166int adf_ae_shutdown(struct adf_accel_dev *accel_dev) 169int adf_ae_shutdown(struct adf_accel_dev *accel_dev)
167{ 170{
171 struct adf_fw_loader_data *loader_data = accel_dev->fw_loader;
172
173 qat_hal_deinit(loader_data->fw_loader);
168 kfree(accel_dev->fw_loader); 174 kfree(accel_dev->fw_loader);
169 accel_dev->fw_loader = NULL; 175 accel_dev->fw_loader = NULL;
170 return 0; 176 return 0;
diff --git a/drivers/crypto/qat/qat_common/adf_common_drv.h b/drivers/crypto/qat/qat_common/adf_common_drv.h
index a62e485c8786..0666ee6a3360 100644
--- a/drivers/crypto/qat/qat_common/adf_common_drv.h
+++ b/drivers/crypto/qat/qat_common/adf_common_drv.h
@@ -115,7 +115,7 @@ int adf_dev_restarted_notify(struct adf_accel_dev *accel_dev);
115int adf_ae_init(struct adf_accel_dev *accel_dev); 115int adf_ae_init(struct adf_accel_dev *accel_dev);
116int adf_ae_shutdown(struct adf_accel_dev *accel_dev); 116int adf_ae_shutdown(struct adf_accel_dev *accel_dev);
117int adf_ae_fw_load(struct adf_accel_dev *accel_dev); 117int adf_ae_fw_load(struct adf_accel_dev *accel_dev);
118int adf_ae_fw_release(struct adf_accel_dev *accel_dev); 118void adf_ae_fw_release(struct adf_accel_dev *accel_dev);
119int adf_ae_start(struct adf_accel_dev *accel_dev); 119int adf_ae_start(struct adf_accel_dev *accel_dev);
120int adf_ae_stop(struct adf_accel_dev *accel_dev); 120int adf_ae_stop(struct adf_accel_dev *accel_dev);
121 121
diff --git a/drivers/crypto/qat/qat_common/adf_init.c b/drivers/crypto/qat/qat_common/adf_init.c
index da5793b34841..245f43237a2d 100644
--- a/drivers/crypto/qat/qat_common/adf_init.c
+++ b/drivers/crypto/qat/qat_common/adf_init.c
@@ -160,7 +160,6 @@ int adf_dev_init(struct adf_accel_dev *accel_dev)
160 if (adf_ae_fw_load(accel_dev)) { 160 if (adf_ae_fw_load(accel_dev)) {
161 dev_err(&GET_DEV(accel_dev), 161 dev_err(&GET_DEV(accel_dev),
162 "Failed to load acceleration FW\n"); 162 "Failed to load acceleration FW\n");
163 adf_ae_fw_release(accel_dev);
164 return -EFAULT; 163 return -EFAULT;
165 } 164 }
166 set_bit(ADF_STATUS_AE_UCODE_LOADED, &accel_dev->status); 165 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 } 358 }
360 359
361 if (test_bit(ADF_STATUS_AE_UCODE_LOADED, &accel_dev->status)) { 360 if (test_bit(ADF_STATUS_AE_UCODE_LOADED, &accel_dev->status)) {
362 if (adf_ae_fw_release(accel_dev)) 361 adf_ae_fw_release(accel_dev);
363 dev_err(&GET_DEV(accel_dev), 362 clear_bit(ADF_STATUS_AE_UCODE_LOADED, &accel_dev->status);
364 "Failed to release the ucode\n");
365 else
366 clear_bit(ADF_STATUS_AE_UCODE_LOADED,
367 &accel_dev->status);
368 } 363 }
369 364
370 if (test_bit(ADF_STATUS_AE_INITIALISED, &accel_dev->status)) { 365 if (test_bit(ADF_STATUS_AE_INITIALISED, &accel_dev->status)) {