From 8565e7029fecee461d7520c50db92a52c99de84d Mon Sep 17 00:00:00 2001 From: Ananya Gupta Date: Tue, 22 Mar 2022 13:29:10 +0530 Subject: [PATCH] qcacmn: Register DP, HTC, HAL modules with Runtime PM module With restructuring in HIF runtime PM module, modules are required to register with the HIF runtime PM module. Also, changes are done in functions of allowing and preventing runtime PM suspend as part of restructuring. This change registers DP, HTC and HAL internal modules with runtime PM module and update HIF runtime PM function calls with the restructured code of HIF runtime PM module. Change-Id: I8899a1d3b92a90a05c5eaf4df7609f4008f739f8 CRs-Fixed: 3169372 --- dp/wifi3.0/be/dp_be_rx.c | 2 +- dp/wifi3.0/dp_internal.h | 40 ++++++++++- dp/wifi3.0/dp_main.c | 2 + dp/wifi3.0/dp_stats.c | 6 +- dp/wifi3.0/dp_tx.c | 33 ++------- dp/wifi3.0/dp_tx_desc.h | 22 +----- dp/wifi3.0/dp_types.h | 4 +- dp/wifi3.0/li/dp_li_rx.c | 2 +- hal/wifi3.0/be/hal_be_reo.c | 18 ++--- hal/wifi3.0/hal_api.h | 11 +-- hal/wifi3.0/hal_srng.c | 14 ++-- hal/wifi3.0/li/hal_li_reo.c | 18 ++--- htc/htc.c | 30 ++++----- htc/htc_internal.h | 1 + htc/htc_send.c | 131 ++++++++++++------------------------ 15 files changed, 134 insertions(+), 200 deletions(-) diff --git a/dp/wifi3.0/be/dp_be_rx.c b/dp/wifi3.0/be/dp_be_rx.c index 9ef34b3676..11e1809a4d 100644 --- a/dp/wifi3.0/be/dp_be_rx.c +++ b/dp/wifi3.0/be/dp_be_rx.c @@ -205,9 +205,9 @@ uint32_t dp_rx_process_be(struct dp_intr *int_ctx, qdf_assert_always(hal_soc); scn = soc->hif_handle; - hif_pm_runtime_mark_dp_rx_busy(scn); intr_id = int_ctx->dp_intr_id; num_entries = hal_srng_get_num_entries(hal_soc, hal_ring_hdl); + dp_runtime_pm_mark_last_busy(soc); more_data: /* reset local variables here to be re-used in the function */ diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index e19949f705..5675d2f4c4 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -3390,14 +3390,40 @@ static inline int32_t dp_runtime_get_refcount(struct dp_soc *soc) } /** - * dp_runtime_init() - Init dp runtime refcount when dp soc init + * dp_runtime_init() - Init DP related runtime PM clients and runtime refcount * @soc: Datapath soc handle * * Return: QDF_STATUS */ -static inline QDF_STATUS dp_runtime_init(struct dp_soc *soc) +static inline void dp_runtime_init(struct dp_soc *soc) { - return qdf_atomic_init(&soc->dp_runtime_refcount); + hif_rtpm_register(HIF_RTPM_ID_DP, NULL); + hif_rtpm_register(HIF_RTPM_ID_DP_RING_STATS, NULL); + qdf_atomic_init(&soc->dp_runtime_refcount); +} + +/** + * dp_runtime_deinit() - Deinit DP related runtime PM clients + * + * Return: None + */ +static inline void dp_runtime_deinit(void) +{ + hif_rtpm_deregister(HIF_RTPM_ID_DP); + hif_rtpm_deregister(HIF_RTPM_ID_DP_RING_STATS); +} + +/** + * dp_runtime_pm_mark_last_busy() - Mark last busy when rx path in use + * @soc: Datapath soc handle + * + * Return: None + */ +static inline void dp_runtime_pm_mark_last_busy(struct dp_soc *soc) +{ + soc->rx_last_busy = qdf_get_log_timestamp_usecs(); + + hif_rtpm_mark_last_busy(HIF_RTPM_ID_DP); } #else static inline int32_t dp_runtime_get(struct dp_soc *soc) @@ -3414,6 +3440,14 @@ static inline QDF_STATUS dp_runtime_init(struct dp_soc *soc) { return QDF_STATUS_SUCCESS; } + +static inline void dp_runtime_deinit(void) +{ +} + +static inline void dp_runtime_pm_mark_last_busy(struct dp_soc *soc) +{ +} #endif static inline enum QDF_GLOBAL_MODE dp_soc_get_con_mode(struct dp_soc *soc) diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 4464652207..d841324183 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -5916,6 +5916,8 @@ static void dp_soc_detach(struct cdp_soc_t *txrx_soc) soc->arch_ops.txrx_soc_detach(soc); + dp_runtime_deinit(); + dp_sysfs_deinitialize_stats(soc); dp_soc_swlm_detach(soc); dp_soc_tx_desc_sw_pools_free(soc); diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index 47e80ffe00..8715527362 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -5594,8 +5594,7 @@ dp_print_ring_stats(struct dp_pdev *pdev) int mac_id; int lmac_id; - if (hif_pm_runtime_get_sync(pdev->soc->hif_handle, - RTPM_ID_DP_PRINT_RING_STATS)) + if (hif_rtpm_get(HIF_RTPM_GET_SYNC, HIF_RTPM_ID_DP_RING_STATS)) return; dp_print_ring_stat_from_hal(pdev->soc, @@ -5680,8 +5679,7 @@ dp_print_ring_stats(struct dp_pdev *pdev) [lmac_id], RXDMA_DST); } - hif_pm_runtime_put(pdev->soc->hif_handle, - RTPM_ID_DP_PRINT_RING_STATS); + hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_DP_RING_STATS); } /** diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index 0ce9aee303..b46040288a 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -1548,10 +1548,8 @@ dp_tx_ring_access_end_wrapper(struct dp_soc *soc, return; } - ret = hif_pm_runtime_get(soc->hif_handle, - RTPM_ID_DW_TX_HW_ENQUEUE, true); - switch (ret) { - case 0: + ret = hif_rtpm_get(HIF_RTPM_GET_ASYNC, HIF_RTPM_ID_DP); + if (QDF_IS_STATUS_SUCCESS(ret)) { if (hif_system_pm_state_check(soc->hif_handle)) { dp_tx_hal_ring_access_end_reap(soc, hal_ring_hdl); hal_srng_set_event(hal_ring_hdl, HAL_SRNG_FLUSH_EVENT); @@ -1559,31 +1557,8 @@ dp_tx_ring_access_end_wrapper(struct dp_soc *soc, } else { dp_tx_ring_access_end(soc, hal_ring_hdl, coalesce); } - hif_pm_runtime_put(soc->hif_handle, - RTPM_ID_DW_TX_HW_ENQUEUE); - break; - /* - * If hif_pm_runtime_get returns -EBUSY or -EINPROGRESS, - * take the dp runtime refcount using dp_runtime_get, - * check link state,if up, write TX ring HP, else just set flush event. - * In dp_runtime_resume, wait until dp runtime refcount becomes - * zero or time out, then flush pending tx. - */ - case -EBUSY: - case -EINPROGRESS: - dp_runtime_get(soc); - if (hif_pm_get_link_state(soc->hif_handle) == - HIF_PM_LINK_STATE_UP) { - dp_tx_ring_access_end(soc, hal_ring_hdl, coalesce); - } else { - dp_tx_hal_ring_access_end_reap(soc, hal_ring_hdl); - hal_srng_set_event(hal_ring_hdl, HAL_SRNG_FLUSH_EVENT); - qdf_atomic_inc(&soc->tx_pending_rtpm); - hal_srng_inc_flush_cnt(hal_ring_hdl); - } - dp_runtime_put(soc); - break; - default: + hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_DP); + } else { dp_runtime_get(soc); dp_tx_hal_ring_access_end_reap(soc, hal_ring_hdl); hal_srng_set_event(hal_ring_hdl, HAL_SRNG_FLUSH_EVENT); diff --git a/dp/wifi3.0/dp_tx_desc.h b/dp/wifi3.0/dp_tx_desc.h index c10dc8b9d2..91403c1db7 100644 --- a/dp/wifi3.0/dp_tx_desc.h +++ b/dp/wifi3.0/dp_tx_desc.h @@ -530,17 +530,6 @@ dp_tx_desc_alloc(struct dp_soc *soc, uint8_t desc_pool_id) } else { qdf_spin_unlock_bh(&pool->flow_pool_lock); } - - /* - * If one packet is going to be sent, PM usage count - * needs to be incremented by one to prevent future - * runtime suspend. This should be tied with the - * success of allocating one descriptor. It will be - * decremented after the packet has been sent. - */ - hif_pm_runtime_get_noresume( - soc->hif_handle, - RTPM_ID_DP_TX_DESC_ALLOC_FREE); } else { pool->pkt_drop_no_desc++; qdf_spin_unlock_bh(&pool->flow_pool_lock); @@ -549,7 +538,6 @@ dp_tx_desc_alloc(struct dp_soc *soc, uint8_t desc_pool_id) soc->pool_stats.pkt_drop_no_pool++; } - return tx_desc; } @@ -590,7 +578,7 @@ dp_tx_desc_free(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc, qdf_spin_unlock_bh(&pool->flow_pool_lock); qdf_print("%s %d pool is freed!!", __func__, __LINE__); - goto out; + return; } break; @@ -603,14 +591,6 @@ dp_tx_desc_free(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc, }; qdf_spin_unlock_bh(&pool->flow_pool_lock); - -out: - /** - * Decrement PM usage count if the packet has been sent. This - * should be tied with the success of freeing one descriptor. - */ - hif_pm_runtime_put(soc->hif_handle, - RTPM_ID_DP_TX_DESC_ALLOC_FREE); } #endif /* QCA_AC_BASED_FLOW_CONTROL */ diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index deede7c657..2f15f8c7dc 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -2307,10 +2307,12 @@ struct dp_soc { #ifdef WLAN_DP_FEATURE_SW_LATENCY_MGR struct dp_swlm swlm; #endif + #ifdef FEATURE_RUNTIME_PM + /* DP Rx timestamp */ + qdf_time_t rx_last_busy; /* Dp runtime refcount */ qdf_atomic_t dp_runtime_refcount; - /* Dp tx pending count in RTPM */ qdf_atomic_t tx_pending_rtpm; #endif diff --git a/dp/wifi3.0/li/dp_li_rx.c b/dp/wifi3.0/li/dp_li_rx.c index 96cbbe29ff..c7b925705d 100644 --- a/dp/wifi3.0/li/dp_li_rx.c +++ b/dp/wifi3.0/li/dp_li_rx.c @@ -264,9 +264,9 @@ uint32_t dp_rx_process_li(struct dp_intr *int_ctx, qdf_assert_always(hal_soc); scn = soc->hif_handle; - hif_pm_runtime_mark_dp_rx_busy(scn); intr_id = int_ctx->dp_intr_id; num_entries = hal_srng_get_num_entries(hal_soc, hal_ring_hdl); + dp_runtime_pm_mark_last_busy(soc); more_data: /* reset local variables here to be re-used in the function */ diff --git a/hal/wifi3.0/be/hal_be_reo.c b/hal/wifi3.0/be/hal_be_reo.c index e10f46865e..440f6205ac 100644 --- a/hal/wifi3.0/be/hal_be_reo.c +++ b/hal/wifi3.0/be/hal_be_reo.c @@ -360,8 +360,8 @@ hal_reo_cmd_queue_stats_be(hal_ring_handle_t hal_ring_hdl, HAL_DESC_64_SET_FIELD(reo_desc, REO_GET_QUEUE_STATS, CLEAR_STATS, cmd->u.stats_params.clear); - hal_srng_access_end_v1(hal_soc_hdl, hal_ring_hdl, RTPM_ID_HAL_REO_CMD, - true); + hal_srng_access_end_v1(hal_soc_hdl, hal_ring_hdl, + HIF_RTPM_ID_HAL_REO_CMD); val = reo_desc[CMD_HEADER_DW_OFFSET]; return HAL_GET_FIELD(UNIFORM_REO_CMD_HEADER, REO_CMD_NUMBER, @@ -412,8 +412,9 @@ hal_reo_cmd_flush_queue_be(hal_ring_handle_t hal_ring_hdl, cmd->u.fl_queue_params.index); } - hal_srng_access_end_v1(hal_soc_hdl, hal_ring_hdl, RTPM_ID_HAL_REO_CMD, - false); + hal_srng_access_end_v1(hal_soc_hdl, hal_ring_hdl, + HIF_RTPM_ID_HAL_REO_CMD); + val = reo_desc[CMD_HEADER_DW_OFFSET]; return HAL_GET_FIELD(UNIFORM_REO_CMD_HEADER, REO_CMD_NUMBER, val); @@ -496,8 +497,8 @@ hal_reo_cmd_flush_cache_be(hal_ring_handle_t hal_ring_hdl, HAL_DESC_64_SET_FIELD(reo_desc, REO_FLUSH_CACHE, FLUSH_ENTIRE_CACHE, cp->flush_entire_cache); - hal_srng_access_end_v1(hal_soc_hdl, hal_ring_hdl, RTPM_ID_HAL_REO_CMD, - false); + hal_srng_access_end_v1(hal_soc_hdl, hal_ring_hdl, + HIF_RTPM_ID_HAL_REO_CMD); val = reo_desc[CMD_HEADER_DW_OFFSET]; return HAL_GET_FIELD(UNIFORM_REO_CMD_HEADER, REO_CMD_NUMBER, @@ -812,8 +813,9 @@ hal_reo_cmd_update_rx_queue_be(hal_ring_handle_t hal_ring_hdl, HAL_DESC_64_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE, PN_127_96, p->pn_127_96); - hal_srng_access_end_v1(hal_soc_hdl, hal_ring_hdl, RTPM_ID_HAL_REO_CMD, - false); + hal_srng_access_end_v1(hal_soc_hdl, hal_ring_hdl, + HIF_RTPM_ID_HAL_REO_CMD); + val = reo_desc[CMD_HEADER_DW_OFFSET]; return HAL_GET_FIELD(UNIFORM_REO_CMD_HEADER, REO_CMD_NUMBER, val); diff --git a/hal/wifi3.0/hal_api.h b/hal/wifi3.0/hal_api.h index ad79666641..a510fbfa06 100644 --- a/hal/wifi3.0/hal_api.h +++ b/hal/wifi3.0/hal_api.h @@ -2217,11 +2217,6 @@ hal_srng_access_end(void *hal_soc, hal_ring_handle_t hal_ring_hdl) SRNG_UNLOCK(&(srng->lock)); } -void hal_srng_access_end_v1(hal_soc_handle_t hal_soc_hdl, - hal_ring_handle_t hal_ring_hdl, - wlan_rtpm_dbgid rtpm_dbgid, - bool is_critical_ctx); - #ifdef FEATURE_RUNTIME_PM #define hal_srng_access_end_v1 hal_srng_rtpm_access_end @@ -2243,11 +2238,9 @@ void hal_srng_access_end_v1(hal_soc_handle_t hal_soc_hdl, void hal_srng_rtpm_access_end(hal_soc_handle_t hal_soc_hdl, hal_ring_handle_t hal_ring_hdl, - wlan_rtpm_dbgid rtpm_dbgid, - bool is_critical_ctx); + uint32_t rtpm_id); #else -#define hal_srng_access_end_v1(hal_soc_hdl, hal_ring_hdl, rtpm_dbgid, \ - is_critical_ctx)\ +#define hal_srng_access_end_v1(hal_soc_hdl, hal_ring_hdl, rtpm_id) \ hal_srng_access_end(hal_soc_hdl, hal_ring_hdl) #endif diff --git a/hal/wifi3.0/hal_srng.c b/hal/wifi3.0/hal_srng.c index d0ecae2bc3..26200a84aa 100644 --- a/hal/wifi3.0/hal_srng.c +++ b/hal/wifi3.0/hal_srng.c @@ -1102,6 +1102,8 @@ void *hal_attach(struct hif_opaque_softc *hif_handle, qdf_device_t qdf_dev) hal_reo_shared_qaddr_setup((hal_soc_handle_t)hal); + hif_rtpm_register(HIF_RTPM_ID_HAL_REO_CMD, NULL); + return (void *)hal; fail3: qdf_mem_free_consistent(qdf_dev, qdf_dev->dev, @@ -1156,6 +1158,7 @@ extern void hal_detach(void *hal_soc) { struct hal_soc *hal = (struct hal_soc *)hal_soc; + hif_rtpm_deregister(HIF_RTPM_ID_HAL_REO_CMD); hal_delayed_reg_write_deinit(hal); hal_reo_shared_qaddr_detach((hal_soc_handle_t)hal); qdf_mem_free(hal->ops); @@ -1788,21 +1791,16 @@ qdf_export_symbol(hal_set_low_threshold); void hal_srng_rtpm_access_end(hal_soc_handle_t hal_soc_hdl, hal_ring_handle_t hal_ring_hdl, - wlan_rtpm_dbgid rtpm_dbgid, - bool is_critical_ctx) + uint32_t rtpm_id) { - struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl; - if (qdf_unlikely(!hal_ring_hdl)) { qdf_print("Error: Invalid hal_ring\n"); return; } - if (hif_pm_runtime_get(hal_soc->hif_handle, - rtpm_dbgid, is_critical_ctx) == 0) { + if (hif_rtpm_get(HIF_RTPM_GET_ASYNC, rtpm_id) == 0) { hal_srng_access_end(hal_soc_hdl, hal_ring_hdl); - hif_pm_runtime_put(hal_soc->hif_handle, - rtpm_dbgid); + hif_rtpm_put(HIF_RTPM_PUT_ASYNC, rtpm_id); } else { hal_srng_access_end_reap(hal_soc_hdl, hal_ring_hdl); hal_srng_set_event(hal_ring_hdl, HAL_SRNG_FLUSH_EVENT); diff --git a/hal/wifi3.0/li/hal_li_reo.c b/hal/wifi3.0/li/hal_li_reo.c index b536c67920..c39b73c43d 100644 --- a/hal/wifi3.0/li/hal_li_reo.c +++ b/hal/wifi3.0/li/hal_li_reo.c @@ -356,11 +356,9 @@ hal_reo_cmd_queue_stats_li(hal_ring_handle_t hal_ring_hdl, HAL_DESC_SET_FIELD(reo_desc, REO_GET_QUEUE_STATS_2, CLEAR_STATS, cmd->u.stats_params.clear); - if (hif_pm_runtime_get(hal_soc->hif_handle, - RTPM_ID_HAL_REO_CMD, false) == 0) { + if (hif_rtpm_get(HIF_RTPM_GET_ASYNC, HIF_RTPM_ID_HAL_REO_CMD) == 0) { hal_srng_access_end(hal_soc_hdl, hal_ring_hdl); - hif_pm_runtime_put(hal_soc->hif_handle, - RTPM_ID_HAL_REO_CMD); + hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_HAL_REO_CMD); } else { hal_srng_access_end_reap(hal_soc_hdl, hal_ring_hdl); hal_srng_set_event(hal_ring_hdl, HAL_SRNG_FLUSH_EVENT); @@ -499,11 +497,9 @@ hal_reo_cmd_flush_cache_li(hal_ring_handle_t hal_ring_hdl, HAL_DESC_SET_FIELD(reo_desc, REO_FLUSH_CACHE_2, FLUSH_ENTIRE_CACHE, cp->flush_entire_cache); - if (hif_pm_runtime_get(hal_soc->hif_handle, - RTPM_ID_HAL_REO_CMD, false) == 0) { + if (hif_rtpm_get(HIF_RTPM_GET_ASYNC, HIF_RTPM_ID_HAL_REO_CMD) == 0) { hal_srng_access_end(hal_soc_hdl, hal_ring_hdl); - hif_pm_runtime_put(hal_soc->hif_handle, - RTPM_ID_HAL_REO_CMD); + hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_HAL_REO_CMD); } else { hal_srng_access_end_reap(hal_soc_hdl, hal_ring_hdl); hal_srng_set_event(hal_ring_hdl, HAL_SRNG_FLUSH_EVENT); @@ -822,11 +818,9 @@ hal_reo_cmd_update_rx_queue_li(hal_ring_handle_t hal_ring_hdl, HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_8, PN_127_96, p->pn_127_96); - if (hif_pm_runtime_get(hal_soc->hif_handle, - RTPM_ID_HAL_REO_CMD, false) == 0) { + if (hif_rtpm_get(HIF_RTPM_GET_ASYNC, HIF_RTPM_ID_HAL_REO_CMD) == 0) { hal_srng_access_end(hal_soc_hdl, hal_ring_hdl); - hif_pm_runtime_put(hal_soc->hif_handle, - RTPM_ID_HAL_REO_CMD); + hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_HAL_REO_CMD); } else { hal_srng_access_end_reap(hal_soc_hdl, hal_ring_hdl); hal_srng_set_event(hal_ring_hdl, HAL_SRNG_FLUSH_EVENT); diff --git a/htc/htc.c b/htc/htc.c index 9992d01978..c9dbf386d2 100644 --- a/htc/htc.c +++ b/htc/htc.c @@ -154,11 +154,8 @@ static void htc_cleanup(HTC_TARGET *target) HTC_PACKET_QUEUE *pkt_queue; qdf_nbuf_t netbuf; - while (htc_dec_return_runtime_cnt((void *)target) >= 0) { - hif_pm_runtime_put(target->hif_dev, RTPM_ID_HTC); - hif_pm_runtime_update_stats(target->hif_dev, RTPM_ID_HTC, - HIF_PM_HTC_STATS_PUT_HTC_CLEANUP); - } + while (htc_dec_return_runtime_cnt((void *)target) >= 0) + hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_HTT); if (target->hif_dev) { hif_detach_htc(target->hif_dev); @@ -490,6 +487,9 @@ HTC_HANDLE htc_create(void *ol_sc, struct htc_init_info *pInfo, htc_init_link_vote_ids(); + hif_rtpm_register(HIF_RTPM_ID_WMI, NULL); + hif_rtpm_register(HIF_RTPM_ID_HTT, NULL); + return (HTC_HANDLE) target; } @@ -499,10 +499,15 @@ void htc_destroy(HTC_HANDLE HTCHandle) AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+htc_destroy .. Destroying :0x%pK\n", target)); + htc_hang_event_notifier_unregister(); - hif_stop(htc_get_hif_device(HTCHandle)); - if (target) + + if (target) { + hif_rtpm_deregister(HIF_RTPM_ID_HTT); + hif_rtpm_deregister(HIF_RTPM_ID_WMI); + hif_stop(htc_get_hif_device(HTCHandle)); htc_cleanup(target); + } AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-htc_destroy\n")); htc_credit_history_deinit(); } @@ -1216,19 +1221,12 @@ bool htc_can_suspend_link(HTC_HANDLE htc_handle) #ifdef FEATURE_RUNTIME_PM int htc_pm_runtime_get(HTC_HANDLE htc_handle) { - HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(htc_handle); - - return hif_pm_runtime_get(target->hif_dev, - RTPM_ID_HTC, false); + return hif_rtpm_get(HIF_RTPM_GET_ASYNC, HIF_RTPM_ID_HTT); } int htc_pm_runtime_put(HTC_HANDLE htc_handle) { - HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(htc_handle); - - hif_pm_runtime_update_stats(target->hif_dev, RTPM_ID_HTC, - HIF_PM_HTC_STATS_PUT_HTT_RESPONSE); - return hif_pm_runtime_put(target->hif_dev, RTPM_ID_HTC); + return hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_HTT); } #endif diff --git a/htc/htc_internal.h b/htc/htc_internal.h index 9db8847daa..9710bd4f73 100644 --- a/htc/htc_internal.h +++ b/htc/htc_internal.h @@ -198,6 +198,7 @@ enum ol_ath_htc_pkt_ecodes { HTC_PKT_Q_EMPTY, HTC_SEND_Q_EMPTY }; + /* our HTC target state */ typedef struct _HTC_TARGET { struct hif_opaque_softc *hif_dev; diff --git a/htc/htc_send.c b/htc/htc_send.c index 8afc1de7cf..95085b7f7c 100644 --- a/htc/htc_send.c +++ b/htc/htc_send.c @@ -870,16 +870,10 @@ static QDF_STATUS htc_issue_packets(HTC_TARGET *target, */ if (pPacket->PktInfo.AsTx.Tag == HTC_TX_PACKET_TAG_RUNTIME_PUT) { rt_put = true; - hif_pm_runtime_update_stats( - target->hif_dev, RTPM_ID_HTC, - HIF_PM_HTC_STATS_GET_HTT_NO_RESPONSE); } else if (pPacket->PktInfo.AsTx.Tag == HTC_TX_PACKET_TAG_RTPM_PUT_RC) { rt_put_in_resp = true; htc_inc_runtime_cnt(target); - hif_pm_runtime_update_stats( - target->hif_dev, RTPM_ID_HTC, - HIF_PM_HTC_STATS_GET_HTT_RESPONSE); } #if DEBUG_BUNDLE @@ -971,11 +965,7 @@ static QDF_STATUS htc_issue_packets(HTC_TARGET *target, break; } if (rt_put) { - hif_pm_runtime_put(target->hif_dev, - RTPM_ID_HTC); - hif_pm_runtime_update_stats( - target->hif_dev, RTPM_ID_HTC, - HIF_PM_HTC_STATS_PUT_HTT_NO_RESPONSE); + hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_HTT); rt_put = false; } } @@ -1050,7 +1040,7 @@ static void queue_htc_pm_packets(HTC_ENDPOINT *endpoint, #endif /** - * htc_send_pkts_rtpm_dbgid_get() - get runtime pm dbgid by service_id + * htc_send_pkts_get_rtpm_id() - get runtime pm dbgid by service_id * @service_id: service for endpoint * * For service_id HTT_DATA_MSG_SVC, HTT message donot have a tx complete @@ -1068,19 +1058,15 @@ static void queue_htc_pm_packets(HTC_ENDPOINT *endpoint, * put/get. * * - * Return: rtpm_dbgid to trace who use it + * Return: rtpm id to trace who used it */ -static wlan_rtpm_dbgid -htc_send_pkts_rtpm_dbgid_get(HTC_SERVICE_ID service_id) +static unsigned int +htc_send_pkts_get_rtpm_id(HTC_SERVICE_ID service_id) { - wlan_rtpm_dbgid rtpm_dbgid; - if (service_id == HTT_DATA_MSG_SVC) - rtpm_dbgid = RTPM_ID_HTC; + return HIF_RTPM_ID_HTT; else - rtpm_dbgid = RTPM_ID_WMI; - - return rtpm_dbgid; + return HIF_RTPM_ID_WMI; } #ifdef SYSTEM_PM_CHECK @@ -1141,7 +1127,7 @@ static void get_htc_send_packets_credit_based(HTC_TARGET *target, HTC_PACKET_QUEUE *tx_queue; HTC_PACKET_QUEUE pm_queue; bool do_pm_get = false; - wlan_rtpm_dbgid rtpm_dbgid = 0; + unsigned int rtpm_code = 0; int ret; HTC_PACKET_QUEUE sys_pm_queue; bool sys_pm_check = false; @@ -1170,20 +1156,16 @@ static void get_htc_send_packets_credit_based(HTC_TARGET *target, /* loop until we can grab as many packets out of the queue as we can */ while (true) { if (do_pm_get) { - rtpm_dbgid = - htc_send_pkts_rtpm_dbgid_get( - pEndpoint->service_id); - ret = hif_pm_runtime_get(target->hif_dev, - rtpm_dbgid, false); + rtpm_code = htc_send_pkts_get_rtpm_id( + pEndpoint->service_id); + ret = hif_rtpm_get(HIF_RTPM_GET_ASYNC, rtpm_code); if (ret) { /* bus suspended, runtime resume issued */ QDF_ASSERT(HTC_PACKET_QUEUE_DEPTH(pQueue) == 0); - if (ret == -EAGAIN) { - pPacket = htc_get_pkt_at_head(tx_queue); - if (!pPacket) - break; - log_packet_info(target, pPacket); - } + pPacket = htc_get_pkt_at_head(tx_queue); + if (!pPacket) + break; + log_packet_info(target, pPacket); break; } } @@ -1193,15 +1175,14 @@ static void get_htc_send_packets_credit_based(HTC_TARGET *target, pPacket = htc_get_pkt_at_head(tx_queue); if (!pPacket) { if (do_pm_get) - hif_pm_runtime_put(target->hif_dev, - rtpm_dbgid); + hif_rtpm_put(HIF_RTPM_PUT_ASYNC, rtpm_code); break; } if (sys_pm_check && hif_system_pm_state_check(target->hif_dev)) { if (do_pm_get) - hif_pm_runtime_put(target->hif_dev, rtpm_dbgid); + hif_rtpm_put(HIF_RTPM_PUT_ASYNC, rtpm_code); break; } @@ -1245,8 +1226,9 @@ static void get_htc_send_packets_credit_based(HTC_TARGET *target, creditsRequired)); #endif if (do_pm_get) - hif_pm_runtime_put(target->hif_dev, - rtpm_dbgid); + hif_rtpm_put(HIF_RTPM_PUT_ASYNC, + rtpm_code); + break; } @@ -1308,7 +1290,7 @@ static void get_htc_send_packets(HTC_TARGET *target, HTC_PACKET_QUEUE *tx_queue; HTC_PACKET_QUEUE pm_queue; bool do_pm_get = false; - wlan_rtpm_dbgid rtpm_dbgid = 0; + unsigned int rtpm_code = 0; int ret; /*** NOTE : the TX lock is held when this function is called ***/ @@ -1329,34 +1311,26 @@ static void get_htc_send_packets(HTC_TARGET *target, int num_frags; if (do_pm_get) { - rtpm_dbgid = - htc_send_pkts_rtpm_dbgid_get( - pEndpoint->service_id); - ret = hif_pm_runtime_get(target->hif_dev, - rtpm_dbgid, false); + rtpm_code = + htc_send_pkts_get_rtpm_id( + pEndpoint->service_id); + ret = hif_rtpm_get(HIF_RTPM_GET_ASYNC, rtpm_code); if (ret) { /* bus suspended, runtime resume issued */ QDF_ASSERT(HTC_PACKET_QUEUE_DEPTH(pQueue) == 0); - if (ret == -EAGAIN) { - pPacket = htc_get_pkt_at_head(tx_queue); - if (!pPacket) - break; - log_packet_info(target, pPacket); - } + pPacket = htc_get_pkt_at_head(tx_queue); + if (!pPacket) + break; + log_packet_info(target, pPacket); break; } - hif_pm_runtime_update_stats( - target->hif_dev, rtpm_dbgid, - HIF_PM_HTC_STATS_GET_HTT_FETCH_PKTS); + } ret = hif_system_pm_state_check(target->hif_dev); if (ret) { if (do_pm_get) { - hif_pm_runtime_put(target->hif_dev, rtpm_dbgid); - hif_pm_runtime_update_stats( - target->hif_dev, rtpm_dbgid, - HIF_PM_HTC_STATS_PUT_HTT_FETCH_PKTS); + hif_rtpm_put(HIF_RTPM_PUT_ASYNC, rtpm_code); } break; } @@ -1364,10 +1338,7 @@ static void get_htc_send_packets(HTC_TARGET *target, pPacket = htc_packet_dequeue(tx_queue); if (!pPacket) { if (do_pm_get) { - hif_pm_runtime_put(target->hif_dev, rtpm_dbgid); - hif_pm_runtime_update_stats( - target->hif_dev, rtpm_dbgid, - HIF_PM_HTC_STATS_PUT_HTT_FETCH_PKTS); + hif_rtpm_put(HIF_RTPM_PUT_ASYNC, rtpm_code); } break; } @@ -1696,7 +1667,7 @@ static enum HTC_SEND_QUEUE_RESULT htc_try_send(HTC_TARGET *target, status = htc_issue_packets(target, pEndpoint, &sendQueue); if (status) { int i; - wlan_rtpm_dbgid rtpm_dbgid; + unsigned int rtpm_code; result = HTC_SEND_QUEUE_DROP; @@ -1719,15 +1690,10 @@ static enum HTC_SEND_QUEUE_RESULT htc_try_send(HTC_TARGET *target, break; } - rtpm_dbgid = - htc_send_pkts_rtpm_dbgid_get( - pEndpoint->service_id); + rtpm_code = htc_send_pkts_get_rtpm_id( + pEndpoint->service_id); for (i = HTC_PACKET_QUEUE_DEPTH(&sendQueue); i > 0; i--) { - hif_pm_runtime_put(target->hif_dev, - rtpm_dbgid); - hif_pm_runtime_update_stats( - target->hif_dev, rtpm_dbgid, - HIF_PM_HTC_STATS_PUT_HTT_ERROR); + hif_rtpm_put(HIF_RTPM_PUT_ASYNC, rtpm_code); } if (!pEndpoint->async_update) { @@ -2017,7 +1983,7 @@ QDF_STATUS htc_send_data_pkt(HTC_HANDLE htc_hdl, qdf_nbuf_t netbuf, int ep_id, int tx_resources; uint32_t data_attr = 0; int htc_payload_len = actual_length; - wlan_rtpm_dbgid rtpm_dbgid; + unsigned int rtpm_code; pEndpoint = &target->endpoint[ep_id]; @@ -2036,9 +2002,9 @@ QDF_STATUS htc_send_data_pkt(HTC_HANDLE htc_hdl, qdf_nbuf_t netbuf, int ep_id, return QDF_STATUS_E_FAILURE; } - rtpm_dbgid = - htc_send_pkts_rtpm_dbgid_get(pEndpoint->service_id); - if (hif_pm_runtime_get(target->hif_dev, rtpm_dbgid, false)) + rtpm_code = htc_send_pkts_get_rtpm_id( + pEndpoint->service_id); + if (hif_rtpm_get(HIF_RTPM_GET_ASYNC, rtpm_code)) return QDF_STATUS_E_FAILURE; p_htc_hdr = (HTC_FRAME_HDR *)qdf_nbuf_get_frag_vaddr(netbuf, 0); @@ -2483,8 +2449,8 @@ QDF_STATUS htc_tx_completion_handler(void *Context, if (pPacket->PktInfo.AsTx.Tag != HTC_TX_PACKET_TAG_AUTO_PM && pPacket->PktInfo.AsTx.Tag != HTC_TX_PACKET_TAG_RUNTIME_PUT && pPacket->PktInfo.AsTx.Tag != HTC_TX_PACKET_TAG_RTPM_PUT_RC) - hif_pm_runtime_put(target->hif_dev, - RTPM_ID_WMI); + hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_WMI); + if (pPacket->PktInfo.AsTx.Tag == HTC_TX_PACKET_TAG_BUNDLED) { HTC_PACKET *pPacketTemp; @@ -2592,13 +2558,9 @@ void htc_kick_queues(void *context) HTC_TARGET *target = (HTC_TARGET *)context; HTC_ENDPOINT *endpoint = NULL; - if (hif_pm_runtime_get_sync(target->hif_dev, RTPM_ID_HTC)) + if (hif_rtpm_get(HIF_RTPM_GET_SYNC, HIF_RTPM_ID_HTT)) return; - hif_pm_runtime_update_stats( - target->hif_dev, RTPM_ID_HTC, - HIF_PM_HTC_STATS_GET_HTC_KICK_QUEUES); - for (i = 0; i < ENDPOINT_MAX; i++) { endpoint = &target->endpoint[i]; @@ -2614,12 +2576,7 @@ void htc_kick_queues(void *context) hif_fastpath_resume(target->hif_dev); - if (hif_pm_runtime_put(target->hif_dev, RTPM_ID_HTC)) - return; - - hif_pm_runtime_update_stats( - target->hif_dev, RTPM_ID_HTC, - HIF_PM_HTC_STATS_PUT_HTC_KICK_QUEUES); + hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_HTT); } #endif