From 0e577cd85316a5ff01c4573269d6845176a10e63 Mon Sep 17 00:00:00 2001 From: Gaurav Kashyap Date: Mon, 15 Jun 2020 11:33:48 -0700 Subject: [PATCH] scsi: ufshcd-crypto-qti.c: do not resume for key reprogram When reprogram_all_keys is called from keyslot manager, it is done as part of the ufs resume context. This will cause a hang when keyslot program tries to do a resume again. Avoid doing a resume if keyslot program is called from resume context. Change-Id: I336fd580885d8e26ec9bf3fafe13e30404ba3ac5 Signed-off-by: Gaurav Kashyap --- drivers/scsi/ufs/ufshcd-crypto-qti.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/drivers/scsi/ufs/ufshcd-crypto-qti.c b/drivers/scsi/ufs/ufshcd-crypto-qti.c index 62d1ec595840..42b296a182b4 100644 --- a/drivers/scsi/ufs/ufshcd-crypto-qti.c +++ b/drivers/scsi/ufs/ufshcd-crypto-qti.c @@ -55,7 +55,6 @@ void ufshcd_crypto_qti_enable(struct ufs_hba *hba) } ufshcd_crypto_enable_spec(hba); - } void ufshcd_crypto_qti_disable(struct ufs_hba *hba) @@ -88,26 +87,25 @@ static int ufshcd_crypto_qti_keyslot_program(struct keyslot_manager *ksm, hba->crypto_cap_array[crypto_alg_id].sdus_mask)) return -EINVAL; - pm_runtime_get_sync(hba->dev); + if (!hba->pm_op_in_progress) + pm_runtime_get_sync(hba->dev); err = ufshcd_hold(hba, false); if (err) { pr_err("%s: failed to enable clocks, err %d\n", __func__, err); - return err; + goto out; } err = crypto_qti_keyslot_program(hba->crypto_vops->priv, key, slot, data_unit_mask, crypto_alg_id); - if (err) { + if (err) pr_err("%s: failed with error %d\n", __func__, err); - ufshcd_release(hba); - pm_runtime_put_sync(hba->dev); - return err; - } ufshcd_release(hba); - pm_runtime_put_sync(hba->dev); +out: + if (!hba->pm_op_in_progress) + pm_runtime_put_sync(hba->dev); - return 0; + return err; } static int ufshcd_crypto_qti_keyslot_evict(struct keyslot_manager *ksm,