diff --git a/drivers/cam_req_mgr/cam_req_mgr_core.c b/drivers/cam_req_mgr/cam_req_mgr_core.c index ee3972096998..5881df747c2a 100644 --- a/drivers/cam_req_mgr/cam_req_mgr_core.c +++ b/drivers/cam_req_mgr/cam_req_mgr_core.c @@ -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);