diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index 613ddd502ad9538fcd26cac2bcad81e1afb2d1ce..a18527cd99733c975dbac499a2257f569dc5193f 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -551,6 +551,8 @@ static int __qseecom_process_incomplete_cmd(struct qseecom_dev_handle *data, unsigned long flags; struct qseecom_client_listener_data_irsp send_data_rsp; struct qseecom_registered_listener_list *ptr_svc = NULL; + sigset_t new_sigset; + sigset_t old_sigset; while (resp->result == QSEOS_RESULT_INCOMPLETE) { @@ -576,17 +578,28 @@ static int __qseecom_process_incomplete_cmd(struct qseecom_dev_handle *data, } pr_debug("waking up rcv_req_wq and " "waiting for send_resp_wq\n"); - if (wait_event_freezable(qseecom.send_resp_wq, - __qseecom_listener_has_sent_rsp(data))) { - pr_warning("Interrupted: exiting send_cmd loop\n"); - return -ERESTARTSYS; - } + /* initialize the new signal mask with all signals*/ + sigfillset(&new_sigset); + /* block all signals */ + sigprocmask(SIG_SETMASK, &new_sigset, &old_sigset); + + do { + if (!wait_event_freezable(qseecom.send_resp_wq, + __qseecom_listener_has_sent_rsp(data))) + break; + } while (1); + + /* restore signal mask */ + sigprocmask(SIG_SETMASK, &old_sigset, NULL); if (data->abort) { - pr_err("Aborting listener service %d\n", - data->listener.id); + pr_err("Abort clnt %d waiting on lstnr svc %d, ret %d", + data->client.app_id, lstnr, ret); return -ENODEV; + } + + qseecom.send_resp_flag = 0; send_data_rsp.qsee_cmd_id = QSEOS_LISTENER_DATA_RSP_COMMAND; send_data_rsp.listener_id = lstnr ;