diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index 16dd7dd37f78..98657d0a6822 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -1940,7 +1940,7 @@ exit: } static int __qseecom_process_blocked_on_listener_smcinvoke( - struct qseecom_command_scm_resp *resp) + struct qseecom_command_scm_resp *resp, uint32_t app_id) { struct qseecom_registered_listener_list *list_ptr; int ret = 0; @@ -1987,9 +1987,18 @@ static int __qseecom_process_blocked_on_listener_smcinvoke( &ireq, sizeof(ireq), &continue_resp, sizeof(continue_resp)); if (ret) { - pr_err("scm_call for continue blocked req for session %d failed, ret %d\n", - session_id, ret); - goto exit; + /* retry with legacy cmd */ + qseecom.smcinvoke_support = false; + ireq.app_or_session_id = app_id; + ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, + &ireq, sizeof(ireq), + &continue_resp, sizeof(continue_resp)); + qseecom.smcinvoke_support = true; + if (ret) { + pr_err("cont block req for app %d or session %d fail\n", + app_id, session_id); + goto exit; + } } resp->result = QSEOS_RESULT_INCOMPLETE; exit: @@ -2006,7 +2015,7 @@ static int __qseecom_process_reentrancy_blocked_on_listener( resp, ptr_app, data); else return __qseecom_process_blocked_on_listener_smcinvoke( - resp); + resp, data->client.app_id); } static int __qseecom_reentrancy_process_incomplete_cmd( struct qseecom_dev_handle *data, @@ -4786,6 +4795,9 @@ int qseecom_process_listener_from_smcinvoke(struct scm_desc *desc) resp.resp_type = desc->ret[1]; /*incomplete:unused;blocked:session_id*/ resp.data = desc->ret[2]; /*listener_id*/ + dummy_private_data.client.app_id = desc->ret[1]; + dummy_app_entry.app_id = desc->ret[1]; + mutex_lock(&app_access_lock); if (qseecom.qsee_reentrancy_support) ret = __qseecom_process_reentrancy(&resp, &dummy_app_entry,