diff options
| -rw-r--r-- | core/hdd/inc/wlan_hdd_power.h | 12 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_driver_ops.c | 23 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_power.c | 2 | ||||
| -rw-r--r-- | core/wma/inc/wma_api.h | 8 | ||||
| -rw-r--r-- | core/wma/src/wma_features.c | 19 |
5 files changed, 48 insertions, 16 deletions
diff --git a/core/hdd/inc/wlan_hdd_power.h b/core/hdd/inc/wlan_hdd_power.h index 4623d9bb6b83..e9262637a513 100644 --- a/core/hdd/inc/wlan_hdd_power.h +++ b/core/hdd/inc/wlan_hdd_power.h @@ -223,6 +223,18 @@ void wlan_hdd_inc_suspend_stats(hdd_context_t *hdd_ctx, */ #ifdef WLAN_SUSPEND_RESUME_TEST /** + * wlan_hdd_unit_test_bus_suspend() - suspend the wlan bus + * @state: state containing the suspend source event + * + * This function does the same as wlan_hdd_bus_suspend, but additionally passes + * the appropriate flags to FW, indicating this is a unit-test suspend and it + * should use an HTC wakeup method to resume. + * + * Return: 0 for success or error code + */ +int wlan_hdd_unit_test_bus_suspend(pm_message_t state); + +/** * hdd_wlan_fake_apps_resume() - Resume from unit-test triggered suspend * @wiphy: the kernel wiphy struct for the device being resumed * @dev: the kernel net_device struct for the device being resumed diff --git a/core/hdd/src/wlan_hdd_driver_ops.c b/core/hdd/src/wlan_hdd_driver_ops.c index 20290b8f9280..22189d3e28f2 100644 --- a/core/hdd/src/wlan_hdd_driver_ops.c +++ b/core/hdd/src/wlan_hdd_driver_ops.c @@ -494,6 +494,7 @@ static void wlan_hdd_notify_handler(int state) /** * __wlan_hdd_bus_suspend() - handles platform supsend * @state: suspend message from the kernel + * @wow_flags: bitmap of WMI WOW flags to pass to FW * * Does precondtion validation. Ensures that a subsystem restart isn't in * progress. Ensures that no load or unload is in progress. @@ -505,7 +506,7 @@ static void wlan_hdd_notify_handler(int state) * -EBUSY or -EAGAIN if another opperation is in progress and * wlan will not be ready to suspend in time. */ -static int __wlan_hdd_bus_suspend(pm_message_t state) +static int __wlan_hdd_bus_suspend(pm_message_t state, uint32_t wow_flags) { hdd_context_t *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD); void *hif_ctx; @@ -532,7 +533,7 @@ static int __wlan_hdd_bus_suspend(pm_message_t state) if (err) goto done; - err = wma_bus_suspend(); + err = wma_bus_suspend(wow_flags); if (err) goto resume_oltxrx; @@ -559,12 +560,26 @@ int wlan_hdd_bus_suspend(pm_message_t state) int ret; cds_ssr_protect(__func__); - ret = __wlan_hdd_bus_suspend(state); + ret = __wlan_hdd_bus_suspend(state, 0); cds_ssr_unprotect(__func__); return ret; } +#ifdef WLAN_SUSPEND_RESUME_TEST +int wlan_hdd_unit_test_bus_suspend(pm_message_t state) +{ + int ret; + + cds_ssr_protect(__func__); + ret = __wlan_hdd_bus_suspend(state, WMI_WOW_FLAG_UNIT_TEST_ENABLE | + WMI_WOW_FLAG_DO_HTC_WAKEUP); + cds_ssr_unprotect(__func__); + + return ret; +} +#endif + /** * __wlan_hdd_bus_suspend_noirq() - handle .suspend_noirq callback * @@ -822,7 +837,7 @@ static int __wlan_hdd_runtime_suspend(struct device *dev) if (status) goto resume_txrx; - status = wma_runtime_suspend(); + status = wma_runtime_suspend(0); if (status) goto resume_htc; diff --git a/core/hdd/src/wlan_hdd_power.c b/core/hdd/src/wlan_hdd_power.c index b808bf38807b..8249b069083e 100644 --- a/core/hdd/src/wlan_hdd_power.c +++ b/core/hdd/src/wlan_hdd_power.c @@ -2531,7 +2531,7 @@ int hdd_wlan_fake_apps_suspend(struct wiphy *wiphy, struct net_device *dev) goto resume_done; state.event = PM_EVENT_SUSPEND; - suspend_err = wlan_hdd_bus_suspend(state); + suspend_err = wlan_hdd_unit_test_bus_suspend(state); if (suspend_err) goto cfg80211_resume; diff --git a/core/wma/inc/wma_api.h b/core/wma/inc/wma_api.h index e321cd1af6d2..d6ca6d14e875 100644 --- a/core/wma/inc/wma_api.h +++ b/core/wma/inc/wma_api.h @@ -142,9 +142,9 @@ QDF_STATUS wma_set_reg_domain(void *clientCtxt, v_REGDOMAIN_t regId); QDF_STATUS wma_get_wcnss_software_version(void *p_cds_gctx, uint8_t *pVersion, uint32_t versionBufferSize); -int wma_runtime_suspend(void); +int wma_runtime_suspend(uint32_t wow_flags); int wma_runtime_resume(void); -int wma_bus_suspend(void); +int wma_bus_suspend(uint32_t wow_flags); int wma_is_target_wake_up_received(void); int wma_clear_target_wake_up(void); QDF_STATUS wma_suspend_target(WMA_HANDLE handle, int disable_target_intr); @@ -155,8 +155,8 @@ QDF_STATUS wma_resume_target(WMA_HANDLE handle); QDF_STATUS wma_disable_wow_in_fw(WMA_HANDLE handle); QDF_STATUS wma_disable_d0wow_in_fw(WMA_HANDLE handle); bool wma_is_wow_mode_selected(WMA_HANDLE handle); -QDF_STATUS wma_enable_wow_in_fw(WMA_HANDLE handle); -QDF_STATUS wma_enable_d0wow_in_fw(WMA_HANDLE handle); +QDF_STATUS wma_enable_wow_in_fw(WMA_HANDLE handle, uint32_t wow_flags); +QDF_STATUS wma_enable_d0wow_in_fw(WMA_HANDLE handle, uint32_t wow_flags); bool wma_check_scan_in_progress(WMA_HANDLE handle); void wma_set_peer_authorized_cb(void *wma_ctx, wma_peer_authorized_fp auth_cb); QDF_STATUS wma_set_peer_param(void *wma_ctx, uint8_t *peer_addr, diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index 5e817443a536..1f404cfbbaad 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -3873,10 +3873,11 @@ void wma_enable_disable_wakeup_event(WMA_HANDLE handle, /** * wma_enable_wow_in_fw() - wnable wow in fw * @wma: wma handle + * @wow_flags: bitmap of WMI WOW flags to pass to FW * * Return: QDF status */ -QDF_STATUS wma_enable_wow_in_fw(WMA_HANDLE handle) +QDF_STATUS wma_enable_wow_in_fw(WMA_HANDLE handle, uint32_t wow_flags) { tp_wma_handle wma = handle; int ret; @@ -3912,6 +3913,7 @@ QDF_STATUS wma_enable_wow_in_fw(WMA_HANDLE handle) param.enable = true; param.can_suspend_link = htc_can_suspend_link(wma->htc_handle); + param.flags = wow_flags; ret = wmi_unified_wow_enable_send(wma->wmi_handle, ¶m, WMA_WILDCARD_PDEV_ID); if (ret) { @@ -6446,13 +6448,14 @@ failure: /** * __wma_bus_suspend(): handles bus suspend for wma * @type: is this suspend part of runtime suspend or system suspend? + * @wow_flags: bitmap of WMI WOW flags to pass to FW * * Bails if a scan is in progress. * Calls the appropriate handlers based on configuration and event. * * Return: 0 for success or error code */ -static int __wma_bus_suspend(enum qdf_suspend_type type) +static int __wma_bus_suspend(enum qdf_suspend_type type, uint32_t wow_flags) { WMA_HANDLE handle = cds_get_context(QDF_MODULE_ID_WMA); if (NULL == handle) { @@ -6476,7 +6479,7 @@ static int __wma_bus_suspend(enum qdf_suspend_type type) wma_is_wow_mode_selected(handle)); if (wma_is_wow_mode_selected(handle)) { - QDF_STATUS status = wma_enable_wow_in_fw(handle); + QDF_STATUS status = wma_enable_wow_in_fw(handle, wow_flags); return qdf_status_to_os_return(status); } @@ -6485,6 +6488,7 @@ static int __wma_bus_suspend(enum qdf_suspend_type type) /** * wma_runtime_suspend() - handles runtime suspend request from hdd + * @wow_flags: bitmap of WMI WOW flags to pass to FW * * Calls the appropriate handler based on configuration and event. * Last busy marking should prevent race conditions between processing @@ -6496,22 +6500,23 @@ static int __wma_bus_suspend(enum qdf_suspend_type type) * * Return: 0 for success or error code */ -int wma_runtime_suspend(void) +int wma_runtime_suspend(uint32_t wow_flags) { - return __wma_bus_suspend(QDF_RUNTIME_SUSPEND); + return __wma_bus_suspend(QDF_RUNTIME_SUSPEND, wow_flags); } /** * wma_bus_suspend() - handles bus suspend request from hdd + * @wow_flags: bitmap of WMI WOW flags to pass to FW * * Calls the appropriate handler based on configuration and event * * Return: 0 for success or error code */ -int wma_bus_suspend(void) +int wma_bus_suspend(uint32_t wow_flags) { - return __wma_bus_suspend(QDF_SYSTEM_SUSPEND); + return __wma_bus_suspend(QDF_SYSTEM_SUSPEND, wow_flags); } /** |
