From de5f115df09bb4a5788f60d3af90f2e4c57f8987 Mon Sep 17 00:00:00 2001 From: sumikush Date: Mon, 24 May 2021 19:42:45 +0530 Subject: [PATCH] qseecom: retry scm call if app is busy When KeyMaster (KM) app is occupied by Identity Credential (IC) app and any client requests some functionality from KM app then scm call failure is observed with response code indicating KM app is busy. In this case same scm call should be retried few more times to check if app can serve it. Bail out with failure if retry count expires. Change-Id: Icb092ff0a6b3b313197cf6a21f74caeaf6c576a1 Signed-off-by: sumikush --- drivers/misc/qseecom.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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; }