diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index 5442b9addab8..8c338aaa615c 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -470,6 +470,8 @@ static void __qseecom_free_coherent_buf(uint32_t size, #define QSEECOM_SCM_EBUSY_WAIT_MS 30 #define QSEECOM_SCM_EBUSY_MAX_RETRY 67 +#define QSEE_RESULT_FAIL_APP_BUSY 315 + static int __qseecom_scm_call2_locked(uint32_t smc_id, struct scm_desc *desc) { int ret = 0; @@ -477,14 +479,14 @@ static int __qseecom_scm_call2_locked(uint32_t smc_id, struct scm_desc *desc) do { ret = qcom_scm_qseecom_call_noretry(smc_id, desc); - if (ret == -EBUSY) { + if ((ret == -EBUSY) || (desc && (desc->ret[0] == -QSEE_RESULT_FAIL_APP_BUSY))) { mutex_unlock(&app_access_lock); msleep(QSEECOM_SCM_EBUSY_WAIT_MS); mutex_lock(&app_access_lock); } if (retry_count == 33) pr_warn("secure world has been busy for 1 second!\n"); - } while (ret == -EBUSY && + } while (((ret == -EBUSY) || (desc && (desc->ret[0] == -QSEE_RESULT_FAIL_APP_BUSY))) && (retry_count++ < QSEECOM_SCM_EBUSY_MAX_RETRY)); return ret; }