qcacmn: Prevent runtime PM suspend for MGMT TX frames

Add a runtime PM wake lock for MGMT TX frames and prevent
runtime PM suspend if there are outstanding MGMT TX descriptors
in fw because fw may try to access host ddr when PCIe link is down
which can lead to system NOC errors.

Change-Id: I46b851b7babc8f0fe2c31f27892b0c7a3f255a17
CRs-Fixed: 2495612
This commit is contained in:
Rajeev Kumar
2019-07-23 14:57:32 -07:00
کامیت شده توسط nshrivas
والد d2ede02e21
کامیت d9cede1908
3فایلهای تغییر یافته به همراه11 افزوده شده و 1 حذف شده

مشاهده پرونده

@@ -127,6 +127,8 @@ struct mgmt_txrx_desc_elem_t *wlan_mgmt_txrx_desc_get(
/* acquire the wakelock when there are pending mgmt tx frames */ /* acquire the wakelock when there are pending mgmt tx frames */
qdf_wake_lock_timeout_acquire(&mgmt_txrx_pdev_ctx->wakelock_tx_cmp, qdf_wake_lock_timeout_acquire(&mgmt_txrx_pdev_ctx->wakelock_tx_cmp,
MGMT_TXRX_WAKELOCK_TIMEOUT_TX_CMP); MGMT_TXRX_WAKELOCK_TIMEOUT_TX_CMP);
qdf_runtime_pm_prevent_suspend(
&mgmt_txrx_pdev_ctx->wakelock_tx_runtime_cmp);
qdf_spin_unlock_bh(&mgmt_txrx_pdev_ctx->mgmt_desc_pool.desc_pool_lock); qdf_spin_unlock_bh(&mgmt_txrx_pdev_ctx->mgmt_desc_pool.desc_pool_lock);
@@ -160,9 +162,12 @@ void wlan_mgmt_txrx_desc_put(
/* release the wakelock if there are no pending mgmt tx frames */ /* release the wakelock if there are no pending mgmt tx frames */
if (mgmt_txrx_pdev_ctx->mgmt_desc_pool.free_list.count == if (mgmt_txrx_pdev_ctx->mgmt_desc_pool.free_list.count ==
mgmt_txrx_pdev_ctx->mgmt_desc_pool.free_list.max_size) mgmt_txrx_pdev_ctx->mgmt_desc_pool.free_list.max_size) {
qdf_runtime_pm_allow_suspend(
&mgmt_txrx_pdev_ctx->wakelock_tx_runtime_cmp);
qdf_wake_lock_release(&mgmt_txrx_pdev_ctx->wakelock_tx_cmp, qdf_wake_lock_release(&mgmt_txrx_pdev_ctx->wakelock_tx_cmp,
MGMT_TXRX_WAKELOCK_REASON_TX_CMP); MGMT_TXRX_WAKELOCK_REASON_TX_CMP);
}
qdf_spin_unlock_bh(&mgmt_txrx_pdev_ctx->mgmt_desc_pool.desc_pool_lock); qdf_spin_unlock_bh(&mgmt_txrx_pdev_ctx->mgmt_desc_pool.desc_pool_lock);

مشاهده پرونده

@@ -186,12 +186,14 @@ struct mgmt_txrx_priv_psoc_context {
* @mgmt_desc_pool: pointer to mgmt desc. pool * @mgmt_desc_pool: pointer to mgmt desc. pool
* @mgmt_txrx_stats: pointer to mgmt txrx stats * @mgmt_txrx_stats: pointer to mgmt txrx stats
* @wakelock_tx_cmp: mgmt tx complete wake lock * @wakelock_tx_cmp: mgmt tx complete wake lock
* @wakelock_tx_runtime_cmp: mgmt tx runtime complete wake lock
*/ */
struct mgmt_txrx_priv_pdev_context { struct mgmt_txrx_priv_pdev_context {
struct wlan_objmgr_pdev *pdev; struct wlan_objmgr_pdev *pdev;
struct mgmt_desc_pool_t mgmt_desc_pool; struct mgmt_desc_pool_t mgmt_desc_pool;
struct mgmt_txrx_stats_t *mgmt_txrx_stats; struct mgmt_txrx_stats_t *mgmt_txrx_stats;
qdf_wake_lock_t wakelock_tx_cmp; qdf_wake_lock_t wakelock_tx_cmp;
qdf_runtime_lock_t wakelock_tx_runtime_cmp;
}; };

مشاهده پرونده

@@ -184,6 +184,7 @@ static QDF_STATUS wlan_mgmt_txrx_pdev_obj_create_notification(
qdf_wake_lock_create(&mgmt_txrx_pdev_ctx->wakelock_tx_cmp, qdf_wake_lock_create(&mgmt_txrx_pdev_ctx->wakelock_tx_cmp,
"mgmt_txrx tx_cmp"); "mgmt_txrx tx_cmp");
qdf_runtime_lock_init(&mgmt_txrx_pdev_ctx->wakelock_tx_runtime_cmp);
if (wlan_objmgr_pdev_component_obj_attach(pdev, if (wlan_objmgr_pdev_component_obj_attach(pdev,
WLAN_UMAC_COMP_MGMT_TXRX, WLAN_UMAC_COMP_MGMT_TXRX,
@@ -201,6 +202,7 @@ static QDF_STATUS wlan_mgmt_txrx_pdev_obj_create_notification(
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
err_pdev_attach: err_pdev_attach:
qdf_runtime_lock_deinit(&mgmt_txrx_pdev_ctx->wakelock_tx_runtime_cmp);
qdf_wake_lock_destroy(&mgmt_txrx_pdev_ctx->wakelock_tx_cmp); qdf_wake_lock_destroy(&mgmt_txrx_pdev_ctx->wakelock_tx_cmp);
qdf_mem_free(mgmt_txrx_stats); qdf_mem_free(mgmt_txrx_stats);
err_mgmt_txrx_stats: err_mgmt_txrx_stats:
@@ -251,6 +253,7 @@ static QDF_STATUS wlan_mgmt_txrx_pdev_obj_destroy_notification(
wlan_mgmt_txrx_desc_pool_deinit(mgmt_txrx_pdev_ctx); wlan_mgmt_txrx_desc_pool_deinit(mgmt_txrx_pdev_ctx);
qdf_mem_free(mgmt_txrx_pdev_ctx->mgmt_txrx_stats); qdf_mem_free(mgmt_txrx_pdev_ctx->mgmt_txrx_stats);
qdf_runtime_lock_deinit(&mgmt_txrx_pdev_ctx->wakelock_tx_runtime_cmp);
qdf_wake_lock_destroy(&mgmt_txrx_pdev_ctx->wakelock_tx_cmp); qdf_wake_lock_destroy(&mgmt_txrx_pdev_ctx->wakelock_tx_cmp);
qdf_mem_free(mgmt_txrx_pdev_ctx); qdf_mem_free(mgmt_txrx_pdev_ctx);