Loading drivers/misc/qseecom.c +25 −19 Original line number Diff line number Diff line Loading @@ -182,6 +182,7 @@ struct qseecom_registered_listener_list { size_t sb_length; struct ion_handle *ihandle; /* Retrieve phy addr */ wait_queue_head_t rcv_req_wq; /* rcv_req_flag: -1: not ready; 0: ready and empty; 1: received req */ int rcv_req_flag; int send_resp_flag; bool listener_in_use; Loading Loading @@ -1202,7 +1203,7 @@ static int qseecom_register_listener(struct qseecom_dev_handle *data, if (!new_entry) return -ENOMEM; memcpy(&new_entry->svc, &rcvd_lstnr, sizeof(rcvd_lstnr)); new_entry->rcv_req_flag = 0; new_entry->rcv_req_flag = -1; new_entry->svc.listener_id = rcvd_lstnr.listener_id; new_entry->sb_length = rcvd_lstnr.sb_size; Loading Loading @@ -1651,21 +1652,10 @@ static void __qseecom_clean_listener_sglistinfo( } } /* wake up listener receive request wq retry delay (ms) and max attemp count */ #define QSEECOM_WAKE_LISTENER_RCVWQ_DELAY 10 #define QSEECOM_WAKE_LISTENER_RCVWQ_MAX_ATTEMP 3 static int __qseecom_retry_wake_up_listener_rcv_wq( static int __is_listener_rcv_wq_not_ready( struct qseecom_registered_listener_list *ptr_svc) { int retry = 0; while (ptr_svc->rcv_req_flag == 1 && retry++ < QSEECOM_WAKE_LISTENER_RCVWQ_MAX_ATTEMP) { wake_up_interruptible(&ptr_svc->rcv_req_wq); msleep(QSEECOM_WAKE_LISTENER_RCVWQ_DELAY); } return ptr_svc->rcv_req_flag == 1; return ptr_svc->rcv_req_flag == -1; } static int __qseecom_process_incomplete_cmd(struct qseecom_dev_handle *data, Loading @@ -1685,6 +1675,7 @@ static int __qseecom_process_incomplete_cmd(struct qseecom_dev_handle *data, void *cmd_buf = NULL; size_t cmd_len; struct sglist_info *table = NULL; bool not_ready = false; while (resp->result == QSEOS_RESULT_INCOMPLETE) { lstnr = resp->data; Loading @@ -1696,6 +1687,10 @@ static int __qseecom_process_incomplete_cmd(struct qseecom_dev_handle *data, list_for_each_entry(ptr_svc, &qseecom.registered_listener_list_head, list) { if (ptr_svc->svc.listener_id == lstnr) { if (__is_listener_rcv_wq_not_ready(ptr_svc)) { not_ready = true; break; } ptr_svc->listener_in_use = true; ptr_svc->rcv_req_flag = 1; wake_up_interruptible(&ptr_svc->rcv_req_wq); Loading Loading @@ -1736,14 +1731,15 @@ static int __qseecom_process_incomplete_cmd(struct qseecom_dev_handle *data, goto err_resp; } if (ptr_svc->rcv_req_flag == 1 && __qseecom_retry_wake_up_listener_rcv_wq(ptr_svc)) { if (not_ready) { pr_err("Service %d is not ready to receive request\n", lstnr); rc = -ENOENT; status = QSEOS_RESULT_FAILURE; goto err_resp; } pr_debug("waking up rcv_req_wq and waiting for send_resp_wq\n"); /* initialize the new signal mask with all signals*/ Loading Loading @@ -2005,6 +2001,7 @@ static int __qseecom_reentrancy_process_incomplete_cmd( void *cmd_buf = NULL; size_t cmd_len; struct sglist_info *table = NULL; bool not_ready = false; while (ret == 0 && resp->result == QSEOS_RESULT_INCOMPLETE) { lstnr = resp->data; Loading @@ -2016,6 +2013,10 @@ static int __qseecom_reentrancy_process_incomplete_cmd( list_for_each_entry(ptr_svc, &qseecom.registered_listener_list_head, list) { if (ptr_svc->svc.listener_id == lstnr) { if (__is_listener_rcv_wq_not_ready(ptr_svc)) { not_ready = true; break; } ptr_svc->listener_in_use = true; ptr_svc->rcv_req_flag = 1; wake_up_interruptible(&ptr_svc->rcv_req_wq); Loading Loading @@ -2056,14 +2057,15 @@ static int __qseecom_reentrancy_process_incomplete_cmd( goto err_resp; } if (ptr_svc->rcv_req_flag == 1 && __qseecom_retry_wake_up_listener_rcv_wq(ptr_svc)) { if (not_ready) { pr_err("Service %d is not ready to receive request\n", lstnr); rc = -ENOENT; status = QSEOS_RESULT_FAILURE; goto err_resp; } pr_debug("waking up rcv_req_wq and waiting for send_resp_wq\n"); /* initialize the new signal mask with all signals*/ Loading Loading @@ -3871,7 +3873,7 @@ static int __qseecom_listener_has_rcvd_req(struct qseecom_dev_handle *data, { int ret; ret = (svc->rcv_req_flag != 0); ret = (svc->rcv_req_flag == 1); return ret || data->abort || svc->abort; } Loading @@ -3886,6 +3888,9 @@ static int qseecom_receive_req(struct qseecom_dev_handle *data) return -ENODATA; } if (this_lstnr->rcv_req_flag == -1) this_lstnr->rcv_req_flag = 0; while (1) { if (wait_event_freezable(this_lstnr->rcv_req_wq, __qseecom_listener_has_rcvd_req(data, Loading @@ -3893,6 +3898,7 @@ static int qseecom_receive_req(struct qseecom_dev_handle *data) pr_warn("Interrupted: exiting Listener Service = %d\n", (uint32_t)data->listener.id); /* woken up for different reason */ this_lstnr->rcv_req_flag = -1; return -ERESTARTSYS; } Loading Loading
drivers/misc/qseecom.c +25 −19 Original line number Diff line number Diff line Loading @@ -182,6 +182,7 @@ struct qseecom_registered_listener_list { size_t sb_length; struct ion_handle *ihandle; /* Retrieve phy addr */ wait_queue_head_t rcv_req_wq; /* rcv_req_flag: -1: not ready; 0: ready and empty; 1: received req */ int rcv_req_flag; int send_resp_flag; bool listener_in_use; Loading Loading @@ -1202,7 +1203,7 @@ static int qseecom_register_listener(struct qseecom_dev_handle *data, if (!new_entry) return -ENOMEM; memcpy(&new_entry->svc, &rcvd_lstnr, sizeof(rcvd_lstnr)); new_entry->rcv_req_flag = 0; new_entry->rcv_req_flag = -1; new_entry->svc.listener_id = rcvd_lstnr.listener_id; new_entry->sb_length = rcvd_lstnr.sb_size; Loading Loading @@ -1651,21 +1652,10 @@ static void __qseecom_clean_listener_sglistinfo( } } /* wake up listener receive request wq retry delay (ms) and max attemp count */ #define QSEECOM_WAKE_LISTENER_RCVWQ_DELAY 10 #define QSEECOM_WAKE_LISTENER_RCVWQ_MAX_ATTEMP 3 static int __qseecom_retry_wake_up_listener_rcv_wq( static int __is_listener_rcv_wq_not_ready( struct qseecom_registered_listener_list *ptr_svc) { int retry = 0; while (ptr_svc->rcv_req_flag == 1 && retry++ < QSEECOM_WAKE_LISTENER_RCVWQ_MAX_ATTEMP) { wake_up_interruptible(&ptr_svc->rcv_req_wq); msleep(QSEECOM_WAKE_LISTENER_RCVWQ_DELAY); } return ptr_svc->rcv_req_flag == 1; return ptr_svc->rcv_req_flag == -1; } static int __qseecom_process_incomplete_cmd(struct qseecom_dev_handle *data, Loading @@ -1685,6 +1675,7 @@ static int __qseecom_process_incomplete_cmd(struct qseecom_dev_handle *data, void *cmd_buf = NULL; size_t cmd_len; struct sglist_info *table = NULL; bool not_ready = false; while (resp->result == QSEOS_RESULT_INCOMPLETE) { lstnr = resp->data; Loading @@ -1696,6 +1687,10 @@ static int __qseecom_process_incomplete_cmd(struct qseecom_dev_handle *data, list_for_each_entry(ptr_svc, &qseecom.registered_listener_list_head, list) { if (ptr_svc->svc.listener_id == lstnr) { if (__is_listener_rcv_wq_not_ready(ptr_svc)) { not_ready = true; break; } ptr_svc->listener_in_use = true; ptr_svc->rcv_req_flag = 1; wake_up_interruptible(&ptr_svc->rcv_req_wq); Loading Loading @@ -1736,14 +1731,15 @@ static int __qseecom_process_incomplete_cmd(struct qseecom_dev_handle *data, goto err_resp; } if (ptr_svc->rcv_req_flag == 1 && __qseecom_retry_wake_up_listener_rcv_wq(ptr_svc)) { if (not_ready) { pr_err("Service %d is not ready to receive request\n", lstnr); rc = -ENOENT; status = QSEOS_RESULT_FAILURE; goto err_resp; } pr_debug("waking up rcv_req_wq and waiting for send_resp_wq\n"); /* initialize the new signal mask with all signals*/ Loading Loading @@ -2005,6 +2001,7 @@ static int __qseecom_reentrancy_process_incomplete_cmd( void *cmd_buf = NULL; size_t cmd_len; struct sglist_info *table = NULL; bool not_ready = false; while (ret == 0 && resp->result == QSEOS_RESULT_INCOMPLETE) { lstnr = resp->data; Loading @@ -2016,6 +2013,10 @@ static int __qseecom_reentrancy_process_incomplete_cmd( list_for_each_entry(ptr_svc, &qseecom.registered_listener_list_head, list) { if (ptr_svc->svc.listener_id == lstnr) { if (__is_listener_rcv_wq_not_ready(ptr_svc)) { not_ready = true; break; } ptr_svc->listener_in_use = true; ptr_svc->rcv_req_flag = 1; wake_up_interruptible(&ptr_svc->rcv_req_wq); Loading Loading @@ -2056,14 +2057,15 @@ static int __qseecom_reentrancy_process_incomplete_cmd( goto err_resp; } if (ptr_svc->rcv_req_flag == 1 && __qseecom_retry_wake_up_listener_rcv_wq(ptr_svc)) { if (not_ready) { pr_err("Service %d is not ready to receive request\n", lstnr); rc = -ENOENT; status = QSEOS_RESULT_FAILURE; goto err_resp; } pr_debug("waking up rcv_req_wq and waiting for send_resp_wq\n"); /* initialize the new signal mask with all signals*/ Loading Loading @@ -3871,7 +3873,7 @@ static int __qseecom_listener_has_rcvd_req(struct qseecom_dev_handle *data, { int ret; ret = (svc->rcv_req_flag != 0); ret = (svc->rcv_req_flag == 1); return ret || data->abort || svc->abort; } Loading @@ -3886,6 +3888,9 @@ static int qseecom_receive_req(struct qseecom_dev_handle *data) return -ENODATA; } if (this_lstnr->rcv_req_flag == -1) this_lstnr->rcv_req_flag = 0; while (1) { if (wait_event_freezable(this_lstnr->rcv_req_wq, __qseecom_listener_has_rcvd_req(data, Loading @@ -3893,6 +3898,7 @@ static int qseecom_receive_req(struct qseecom_dev_handle *data) pr_warn("Interrupted: exiting Listener Service = %d\n", (uint32_t)data->listener.id); /* woken up for different reason */ this_lstnr->rcv_req_flag = -1; return -ERESTARTSYS; } Loading