|
@@ -3051,6 +3051,66 @@ static void wma_wake_event_log_reason(t_wma_handle *wma,
|
|
|
qdf_wma_wow_wakeup_stats_event(wma);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * wma_wow_wakeup_host_trigger_ssr() - Trigger SSR on host wakeup
|
|
|
+ * @handle: wma handle
|
|
|
+ * @reason: Host wakeup reason
|
|
|
+ *
|
|
|
+ * This function triggers SSR if host is woken up by fw with reason as pagefault
|
|
|
+ *
|
|
|
+ * Return: None
|
|
|
+ */
|
|
|
+static void
|
|
|
+wma_wow_wakeup_host_trigger_ssr(t_wma_handle *wma, uint32_t reason)
|
|
|
+{
|
|
|
+ uint8_t pagefault_wakeups_for_ssr;
|
|
|
+ uint32_t interval_for_pagefault_wakeup_counts;
|
|
|
+ qdf_time_t curr_time;
|
|
|
+ struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
|
|
|
+
|
|
|
+ if (!mac) {
|
|
|
+ wma_debug("NULL mac ptr");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (WOW_REASON_PAGE_FAULT != reason)
|
|
|
+ return;
|
|
|
+
|
|
|
+ if (!mac->sme.ssr_on_pagefault_cb) {
|
|
|
+ wma_debug("NULL SSR on pagefault cb");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!wlan_pmo_enable_ssr_on_page_fault(wma->psoc))
|
|
|
+ return;
|
|
|
+
|
|
|
+ pagefault_wakeups_for_ssr =
|
|
|
+ wlan_pmo_get_max_pagefault_wakeups_for_ssr(wma->psoc);
|
|
|
+
|
|
|
+ interval_for_pagefault_wakeup_counts =
|
|
|
+ wlan_pmo_get_interval_for_pagefault_wakeup_counts(wma->psoc);
|
|
|
+
|
|
|
+ curr_time = qdf_get_time_of_the_day_ms();
|
|
|
+
|
|
|
+ if (wma->num_page_fault_wakeups == pagefault_wakeups_for_ssr) {
|
|
|
+ qdf_mem_copy(&wma->pagefault_wakeups_ts[0],
|
|
|
+ &wma->pagefault_wakeups_ts[1],
|
|
|
+ (pagefault_wakeups_for_ssr - 1) *
|
|
|
+ sizeof(qdf_time_t));
|
|
|
+ wma->num_page_fault_wakeups--;
|
|
|
+ }
|
|
|
+
|
|
|
+ wma->pagefault_wakeups_ts[wma->num_page_fault_wakeups++] = curr_time;
|
|
|
+
|
|
|
+ wma_nofl_debug("num pagefault wakeups %d", wma->num_page_fault_wakeups);
|
|
|
+
|
|
|
+ if (wma->num_page_fault_wakeups < pagefault_wakeups_for_ssr)
|
|
|
+ return;
|
|
|
+
|
|
|
+ if (curr_time - wma->pagefault_wakeups_ts[0] <=
|
|
|
+ interval_for_pagefault_wakeup_counts)
|
|
|
+ mac->sme.ssr_on_pagefault_cb();
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* wma_wow_wakeup_host_event() - wakeup host event handler
|
|
|
* @handle: wma handle
|
|
@@ -3083,6 +3143,7 @@ int wma_wow_wakeup_host_event(void *handle, uint8_t *event, uint32_t len)
|
|
|
}
|
|
|
|
|
|
wma_wake_event_log_reason(wma, wake_info);
|
|
|
+ wma_wow_wakeup_host_trigger_ssr(wma, wake_info->wake_reason);
|
|
|
|
|
|
if (wake_info->wake_reason == WOW_REASON_LOCAL_DATA_UC_DROP)
|
|
|
hif_rtpm_set_autosuspend_delay(WOW_LARGE_RX_RTPM_DELAY);
|