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
This commit is contained in:
Ananya Gupta
2022-03-22 13:29:10 +05:30
committed by Madan Koyyalamudi
父節點 4021d4b379
當前提交 8565e7029f
共有 15 個文件被更改,包括 134 次插入200 次删除

查看文件

@@ -205,9 +205,9 @@ uint32_t dp_rx_process_be(struct dp_intr *int_ctx,
qdf_assert_always(hal_soc); qdf_assert_always(hal_soc);
scn = soc->hif_handle; scn = soc->hif_handle;
hif_pm_runtime_mark_dp_rx_busy(scn);
intr_id = int_ctx->dp_intr_id; intr_id = int_ctx->dp_intr_id;
num_entries = hal_srng_get_num_entries(hal_soc, hal_ring_hdl); num_entries = hal_srng_get_num_entries(hal_soc, hal_ring_hdl);
dp_runtime_pm_mark_last_busy(soc);
more_data: more_data:
/* reset local variables here to be re-used in the function */ /* reset local variables here to be re-used in the function */

查看文件

@@ -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 * @soc: Datapath soc handle
* *
* Return: QDF_STATUS * 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 #else
static inline int32_t dp_runtime_get(struct dp_soc *soc) 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; 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 #endif
static inline enum QDF_GLOBAL_MODE dp_soc_get_con_mode(struct dp_soc *soc) static inline enum QDF_GLOBAL_MODE dp_soc_get_con_mode(struct dp_soc *soc)

查看文件

@@ -5916,6 +5916,8 @@ static void dp_soc_detach(struct cdp_soc_t *txrx_soc)
soc->arch_ops.txrx_soc_detach(soc); soc->arch_ops.txrx_soc_detach(soc);
dp_runtime_deinit();
dp_sysfs_deinitialize_stats(soc); dp_sysfs_deinitialize_stats(soc);
dp_soc_swlm_detach(soc); dp_soc_swlm_detach(soc);
dp_soc_tx_desc_sw_pools_free(soc); dp_soc_tx_desc_sw_pools_free(soc);

查看文件

@@ -5594,8 +5594,7 @@ dp_print_ring_stats(struct dp_pdev *pdev)
int mac_id; int mac_id;
int lmac_id; int lmac_id;
if (hif_pm_runtime_get_sync(pdev->soc->hif_handle, if (hif_rtpm_get(HIF_RTPM_GET_SYNC, HIF_RTPM_ID_DP_RING_STATS))
RTPM_ID_DP_PRINT_RING_STATS))
return; return;
dp_print_ring_stat_from_hal(pdev->soc, dp_print_ring_stat_from_hal(pdev->soc,
@@ -5680,8 +5679,7 @@ dp_print_ring_stats(struct dp_pdev *pdev)
[lmac_id], [lmac_id],
RXDMA_DST); RXDMA_DST);
} }
hif_pm_runtime_put(pdev->soc->hif_handle, hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_DP_RING_STATS);
RTPM_ID_DP_PRINT_RING_STATS);
} }
/** /**

查看文件

@@ -1548,10 +1548,8 @@ dp_tx_ring_access_end_wrapper(struct dp_soc *soc,
return; return;
} }
ret = hif_pm_runtime_get(soc->hif_handle, ret = hif_rtpm_get(HIF_RTPM_GET_ASYNC, HIF_RTPM_ID_DP);
RTPM_ID_DW_TX_HW_ENQUEUE, true); if (QDF_IS_STATUS_SUCCESS(ret)) {
switch (ret) {
case 0:
if (hif_system_pm_state_check(soc->hif_handle)) { if (hif_system_pm_state_check(soc->hif_handle)) {
dp_tx_hal_ring_access_end_reap(soc, hal_ring_hdl); dp_tx_hal_ring_access_end_reap(soc, hal_ring_hdl);
hal_srng_set_event(hal_ring_hdl, HAL_SRNG_FLUSH_EVENT); 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 { } else {
dp_tx_ring_access_end(soc, hal_ring_hdl, coalesce); dp_tx_ring_access_end(soc, hal_ring_hdl, coalesce);
} }
hif_pm_runtime_put(soc->hif_handle, hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_DP);
RTPM_ID_DW_TX_HW_ENQUEUE); } else {
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:
dp_runtime_get(soc); dp_runtime_get(soc);
dp_tx_hal_ring_access_end_reap(soc, hal_ring_hdl); dp_tx_hal_ring_access_end_reap(soc, hal_ring_hdl);
hal_srng_set_event(hal_ring_hdl, HAL_SRNG_FLUSH_EVENT); hal_srng_set_event(hal_ring_hdl, HAL_SRNG_FLUSH_EVENT);

查看文件

@@ -530,17 +530,6 @@ dp_tx_desc_alloc(struct dp_soc *soc, uint8_t desc_pool_id)
} else { } else {
qdf_spin_unlock_bh(&pool->flow_pool_lock); 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 { } else {
pool->pkt_drop_no_desc++; pool->pkt_drop_no_desc++;
qdf_spin_unlock_bh(&pool->flow_pool_lock); 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++; soc->pool_stats.pkt_drop_no_pool++;
} }
return tx_desc; 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_spin_unlock_bh(&pool->flow_pool_lock);
qdf_print("%s %d pool is freed!!", qdf_print("%s %d pool is freed!!",
__func__, __LINE__); __func__, __LINE__);
goto out; return;
} }
break; 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); 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 */ #endif /* QCA_AC_BASED_FLOW_CONTROL */

查看文件

@@ -2307,10 +2307,12 @@ struct dp_soc {
#ifdef WLAN_DP_FEATURE_SW_LATENCY_MGR #ifdef WLAN_DP_FEATURE_SW_LATENCY_MGR
struct dp_swlm swlm; struct dp_swlm swlm;
#endif #endif
#ifdef FEATURE_RUNTIME_PM #ifdef FEATURE_RUNTIME_PM
/* DP Rx timestamp */
qdf_time_t rx_last_busy;
/* Dp runtime refcount */ /* Dp runtime refcount */
qdf_atomic_t dp_runtime_refcount; qdf_atomic_t dp_runtime_refcount;
/* Dp tx pending count in RTPM */ /* Dp tx pending count in RTPM */
qdf_atomic_t tx_pending_rtpm; qdf_atomic_t tx_pending_rtpm;
#endif #endif

查看文件

@@ -264,9 +264,9 @@ uint32_t dp_rx_process_li(struct dp_intr *int_ctx,
qdf_assert_always(hal_soc); qdf_assert_always(hal_soc);
scn = soc->hif_handle; scn = soc->hif_handle;
hif_pm_runtime_mark_dp_rx_busy(scn);
intr_id = int_ctx->dp_intr_id; intr_id = int_ctx->dp_intr_id;
num_entries = hal_srng_get_num_entries(hal_soc, hal_ring_hdl); num_entries = hal_srng_get_num_entries(hal_soc, hal_ring_hdl);
dp_runtime_pm_mark_last_busy(soc);
more_data: more_data:
/* reset local variables here to be re-used in the function */ /* reset local variables here to be re-used in the function */

查看文件

@@ -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, HAL_DESC_64_SET_FIELD(reo_desc, REO_GET_QUEUE_STATS, CLEAR_STATS,
cmd->u.stats_params.clear); cmd->u.stats_params.clear);
hal_srng_access_end_v1(hal_soc_hdl, hal_ring_hdl, RTPM_ID_HAL_REO_CMD, hal_srng_access_end_v1(hal_soc_hdl, hal_ring_hdl,
true); HIF_RTPM_ID_HAL_REO_CMD);
val = reo_desc[CMD_HEADER_DW_OFFSET]; val = reo_desc[CMD_HEADER_DW_OFFSET];
return HAL_GET_FIELD(UNIFORM_REO_CMD_HEADER, REO_CMD_NUMBER, 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); cmd->u.fl_queue_params.index);
} }
hal_srng_access_end_v1(hal_soc_hdl, hal_ring_hdl, RTPM_ID_HAL_REO_CMD, hal_srng_access_end_v1(hal_soc_hdl, hal_ring_hdl,
false); HIF_RTPM_ID_HAL_REO_CMD);
val = reo_desc[CMD_HEADER_DW_OFFSET]; val = reo_desc[CMD_HEADER_DW_OFFSET];
return HAL_GET_FIELD(UNIFORM_REO_CMD_HEADER, REO_CMD_NUMBER, return HAL_GET_FIELD(UNIFORM_REO_CMD_HEADER, REO_CMD_NUMBER,
val); 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, HAL_DESC_64_SET_FIELD(reo_desc, REO_FLUSH_CACHE, FLUSH_ENTIRE_CACHE,
cp->flush_entire_cache); cp->flush_entire_cache);
hal_srng_access_end_v1(hal_soc_hdl, hal_ring_hdl, RTPM_ID_HAL_REO_CMD, hal_srng_access_end_v1(hal_soc_hdl, hal_ring_hdl,
false); HIF_RTPM_ID_HAL_REO_CMD);
val = reo_desc[CMD_HEADER_DW_OFFSET]; val = reo_desc[CMD_HEADER_DW_OFFSET];
return HAL_GET_FIELD(UNIFORM_REO_CMD_HEADER, REO_CMD_NUMBER, 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, HAL_DESC_64_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE,
PN_127_96, p->pn_127_96); PN_127_96, p->pn_127_96);
hal_srng_access_end_v1(hal_soc_hdl, hal_ring_hdl, RTPM_ID_HAL_REO_CMD, hal_srng_access_end_v1(hal_soc_hdl, hal_ring_hdl,
false); HIF_RTPM_ID_HAL_REO_CMD);
val = reo_desc[CMD_HEADER_DW_OFFSET]; val = reo_desc[CMD_HEADER_DW_OFFSET];
return HAL_GET_FIELD(UNIFORM_REO_CMD_HEADER, REO_CMD_NUMBER, return HAL_GET_FIELD(UNIFORM_REO_CMD_HEADER, REO_CMD_NUMBER,
val); val);

查看文件

@@ -2217,11 +2217,6 @@ hal_srng_access_end(void *hal_soc, hal_ring_handle_t hal_ring_hdl)
SRNG_UNLOCK(&(srng->lock)); 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 #ifdef FEATURE_RUNTIME_PM
#define hal_srng_access_end_v1 hal_srng_rtpm_access_end #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 void
hal_srng_rtpm_access_end(hal_soc_handle_t hal_soc_hdl, hal_srng_rtpm_access_end(hal_soc_handle_t hal_soc_hdl,
hal_ring_handle_t hal_ring_hdl, hal_ring_handle_t hal_ring_hdl,
wlan_rtpm_dbgid rtpm_dbgid, uint32_t rtpm_id);
bool is_critical_ctx);
#else #else
#define hal_srng_access_end_v1(hal_soc_hdl, hal_ring_hdl, rtpm_dbgid, \ #define hal_srng_access_end_v1(hal_soc_hdl, hal_ring_hdl, rtpm_id) \
is_critical_ctx)\
hal_srng_access_end(hal_soc_hdl, hal_ring_hdl) hal_srng_access_end(hal_soc_hdl, hal_ring_hdl)
#endif #endif

查看文件

@@ -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); hal_reo_shared_qaddr_setup((hal_soc_handle_t)hal);
hif_rtpm_register(HIF_RTPM_ID_HAL_REO_CMD, NULL);
return (void *)hal; return (void *)hal;
fail3: fail3:
qdf_mem_free_consistent(qdf_dev, qdf_dev->dev, 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; 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_delayed_reg_write_deinit(hal);
hal_reo_shared_qaddr_detach((hal_soc_handle_t)hal); hal_reo_shared_qaddr_detach((hal_soc_handle_t)hal);
qdf_mem_free(hal->ops); qdf_mem_free(hal->ops);
@@ -1788,21 +1791,16 @@ qdf_export_symbol(hal_set_low_threshold);
void void
hal_srng_rtpm_access_end(hal_soc_handle_t hal_soc_hdl, hal_srng_rtpm_access_end(hal_soc_handle_t hal_soc_hdl,
hal_ring_handle_t hal_ring_hdl, hal_ring_handle_t hal_ring_hdl,
wlan_rtpm_dbgid rtpm_dbgid, uint32_t rtpm_id)
bool is_critical_ctx)
{ {
struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
if (qdf_unlikely(!hal_ring_hdl)) { if (qdf_unlikely(!hal_ring_hdl)) {
qdf_print("Error: Invalid hal_ring\n"); qdf_print("Error: Invalid hal_ring\n");
return; return;
} }
if (hif_pm_runtime_get(hal_soc->hif_handle, if (hif_rtpm_get(HIF_RTPM_GET_ASYNC, rtpm_id) == 0) {
rtpm_dbgid, is_critical_ctx) == 0) {
hal_srng_access_end(hal_soc_hdl, hal_ring_hdl); hal_srng_access_end(hal_soc_hdl, hal_ring_hdl);
hif_pm_runtime_put(hal_soc->hif_handle, hif_rtpm_put(HIF_RTPM_PUT_ASYNC, rtpm_id);
rtpm_dbgid);
} else { } else {
hal_srng_access_end_reap(hal_soc_hdl, hal_ring_hdl); hal_srng_access_end_reap(hal_soc_hdl, hal_ring_hdl);
hal_srng_set_event(hal_ring_hdl, HAL_SRNG_FLUSH_EVENT); hal_srng_set_event(hal_ring_hdl, HAL_SRNG_FLUSH_EVENT);

查看文件

@@ -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, HAL_DESC_SET_FIELD(reo_desc, REO_GET_QUEUE_STATS_2, CLEAR_STATS,
cmd->u.stats_params.clear); cmd->u.stats_params.clear);
if (hif_pm_runtime_get(hal_soc->hif_handle, if (hif_rtpm_get(HIF_RTPM_GET_ASYNC, HIF_RTPM_ID_HAL_REO_CMD) == 0) {
RTPM_ID_HAL_REO_CMD, false) == 0) {
hal_srng_access_end(hal_soc_hdl, hal_ring_hdl); hal_srng_access_end(hal_soc_hdl, hal_ring_hdl);
hif_pm_runtime_put(hal_soc->hif_handle, hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_HAL_REO_CMD);
RTPM_ID_HAL_REO_CMD);
} else { } else {
hal_srng_access_end_reap(hal_soc_hdl, hal_ring_hdl); hal_srng_access_end_reap(hal_soc_hdl, hal_ring_hdl);
hal_srng_set_event(hal_ring_hdl, HAL_SRNG_FLUSH_EVENT); 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, HAL_DESC_SET_FIELD(reo_desc, REO_FLUSH_CACHE_2, FLUSH_ENTIRE_CACHE,
cp->flush_entire_cache); cp->flush_entire_cache);
if (hif_pm_runtime_get(hal_soc->hif_handle, if (hif_rtpm_get(HIF_RTPM_GET_ASYNC, HIF_RTPM_ID_HAL_REO_CMD) == 0) {
RTPM_ID_HAL_REO_CMD, false) == 0) {
hal_srng_access_end(hal_soc_hdl, hal_ring_hdl); hal_srng_access_end(hal_soc_hdl, hal_ring_hdl);
hif_pm_runtime_put(hal_soc->hif_handle, hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_HAL_REO_CMD);
RTPM_ID_HAL_REO_CMD);
} else { } else {
hal_srng_access_end_reap(hal_soc_hdl, hal_ring_hdl); hal_srng_access_end_reap(hal_soc_hdl, hal_ring_hdl);
hal_srng_set_event(hal_ring_hdl, HAL_SRNG_FLUSH_EVENT); 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, HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_8,
PN_127_96, p->pn_127_96); PN_127_96, p->pn_127_96);
if (hif_pm_runtime_get(hal_soc->hif_handle, if (hif_rtpm_get(HIF_RTPM_GET_ASYNC, HIF_RTPM_ID_HAL_REO_CMD) == 0) {
RTPM_ID_HAL_REO_CMD, false) == 0) {
hal_srng_access_end(hal_soc_hdl, hal_ring_hdl); hal_srng_access_end(hal_soc_hdl, hal_ring_hdl);
hif_pm_runtime_put(hal_soc->hif_handle, hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_HAL_REO_CMD);
RTPM_ID_HAL_REO_CMD);
} else { } else {
hal_srng_access_end_reap(hal_soc_hdl, hal_ring_hdl); hal_srng_access_end_reap(hal_soc_hdl, hal_ring_hdl);
hal_srng_set_event(hal_ring_hdl, HAL_SRNG_FLUSH_EVENT); hal_srng_set_event(hal_ring_hdl, HAL_SRNG_FLUSH_EVENT);

查看文件

@@ -154,11 +154,8 @@ static void htc_cleanup(HTC_TARGET *target)
HTC_PACKET_QUEUE *pkt_queue; HTC_PACKET_QUEUE *pkt_queue;
qdf_nbuf_t netbuf; qdf_nbuf_t netbuf;
while (htc_dec_return_runtime_cnt((void *)target) >= 0) { while (htc_dec_return_runtime_cnt((void *)target) >= 0)
hif_pm_runtime_put(target->hif_dev, RTPM_ID_HTC); hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_HTT);
hif_pm_runtime_update_stats(target->hif_dev, RTPM_ID_HTC,
HIF_PM_HTC_STATS_PUT_HTC_CLEANUP);
}
if (target->hif_dev) { if (target->hif_dev) {
hif_detach_htc(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(); 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; return (HTC_HANDLE) target;
} }
@@ -499,10 +499,15 @@ void htc_destroy(HTC_HANDLE HTCHandle)
AR_DEBUG_PRINTF(ATH_DEBUG_TRC, AR_DEBUG_PRINTF(ATH_DEBUG_TRC,
("+htc_destroy .. Destroying :0x%pK\n", target)); ("+htc_destroy .. Destroying :0x%pK\n", target));
htc_hang_event_notifier_unregister(); 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); htc_cleanup(target);
}
AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-htc_destroy\n")); AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-htc_destroy\n"));
htc_credit_history_deinit(); htc_credit_history_deinit();
} }
@@ -1216,19 +1221,12 @@ bool htc_can_suspend_link(HTC_HANDLE htc_handle)
#ifdef FEATURE_RUNTIME_PM #ifdef FEATURE_RUNTIME_PM
int htc_pm_runtime_get(HTC_HANDLE htc_handle) int htc_pm_runtime_get(HTC_HANDLE htc_handle)
{ {
HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(htc_handle); return hif_rtpm_get(HIF_RTPM_GET_ASYNC, HIF_RTPM_ID_HTT);
return hif_pm_runtime_get(target->hif_dev,
RTPM_ID_HTC, false);
} }
int htc_pm_runtime_put(HTC_HANDLE htc_handle) int htc_pm_runtime_put(HTC_HANDLE htc_handle)
{ {
HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(htc_handle); return hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_HTT);
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);
} }
#endif #endif

查看文件

@@ -198,6 +198,7 @@ enum ol_ath_htc_pkt_ecodes {
HTC_PKT_Q_EMPTY, HTC_PKT_Q_EMPTY,
HTC_SEND_Q_EMPTY HTC_SEND_Q_EMPTY
}; };
/* our HTC target state */ /* our HTC target state */
typedef struct _HTC_TARGET { typedef struct _HTC_TARGET {
struct hif_opaque_softc *hif_dev; struct hif_opaque_softc *hif_dev;

查看文件

@@ -870,16 +870,10 @@ static QDF_STATUS htc_issue_packets(HTC_TARGET *target,
*/ */
if (pPacket->PktInfo.AsTx.Tag == HTC_TX_PACKET_TAG_RUNTIME_PUT) { if (pPacket->PktInfo.AsTx.Tag == HTC_TX_PACKET_TAG_RUNTIME_PUT) {
rt_put = true; 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 == } else if (pPacket->PktInfo.AsTx.Tag ==
HTC_TX_PACKET_TAG_RTPM_PUT_RC) { HTC_TX_PACKET_TAG_RTPM_PUT_RC) {
rt_put_in_resp = true; rt_put_in_resp = true;
htc_inc_runtime_cnt(target); 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 #if DEBUG_BUNDLE
@@ -971,11 +965,7 @@ static QDF_STATUS htc_issue_packets(HTC_TARGET *target,
break; break;
} }
if (rt_put) { if (rt_put) {
hif_pm_runtime_put(target->hif_dev, hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_HTT);
RTPM_ID_HTC);
hif_pm_runtime_update_stats(
target->hif_dev, RTPM_ID_HTC,
HIF_PM_HTC_STATS_PUT_HTT_NO_RESPONSE);
rt_put = false; rt_put = false;
} }
} }
@@ -1050,7 +1040,7 @@ static void queue_htc_pm_packets(HTC_ENDPOINT *endpoint,
#endif #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 * @service_id: service for endpoint
* *
* For service_id HTT_DATA_MSG_SVC, HTT message donot have a tx complete * 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. * put/get.
* *
* *
* Return: rtpm_dbgid to trace who use it * Return: rtpm id to trace who used it
*/ */
static wlan_rtpm_dbgid static unsigned int
htc_send_pkts_rtpm_dbgid_get(HTC_SERVICE_ID service_id) htc_send_pkts_get_rtpm_id(HTC_SERVICE_ID service_id)
{ {
wlan_rtpm_dbgid rtpm_dbgid;
if (service_id == HTT_DATA_MSG_SVC) if (service_id == HTT_DATA_MSG_SVC)
rtpm_dbgid = RTPM_ID_HTC; return HIF_RTPM_ID_HTT;
else else
rtpm_dbgid = RTPM_ID_WMI; return HIF_RTPM_ID_WMI;
return rtpm_dbgid;
} }
#ifdef SYSTEM_PM_CHECK #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 *tx_queue;
HTC_PACKET_QUEUE pm_queue; HTC_PACKET_QUEUE pm_queue;
bool do_pm_get = false; bool do_pm_get = false;
wlan_rtpm_dbgid rtpm_dbgid = 0; unsigned int rtpm_code = 0;
int ret; int ret;
HTC_PACKET_QUEUE sys_pm_queue; HTC_PACKET_QUEUE sys_pm_queue;
bool sys_pm_check = false; 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 */ /* loop until we can grab as many packets out of the queue as we can */
while (true) { while (true) {
if (do_pm_get) { if (do_pm_get) {
rtpm_dbgid = rtpm_code = htc_send_pkts_get_rtpm_id(
htc_send_pkts_rtpm_dbgid_get( pEndpoint->service_id);
pEndpoint->service_id); ret = hif_rtpm_get(HIF_RTPM_GET_ASYNC, rtpm_code);
ret = hif_pm_runtime_get(target->hif_dev,
rtpm_dbgid, false);
if (ret) { if (ret) {
/* bus suspended, runtime resume issued */ /* bus suspended, runtime resume issued */
QDF_ASSERT(HTC_PACKET_QUEUE_DEPTH(pQueue) == 0); QDF_ASSERT(HTC_PACKET_QUEUE_DEPTH(pQueue) == 0);
if (ret == -EAGAIN) { pPacket = htc_get_pkt_at_head(tx_queue);
pPacket = htc_get_pkt_at_head(tx_queue); if (!pPacket)
if (!pPacket) break;
break; log_packet_info(target, pPacket);
log_packet_info(target, pPacket);
}
break; break;
} }
} }
@@ -1193,15 +1175,14 @@ static void get_htc_send_packets_credit_based(HTC_TARGET *target,
pPacket = htc_get_pkt_at_head(tx_queue); pPacket = htc_get_pkt_at_head(tx_queue);
if (!pPacket) { if (!pPacket) {
if (do_pm_get) if (do_pm_get)
hif_pm_runtime_put(target->hif_dev, hif_rtpm_put(HIF_RTPM_PUT_ASYNC, rtpm_code);
rtpm_dbgid);
break; break;
} }
if (sys_pm_check && if (sys_pm_check &&
hif_system_pm_state_check(target->hif_dev)) { hif_system_pm_state_check(target->hif_dev)) {
if (do_pm_get) if (do_pm_get)
hif_pm_runtime_put(target->hif_dev, rtpm_dbgid); hif_rtpm_put(HIF_RTPM_PUT_ASYNC, rtpm_code);
break; break;
} }
@@ -1245,8 +1226,9 @@ static void get_htc_send_packets_credit_based(HTC_TARGET *target,
creditsRequired)); creditsRequired));
#endif #endif
if (do_pm_get) if (do_pm_get)
hif_pm_runtime_put(target->hif_dev, hif_rtpm_put(HIF_RTPM_PUT_ASYNC,
rtpm_dbgid); rtpm_code);
break; break;
} }
@@ -1308,7 +1290,7 @@ static void get_htc_send_packets(HTC_TARGET *target,
HTC_PACKET_QUEUE *tx_queue; HTC_PACKET_QUEUE *tx_queue;
HTC_PACKET_QUEUE pm_queue; HTC_PACKET_QUEUE pm_queue;
bool do_pm_get = false; bool do_pm_get = false;
wlan_rtpm_dbgid rtpm_dbgid = 0; unsigned int rtpm_code = 0;
int ret; int ret;
/*** NOTE : the TX lock is held when this function is called ***/ /*** 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; int num_frags;
if (do_pm_get) { if (do_pm_get) {
rtpm_dbgid = rtpm_code =
htc_send_pkts_rtpm_dbgid_get( htc_send_pkts_get_rtpm_id(
pEndpoint->service_id); pEndpoint->service_id);
ret = hif_pm_runtime_get(target->hif_dev, ret = hif_rtpm_get(HIF_RTPM_GET_ASYNC, rtpm_code);
rtpm_dbgid, false);
if (ret) { if (ret) {
/* bus suspended, runtime resume issued */ /* bus suspended, runtime resume issued */
QDF_ASSERT(HTC_PACKET_QUEUE_DEPTH(pQueue) == 0); QDF_ASSERT(HTC_PACKET_QUEUE_DEPTH(pQueue) == 0);
if (ret == -EAGAIN) { pPacket = htc_get_pkt_at_head(tx_queue);
pPacket = htc_get_pkt_at_head(tx_queue); if (!pPacket)
if (!pPacket) break;
break; log_packet_info(target, pPacket);
log_packet_info(target, pPacket);
}
break; 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); ret = hif_system_pm_state_check(target->hif_dev);
if (ret) { if (ret) {
if (do_pm_get) { if (do_pm_get) {
hif_pm_runtime_put(target->hif_dev, rtpm_dbgid); hif_rtpm_put(HIF_RTPM_PUT_ASYNC, rtpm_code);
hif_pm_runtime_update_stats(
target->hif_dev, rtpm_dbgid,
HIF_PM_HTC_STATS_PUT_HTT_FETCH_PKTS);
} }
break; break;
} }
@@ -1364,10 +1338,7 @@ static void get_htc_send_packets(HTC_TARGET *target,
pPacket = htc_packet_dequeue(tx_queue); pPacket = htc_packet_dequeue(tx_queue);
if (!pPacket) { if (!pPacket) {
if (do_pm_get) { if (do_pm_get) {
hif_pm_runtime_put(target->hif_dev, rtpm_dbgid); hif_rtpm_put(HIF_RTPM_PUT_ASYNC, rtpm_code);
hif_pm_runtime_update_stats(
target->hif_dev, rtpm_dbgid,
HIF_PM_HTC_STATS_PUT_HTT_FETCH_PKTS);
} }
break; break;
} }
@@ -1696,7 +1667,7 @@ static enum HTC_SEND_QUEUE_RESULT htc_try_send(HTC_TARGET *target,
status = htc_issue_packets(target, pEndpoint, &sendQueue); status = htc_issue_packets(target, pEndpoint, &sendQueue);
if (status) { if (status) {
int i; int i;
wlan_rtpm_dbgid rtpm_dbgid; unsigned int rtpm_code;
result = HTC_SEND_QUEUE_DROP; result = HTC_SEND_QUEUE_DROP;
@@ -1719,15 +1690,10 @@ static enum HTC_SEND_QUEUE_RESULT htc_try_send(HTC_TARGET *target,
break; break;
} }
rtpm_dbgid = rtpm_code = htc_send_pkts_get_rtpm_id(
htc_send_pkts_rtpm_dbgid_get( pEndpoint->service_id);
pEndpoint->service_id);
for (i = HTC_PACKET_QUEUE_DEPTH(&sendQueue); i > 0; i--) { for (i = HTC_PACKET_QUEUE_DEPTH(&sendQueue); i > 0; i--) {
hif_pm_runtime_put(target->hif_dev, hif_rtpm_put(HIF_RTPM_PUT_ASYNC, rtpm_code);
rtpm_dbgid);
hif_pm_runtime_update_stats(
target->hif_dev, rtpm_dbgid,
HIF_PM_HTC_STATS_PUT_HTT_ERROR);
} }
if (!pEndpoint->async_update) { 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; int tx_resources;
uint32_t data_attr = 0; uint32_t data_attr = 0;
int htc_payload_len = actual_length; int htc_payload_len = actual_length;
wlan_rtpm_dbgid rtpm_dbgid; unsigned int rtpm_code;
pEndpoint = &target->endpoint[ep_id]; 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; return QDF_STATUS_E_FAILURE;
} }
rtpm_dbgid = rtpm_code = htc_send_pkts_get_rtpm_id(
htc_send_pkts_rtpm_dbgid_get(pEndpoint->service_id); pEndpoint->service_id);
if (hif_pm_runtime_get(target->hif_dev, rtpm_dbgid, false)) if (hif_rtpm_get(HIF_RTPM_GET_ASYNC, rtpm_code))
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
p_htc_hdr = (HTC_FRAME_HDR *)qdf_nbuf_get_frag_vaddr(netbuf, 0); 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 && 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_RUNTIME_PUT &&
pPacket->PktInfo.AsTx.Tag != HTC_TX_PACKET_TAG_RTPM_PUT_RC) pPacket->PktInfo.AsTx.Tag != HTC_TX_PACKET_TAG_RTPM_PUT_RC)
hif_pm_runtime_put(target->hif_dev, hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_WMI);
RTPM_ID_WMI);
if (pPacket->PktInfo.AsTx.Tag == HTC_TX_PACKET_TAG_BUNDLED) { if (pPacket->PktInfo.AsTx.Tag == HTC_TX_PACKET_TAG_BUNDLED) {
HTC_PACKET *pPacketTemp; HTC_PACKET *pPacketTemp;
@@ -2592,13 +2558,9 @@ void htc_kick_queues(void *context)
HTC_TARGET *target = (HTC_TARGET *)context; HTC_TARGET *target = (HTC_TARGET *)context;
HTC_ENDPOINT *endpoint = NULL; 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; 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++) { for (i = 0; i < ENDPOINT_MAX; i++) {
endpoint = &target->endpoint[i]; endpoint = &target->endpoint[i];
@@ -2614,12 +2576,7 @@ void htc_kick_queues(void *context)
hif_fastpath_resume(target->hif_dev); hif_fastpath_resume(target->hif_dev);
if (hif_pm_runtime_put(target->hif_dev, RTPM_ID_HTC)) hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_HTT);
return;
hif_pm_runtime_update_stats(
target->hif_dev, RTPM_ID_HTC,
HIF_PM_HTC_STATS_PUT_HTC_KICK_QUEUES);
} }
#endif #endif