From eaac8c195b261f6b8c7035823b4d5452a0ff89cc Mon Sep 17 00:00:00 2001 From: Arun Kumar Khandavalli Date: Fri, 22 Nov 2019 17:16:18 +0530 Subject: [PATCH] qcacmn: Move wakelock to psoc level Wakelock is system level lock not required to be taken for every vdev, Hence move the wakelock to the psoc hierarchy. Change-Id: I525baf5f4b5dcadb493d84900dbd0a2e7c6407f6 CRs-Fixed: 2563406 --- .../inc/target_if_psoc_wake_lock.h} | 46 ++-- .../mlme/psoc/src/target_if_psoc_wake_lock.c | 151 +++++++++++++ .../vdev_mgr/src/target_if_vdev_mgr_tx_ops.c | 38 +++- .../src/target_if_vdev_mgr_wake_lock.c | 199 ------------------ .../lmac_if/inc/wlan_lmac_if_def.h | 13 +- umac/mlme/include/wlan_psoc_mlme.h | 4 + umac/mlme/include/wlan_vdev_mlme.h | 19 -- .../dispatcher/src/wlan_psoc_mlme_main.c | 5 +- .../dispatcher/src/wlan_vdev_mlme_main.c | 3 - .../src/wlan_vdev_mgr_tgt_if_rx_api.c | 24 +-- 10 files changed, 239 insertions(+), 263 deletions(-) rename target_if/mlme/{vdev_mgr/inc/target_if_vdev_mgr_wake_lock.h => psoc/inc/target_if_psoc_wake_lock.h} (68%) create mode 100644 target_if/mlme/psoc/src/target_if_psoc_wake_lock.c delete mode 100644 target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_wake_lock.c diff --git a/target_if/mlme/vdev_mgr/inc/target_if_vdev_mgr_wake_lock.h b/target_if/mlme/psoc/inc/target_if_psoc_wake_lock.h similarity index 68% rename from target_if/mlme/vdev_mgr/inc/target_if_vdev_mgr_wake_lock.h rename to target_if/mlme/psoc/inc/target_if_psoc_wake_lock.h index 768b21b78d..21ef960364 100644 --- a/target_if/mlme/vdev_mgr/inc/target_if_vdev_mgr_wake_lock.h +++ b/target_if/mlme/psoc/inc/target_if_psoc_wake_lock.h @@ -17,13 +17,29 @@ */ /** - * DOC: target_if_vdev_mgr_wake_lock.h + * DOC: target_if_psoc_wake_lock.h * * This file provides declaration for wakelock APIs */ -#ifndef __TARGET_IF_VDEV_MGR_WAKE_LOCK_H__ -#define __TARGET_IF_VDEV_MGR_WAKE_LOCK_H__ +#ifndef __TARGET_IF_PSOC_WAKE_LOCK_H__ +#define __TARGET_IF_PSOC_WAKE_LOCK_H__ + +#ifdef FEATURE_VDEV_RSP_WAKELOCK +/** + * struct wlan_vdev_wakelock - vdev wake lock sub structure + * @start_wakelock: wakelock for vdev start + * @stop_wakelock: wakelock for vdev stop + * @delete_wakelock: wakelock for vdev delete + * @wmi_cmd_rsp_runtime_lock: run time lock + */ +struct psoc_mlme_wakelock { + qdf_wake_lock_t start_wakelock; + qdf_wake_lock_t stop_wakelock; + qdf_wake_lock_t delete_wakelock; + qdf_runtime_lock_t wmi_cmd_rsp_runtime_lock; +}; +#endif enum wakelock_mode { START_WAKELOCK, @@ -37,65 +53,65 @@ enum wakelock_mode { * target_if_wake_lock_init() - API to initialize wakelocks:start, stop and delete. - * @vdev: pointer to vdev + * @psoc: pointer to psoc * * This also initialize the runtime lock * * Return: None */ -void target_if_wake_lock_init(struct wlan_objmgr_vdev *vdev); +void target_if_wake_lock_init(struct wlan_objmgr_psoc *psoc); /** * target_if_wake_lock_deinit() - API to destroy wakelocks:start, stop and delete. - * @vdev: pointer to vdev + * @psoc: pointer to psoc * * This also destroy the runtime lock * * Return: None */ -void target_if_wake_lock_deinit(struct wlan_objmgr_vdev *vdev); +void target_if_wake_lock_deinit(struct wlan_objmgr_psoc *psoc); /** * target_if_start_wake_lock_timeout_acquire() - acquire the vdev start wakelock - * @vdev: pointer to vdev + * @psoc: pointer to psoc * * This also acquires the target_if runtime pm lock. * * Return: Success/Failure */ -QDF_STATUS target_if_wake_lock_timeout_acquire(struct wlan_objmgr_vdev *vdev, +QDF_STATUS target_if_wake_lock_timeout_acquire(struct wlan_objmgr_psoc *psoc, enum wakelock_mode mode); /** * target_if_start_wake_lock_timeout_release() - release the start wakelock - * @vdev: pointer to vdev + * @psoc: pointer to psoc * * This also release the target_if runtime pm lock. * * Return: Success/Failure */ -QDF_STATUS target_if_wake_lock_timeout_release(struct wlan_objmgr_vdev *vdev, +QDF_STATUS target_if_wake_lock_timeout_release(struct wlan_objmgr_psoc *psoc, enum wakelock_mode mode); #else -static inline void target_if_wake_lock_init(struct wlan_objmgr_vdev *vdev) +static inline void target_if_wake_lock_init(struct wlan_objmgr_psoc *psoc) { } -static inline void target_if_wake_lock_deinit(struct wlan_objmgr_vdev *vdev) +static inline void target_if_wake_lock_deinit(struct wlan_objmgr_psoc *psoc) { } static inline QDF_STATUS target_if_wake_lock_timeout_acquire( - struct wlan_objmgr_vdev *vdev, + struct wlan_objmgr_psoc *psoc, enum wakelock_mode mode) { return QDF_STATUS_SUCCESS; } static inline QDF_STATUS target_if_wake_lock_timeout_release( - struct wlan_objmgr_vdev *vdev, + struct wlan_objmgr_psoc *psoc, enum wakelock_mode mode) { return QDF_STATUS_SUCCESS; diff --git a/target_if/mlme/psoc/src/target_if_psoc_wake_lock.c b/target_if/mlme/psoc/src/target_if_psoc_wake_lock.c new file mode 100644 index 0000000000..752ab0b439 --- /dev/null +++ b/target_if/mlme/psoc/src/target_if_psoc_wake_lock.c @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved. + * + * Permission to use, copy, modify, and/or distribute this software for + * any purpose with or without fee is hereby granted, provided that the + * above copyright notice and this permission notice appear in all + * copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE + * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/** + * DOC: target_if_psoc_wake_lock.c + * + * This file provide definition for APIs related to wake lock + */ + +#include "qdf_lock.h" +#include +#include +#include +#include +#include + +void target_if_wake_lock_init(struct wlan_objmgr_psoc *psoc) +{ + struct psoc_mlme_wakelock *psoc_wakelock; + struct wlan_lmac_if_mlme_rx_ops *rx_ops; + + rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); + if (!rx_ops && !rx_ops->psoc_get_wakelock_info) { + mlme_err("vdev_id:%d psoc_id:%d No Rx Ops", vdev_id, + wlan_psoc_get_id(psoc)); + return QDF_STATUS_E_INVAL; + } + + psoc_wakelock = rx_ops->psoc_get_wakelock_info(psoc); + + qdf_wake_lock_create(&psoc_wakelock->start_wakelock, "vdev_start"); + qdf_wake_lock_create(&psoc_wakelock->stop_wakelock, "vdev_stop"); + qdf_wake_lock_create(&psoc_wakelock->delete_wakelock, "vdev_delete"); + + qdf_runtime_lock_init(&psoc_wakelock->wmi_cmd_rsp_runtime_lock); +} + +void target_if_wake_lock_deinit(struct wlan_objmgr_psoc *psoc) +{ + struct psoc_mlme_wakelock *psoc_wakelock; + struct wlan_lmac_if_mlme_rx_ops *rx_ops; + + rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); + if (!rx_ops && !rx_ops->psoc_get_wakelock_info) { + mlme_err("vdev_id:%d psoc_id:%d No Rx Ops", vdev_id, + wlan_psoc_get_id(psoc)); + return QDF_STATUS_E_INVAL; + } + + psoc_wakelock = rx_ops->psoc_get_wakelock_info(psoc); + + qdf_wake_lock_destroy(&psoc_wakelock->start_wakelock); + qdf_wake_lock_destroy(&psoc_wakelock->stop_wakelock); + qdf_wake_lock_destroy(&psoc_wakelock->delete_wakelock); + + qdf_runtime_lock_deinit(&vdev_wakelock->wmi_cmd_rsp_runtime_lock); +} + +QDF_STATUS target_if_wake_lock_timeout_acquire( + struct wlan_objmgr_psoc *psoc, + enum wakelock_mode mode) +{ + struct psoc_mlme_wakelock *psoc_wakelock; + struct wlan_objmgr_psoc *psoc; + struct wlan_lmac_if_mlme_rx_ops *rx_ops; + + rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); + if (!rx_ops && !rx_ops->psoc_get_wakelock_info) { + mlme_err("vdev_id:%d psoc_id:%d No Rx Ops", vdev_id, + wlan_psoc_get_id(psoc)); + return QDF_STATUS_E_INVAL; + } + + psoc_wakelock = rx_ops->psoc_get_wakelock_info(psoc); + switch (mode) { + case START_WAKELOCK: + qdf_wake_lock_timeout_acquire(&psoc_wakelock->start_wakelock, + START_RESPONSE_TIMER); + break; + case STOP_WAKELOCK: + qdf_wake_lock_timeout_acquire(&psoc_wakelock->stop_wakelock, + STOP_RESPONSE_TIMER); + break; + case DELETE_WAKELOCK: + qdf_wake_lock_timeout_acquire(&vdev_wakelock->delete_wakelock, + DELETE_RESPONSE_TIMER); + break; + default: + target_if_err("operation mode is invalid"); + return QDF_STATUS_E_FAILURE; + } + + qdf_runtime_pm_prevent_suspend( + &psoc_wakelock->wmi_cmd_rsp_runtime_lock); + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS target_if_wake_lock_timeout_release( + struct wlan_objmgr_psoc *psoc, + enum wakelock_mode mode) +{ + struct psoc_mlme_wakelock *psoc_wakelock; + struct wlan_lmac_if_mlme_rx_ops *rx_ops; + + rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); + if (!rx_ops && !rx_ops->psoc_get_wakelock_info) { + mlme_err("vdev_id:%d psoc_id:%d No Rx Ops", vdev_id, + wlan_psoc_get_id(psoc)); + return QDF_STATUS_E_INVAL; + } + + psoc_wakelock = rx_ops->psoc_get_wakelock_info(psoc); + switch (mode) { + case START_WAKELOCK: + qdf_wake_lock_release(&psoc_wakelock->start_wakelock, + WIFI_POWER_EVENT_WAKELOCK_WMI_CMD_RSP); + break; + case STOP_WAKELOCK: + qdf_wake_lock_release(&psoc_wakelock->stop_wakelock, + WIFI_POWER_EVENT_WAKELOCK_WMI_CMD_RSP); + break; + case DELETE_WAKELOCK: + qdf_wake_lock_release(&psoc_wakelock->delete_wakelock, + WIFI_POWER_EVENT_WAKELOCK_WMI_CMD_RSP); + break; + default: + target_if_err("operation mode is invalid"); + return QDF_STATUS_E_FAILURE; + } + + qdf_runtime_pm_allow_suspend(&psoc_wakelock->wmi_cmd_rsp_runtime_lock); + + return QDF_STATUS_SUCCESS; +} + diff --git a/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_tx_ops.c b/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_tx_ops.c index a60ebe5436..f85f7d80a1 100644 --- a/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_tx_ops.c +++ b/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_tx_ops.c @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -38,6 +37,7 @@ #include #include #include +#include static QDF_STATUS target_if_vdev_mgr_register_event_handler( struct wlan_objmgr_psoc *psoc) @@ -444,7 +444,7 @@ static QDF_STATUS target_if_vdev_mgr_start_send( } vdev_rsp->expire_time = START_RESPONSE_TIMER; - target_if_wake_lock_timeout_acquire(vdev, START_WAKELOCK); + target_if_wake_lock_timeout_acquire(psoc, START_WAKELOCK); if (param->is_restart) target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, @@ -457,7 +457,7 @@ static QDF_STATUS target_if_vdev_mgr_start_send( if (QDF_IS_STATUS_ERROR(status)) { vdev_rsp->timer_status = QDF_STATUS_E_CANCELED; vdev_rsp->expire_time = 0; - target_if_wake_lock_timeout_release(vdev, START_WAKELOCK); + target_if_wake_lock_timeout_release(psoc, START_WAKELOCK); if (param->is_restart) target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, RESTART_RESPONSE_BIT); @@ -478,7 +478,7 @@ static QDF_STATUS target_if_vdev_mgr_delete_response_send( rsp.vdev_id = wlan_vdev_get_id(vdev); status = rx_ops->vdev_mgr_delete_response(psoc, &rsp); - target_if_wake_lock_timeout_release(vdev, DELETE_WAKELOCK); + target_if_wake_lock_timeout_release(psoc, DELETE_WAKELOCK); return status; } @@ -521,10 +521,10 @@ static QDF_STATUS target_if_vdev_mgr_delete_send( return QDF_STATUS_E_INVAL; } - target_if_wake_lock_timeout_acquire(vdev, DELETE_WAKELOCK); vdev_rsp->expire_time = DELETE_RESPONSE_TIMER; target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, DELETE_RESPONSE_BIT); + target_if_wake_lock_timeout_acquire(psoc, DELETE_WAKELOCK); status = wmi_unified_vdev_delete_send(wmi_handle, param->vdev_id); if (QDF_IS_STATUS_SUCCESS(status)) { @@ -540,11 +540,11 @@ static QDF_STATUS target_if_vdev_mgr_delete_send( target_if_vdev_mgr_delete_response_send(vdev, rx_ops); } } else { - target_if_wake_lock_timeout_release(vdev, DELETE_WAKELOCK); vdev_rsp->expire_time = 0; vdev_rsp->timer_status = QDF_STATUS_E_CANCELED; target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, DELETE_RESPONSE_BIT); + target_if_wake_lock_timeout_release(psoc, DELETE_WAKELOCK); } return status; } @@ -588,17 +588,17 @@ static QDF_STATUS target_if_vdev_mgr_stop_send( return QDF_STATUS_E_INVAL; } - target_if_wake_lock_timeout_acquire(vdev, STOP_WAKELOCK); vdev_rsp->expire_time = STOP_RESPONSE_TIMER; target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, STOP_RESPONSE_BIT); + target_if_wake_lock_timeout_acquire(psoc, STOP_WAKELOCK); status = wmi_unified_vdev_stop_send(wmi_handle, param->vdev_id); if (QDF_IS_STATUS_ERROR(status)) { vdev_rsp->expire_time = 0; vdev_rsp->timer_status = QDF_STATUS_E_CANCELED; - target_if_wake_lock_timeout_release(vdev, STOP_WAKELOCK); target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, STOP_RESPONSE_BIT); + target_if_wake_lock_timeout_release(psoc, STOP_WAKELOCK); } return status; } @@ -609,6 +609,7 @@ static QDF_STATUS target_if_vdev_mgr_down_send( { QDF_STATUS status; struct wmi_unified *wmi_handle; + struct wlan_objmgr_psoc *psoc; if (!vdev || !param) { mlme_err("Invalid input"); @@ -621,8 +622,14 @@ static QDF_STATUS target_if_vdev_mgr_down_send( return QDF_STATUS_E_INVAL; } + psoc = wlan_vdev_get_psoc(vdev); + if (!psoc) { + mlme_err("Failed to get PSOC Object"); + return QDF_STATUS_E_INVAL; + } + status = wmi_unified_vdev_down_send(wmi_handle, param->vdev_id); - target_if_wake_lock_timeout_release(vdev, START_WAKELOCK); + target_if_wake_lock_timeout_release(psoc, START_WAKELOCK); return status; } @@ -636,6 +643,7 @@ static QDF_STATUS target_if_vdev_mgr_up_send( struct vdev_set_params sparam = {0}; uint8_t bssid[QDF_MAC_ADDR_SIZE]; uint8_t vdev_id; + struct wlan_objmgr_psoc *psoc; if (!vdev || !param) { mlme_err("Invalid input"); @@ -648,6 +656,12 @@ static QDF_STATUS target_if_vdev_mgr_up_send( return QDF_STATUS_E_INVAL; } + psoc = wlan_vdev_get_psoc(vdev); + if (!psoc) { + mlme_err("Failed to get PSOC Object"); + return QDF_STATUS_E_INVAL; + } + vdev_id = wlan_vdev_get_id(vdev); sparam.vdev_id = vdev_id; @@ -661,7 +675,7 @@ static QDF_STATUS target_if_vdev_mgr_up_send( ucfg_wlan_vdev_mgr_get_param_bssid(vdev, bssid); status = wmi_unified_vdev_up_send(wmi_handle, bssid, param); - target_if_wake_lock_timeout_release(vdev, START_WAKELOCK); + target_if_wake_lock_timeout_release(psoc, START_WAKELOCK); return status; } @@ -1174,5 +1188,9 @@ target_if_vdev_mgr_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops) target_if_psoc_vdev_rsp_timer_deinit; mlme_tx_ops->psoc_vdev_rsp_timer_inuse = target_if_psoc_vdev_rsp_timer_inuse; + mlme_tx_ops->psoc_wake_lock_init = + target_if_wake_lock_init; + mlme_tx_ops->psoc_wake_lock_deinit = + target_if_wake_lock_deinit; return QDF_STATUS_SUCCESS; } diff --git a/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_wake_lock.c b/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_wake_lock.c deleted file mode 100644 index 69c3a52f54..0000000000 --- a/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_wake_lock.c +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved. - * - * Permission to use, copy, modify, and/or distribute this software for - * any purpose with or without fee is hereby granted, provided that the - * above copyright notice and this permission notice appear in all - * copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE - * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -/** - * DOC: target_if_vdev_mgr_wake_lock.c - * - * This file provide definition for APIs related to wake lock - */ -#include "wlan_objmgr_vdev_obj.h" -#include "include/wlan_vdev_mlme.h" -#include "qdf_lock.h" -#include "target_if_vdev_mgr_wake_lock.h" -#include "wlan_lmac_if_def.h" -#include "host_diag_core_event.h" -#include -#include -#include -#include "target_if_vdev_mgr_rx_ops.h" - -void target_if_wake_lock_init(struct wlan_objmgr_vdev *vdev) -{ - struct vdev_mlme_wakelock *vdev_wakelock; - struct wlan_objmgr_psoc *psoc; - struct wlan_lmac_if_mlme_rx_ops *rx_ops; - - if (!vdev) { - target_if_err(" VDEV is NULL"); - return; - } - - psoc = wlan_vdev_get_psoc(vdev); - if (!psoc) { - target_if_err("PSOC is NULL"); - return; - } - - rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); - if (!rx_ops || !rx_ops->vdev_mgr_get_wakelock_info) { - target_if_err("No Rx Ops"); - return; - } - - vdev_wakelock = rx_ops->vdev_mgr_get_wakelock_info(vdev); - - qdf_wake_lock_create(&vdev_wakelock->start_wakelock, "vdev_start"); - qdf_wake_lock_create(&vdev_wakelock->stop_wakelock, "vdev_stop"); - qdf_wake_lock_create(&vdev_wakelock->delete_wakelock, "vdev_delete"); - - qdf_runtime_lock_init(&vdev_wakelock->wmi_cmd_rsp_runtime_lock); -} - -void target_if_wake_lock_deinit(struct wlan_objmgr_vdev *vdev) -{ - struct vdev_mlme_wakelock *vdev_wakelock; - struct wlan_objmgr_psoc *psoc; - struct wlan_lmac_if_mlme_rx_ops *rx_ops; - - if (!vdev) { - target_if_err(" VDEV is NULL"); - return; - } - - psoc = wlan_vdev_get_psoc(vdev); - if (!psoc) { - target_if_err("PSOC is NULL"); - return; - } - - rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); - if (!rx_ops || !rx_ops->vdev_mgr_get_wakelock_info) { - target_if_err("No Rx Ops"); - return; - } - - vdev_wakelock = rx_ops->vdev_mgr_get_wakelock_info(vdev); - - qdf_wake_lock_destroy(&vdev_wakelock->start_wakelock); - qdf_wake_lock_destroy(&vdev_wakelock->stop_wakelock); - qdf_wake_lock_destroy(&vdev_wakelock->delete_wakelock); - - qdf_runtime_lock_deinit(&vdev_wakelock->wmi_cmd_rsp_runtime_lock); -} - -QDF_STATUS target_if_wake_lock_timeout_acquire( - struct wlan_objmgr_vdev *vdev, - enum wakelock_mode mode) -{ - struct vdev_mlme_wakelock *vdev_wakelock; - struct wlan_objmgr_psoc *psoc; - struct wlan_lmac_if_mlme_rx_ops *rx_ops; - - if (!vdev) { - target_if_err(" VDEV is NULL"); - return QDF_STATUS_E_FAILURE; - } - - psoc = wlan_vdev_get_psoc(vdev); - if (!psoc) { - target_if_err("PSOC is NULL"); - return QDF_STATUS_E_FAILURE; - } - - rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); - if (!rx_ops || !rx_ops->vdev_mgr_get_wakelock_info) { - target_if_err("No Rx Ops"); - return QDF_STATUS_E_FAILURE; - } - - vdev_wakelock = rx_ops->vdev_mgr_get_wakelock_info(vdev); - - switch (mode) { - case START_WAKELOCK: - qdf_wake_lock_timeout_acquire(&vdev_wakelock->start_wakelock, - START_RESPONSE_TIMER); - break; - case STOP_WAKELOCK: - qdf_wake_lock_timeout_acquire(&vdev_wakelock->stop_wakelock, - STOP_RESPONSE_TIMER); - break; - case DELETE_WAKELOCK: - qdf_wake_lock_timeout_acquire(&vdev_wakelock->delete_wakelock, - DELETE_RESPONSE_TIMER); - break; - default: - target_if_err("operation mode is invalid"); - return QDF_STATUS_E_FAILURE; - } - - qdf_runtime_pm_prevent_suspend( - &vdev_wakelock->wmi_cmd_rsp_runtime_lock); - - return QDF_STATUS_SUCCESS; -} - -QDF_STATUS target_if_wake_lock_timeout_release( - struct wlan_objmgr_vdev *vdev, - enum wakelock_mode mode) -{ - struct vdev_mlme_wakelock *vdev_wakelock; - struct wlan_objmgr_psoc *psoc; - struct wlan_lmac_if_mlme_rx_ops *rx_ops; - - if (!vdev) { - target_if_err(" VDEV is NULL"); - return QDF_STATUS_E_FAILURE; - } - - psoc = wlan_vdev_get_psoc(vdev); - if (!psoc) { - target_if_err("PSOC is NULL"); - return QDF_STATUS_E_FAILURE; - } - - rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); - if (!rx_ops || !rx_ops->vdev_mgr_get_wakelock_info) { - target_if_err("No Rx Ops"); - return QDF_STATUS_E_FAILURE; - } - - vdev_wakelock = rx_ops->vdev_mgr_get_wakelock_info(vdev); - - switch (mode) { - case START_WAKELOCK: - qdf_wake_lock_release(&vdev_wakelock->start_wakelock, - WIFI_POWER_EVENT_WAKELOCK_WMI_CMD_RSP); - break; - case STOP_WAKELOCK: - qdf_wake_lock_release(&vdev_wakelock->stop_wakelock, - WIFI_POWER_EVENT_WAKELOCK_WMI_CMD_RSP); - break; - case DELETE_WAKELOCK: - qdf_wake_lock_release(&vdev_wakelock->delete_wakelock, - WIFI_POWER_EVENT_WAKELOCK_WMI_CMD_RSP); - break; - default: - target_if_err("operation mode is invalid"); - return QDF_STATUS_E_FAILURE; - } - - qdf_runtime_pm_allow_suspend(&vdev_wakelock->wmi_cmd_rsp_runtime_lock); - - return QDF_STATUS_SUCCESS; -} - diff --git a/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h b/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h index fdee2dbc6d..f8ea4868b7 100644 --- a/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h +++ b/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h @@ -210,6 +210,8 @@ enum wlan_mlme_cfg_id; * @psoc_vdev_rsp_timer_inuse: function to determine whether the vdev rsp * timer is inuse or not * @psoc_vdev_rsp_timer_mod: function to modify the time of vdev rsp timer + * @psoc_wake_lock_init: Initialize psoc wake lock for vdev response timer + * @psoc_wake_lock_deinit: De-Initialize psoc wake lock for vdev response timer */ struct wlan_lmac_if_mlme_tx_ops { uint32_t (*get_wifi_iface_id) (struct wlan_objmgr_pdev *pdev); @@ -281,7 +283,10 @@ struct wlan_lmac_if_mlme_tx_ops { struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, int mseconds); - + void (*psoc_wake_lock_init)( + struct wlan_objmgr_psoc *psoc); + void (*psoc_wake_lock_deinit)( + struct wlan_objmgr_psoc *psoc); }; /** @@ -1507,7 +1512,7 @@ struct wlan_lmac_if_dfs_rx_ops { * @vdev_mgr_tbttoffset_update_handle: function to handle tbtt offset event * @vdev_mgr_peer_delete_all_response: function to handle vdev delete all peer * event - * @vdev_mgr_get_wakelock_info: function to get wakelock info + * @psoc_get_wakelock_info: function to get wakelock info * @psoc_get_vdev_response_timer_info: function to get vdev response timer * structure for a specific vdev id */ @@ -1531,8 +1536,8 @@ struct wlan_lmac_if_mlme_rx_ops { struct wlan_objmgr_psoc *psoc, struct peer_delete_all_response *rsp); #ifdef FEATURE_VDEV_RSP_WAKELOCK - struct vdev_mlme_wakelock *(*vdev_mgr_get_wakelock_info)( - struct wlan_objmgr_vdev *vdev); + struct vdev_mlme_wakelock *(*psoc_get_wakelock_info)( + struct wlan_objmgr_psoc *psoc); #endif struct vdev_response_timer *(*psoc_get_vdev_response_timer_info)( struct wlan_objmgr_psoc *psoc, diff --git a/umac/mlme/include/wlan_psoc_mlme.h b/umac/mlme/include/wlan_psoc_mlme.h index 90644b4403..963cdbbfb3 100644 --- a/umac/mlme/include/wlan_psoc_mlme.h +++ b/umac/mlme/include/wlan_psoc_mlme.h @@ -29,11 +29,15 @@ * @psoc: PSoC object * @ext_psoc_ptr: PSoC legacy pointer * @psoc_vdev_rt: PSoC Vdev response timer + * @psoc_mlme_wakelock: Wakelock to prevent system going to suspend */ struct psoc_mlme_obj { struct wlan_objmgr_psoc *psoc; mlme_psoc_ext_t *ext_psoc_ptr; struct vdev_response_timer psoc_vdev_rt[WLAN_UMAC_PSOC_MAX_VDEVS]; +#ifdef FEATURE_VDEV_RSP_WAKELOCK + struct psoc_mlme_wakelock psoc_mlme_wakelock; +#endif }; #endif diff --git a/umac/mlme/include/wlan_vdev_mlme.h b/umac/mlme/include/wlan_vdev_mlme.h index a354239bc4..28dc138d0e 100644 --- a/umac/mlme/include/wlan_vdev_mlme.h +++ b/umac/mlme/include/wlan_vdev_mlme.h @@ -527,22 +527,6 @@ struct vdev_mlme_ops { struct peer_delete_all_response *rsp); }; -#ifdef FEATURE_VDEV_RSP_WAKELOCK -/** - * struct wlan_vdev_wakelock - vdev wake lock sub structure - * @start_wakelock: wakelock for vdev start - * @stop_wakelock: wakelock for vdev stop - * @delete_wakelock: wakelock for vdev delete - * @wmi_cmd_rsp_runtime_lock: run time lock - */ -struct vdev_mlme_wakelock { - qdf_wake_lock_t start_wakelock; - qdf_wake_lock_t stop_wakelock; - qdf_wake_lock_t delete_wakelock; - qdf_runtime_lock_t wmi_cmd_rsp_runtime_lock; -}; -#endif - /** * struct vdev_mlme_obj - VDEV MLME component object * @proto: VDEV MLME proto substructure @@ -567,9 +551,6 @@ struct vdev_mlme_obj { struct wlan_objmgr_vdev *vdev; struct vdev_mlme_ops *ops; mlme_vdev_ext_t *ext_vdev_ptr; -#ifdef FEATURE_VDEV_RSP_WAKELOCK - struct vdev_mlme_wakelock vdev_wakelock; -#endif }; /** diff --git a/umac/mlme/mlme_objmgr/dispatcher/src/wlan_psoc_mlme_main.c b/umac/mlme/mlme_objmgr/dispatcher/src/wlan_psoc_mlme_main.c index 3303b3079b..b979bcf538 100644 --- a/umac/mlme/mlme_objmgr/dispatcher/src/wlan_psoc_mlme_main.c +++ b/umac/mlme/mlme_objmgr/dispatcher/src/wlan_psoc_mlme_main.c @@ -25,6 +25,7 @@ #include #include #include +#include struct psoc_mlme_obj *mlme_psoc_get_priv(struct wlan_objmgr_psoc *psoc) { @@ -69,7 +70,8 @@ static QDF_STATUS mlme_psoc_obj_create_handler(struct wlan_objmgr_psoc *psoc, goto init_failed; } - return status; + target_if_wake_lock_init(psoc); + return QDF_STATUS_SUCCESS; init_failed: qdf_mem_free(psoc_mlme); @@ -87,6 +89,7 @@ static QDF_STATUS mlme_psoc_obj_destroy_handler(struct wlan_objmgr_psoc *psoc, return QDF_STATUS_E_FAILURE; } + target_if_wake_lock_deinit(psoc); wlan_objmgr_psoc_component_obj_detach(psoc, WLAN_UMAC_COMP_MLME, psoc_mlme); diff --git a/umac/mlme/mlme_objmgr/dispatcher/src/wlan_vdev_mlme_main.c b/umac/mlme/mlme_objmgr/dispatcher/src/wlan_vdev_mlme_main.c index 746f62b0bd..24bc48201a 100644 --- a/umac/mlme/mlme_objmgr/dispatcher/src/wlan_vdev_mlme_main.c +++ b/umac/mlme/mlme_objmgr/dispatcher/src/wlan_vdev_mlme_main.c @@ -31,7 +31,6 @@ #include #include #include -#include #include #include @@ -113,7 +112,6 @@ static QDF_STATUS mlme_vdev_obj_create_handler(struct wlan_objmgr_vdev *vdev, (void *)vdev_mlme, QDF_STATUS_SUCCESS); - target_if_wake_lock_init(vdev); if (mlme_vdev_ops_ext_hdl_post_create(vdev_mlme) != QDF_STATUS_SUCCESS) { mlme_err("Legacy vdev object post creation failed"); @@ -146,7 +144,6 @@ static QDF_STATUS mlme_vdev_obj_destroy_handler(struct wlan_objmgr_vdev *vdev, mlme_err(" VDEV is NULL"); return QDF_STATUS_E_FAILURE; } - target_if_wake_lock_deinit(vdev); vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); if (!vdev_mlme) { diff --git a/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_rx_api.c b/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_rx_api.c index c05d07d256..c61c2ebfdc 100644 --- a/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_rx_api.c +++ b/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_rx_api.c @@ -225,30 +225,30 @@ tgt_vdev_mgr_ext_tbttoffset_update_handle(uint32_t num_vdevs, bool is_ext) } #ifdef FEATURE_VDEV_RSP_WAKELOCK -static struct vdev_mlme_wakelock * -tgt_vdev_mgr_get_wakelock_info(struct wlan_objmgr_vdev *vdev) +static struct psoc_mlme_wakelock * +tgt_psoc_get_wakelock_info(struct wlan_objmgr_psoc *psoc) { - struct vdev_mlme_obj *vdev_mlme; + struct psoc_mlme_obj *psoc_mlme; - vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); - if (!vdev_mlme) { - mlme_err("VDEV_%d: VDEV_MLME is NULL", wlan_vdev_get_id(vdev)); + psoc_mlme = mlme_psoc_get_priv(psoc); + if (!psoc_mlme) { + mlme_err("VDEV_%d: VDEV_MLME is NULL", wlan_vdev_get_id(psoc)); return NULL; } - return &vdev_mlme->vdev_wakelock; + return &psoc_mlme->psoc_wakelock; } static inline void -tgt_vdev_mgr_reg_wakelock_info_rx_op(struct wlan_lmac_if_mlme_rx_ops +tgt_psoc_reg_wakelock_info_rx_op(struct wlan_lmac_if_mlme_rx_ops *mlme_rx_ops) { - mlme_rx_ops->vdev_mgr_get_wakelock_info = - tgt_vdev_mgr_get_wakelock_info; + mlme_rx_ops->psoc_get_wakelock_info = + tgt_psoc_get_wakelock_info; } #else static inline void -tgt_vdev_mgr_reg_wakelock_info_rx_op(struct wlan_lmac_if_mlme_rx_ops +tgt_psoc_reg_wakelock_info_rx_op(struct wlan_lmac_if_mlme_rx_ops *mlme_rx_ops) { } @@ -272,5 +272,5 @@ void tgt_vdev_mgr_register_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops) tgt_vdev_mgr_peer_delete_all_response_handler; mlme_rx_ops->psoc_get_vdev_response_timer_info = tgt_vdev_mgr_get_response_timer_info; - tgt_vdev_mgr_reg_wakelock_info_rx_op(&rx_ops->mops); + tgt_psoc_reg_wakelock_info_rx_op(&rx_ops->mops); }