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

Commit 49ea8fb3 authored by Wyes Karny's avatar Wyes Karny
Browse files

msm: camera: reqmgr: Fix for apply stuck issue for pd 1 device



In a edge case if there are only pd 1 devices then avoid reset
slot if last buf done req if last applied req. If rd_idx is equal to
last bufdone index then reset previous slot. Based on max PD in the
link calculate max retry attempt before triggering recovery to UMD.
Also fill trigger information during notify error.

CRs-Fixed: 2776184
Change-Id: Ifabf660df7861b78e7801dc7eebe0c5e71908e74
Signed-off-by: default avatarWyes Karny <wkarny@codeaurora.org>
parent d74902f0
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -1594,6 +1594,7 @@ static int __cam_req_mgr_process_req(struct cam_req_mgr_core_link *link,
	struct cam_req_mgr_core_session     *session;
	struct cam_req_mgr_connected_device *dev;
	struct cam_req_mgr_core_link        *tmp_link = NULL;
	uint32_t                             max_retry = 0;

	in_q = link->req.in_q;
	session = (struct cam_req_mgr_core_session *)link->parent;
@@ -1700,6 +1701,9 @@ static int __cam_req_mgr_process_req(struct cam_req_mgr_core_link *link,
	if (rc < 0) {
		/* Apply req failed retry at next sof */
		slot->status = CRM_SLOT_STATUS_REQ_PENDING;
		max_retry = MAXIMUM_RETRY_ATTEMPTS;
		if (link->max_delay == 1)
			max_retry++;

		if (jiffies_to_msecs(jiffies - link->last_applied_jiffies) >
			MINIMUM_WORKQUEUE_SCHED_TIME_IN_MS)
@@ -1707,10 +1711,10 @@ static int __cam_req_mgr_process_req(struct cam_req_mgr_core_link *link,

		if ((in_q->last_applied_idx < in_q->rd_idx) && check_retry_cnt) {
			link->retry_cnt++;
			if (link->retry_cnt == MAXIMUM_RETRY_ATTEMPTS) {
			if (link->retry_cnt == max_retry) {
				CAM_DBG(CAM_CRM,
					"Max retry attempts reached on link[0x%x] for req [%lld]",
					link->link_hdl,
					"Max retry attempts (count %d) reached on link[0x%x] for req [%lld]",
					max_retry, link->link_hdl,
					in_q->slot[in_q->rd_idx].req_id);
				__cam_req_mgr_notify_error_on_link(link, dev);
				link->retry_cnt = 0;
@@ -2805,6 +2809,8 @@ static int cam_req_mgr_process_trigger(void *priv, void *data)
		if (idx >= 0) {
			if (idx == in_q->last_applied_idx)
				in_q->last_applied_idx = -1;
			if (idx == in_q->rd_idx)
				__cam_req_mgr_dec_idx(&idx, 1, in_q->num_slots);
			__cam_req_mgr_reset_req_slot(link, idx);
		}
	}
@@ -3034,6 +3040,7 @@ static int cam_req_mgr_cb_notify_err(
	notify_err->link_hdl = err_info->link_hdl;
	notify_err->dev_hdl = err_info->dev_hdl;
	notify_err->error = err_info->error;
	notify_err->trigger = err_info->trigger;
	task->process_cb = &cam_req_mgr_process_error;
	rc = cam_req_mgr_workq_enqueue_task(task, link, CRM_TASK_PRIORITY_0);