diff --git a/hif/src/ce/ce_internal.h b/hif/src/ce/ce_internal.h index fccd347c8115..0dac6c326e7e 100644 --- a/hif/src/ce/ce_internal.h +++ b/hif/src/ce/ce_internal.h @@ -554,8 +554,8 @@ int hif_get_wake_ce_id(struct hif_softc *scn, uint8_t *ce_id); * @descriptor: descriptor enqueued or dequeued * @memory: virtual address that was used * @index: location of the descriptor in the ce ring; - * @data: data pointed by descriptor * @actual_data_len: length of the data + * @data: data pointed by descriptor */ struct hif_ce_desc_event { int index; @@ -570,8 +570,8 @@ struct hif_ce_desc_event { #endif void *memory; #ifdef HIF_CE_DEBUG_DATA_BUF - uint8_t *data; size_t actual_data_len; + uint8_t *data; #endif /* HIF_CE_DEBUG_DATA_BUF */ #ifdef HIF_CONFIG_SLUB_DEBUG_ON @@ -634,6 +634,16 @@ void hif_record_ce_srng_desc_event(struct hif_softc *scn, int ce_id, * Return: */ void hif_ce_desc_data_record(struct hif_ce_desc_event *event, int len); + +/** + * hif_clear_ce_desc_debug_data() - Clear the contents of hif_ce_desc_event + * upto data field before reusing it. + * + * @event: record every CE event + * + * Return: None + */ +void hif_clear_ce_desc_debug_data(struct hif_ce_desc_event *event); QDF_STATUS alloc_mem_ce_debug_hist_data(struct hif_softc *scn, uint32_t ce_id); void free_mem_ce_debug_hist_data(struct hif_softc *scn, uint32_t ce_id); #else @@ -650,6 +660,8 @@ static inline void hif_ce_desc_data_record(struct hif_ce_desc_event *event, int len) { } + +void hif_clear_ce_desc_debug_data(struct hif_ce_desc_event *event); #endif /*HIF_CE_DEBUG_DATA_BUF*/ #ifdef HIF_CONFIG_SLUB_DEBUG_ON diff --git a/hif/src/ce/ce_main.c b/hif/src/ce/ce_main.c index 54b8252b6f94..c3ac8e9856e2 100644 --- a/hif/src/ce/ce_main.c +++ b/hif/src/ce/ce_main.c @@ -1274,8 +1274,10 @@ QDF_STATUS alloc_mem_ce_debug_hist_data(struct hif_softc *scn, uint32_t ce_id) event = &hist_ev[index]; event->data = (uint8_t *)qdf_mem_malloc(CE_DEBUG_MAX_DATA_BUF_SIZE); - if (!event->data) + if (!event->data) { + hif_err_rl("ce debug data alloc failed"); return QDF_STATUS_E_NOMEM; + } } return QDF_STATUS_SUCCESS; } @@ -1307,6 +1309,7 @@ void free_mem_ce_debug_hist_data(struct hif_softc *scn, uint32_t ce_id) event->data = NULL; event = NULL; } + } #endif /* HIF_CE_DEBUG_DATA_BUF */ @@ -1350,11 +1353,11 @@ static void free_mem_ce_debug_history(struct hif_softc *scn, unsigned int ce_id) struct ce_desc_hist *ce_hist = &scn->hif_ce_desc_hist; ce_hist->enable[ce_id] = 0; - ce_hist->hist_ev[ce_id] = NULL; if (ce_hist->data_enable[ce_id]) { ce_hist->data_enable[ce_id] = false; free_mem_ce_debug_hist_data(scn, ce_id); } + ce_hist->hist_ev[ce_id] = NULL; } #else static inline QDF_STATUS diff --git a/hif/src/ce/ce_service.c b/hif/src/ce/ce_service.c index fc4988e6d17e..47365394b58b 100644 --- a/hif/src/ce/ce_service.c +++ b/hif/src/ce/ce_service.c @@ -111,7 +111,7 @@ void hif_ce_desc_data_record(struct hif_ce_desc_event *event, int len) uint8_t *data = NULL; if (!event->data) { - hif_err("No memory allocated"); + hif_err_rl("No ce debug memory allocated"); return; } @@ -128,6 +128,17 @@ void hif_ce_desc_data_record(struct hif_ce_desc_event *event, int len) event->actual_data_len = len; } } + +void hif_clear_ce_desc_debug_data(struct hif_ce_desc_event *event) +{ + qdf_mem_zero(event, + offsetof(struct hif_ce_desc_event, data)); +} +#else +void hif_clear_ce_desc_debug_data(struct hif_ce_desc_event *event) +{ + qdf_mem_zero(event, sizeof(struct hif_ce_desc_event)); +} #endif #if defined(HIF_CONFIG_SLUB_DEBUG_ON) && defined(HIF_RECORD_RX_PADDR) @@ -199,14 +210,14 @@ void hif_record_ce_desc_event(struct hif_softc *scn, int ce_id, event = &hist_ev[record_index]; - qdf_mem_zero(event, sizeof(struct hif_ce_desc_event)); + hif_clear_ce_desc_debug_data(event); event->type = type; event->time = qdf_get_log_timestamp(); if (descriptor) qdf_mem_copy(&event->descriptor, descriptor, - sizeof(union ce_desc)); + sizeof(union ce_srng_desc)); event->memory = memory; event->index = index; diff --git a/hif/src/ce/ce_service_srng.c b/hif/src/ce/ce_service_srng.c index 48646784203d..1e303c0e484b 100644 --- a/hif/src/ce/ce_service_srng.c +++ b/hif/src/ce/ce_service_srng.c @@ -108,7 +108,7 @@ void hif_record_ce_srng_desc_event(struct hif_softc *scn, int ce_id, event = &hist_ev[record_index]; - qdf_mem_zero(event, sizeof(struct hif_ce_desc_event)); + hif_clear_ce_desc_debug_data(event); event->type = type; event->time = qdf_get_log_timestamp();