Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752448AbbKIHk0 (ORCPT ); Mon, 9 Nov 2015 02:40:26 -0500 Received: from mga11.intel.com ([192.55.52.93]:61059 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751025AbbKIHkV (ORCPT ); Mon, 9 Nov 2015 02:40:21 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.20,265,1444719600"; d="scan'208";a="845880466" From: Lu Baolu To: Mathias Nyman , Greg Kroah-Hartman , Alan Stern Cc: linux-usb@vger.kernel.org, x86@kernel.org, linux-kernel@vger.kernel.org, Lu Baolu Subject: [PATCH v3 05/12] usb: xhci: dbc: add debug buffer Date: Mon, 9 Nov 2015 15:38:34 +0800 Message-Id: <1447054721-7390-6-git-send-email-baolu.lu@linux.intel.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1447054721-7390-1-git-send-email-baolu.lu@linux.intel.com> References: <1447054721-7390-1-git-send-email-baolu.lu@linux.intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2901 Lines: 106 "printk" is not suitable for dbc debugging especially when console is in usage. This patch adds a debug buffer in dbc driver and puts the debug messages in this local buffer. The debug buffer could be dumped whenever the console is not in use. This part of code will not be visible unless DBC_DEBUG is defined. Signed-off-by: Lu Baolu --- drivers/usb/early/xhci-dbc.c | 62 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/drivers/usb/early/xhci-dbc.c b/drivers/usb/early/xhci-dbc.c index 6b23f09..b36a527 100644 --- a/drivers/usb/early/xhci-dbc.c +++ b/drivers/usb/early/xhci-dbc.c @@ -32,8 +32,64 @@ static struct xdbc_state xdbc_stat; static struct xdbc_state *xdbcp = &xdbc_stat; #ifdef DBC_DEBUG -/* place holder */ -#define xdbc_trace printk +#define XDBC_DEBUG_BUF_SIZE (PAGE_SIZE * 32) +#define MSG_MAX_LINE 128 +static char xdbc_debug_buf[XDBC_DEBUG_BUF_SIZE]; +static void xdbc_trace(const char *fmt, ...) +{ + int i, size; + va_list args; + static int pos; + char temp_buf[MSG_MAX_LINE]; + + if (pos >= XDBC_DEBUG_BUF_SIZE - 1) + return; + + memset(temp_buf, 0, MSG_MAX_LINE); + va_start(args, fmt); + vsnprintf(temp_buf, MSG_MAX_LINE - 1, fmt, args); + va_end(args); + + i = 0; + size = strlen(temp_buf); + while (i < size) { + xdbc_debug_buf[pos] = temp_buf[i]; + pos++; + i++; + + if (pos >= XDBC_DEBUG_BUF_SIZE - 1) + break; + } +} + +static void xdbc_dump_debug_buffer(void) +{ + int index = 0; + int count = 0; + char dump_buf[MSG_MAX_LINE]; + + xdbc_trace("The end of DbC trace buffer\n"); + pr_notice("DBC debug buffer:\n"); + memset(dump_buf, 0, MSG_MAX_LINE); + + while (index < XDBC_DEBUG_BUF_SIZE) { + if (!xdbc_debug_buf[index]) + break; + + if (xdbc_debug_buf[index] == '\n' || + count >= MSG_MAX_LINE - 1) { + pr_notice("DBC: @%08x %s\n", index, dump_buf); + memset(dump_buf, 0, MSG_MAX_LINE); + count = 0; + } else { + dump_buf[count] = xdbc_debug_buf[index]; + count++; + } + + index++; + } +} + static void xdbc_dbg_dump_regs(char *str) { if (!xdbcp->xdbc_reg) { @@ -165,6 +221,7 @@ static void xdbc_dbg_dump_data(char *str) #else static inline void xdbc_trace(const char *fmt, ...) { } +static inline void xdbc_dump_debug_buffer(void) { } static inline void xdbc_dbg_dump_regs(char *str) { } static inline void xdbc_dbg_dump_data(char *str) { } #endif /* DBC_DEBUG */ @@ -832,6 +889,7 @@ int __init early_xdbc_init(char *s) pr_notice("failed to setup xHCI DbC connection\n"); xdbcp->xhci_base = NULL; xdbcp->xdbc_reg = NULL; + xdbc_dump_debug_buffer(); return ret; } -- 2.1.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/