diff --git a/qdf/linux/src/i_qdf_trace.h b/qdf/linux/src/i_qdf_trace.h index 72130643d3..8536259de2 100644 --- a/qdf/linux/src/i_qdf_trace.h +++ b/qdf/linux/src/i_qdf_trace.h @@ -486,13 +486,50 @@ __qdf_minidump_remove(void *addr, size_t size, const char *name) minidump_remove_segments((const uintptr_t)addr); } #elif defined(WLAN_QCOM_MINIDUMP) +#define MAX_WLAN_MINIDUMP_ENTRIES 4 + +enum minidump_log_type { + MD_HTC_CREDIT = 0, + MD_WLAN_LOGS, + MD_WMI_TX_CMP, + MD_HAL_SOC, +}; + +static const char *minidump_table[MAX_WLAN_MINIDUMP_ENTRIES]; + +static int qdf_get_name_idx(const char *name) +{ + int i; + static const char * const wlan_str[] = { + [MD_HTC_CREDIT] = "htc_credit", + [MD_WLAN_LOGS] = "wlan_logs", + [MD_WMI_TX_CMP] = "wmi_tx_cmp", + [MD_HAL_SOC] = "hal_soc" + }; + + for (i = 0; i < ARRAY_SIZE(wlan_str); i++) { + if (strncmp(name, wlan_str[i], strlen(wlan_str[i])) == 0) + return i; + } + + return -EINVAL; +} + static inline void __qdf_minidump_log(void *start_addr, const size_t size, const char *name) { struct md_region md_entry; - int ret; + int ret, index; + index = qdf_get_name_idx(name); + if (index < 0) { + QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_QDF, + "%s: invalid entry %s\n", + __func__, name); + QDF_DEBUG_PANIC("Unknown minidump entry"); + return; + } snprintf(md_entry.name, sizeof(md_entry.name), name); md_entry.virt_addr = (uintptr_t)start_addr; md_entry.phys_addr = virt_to_phys(start_addr); @@ -502,6 +539,9 @@ __qdf_minidump_log(void *start_addr, const size_t size, QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_QDF, "%s: failed to log %pK (%s)\n", __func__, start_addr, name); + minidump_table[index] = NULL; + } else { + minidump_table[index] = name; } } @@ -510,12 +550,21 @@ __qdf_minidump_remove(void *start_addr, const size_t size, const char *name) { struct md_region md_entry; + int index; + index = qdf_get_name_idx(name); + if (index < 0 || !minidump_table[index]) { + QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_QDF, + "%s: entry was not added", + __func__); + return; + } snprintf(md_entry.name, sizeof(md_entry.name), name); md_entry.virt_addr = (uintptr_t)start_addr; md_entry.phys_addr = virt_to_phys(start_addr); md_entry.size = size; msm_minidump_remove_region(&md_entry); + minidump_table[qdf_get_name_idx(name)] = NULL; } #else static inline void