summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CORE/SERVICES/COMMON/wma_api.h1
-rw-r--r--CORE/SERVICES/HIF/PCIe/if_pci.c3
-rw-r--r--CORE/SERVICES/WMA/wma.c41
3 files changed, 45 insertions, 0 deletions
diff --git a/CORE/SERVICES/COMMON/wma_api.h b/CORE/SERVICES/COMMON/wma_api.h
index c145fab6aafd..3b392d5113ac 100644
--- a/CORE/SERVICES/COMMON/wma_api.h
+++ b/CORE/SERVICES/COMMON/wma_api.h
@@ -126,6 +126,7 @@ VOS_STATUS WMA_GetWcnssSoftwareVersion(v_PVOID_t pvosGCtx, tANI_U8 *pVersion,
int wma_suspend_target(WMA_HANDLE handle, int disable_target_intr);
void wma_target_suspend_acknowledge(void *context);
int wma_resume_target(WMA_HANDLE handle);
+int wma_disable_wow_in_fw(WMA_HANDLE handle);
int wma_is_wow_mode_selected(WMA_HANDLE handle);
int wma_enable_wow_in_fw(WMA_HANDLE handle);
#endif
diff --git a/CORE/SERVICES/HIF/PCIe/if_pci.c b/CORE/SERVICES/HIF/PCIe/if_pci.c
index b9be432a0b9f..c118d1f4bd90 100644
--- a/CORE/SERVICES/HIF/PCIe/if_pci.c
+++ b/CORE/SERVICES/HIF/PCIe/if_pci.c
@@ -1664,6 +1664,9 @@ hif_pci_resume(struct pci_dev *pdev)
(val == PM_EVENT_HIBERNATE || val == PM_EVENT_SUSPEND)) {
return wma_resume_target(temp_module);
}
+ else if (wma_disable_wow_in_fw(temp_module))
+ return (-1);
+
return 0;
}
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index 091650d9f925..36b111dba792 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -12869,6 +12869,47 @@ static VOS_STATUS wma_resume_req(tp_wma_handle wma, tpSirWlanResumeParam info)
}
/*
+ Disable wow in PCIe resume context.
+*/
+
+int wma_disable_wow_in_fw(WMA_HANDLE handle)
+{
+ tp_wma_handle wma = handle;
+ struct wma_txrx_node *iface;
+ int8_t vdev_id;
+ VOS_STATUS ret;
+
+ if(!wma->wow.wow_enable || !wma->wow.wow_enable_cmd_sent) {
+ return VOS_STATUS_SUCCESS;
+ }
+
+ WMA_LOGD("WoW Resume in PCIe Context\n");
+ wma->wow.wow_enable = FALSE;
+ wma->wow.wow_enable_cmd_sent = FALSE;
+
+ for (vdev_id = 0; vdev_id < wma->max_bssid; vdev_id++) {
+ if (!wma->interfaces[vdev_id].handle)
+ continue;
+
+ #ifdef QCA_SUPPORT_TXRX_VDEV_PAUSE_LL
+ /* When host resume, by default, unpause all active vdev */
+ if (wma->interfaces[vdev_id].pause_bitmap) {
+ wdi_in_vdev_unpause(wma->interfaces[vdev_id].handle);
+ wma->interfaces[vdev_id].pause_bitmap = 0;
+ }
+ #endif /* QCA_SUPPORT_TXRX_VDEV_PAUSE_LL */
+
+ iface = &wma->interfaces[vdev_id];
+ iface->conn_state = FALSE;
+ }
+
+ ret = wma_send_host_wakeup_ind_to_fw(wma);
+ vos_wake_lock_timeout_acquire(&wma->wow_wake_lock, 2000);
+
+ return ret;
+}
+
+/*
* Returns true if wow parameters (patterns, wakeup events, etc)
* are configured in fw and waiting for wow to be enabled in fw.
* Other cases, returns false.