diff --git a/hif/inc/hif.h b/hif/inc/hif.h index e338ed73800c..41af54de528f 100644 --- a/hif/inc/hif.h +++ b/hif/inc/hif.h @@ -1657,36 +1657,6 @@ ssize_t hif_ce_en_desc_hist(struct hif_softc *scn, const char *buf, size_t size); ssize_t hif_disp_ce_enable_desc_data_hist(struct hif_softc *scn, char *buf); ssize_t hif_dump_desc_event(struct hif_softc *scn, char *buf); -/** - * hif_ce_debug_history_prealloc_init() - alloc ce debug history memory - * - * alloc ce debug history memory with driver init, so such memory can - * be existed even after stop module. - * on ini value. - * - * Return: QDF_STATUS_SUCCESS for success, other for fail. - */ -QDF_STATUS hif_ce_debug_history_prealloc_init(void); -/** - * hif_ce_debug_history_prealloc_deinit() - free ce debug history memory - * - * free ce debug history memory when driver deinit. - * - * Return: QDF_STATUS_SUCCESS for success, other for fail. - */ -QDF_STATUS hif_ce_debug_history_prealloc_deinit(void); -#else -static inline -QDF_STATUS hif_ce_debug_history_prealloc_init(void) -{ - return QDF_STATUS_SUCCESS; -} - -static inline -QDF_STATUS hif_ce_debug_history_prealloc_deinit(void) -{ - return QDF_STATUS_SUCCESS; -} #endif/*#if defined(HIF_CONFIG_SLUB_DEBUG_ON)||defined(HIF_CE_DEBUG_DATA_BUF)*/ /** diff --git a/hif/src/ce/ce_main.c b/hif/src/ce/ce_main.c index 1fc8bb03c7fe..9a8fc114bbdd 100644 --- a/hif/src/ce/ce_main.c +++ b/hif/src/ce/ce_main.c @@ -1453,71 +1453,41 @@ void free_mem_ce_debug_hist_data(struct hif_softc *scn, uint32_t ce_id) #ifndef HIF_CE_DEBUG_DATA_DYNAMIC_BUF #if defined(HIF_CONFIG_SLUB_DEBUG_ON) || defined(HIF_CE_DEBUG_DATA_BUF) -struct hif_ce_desc_event *hif_ce_desc_history[CE_COUNT_MAX]; -/* define this variable for crashscope parse */ +/* define below variables for crashscope parse */ +struct hif_ce_desc_event *hif_ce_desc_history[CE_COUNT_MAX]; uint32_t hif_ce_history_max = HIF_CE_HISTORY_MAX; /** - * hif_ce_debug_only_enable_ce2_ce3() - if only enable ce2/ce3 debug - * This is different config for perf/debug buid version. * for debug build, it will enable ce history for all ce, but for * perf build(if CONFIG_SLUB_DEBUG_ON is N), it only enable for * ce2(wmi event) & ce3(wmi cmd) history. - * - * Return: true if only enable ce2/ce3 debug, otherwise false. */ #if defined(CONFIG_SLUB_DEBUG_ON) -static inline bool hif_ce_debug_only_enable_ce2_ce3(void) -{ - return false; -} +#define CE_DESC_HISTORY_BUFF_CNT CE_COUNT_MAX +#define IS_CE_DEBUG_ONLY_FOR_CE2_CE3 FALSE #else -static inline bool hif_ce_debug_only_enable_ce2_ce3(void) -{ - return true; -} +#define CE_DESC_HISTORY_BUFF_CNT 2 +#define IS_CE_DEBUG_ONLY_FOR_CE2_CE3 TRUE #endif +struct hif_ce_desc_event + hif_ce_desc_history_buff[CE_DESC_HISTORY_BUFF_CNT][HIF_CE_HISTORY_MAX]; -QDF_STATUS hif_ce_debug_history_prealloc_deinit(void) +static struct hif_ce_desc_event * + hif_ce_debug_history_buf_get(unsigned int ce_id) { - int ce_id; - - for (ce_id = 0; ce_id < CE_COUNT_MAX; ce_id++) { - if (hif_ce_desc_history[ce_id]) { - qdf_mem_free(hif_ce_desc_history[ce_id]); - hif_ce_desc_history[ce_id] = NULL; - } - } - hif_debug("ce debug memory freed"); - - return QDF_STATUS_SUCCESS; -} - -QDF_STATUS hif_ce_debug_history_prealloc_init(void) -{ - int ce_id; - - hif_debug("alloc ce debug memory, only_ce2/ce3 %d", - hif_ce_debug_only_enable_ce2_ce3()); - for (ce_id = 0; ce_id < CE_COUNT_MAX; ce_id++) { - if (hif_ce_debug_only_enable_ce2_ce3() && - ce_id != CE_ID_2 && - ce_id != CE_ID_3) { - hif_ce_desc_history[ce_id] = NULL; - continue; - } - + hif_debug("get ce debug buffer ce_id %u, only_ce2/ce3=%d", + ce_id, IS_CE_DEBUG_ONLY_FOR_CE2_CE3); + if (IS_CE_DEBUG_ONLY_FOR_CE2_CE3 && + (ce_id == CE_ID_2 || ce_id == CE_ID_3)) { hif_ce_desc_history[ce_id] = - qdf_mem_malloc(HIF_CE_HISTORY_MAX * - sizeof(struct hif_ce_desc_event)); - if (!hif_ce_desc_history[ce_id]) { - hif_ce_debug_history_prealloc_deinit(); - return QDF_STATUS_E_NOMEM; - } + hif_ce_desc_history_buff[ce_id - CE_ID_2]; + } else { + hif_ce_desc_history[ce_id] = + hif_ce_desc_history_buff[ce_id]; } - return QDF_STATUS_SUCCESS; + return hif_ce_desc_history[ce_id]; } /** @@ -1534,7 +1504,8 @@ alloc_mem_ce_debug_history(struct hif_softc *scn, unsigned int ce_id, struct ce_desc_hist *ce_hist = &scn->hif_ce_desc_hist; QDF_STATUS status = QDF_STATUS_SUCCESS; - if (hif_ce_debug_only_enable_ce2_ce3() && + /* For perf build, return directly for non ce2/ce3 */ + if (IS_CE_DEBUG_ONLY_FOR_CE2_CE3 && ce_id != CE_ID_2 && ce_id != CE_ID_3) { ce_hist->enable[ce_id] = false; @@ -1542,11 +1513,7 @@ alloc_mem_ce_debug_history(struct hif_softc *scn, unsigned int ce_id, return QDF_STATUS_SUCCESS; } - if (!hif_ce_desc_history[ce_id]) { - hif_err("prealloc memory failed"); - return QDF_STATUS_E_NOMEM; - } - ce_hist->hist_ev[ce_id] = hif_ce_desc_history[ce_id]; + ce_hist->hist_ev[ce_id] = hif_ce_debug_history_buf_get(ce_id); ce_hist->enable[ce_id] = true; if (src_nentries) {