From 5ae88f4cdd393df19980e7efcf6dbdb0568fee36 Mon Sep 17 00:00:00 2001
From: Purnendu Kapadia
Date: Tue, 23 Apr 2019 10:53:18 +0100
Subject: [PATCH] [RAMEN9610-14887][common][9610] wlbt: complete fw_panic_done
only on fw_panic
We want to prevent fw_panic_done completion happening in case of non
fw_panic SABLE trigger. Introduce response codes corresponding to each
situation based on if it is fw_panic or other trigger from wlbtd and
check for specific condition before completing individual completion.
This change is dependent upon corresponding wlbtd v3.1 which is providing
appropriate response_codes.
SCSC-Bug-Id: SSB-51921
Change-Id: Ia11bd8d8abc370f615222a3ce768b749ac876008
Signed-off-by: Purnendu Kapadia
---
drivers/misc/samsung/scsc/scsc_wlbtd.c | 105 ++++++++++++++++++++-----
drivers/misc/samsung/scsc/scsc_wlbtd.h | 24 ++++++
2 files changed, 111 insertions(+), 18 deletions(-)
diff --git a/drivers/misc/samsung/scsc/scsc_wlbtd.c b/drivers/misc/samsung/scsc/scsc_wlbtd.c
index 1c7fdcfb67b8..123735158b4f 100755
--- a/drivers/misc/samsung/scsc/scsc_wlbtd.c
+++ b/drivers/misc/samsung/scsc/scsc_wlbtd.c
@@ -23,6 +23,45 @@ static struct wake_lock wlbtd_wakelock;
/* module parameter controlling recovery handling */
extern int disable_recovery_handling;
+const char *response_code_to_str(int response_code)
+{
+ switch (response_code) {
+ case SCSC_WLBTD_ERR_PARSE_FAILED:
+ return "SCSC_WLBTD_ERR_PARSE_FAILED";
+ case SCSC_WLBTD_FW_PANIC_TAR_GENERATED:
+ return "SCSC_WLBTD_FW_PANIC_TAR_GENERATED";
+ case SCSC_WLBTD_FW_PANIC_ERR_SCRIPT_FILE_NOT_FOUND:
+ return "SCSC_WLBTD_FW_PANIC_ERR_SCRIPT_FILE_NOT_FOUND";
+ case SCSC_WLBTD_FW_PANIC_ERR_NO_DEV:
+ return "SCSC_WLBTD_FW_PANIC_ERR_NO_DEV";
+ case SCSC_WLBTD_FW_PANIC_ERR_MMAP:
+ return "SCSC_WLBTD_FW_PANIC_ERR_MMAP";
+ case SCSC_WLBTD_FW_PANIC_ERR_SABLE_FILE:
+ return "SCSC_WLBTD_FW_PANIC_ERR_SABLE_FILE";
+ case SCSC_WLBTD_FW_PANIC_ERR_TAR:
+ return "SCSC_WLBTD_FW_PANIC_ERR_TAR";
+ case SCSC_WLBTD_OTHER_SBL_GENERATED:
+ return "SCSC_WLBTD_OTHER_SBL_GENERATED";
+ case SCSC_WLBTD_OTHER_TAR_GENERATED:
+ return "SCSC_WLBTD_OTHER_TAR_GENERATED";
+ case SCSC_WLBTD_OTHER_ERR_SCRIPT_FILE_NOT_FOUND:
+ return "SCSC_WLBTD_OTHER_ERR_SCRIPT_FILE_NOT_FOUND";
+ case SCSC_WLBTD_OTHER_ERR_NO_DEV:
+ return "SCSC_WLBTD_OTHER_ERR_NO_DEV";
+ case SCSC_WLBTD_OTHER_ERR_MMAP:
+ return "SCSC_WLBTD_OTHER_ERR_MMAP";
+ case SCSC_WLBTD_OTHER_ERR_SABLE_FILE:
+ return "SCSC_WLBTD_OTHER_ERR_SABLE_FILE";
+ case SCSC_WLBTD_OTHER_ERR_TAR:
+ return "SCSC_WLBTD_OTHER_ERR_TAR";
+ case SCSC_WLBTD_OTHER_IGNORE_TRIGGER:
+ return "SCSC_WLBTD_OTHER_IGNORE_TRIGGER";
+ default:
+ SCSC_TAG_ERR(WLBTD, "UNKNOWN response_code %d", response_code);
+ return "UNKNOWN response_code";
+ }
+}
+
/**
* This callback runs whenever the socket receives messages.
*/
@@ -55,8 +94,7 @@ static int msg_from_wlbtd_sable_cb(struct sk_buff *skb, struct genl_info *info)
if (info->attrs[2]) {
status = nla_get_u16(info->attrs[2]);
- if (status)
- SCSC_TAG_ERR(WLBTD, "%u\n", status);
+ SCSC_TAG_ERR(WLBTD, "%s\n", response_code_to_str(status));
}
if (disable_recovery_handling == MEMDUMP_FILE_FOR_RECOVERY) {
@@ -69,40 +107,71 @@ static int msg_from_wlbtd_sable_cb(struct sk_buff *skb, struct genl_info *info)
}
/* completion cases :
- * 1) for trigger scsc_log_fw_panic only one response from wlbtd when tar done
+ * 1) FW_PANIC_TAR_GENERATED
+ * for trigger scsc_log_fw_panic only one response from wlbtd when
+ * tar done
* ---> complete fw_panic_done
* 2) for all other triggers, we get 2 responses
- * a) Once .sbl is written
+ * a) OTHER_SBL_GENERATED
+ * Once .sbl is written
* ---> complete event_done
- * b) 2nd time when sable tar is done
- * ignore this response and Don't complete
- * 3) When we get rapid requests for SABLE generation,
+ * b) OTHER_TAR_GENERATED
+ * 2nd time when sable tar is done
+ * IGNORE this response and Don't complete
+ * 3) OTHER_IGNORE_TRIGGER
+ * When we get rapid requests for SABLE generation,
* to serialise while processing current request,
* we ignore requests other than "fw_panic" in wlbtd and
* send a msg "ignoring" back to kernel.
* ---> complete event_done
- * 4) when something failed, file not found
+ * 4) FW_PANIC_ERR_* and OTHER_ERR_*
+ * when something failed, file not found, mmap failed, etc.
+ * ---> complete the completion with waiter(s) based on if it was
+ * a fw_panic trigger or other trigger
+ * 5) ERR_PARSE_FAILED
+ * When msg parsing fails, wlbtd doesn't know the trigger type
* ---> complete the completion with waiter(s)
*/
- if ((strstr(data, "scsc_log_fw_panic") != NULL) ||
- (strstr(data, "not found.") != NULL) ||
- (strstr(data, "failed"))) {
+ switch (status) {
+ case SCSC_WLBTD_ERR_PARSE_FAILED:
if (!completion_done(&fw_panic_done)) {
SCSC_TAG_INFO(WLBTD, "completing fw_panic_done\n");
complete(&fw_panic_done);
- return 0;
}
- }
-
- if ((strstr(data, ".sbl") != NULL) ||
- (strstr(data, "ignoring") != NULL) ||
- (strstr(data, "not found.") != NULL) ||
- (strstr(data, "failed"))) {
if (!completion_done(&event_done)) {
SCSC_TAG_INFO(WLBTD, "completing event_done\n");
complete(&event_done);
}
+ break;
+ case SCSC_WLBTD_FW_PANIC_TAR_GENERATED:
+ case SCSC_WLBTD_FW_PANIC_ERR_TAR:
+ case SCSC_WLBTD_FW_PANIC_ERR_SCRIPT_FILE_NOT_FOUND:
+ case SCSC_WLBTD_FW_PANIC_ERR_NO_DEV:
+ case SCSC_WLBTD_FW_PANIC_ERR_MMAP:
+ case SCSC_WLBTD_FW_PANIC_ERR_SABLE_FILE:
+ if (!completion_done(&fw_panic_done)) {
+ SCSC_TAG_INFO(WLBTD, "completing fw_panic_done\n");
+ complete(&fw_panic_done);
+ }
+ break;
+ case SCSC_WLBTD_OTHER_TAR_GENERATED:
+ /* ignore */
+ break;
+ case SCSC_WLBTD_OTHER_SBL_GENERATED:
+ case SCSC_WLBTD_OTHER_ERR_TAR:
+ case SCSC_WLBTD_OTHER_ERR_SCRIPT_FILE_NOT_FOUND:
+ case SCSC_WLBTD_OTHER_ERR_NO_DEV:
+ case SCSC_WLBTD_OTHER_ERR_MMAP:
+ case SCSC_WLBTD_OTHER_ERR_SABLE_FILE:
+ case SCSC_WLBTD_OTHER_IGNORE_TRIGGER:
+ if (!completion_done(&event_done)) {
+ SCSC_TAG_INFO(WLBTD, "completing event_done\n");
+ complete(&event_done);
+ }
+ break;
+ default:
+ SCSC_TAG_ERR(WLBTD, "UNKNOWN reponse from WLBTD\n");
}
return 0;
diff --git a/drivers/misc/samsung/scsc/scsc_wlbtd.h b/drivers/misc/samsung/scsc/scsc_wlbtd.h
index 12cb8aff7b45..41d972b480d4 100644
--- a/drivers/misc/samsung/scsc/scsc_wlbtd.h
+++ b/drivers/misc/samsung/scsc/scsc_wlbtd.h
@@ -47,6 +47,30 @@ enum events {
__EVENT_MAX,
};
+enum scsc_wlbtd_response_codes {
+ /* NOTE: keep the enum in sync with userspace wlbtd */
+ /* parse failed */
+ SCSC_WLBTD_ERR_PARSE_FAILED,
+
+ /* fw_panic trigger */
+ SCSC_WLBTD_FW_PANIC_TAR_GENERATED,
+ SCSC_WLBTD_FW_PANIC_ERR_SCRIPT_FILE_NOT_FOUND,
+ SCSC_WLBTD_FW_PANIC_ERR_NO_DEV,
+ SCSC_WLBTD_FW_PANIC_ERR_MMAP,
+ SCSC_WLBTD_FW_PANIC_ERR_SABLE_FILE,
+ SCSC_WLBTD_FW_PANIC_ERR_TAR,
+
+ /* other triggers */
+ SCSC_WLBTD_OTHER_SBL_GENERATED,
+ SCSC_WLBTD_OTHER_TAR_GENERATED,
+ SCSC_WLBTD_OTHER_ERR_SCRIPT_FILE_NOT_FOUND,
+ SCSC_WLBTD_OTHER_ERR_NO_DEV,
+ SCSC_WLBTD_OTHER_ERR_MMAP,
+ SCSC_WLBTD_OTHER_ERR_SABLE_FILE,
+ SCSC_WLBTD_OTHER_ERR_TAR,
+ SCSC_WLBTD_OTHER_IGNORE_TRIGGER,
+};
+
static const struct genl_multicast_group scsc_mcgrp[] = {
{ .name = "scsc_mdp_grp", },
};
--
2.20.1