diff options
Diffstat (limited to 'lwis_debug.c')
-rw-r--r-- | lwis_debug.c | 63 |
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 |