diff options
author | Dennis Jeon <dennis.jeon@broadcom.corp-partner.google.com> | 2023-08-02 16:15:42 +0900 |
---|---|---|
committer | Isaac Chiou <isaacchiou@google.com> | 2023-08-14 03:09:03 +0000 |
commit | b8a46242258f452067c741c7b5ef286f5102993f (patch) | |
tree | 4af8d2b32884075821b3d11226dc19f69e55bf84 | |
parent | 66376a2fe0bfa55c10ebaa8f76e512a797c3aad0 (diff) | |
download | bcm4389-b8a46242258f452067c741c7b5ef286f5102993f.tar.gz |
bcmdhd: Fixed not to collect coredump for host wake assrt too long HC traps
Bug: 268578193
Test: Verified on simulated env by adding 10s delay in wlan_oob_irq
Change-Id: I788604b54ab7057f6f095e940ae7ec9c28335554
Signed-off-by: Dennis Jeon <dennis.jeon@broadcom.corp-partner.google.com>
-rw-r--r-- | Kbuild | 2 | ||||
-rw-r--r-- | dhd.h | 1 | ||||
-rw-r--r-- | dhd_linux.c | 37 |
3 files changed, 33 insertions, 7 deletions
@@ -302,6 +302,8 @@ else DHDCFLAGS += -DDHD_FILE_DUMP_EVENT # The debug dump file path is blank in DHD, it is defined in HAL. DHDCFLAGS += -DDHD_COMMON_DUMP_PATH="\"/\"" +# Skip coredump for certain health check traps +DHDCFLAGS += -DDHD_SKIP_COREDUMP_ON_HC endif DHDCFLAGS := $(filter-out -DDHD_DUMP_FILE_WRITE_FROM_KERNEL ,$(DHDCFLAGS)) endif @@ -3897,6 +3897,7 @@ extern int dhd_coredump_mempool_init(dhd_pub_t *dhd); extern void dhd_coredump_mempool_deinit(dhd_pub_t *dhd); #define DHD_COREDUMP_MEMPOOL_INIT(dhdp) dhd_coredump_mempool_init(dhdp) #define DHD_COREDUMP_MEMPOOL_DEINIT(dhdp) dhd_coredump_mempool_deinit(dhdp) +#define DHD_COREDUMP_IGNORE_TRAP_SIG "host_wake_asserted_for_too_long" #else #define DHD_COREDUMP_MEMPOOL_INIT(dhdp) do { /* noop */ } while (0) #define DHD_COREDUMP_MEMPOOL_DEINIT(dhdp) do { /* noop */ } while (0) diff --git a/dhd_linux.c b/dhd_linux.c index 94b853d..665eeb5 100644 --- a/dhd_linux.c +++ b/dhd_linux.c @@ -19043,6 +19043,20 @@ char map_path[PATH_MAX] = VENDOR_PATH CONFIG_BCMDHD_MAP_PATH; extern int dhd_collect_coredump(dhd_pub_t *dhdp, dhd_dump_t *dump); #endif /* DHD_COREDUMP */ +#ifdef DHD_SSSR_COREDUMP +static bool +dhd_is_coredump_reqd(char *trapstr, uint str_len) +{ +#ifdef DHD_SKIP_COREDUMP_ON_HC + if (trapstr && str_len && + strnstr(trapstr, DHD_COREDUMP_IGNORE_TRAP_SIG, str_len)) { + return FALSE; + } +#endif /* DHD_SKIP_COREDUMP_ON_HC */ + return TRUE; +} +#endif /* DHD_SSSR_COREDUMP */ + static void dhd_mem_dump(void *handle, void *event_info, u8 event) { @@ -19064,6 +19078,7 @@ dhd_mem_dump(void *handle, void *event_info, u8 event) char pc_fn[DHD_FUNC_STR_LEN] = "\0"; char lr_fn[DHD_FUNC_STR_LEN] = "\0"; trap_t *tr; + bool collect_coredump = FALSE; #endif /* DHD_COREDUMP */ uint32 memdump_type; @@ -19191,19 +19206,27 @@ dhd_mem_dump(void *handle, void *event_info, u8 event) DHD_ERROR(("%s: dump reason: %s\n", __FUNCTION__, dhdp->memdump_str)); #ifdef DHD_SSSR_COREDUMP - ret = dhd_collect_coredump(dhdp, dump); - if (ret == BCME_ERROR) { - DHD_ERROR(("%s: dhd_collect_coredump() failed.\n", __FUNCTION__)); - goto exit; - } else if (ret == BCME_UNSUPPORTED) { - DHD_LOG_MEM(("%s: Unable to collect SSSR dumps. Skip it.\n", + if (dhd_is_coredump_reqd(dhdp->memdump_str, + strnlen(dhdp->memdump_str, DHD_MEMDUMP_LONGSTR_LEN))) { + ret = dhd_collect_coredump(dhdp, dump); + if (ret == BCME_ERROR) { + DHD_ERROR(("%s: dhd_collect_coredump() failed.\n", + __FUNCTION__)); + goto exit; + } else if (ret == BCME_UNSUPPORTED) { + DHD_LOG_MEM(("%s: Unable to collect SSSR dumps. Skip it.\n", + __FUNCTION__)); + } + collect_coredump = TRUE; + } else { + DHD_PRINT(("%s: coredump not collected, dhd_is_coredump_reqd returns false\n", __FUNCTION__)); } #endif /* DHD_SSSR_COREDUMP */ if (memdump_type == DUMP_TYPE_BY_SYSDUMP) { DHD_LOG_MEM(("%s: coredump is not supported for BY_SYSDUMP/non trap cases\n", __FUNCTION__)); - } else { + } else if (collect_coredump) { DHD_ERROR(("%s: writing SoC_RAM dump\n", __FUNCTION__)); if (wifi_platform_set_coredump(dhd->adapter, dump->buf, dump->bufsize, dhdp->memdump_str)) { |