|
@@ -651,44 +651,24 @@ static void hif_cpuhp_unregister(struct hif_softc *scn)
|
|
|
#endif /* ifdef HIF_CPU_PERF_AFFINE_MASK */
|
|
|
|
|
|
#ifdef HIF_DETECTION_LATENCY_ENABLE
|
|
|
-/**
|
|
|
- * hif_check_detection_latency(): to check if latency for tasklet/credit
|
|
|
- *
|
|
|
- * @scn: hif context
|
|
|
- * @from_timer: if called from timer handler
|
|
|
- * @bitmap_type: indicate if check tasklet or credit
|
|
|
- *
|
|
|
- * Return: none
|
|
|
- */
|
|
|
-void hif_check_detection_latency(struct hif_softc *scn,
|
|
|
- bool from_timer,
|
|
|
- uint32_t bitmap_type)
|
|
|
+
|
|
|
+void hif_tasklet_latency(struct hif_softc *scn, bool from_timer)
|
|
|
{
|
|
|
qdf_time_t ce2_tasklet_sched_time =
|
|
|
scn->latency_detect.ce2_tasklet_sched_time;
|
|
|
qdf_time_t ce2_tasklet_exec_time =
|
|
|
scn->latency_detect.ce2_tasklet_exec_time;
|
|
|
- qdf_time_t credit_request_time =
|
|
|
- scn->latency_detect.credit_request_time;
|
|
|
- qdf_time_t credit_report_time =
|
|
|
- scn->latency_detect.credit_report_time;
|
|
|
qdf_time_t curr_jiffies = qdf_system_ticks();
|
|
|
uint32_t detect_latency_threshold =
|
|
|
scn->latency_detect.detect_latency_threshold;
|
|
|
int cpu_id = qdf_get_cpu();
|
|
|
|
|
|
- if (QDF_GLOBAL_MISSION_MODE != hif_get_conparam(scn))
|
|
|
- return;
|
|
|
-
|
|
|
- if (!scn->latency_detect.enable_detection)
|
|
|
- return;
|
|
|
-
|
|
|
/* 2 kinds of check here.
|
|
|
- * from_timer==true: check if tasklet or credit report stall
|
|
|
- * from_timer==false: check tasklet execute or credit report comes late
|
|
|
+ * from_timer==true: check if tasklet stall
|
|
|
+ * from_timer==false: check tasklet execute comes late
|
|
|
*/
|
|
|
- if (bitmap_type & BIT(HIF_DETECT_TASKLET) &&
|
|
|
- (from_timer ?
|
|
|
+
|
|
|
+ if ((from_timer ?
|
|
|
qdf_system_time_after(ce2_tasklet_sched_time,
|
|
|
ce2_tasklet_exec_time) :
|
|
|
qdf_system_time_after(ce2_tasklet_exec_time,
|
|
@@ -704,9 +684,29 @@ void hif_check_detection_latency(struct hif_softc *scn,
|
|
|
cpu_id, (void *)_RET_IP_);
|
|
|
goto latency;
|
|
|
}
|
|
|
+ return;
|
|
|
|
|
|
- if (bitmap_type & BIT(HIF_DETECT_CREDIT) &&
|
|
|
- (from_timer ?
|
|
|
+latency:
|
|
|
+ qdf_trigger_self_recovery(NULL, QDF_TASKLET_CREDIT_LATENCY_DETECT);
|
|
|
+}
|
|
|
+
|
|
|
+void hif_credit_latency(struct hif_softc *scn, bool from_timer)
|
|
|
+{
|
|
|
+ qdf_time_t credit_request_time =
|
|
|
+ scn->latency_detect.credit_request_time;
|
|
|
+ qdf_time_t credit_report_time =
|
|
|
+ scn->latency_detect.credit_report_time;
|
|
|
+ qdf_time_t curr_jiffies = qdf_system_ticks();
|
|
|
+ uint32_t detect_latency_threshold =
|
|
|
+ scn->latency_detect.detect_latency_threshold;
|
|
|
+ int cpu_id = qdf_get_cpu();
|
|
|
+
|
|
|
+ /* 2 kinds of check here.
|
|
|
+ * from_timer==true: check if credit report stall
|
|
|
+ * from_timer==false: check credit report comes late
|
|
|
+ */
|
|
|
+
|
|
|
+ if ((from_timer ?
|
|
|
qdf_system_time_after(credit_request_time,
|
|
|
credit_report_time) :
|
|
|
qdf_system_time_after(credit_report_time,
|
|
@@ -722,13 +722,38 @@ void hif_check_detection_latency(struct hif_softc *scn,
|
|
|
cpu_id, (void *)_RET_IP_);
|
|
|
goto latency;
|
|
|
}
|
|
|
-
|
|
|
return;
|
|
|
|
|
|
latency:
|
|
|
qdf_trigger_self_recovery(NULL, QDF_TASKLET_CREDIT_LATENCY_DETECT);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * hif_check_detection_latency(): to check if latency for tasklet/credit
|
|
|
+ *
|
|
|
+ * @scn: hif context
|
|
|
+ * @from_timer: if called from timer handler
|
|
|
+ * @bitmap_type: indicate if check tasklet or credit
|
|
|
+ *
|
|
|
+ * Return: none
|
|
|
+ */
|
|
|
+void hif_check_detection_latency(struct hif_softc *scn,
|
|
|
+ bool from_timer,
|
|
|
+ uint32_t bitmap_type)
|
|
|
+{
|
|
|
+ if (QDF_GLOBAL_MISSION_MODE != hif_get_conparam(scn))
|
|
|
+ return;
|
|
|
+
|
|
|
+ if (!scn->latency_detect.enable_detection)
|
|
|
+ return;
|
|
|
+
|
|
|
+ if (bitmap_type & BIT(HIF_DETECT_TASKLET))
|
|
|
+ hif_tasklet_latency(scn, from_timer);
|
|
|
+
|
|
|
+ if (bitmap_type & BIT(HIF_DETECT_CREDIT))
|
|
|
+ hif_credit_latency(scn, from_timer);
|
|
|
+}
|
|
|
+
|
|
|
static void hif_latency_detect_timeout_handler(void *arg)
|
|
|
{
|
|
|
struct hif_softc *scn = (struct hif_softc *)arg;
|