summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDennis Jeon <dennis.jeon@broadcom.corp-partner.google.com>2023-08-02 16:15:42 +0900
committerIsaac Chiou <isaacchiou@google.com>2023-08-14 03:09:03 +0000
commitb8a46242258f452067c741c7b5ef286f5102993f (patch)
tree4af8d2b32884075821b3d11226dc19f69e55bf84
parent66376a2fe0bfa55c10ebaa8f76e512a797c3aad0 (diff)
downloadbcm4389-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--Kbuild2
-rw-r--r--dhd.h1
-rw-r--r--dhd_linux.c37
3 files changed, 33 insertions, 7 deletions
diff --git a/Kbuild b/Kbuild
index 7399f0b..c36f095 100644
--- a/Kbuild
+++ b/Kbuild
@@ -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
diff --git a/dhd.h b/dhd.h
index 663c4f5..f71e4ca 100644
--- a/dhd.h
+++ b/dhd.h
@@ -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)) {