qcacmn: Run time enablement of CE tasklet debug
Add support for enbalement of CE_TASKET_DEBUG_ENABLE in run time. Change-Id: I0132c3b989b75e7d526680f1e5f73a716e9db54c CRs-Fixed:: 2610811
This commit is contained in:

committed by
nshrivas

parent
4b07f4beec
commit
c10ffa0652
@@ -1996,6 +1996,10 @@ enum _ol_ath_param_t {
|
|||||||
OL_ATH_PARAM_GET_PDEV_NUM_PEERS = 435,
|
OL_ATH_PARAM_GET_PDEV_NUM_PEERS = 435,
|
||||||
/* Number of monitor vdevs configured per PDEV */
|
/* Number of monitor vdevs configured per PDEV */
|
||||||
OL_ATH_PARAM_GET_PDEV_NUM_MONITOR_VDEVS = 436,
|
OL_ATH_PARAM_GET_PDEV_NUM_MONITOR_VDEVS = 436,
|
||||||
|
#ifdef CE_TASKLET_DEBUG_ENABLE
|
||||||
|
/* Enable/disable CE stats print */
|
||||||
|
OL_ATH_PARAM_ENABLE_CE_LATENCY_STATS = 437,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
/* Bitmasks for stats that can block */
|
/* Bitmasks for stats that can block */
|
||||||
|
@@ -860,6 +860,10 @@ QDF_STATUS hif_enable(struct hif_opaque_softc *hif_ctx, struct device *dev,
|
|||||||
enum qdf_bus_type bus_type,
|
enum qdf_bus_type bus_type,
|
||||||
enum hif_enable_type type);
|
enum hif_enable_type type);
|
||||||
void hif_disable(struct hif_opaque_softc *hif_ctx, enum hif_disable_type type);
|
void hif_disable(struct hif_opaque_softc *hif_ctx, enum hif_disable_type type);
|
||||||
|
#ifdef CE_TASKLET_DEBUG_ENABLE
|
||||||
|
void hif_enable_ce_latency_stats(struct hif_opaque_softc *hif_ctx,
|
||||||
|
uint8_t value);
|
||||||
|
#endif
|
||||||
void hif_display_stats(struct hif_opaque_softc *hif_ctx);
|
void hif_display_stats(struct hif_opaque_softc *hif_ctx);
|
||||||
void hif_clear_stats(struct hif_opaque_softc *hif_ctx);
|
void hif_clear_stats(struct hif_opaque_softc *hif_ctx);
|
||||||
#ifdef FEATURE_RUNTIME_PM
|
#ifdef FEATURE_RUNTIME_PM
|
||||||
|
@@ -189,33 +189,34 @@ hif_ce_latency_stats(struct hif_softc *hif_ctx)
|
|||||||
struct HIF_CE_state *hif_ce_state = HIF_GET_CE_STATE(hif_ctx);
|
struct HIF_CE_state *hif_ce_state = HIF_GET_CE_STATE(hif_ctx);
|
||||||
struct ce_stats *stats = &hif_ce_state->stats;
|
struct ce_stats *stats = &hif_ce_state->stats;
|
||||||
|
|
||||||
|
hif_err("\tCE TASKLET ARRIVAL AND EXECUTION STATS");
|
||||||
for (i = 0; i < CE_COUNT_MAX; i++) {
|
for (i = 0; i < CE_COUNT_MAX; i++) {
|
||||||
qdf_nofl_info("\n\t\tCE Ring %d Tasklet Execution Bucket", i);
|
hif_nofl_err("\n\t\tCE Ring %d Tasklet Execution Bucket", i);
|
||||||
for (j = 0; j < CE_BUCKET_MAX; j++) {
|
for (j = 0; j < CE_BUCKET_MAX; j++) {
|
||||||
qdf_nofl_info("\t Bucket %sms :%llu\t last update:%llu",
|
hif_nofl_err("\t Bucket %sms :%llu\t last update:%llu",
|
||||||
buck_str[j],
|
buck_str[j],
|
||||||
stats->ce_tasklet_exec_bucket[i][j],
|
stats->ce_tasklet_exec_bucket[i][j],
|
||||||
stats->ce_tasklet_exec_last_update[i][j]);
|
stats->ce_tasklet_exec_last_update[i][j]);
|
||||||
}
|
}
|
||||||
|
|
||||||
qdf_nofl_info("\n\t\tCE Ring %d Tasklet Scheduled Bucket", i);
|
hif_nofl_err("\n\t\tCE Ring %d Tasklet Scheduled Bucket", i);
|
||||||
for (j = 0; j < CE_BUCKET_MAX; j++) {
|
for (j = 0; j < CE_BUCKET_MAX; j++) {
|
||||||
qdf_nofl_info("\t Bucket %sms :%llu\t last update :%lld",
|
hif_nofl_err("\t Bucket %sms :%llu\t last update :%lld",
|
||||||
buck_str[j],
|
buck_str[j],
|
||||||
stats->ce_tasklet_sched_bucket[i][j],
|
stats->ce_tasklet_sched_bucket[i][j],
|
||||||
stats->
|
stats->
|
||||||
ce_tasklet_sched_last_update[i][j]);
|
ce_tasklet_sched_last_update[i][j]);
|
||||||
}
|
}
|
||||||
|
|
||||||
qdf_nofl_info("\n\t\t CE RING %d Last %d time records",
|
hif_nofl_err("\n\t\t CE RING %d Last %d time records",
|
||||||
i, HIF_REQUESTED_EVENTS);
|
i, HIF_REQUESTED_EVENTS);
|
||||||
index = stats->record_index[i];
|
index = stats->record_index[i];
|
||||||
start_index = stats->record_index[i];
|
start_index = stats->record_index[i];
|
||||||
|
|
||||||
for (j = 0; j < HIF_REQUESTED_EVENTS; j++) {
|
for (j = 0; j < HIF_REQUESTED_EVENTS; j++) {
|
||||||
qdf_nofl_info("\t Execuiton time: %luus Total Scheduled time: %luus",
|
hif_nofl_err("\t Execuiton time: %luus Total Scheduled time: %luus",
|
||||||
stats->tasklet_exec_time_record[i][index],
|
stats->tasklet_exec_time_record[i][index],
|
||||||
stats->
|
stats->
|
||||||
tasklet_sched_time_record[i][index]);
|
tasklet_sched_time_record[i][index]);
|
||||||
index = (index - 1) % HIF_REQUESTED_EVENTS;
|
index = (index - 1) % HIF_REQUESTED_EVENTS;
|
||||||
if (index == start_index)
|
if (index == start_index)
|
||||||
@@ -345,7 +346,9 @@ static void ce_tasklet(unsigned long data)
|
|||||||
struct hif_softc *scn = HIF_GET_SOFTC(hif_ce_state);
|
struct hif_softc *scn = HIF_GET_SOFTC(hif_ce_state);
|
||||||
struct CE_state *CE_state = scn->ce_id_to_state[tasklet_entry->ce_id];
|
struct CE_state *CE_state = scn->ce_id_to_state[tasklet_entry->ce_id];
|
||||||
|
|
||||||
hif_record_tasklet_exec_entry_ts(scn, tasklet_entry->ce_id);
|
if (scn->ce_latency_stats)
|
||||||
|
hif_record_tasklet_exec_entry_ts(scn, tasklet_entry->ce_id);
|
||||||
|
|
||||||
hif_record_ce_desc_event(scn, tasklet_entry->ce_id,
|
hif_record_ce_desc_event(scn, tasklet_entry->ce_id,
|
||||||
HIF_CE_TASKLET_ENTRY, NULL, NULL, -1, 0);
|
HIF_CE_TASKLET_ENTRY, NULL, NULL, -1, 0);
|
||||||
|
|
||||||
@@ -375,7 +378,10 @@ static void ce_tasklet(unsigned long data)
|
|||||||
|
|
||||||
hif_record_ce_desc_event(scn, tasklet_entry->ce_id, HIF_CE_TASKLET_EXIT,
|
hif_record_ce_desc_event(scn, tasklet_entry->ce_id, HIF_CE_TASKLET_EXIT,
|
||||||
NULL, NULL, -1, 0);
|
NULL, NULL, -1, 0);
|
||||||
ce_tasklet_update_bucket(hif_ce_state, tasklet_entry->ce_id);
|
|
||||||
|
if (scn->ce_latency_stats)
|
||||||
|
ce_tasklet_update_bucket(hif_ce_state, tasklet_entry->ce_id);
|
||||||
|
|
||||||
qdf_atomic_dec(&scn->active_tasklet_cnt);
|
qdf_atomic_dec(&scn->active_tasklet_cnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -555,7 +561,8 @@ void hif_display_ce_stats(struct hif_softc *hif_ctx)
|
|||||||
qdf_debug("CE id[%2d] - %s", i, str_buffer);
|
qdf_debug("CE id[%2d] - %s", i, str_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
hif_ce_latency_stats(hif_ctx);
|
if (hif_ctx->ce_latency_stats)
|
||||||
|
hif_ce_latency_stats(hif_ctx);
|
||||||
#undef STR_SIZE
|
#undef STR_SIZE
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -589,7 +596,9 @@ static inline bool hif_tasklet_schedule(struct hif_opaque_softc *hif_ctx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
tasklet_schedule(&tasklet_entry->intr_tq);
|
tasklet_schedule(&tasklet_entry->intr_tq);
|
||||||
hif_record_tasklet_sched_entry_ts(scn, tasklet_entry->ce_id);
|
if (scn->ce_latency_stats)
|
||||||
|
hif_record_tasklet_sched_entry_ts(scn, tasklet_entry->ce_id);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -653,6 +653,18 @@ void hif_disable(struct hif_opaque_softc *hif_ctx, enum hif_disable_type type)
|
|||||||
HIF_DBG("%s: X", __func__);
|
HIF_DBG("%s: X", __func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CE_TASKLET_DEBUG_ENABLE
|
||||||
|
void hif_enable_ce_latency_stats(struct hif_opaque_softc *hif_ctx, uint8_t val)
|
||||||
|
{
|
||||||
|
struct hif_softc *scn = HIF_GET_SOFTC(hif_ctx);
|
||||||
|
|
||||||
|
if (!scn)
|
||||||
|
return;
|
||||||
|
|
||||||
|
scn->ce_latency_stats = val;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void hif_display_stats(struct hif_opaque_softc *hif_ctx)
|
void hif_display_stats(struct hif_opaque_softc *hif_ctx)
|
||||||
{
|
{
|
||||||
hif_display_bus_stats(hif_ctx);
|
hif_display_bus_stats(hif_ctx);
|
||||||
|
@@ -176,6 +176,7 @@ struct hif_softc {
|
|||||||
bool hif_init_done;
|
bool hif_init_done;
|
||||||
bool request_irq_done;
|
bool request_irq_done;
|
||||||
bool ext_grp_irq_configured;
|
bool ext_grp_irq_configured;
|
||||||
|
uint8_t ce_latency_stats;
|
||||||
/* Packet statistics */
|
/* Packet statistics */
|
||||||
struct hif_ce_stats pkt_stats;
|
struct hif_ce_stats pkt_stats;
|
||||||
enum hif_target_status target_status;
|
enum hif_target_status target_status;
|
||||||
@@ -233,7 +234,6 @@ struct hif_softc {
|
|||||||
#if defined(HIF_CONFIG_SLUB_DEBUG_ON) || defined(HIF_CE_DEBUG_DATA_BUF)
|
#if defined(HIF_CONFIG_SLUB_DEBUG_ON) || defined(HIF_CE_DEBUG_DATA_BUF)
|
||||||
struct ce_desc_hist hif_ce_desc_hist;
|
struct ce_desc_hist hif_ce_desc_hist;
|
||||||
#endif /*defined(HIF_CONFIG_SLUB_DEBUG_ON) || defined(HIF_CE_DEBUG_DATA_BUF)*/
|
#endif /*defined(HIF_CONFIG_SLUB_DEBUG_ON) || defined(HIF_CE_DEBUG_DATA_BUF)*/
|
||||||
|
|
||||||
#ifdef IPA_OFFLOAD
|
#ifdef IPA_OFFLOAD
|
||||||
qdf_shared_mem_t *ipa_ce_ring;
|
qdf_shared_mem_t *ipa_ce_ring;
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user