Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f6f1a385 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "qseecom: set rcv_req_flag to 0 when listener is just registered"

parents 9f92a220 189330a1
Loading
Loading
Loading
Loading
+25 −19
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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,
@@ -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;
@@ -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);
@@ -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*/
@@ -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;
@@ -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);
@@ -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*/
@@ -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;
}

@@ -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,
@@ -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;
		}