Browse Source

msm: camera: reqmgr: Reset the pd tables as part of flush

As part of flush only the request slots were reset, we need
to reset the slots in each of the pd tables.

CRs-Fixed: 2545130
Change-Id: I34054dea2e5849739df9dd0a77d908a9af9fe3be
Signed-off-by: Karthik Anantha Ram <[email protected]>
Karthik Anantha Ram 5 năm trước cách đây
mục cha
commit
388c4f7280
1 tập tin đã thay đổi với 45 bổ sung9 xóa
  1. 45 9
      drivers/cam_req_mgr/cam_req_mgr_core.c

+ 45 - 9
drivers/cam_req_mgr/cam_req_mgr_core.c

@@ -416,6 +416,50 @@ static void __cam_req_mgr_tbl_set_all_skip_cnt(
 	} while (tbl != NULL);
 }
 
+/**
+ * __cam_req_mgr_flush_req_slot()
+ *
+ * @brief    : reset all the slots/pd tables when flush is
+ *             invoked
+ * @link     : link pointer
+ *
+ */
+static void __cam_req_mgr_flush_req_slot(
+	struct cam_req_mgr_core_link *link)
+{
+	int                           idx = 0;
+	struct cam_req_mgr_slot      *slot;
+	struct cam_req_mgr_req_tbl   *tbl;
+	struct cam_req_mgr_req_queue *in_q = link->req.in_q;
+
+	for (idx = 0; idx < in_q->num_slots; idx++) {
+		slot = &in_q->slot[idx];
+		tbl = link->req.l_tbl;
+		CAM_DBG(CAM_CRM,
+			"RESET idx: %d req_id: %lld slot->status: %d",
+			idx, slot->req_id, slot->status);
+
+		/* Reset input queue slot */
+		slot->req_id = -1;
+		slot->skip_idx = 1;
+		slot->recover = 0;
+		slot->sync_mode = CAM_REQ_MGR_SYNC_MODE_NO_SYNC;
+		slot->status = CRM_SLOT_STATUS_NO_REQ;
+
+		/* Reset all pd table slot */
+		while (tbl != NULL) {
+			CAM_DBG(CAM_CRM, "pd: %d: idx %d state %d",
+				tbl->pd, idx, tbl->slot[idx].state);
+			tbl->slot[idx].req_ready_map = 0;
+			tbl->slot[idx].state = CRM_REQ_STATE_EMPTY;
+			tbl = tbl->next;
+		}
+	}
+
+	in_q->wr_idx = 0;
+	in_q->rd_idx = 0;
+}
+
 /**
  * __cam_req_mgr_reset_req_slot()
  *
@@ -1966,15 +2010,7 @@ int cam_req_mgr_process_flush_req(void *priv, void *data)
 		link->last_flush_id = flush_info->req_id;
 		CAM_INFO(CAM_CRM, "Last request id to flush is %lld",
 			flush_info->req_id);
-		for (i = 0; i < in_q->num_slots; i++) {
-			slot = &in_q->slot[i];
-			slot->req_id = -1;
-			slot->sync_mode = CAM_REQ_MGR_SYNC_MODE_NO_SYNC;
-			slot->skip_idx = 1;
-			slot->status = CRM_SLOT_STATUS_NO_REQ;
-		}
-		in_q->wr_idx = 0;
-		in_q->rd_idx = 0;
+		__cam_req_mgr_flush_req_slot(link);
 	} else if (flush_info->flush_type ==
 		CAM_REQ_MGR_FLUSH_TYPE_CANCEL_REQ) {
 		idx = __cam_req_mgr_find_slot_for_req(in_q, flush_info->req_id);