summaryrefslogtreecommitdiff
path: root/lwis_debug.c
diff options
context:
space:
mode:
Diffstat (limited to 'lwis_debug.c')
-rw-r--r--lwis_debug.c63
1 files changed, 30 insertions, 33 deletions
diff --git a/lwis_debug.c b/lwis_debug.c
index 8e5927e..f3f9501 100644
--- a/lwis_debug.c
+++ b/lwis_debug.c
@@ -23,7 +23,7 @@
#define PRINT_BUFFER_SIZE 128
/* Printing the log buffer line by line as printk does not work well with large chunks of data */
-static void print_to_log(char *buffer)
+static void print_to_log(struct lwis_device *lwis_dev, char *buffer)
{
int size;
char tmpbuf[PRINT_BUFFER_SIZE + 1];
@@ -36,7 +36,7 @@ static void print_to_log(char *buffer)
}
memcpy(tmpbuf, start, size);
tmpbuf[size] = '\0';
- pr_info("%s", tmpbuf);
+ dev_info(lwis_dev->dev, "%s", tmpbuf);
start = end + 1;
end = strchr(start, '\n');
}
@@ -200,18 +200,10 @@ static int generate_event_states_info(struct lwis_device *lwis_dev, char *buffer
return -EINVAL;
}
+ scnprintf(buffer, buffer_size, "=== LWIS EVENT STATES INFO: %s ===\n", lwis_dev->name);
if (lwis_event_dump_cnt >= 0 && lwis_event_dump_cnt <= EVENT_DEBUG_HISTORY_SIZE) {
- scnprintf(tmp_buf, sizeof(tmp_buf), "=== LWIS DUMP LAST %d Received Events ===\n",
- lwis_event_dump_cnt);
- strlcat(buffer, tmp_buf, buffer_size);
traverse_last_events_size = lwis_event_dump_cnt;
- } else if (lwis_event_dump_cnt > EVENT_DEBUG_HISTORY_SIZE) {
- pr_err("lwis_event_dump_cnt (%d) exceed EVENT_DEBUG_HISTORY_SIZE (%d) \n",
- lwis_event_dump_cnt, EVENT_DEBUG_HISTORY_SIZE);
- return -EINVAL;
} else {
- scnprintf(buffer, buffer_size, "=== LWIS EVENT STATES INFO: %s ===\n",
- lwis_dev->name);
traverse_last_events_size = EVENT_DEBUG_HISTORY_SIZE;
}
@@ -220,9 +212,9 @@ static int generate_event_states_info(struct lwis_device *lwis_dev, char *buffer
strlcat(buffer, " No events being monitored\n", buffer_size);
goto exit;
}
- strlcat(buffer, "Enabled Device Events:\n", buffer_size);
+ strlcat(buffer, "Event Counts:\n", buffer_size);
hash_for_each (lwis_dev->event_states, i, state, node) {
- if (state->enable_counter > 0) {
+ if (state->event_counter > 0) {
scnprintf(tmp_buf, sizeof(tmp_buf), "[%2d] ID: 0x%llx Counter: 0x%llx\n",
idx++, state->event_id, state->event_counter);
strlcat(buffer, tmp_buf, buffer_size);
@@ -230,19 +222,15 @@ static int generate_event_states_info(struct lwis_device *lwis_dev, char *buffer
}
}
if (!enabled_event_present) {
- strlcat(buffer, "No enabled events\n", buffer_size);
- }
- if (lwis_event_dump_cnt < 0) {
- strlcat(buffer, "Last Events:\n", buffer_size);
+ strlcat(buffer, " No enabled events\n", buffer_size);
}
+ strlcat(buffer, "Last Events:\n", buffer_size);
idx = lwis_dev->debug_info.cur_event_hist_idx;
for (i = 0; i < traverse_last_events_size; ++i) {
- if (lwis_event_dump_cnt >= 0) {
- if (idx == 0) {
- idx = EVENT_DEBUG_HISTORY_SIZE;
- }
- idx--;
+ idx--;
+ if (idx < 0) {
+ idx = EVENT_DEBUG_HISTORY_SIZE - 1;
}
state = &lwis_dev->debug_info.event_hist[idx].state;
/* Skip uninitialized entries */
@@ -253,12 +241,6 @@ static int generate_event_states_info(struct lwis_device *lwis_dev, char *buffer
lwis_dev->debug_info.event_hist[idx].timestamp);
strlcat(buffer, tmp_buf, buffer_size);
}
- if (lwis_event_dump_cnt < 0) {
- idx++;
- if (idx >= EVENT_DEBUG_HISTORY_SIZE) {
- idx = 0;
- }
- }
}
exit:
@@ -415,7 +397,7 @@ int lwis_debug_print_register_io_history(struct lwis_device *lwis_dev)
dev_err(lwis_dev->dev, "Failed to generate register io history");
goto exit;
}
- print_to_log(buffer);
+ print_to_log(lwis_dev, buffer);
exit:
kfree(buffer);
@@ -434,7 +416,7 @@ int lwis_debug_print_device_info(struct lwis_device *lwis_dev)
dev_err(lwis_dev->dev, "Failed to generate device info");
return ret;
}
- print_to_log(buffer);
+ print_to_log(lwis_dev, buffer);
return 0;
}
@@ -454,7 +436,7 @@ int lwis_debug_print_event_states_info(struct lwis_device *lwis_dev, int lwis_ev
dev_err(lwis_dev->dev, "Failed to generate event states info");
goto exit;
}
- print_to_log(buffer);
+ print_to_log(lwis_dev, buffer);
exit:
kfree(buffer);
return ret;
@@ -476,7 +458,7 @@ int lwis_debug_print_transaction_info(struct lwis_device *lwis_dev)
dev_err(lwis_dev->dev, "Failed to generate transaction info");
goto exit;
}
- print_to_log(buffer);
+ print_to_log(lwis_dev, buffer);
exit:
kfree(buffer);
return ret;
@@ -498,12 +480,27 @@ int lwis_debug_print_buffer_info(struct lwis_device *lwis_dev)
dev_err(lwis_dev->dev, "Failed to generate buffer info");
goto exit;
}
- print_to_log(buffer);
+ print_to_log(lwis_dev, buffer);
exit:
kfree(buffer);
return ret;
}
+void lwis_debug_crash_info_dump(struct lwis_device *lwis_dev)
+{
+ const int event_dump_count = 5;
+
+ /* State dump is only meaningful for I2C and IOREG devices */
+ if (lwis_dev->type != DEVICE_TYPE_I2C && lwis_dev->type != DEVICE_TYPE_IOREG) {
+ return;
+ }
+
+ dev_info(lwis_dev->dev, "LWIS Device (%s) Crash Info Dump:\n", lwis_dev->name);
+
+ /* Dump event states and last 5 received events */
+ lwis_debug_print_event_states_info(lwis_dev, event_dump_count);
+}
+
/* DebugFS specific functions */
#ifdef CONFIG_DEBUG_FS