diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index add93fdfa311..5fbb2bc6550b 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -2655,6 +2655,11 @@ err_resp: pr_warn("get cback req app_id = %d, resp->data = %d\n", data->client.app_id, resp->data); resp->resp_type = SMCINVOKE_RESULT_INBOUND_REQ_NEEDED; + /* We are here because scm call sent to TZ has requested + * for another callback request. This call has been a + * success and hence setting result = 0 + */ + resp->result = 0; break; default: pr_err("fail:resp res= %d,app_id = %d,lstr = %d\n", diff --git a/drivers/soc/qcom/smcinvoke.c b/drivers/soc/qcom/smcinvoke.c index 3881ec0d32cc..3cbf9e359f2a 100644 --- a/drivers/soc/qcom/smcinvoke.c +++ b/drivers/soc/qcom/smcinvoke.c @@ -1282,13 +1282,9 @@ static int prepare_send_scm_msg(const uint8_t *in_buf, phys_addr_t in_paddr, response_type == QSEOS_RESULT_BLOCKED_ON_LISTENER) { ret = qseecom_process_listener_from_smcinvoke( &req->result, &response_type, &data); - /* - * new scm APIs do not provide complete response i.e. res[0-2], - * we loose some values returned from QSEECom APIs. so we need to - * populate result from response type i.e. res[1] - */ - req->result = response_type; - if (!req->result) { + + if (!req->result && + response_type != SMCINVOKE_RESULT_INBOUND_REQ_NEEDED) { ret = marshal_out_invoke_req(in_buf, in_buf_len, req, args_buf); }