From patchwork Mon May 9 23:11:03 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Greear X-Patchwork-Id: 9051481 X-Patchwork-Delegate: kvalo@adurom.com Return-Path: X-Original-To: patchwork-linux-wireless@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 121A2BF440 for ; Mon, 9 May 2016 23:11:48 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 1C62220114 for ; Mon, 9 May 2016 23:11:47 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1570720123 for ; Mon, 9 May 2016 23:11:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753569AbcEIXLn (ORCPT ); Mon, 9 May 2016 19:11:43 -0400 Received: from mail2.candelatech.com ([208.74.158.173]:49986 "EHLO mail2.candelatech.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753410AbcEIXL1 (ORCPT ); Mon, 9 May 2016 19:11:27 -0400 Received: from ben-dt3.candelatech.com (firewall.candelatech.com [50.251.239.81]) by mail2.candelatech.com (Postfix) with ESMTP id 70E3040BAEF; Mon, 9 May 2016 16:11:26 -0700 (PDT) From: greearb@candelatech.com To: ath10k@lists.infradead.org Cc: linux-wireless@vger.kernel.org, Ben Greear Subject: [PATCH 09/21] ath10k: print fw debug messages in hex. Date: Mon, 9 May 2016 16:11:03 -0700 Message-Id: <1462835475-11079-10-git-send-email-greearb@candelatech.com> X-Mailer: git-send-email 2.4.3 In-Reply-To: <1462835475-11079-1-git-send-email-greearb@candelatech.com> References: <1462835475-11079-1-git-send-email-greearb@candelatech.com> Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org X-Spam-Status: No, score=-9.0 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Ben Greear This allows user-space tools to decode debug-log messages by parsing dmesg or /var/log/messages. Signed-off-by: Ben Greear --- drivers/net/wireless/ath/ath10k/debug.c | 72 +++++++++++++++++++++++++++++++++ drivers/net/wireless/ath/ath10k/debug.h | 5 +++ drivers/net/wireless/ath/ath10k/pci.c | 3 ++ drivers/net/wireless/ath/ath10k/wmi.c | 12 ++++++ 4 files changed, 92 insertions(+) diff --git a/drivers/net/wireless/ath/ath10k/debug.c b/drivers/net/wireless/ath/ath10k/debug.c index 28e0c05..c38862b 100644 --- a/drivers/net/wireless/ath/ath10k/debug.c +++ b/drivers/net/wireless/ath/ath10k/debug.c @@ -2660,3 +2660,75 @@ void ath10k_dbg_dump(struct ath10k *ar, EXPORT_SYMBOL(ath10k_dbg_dump); #endif /* CONFIG_ATH10K_DEBUG */ + +void ath10k_dbg_print_fw_dbg_buffer(struct ath10k *ar, __le32 *ibuf, int len, + const char* lvl) +{ + /* Print out raw hex, external tools can decode if + * they care. + * TODO: Add ar identifier to messages. + */ + int q = 0; + + dev_printk(lvl, ar->dev, "ath10k_pci ATH10K_DBG_BUFFER:\n"); + while (q < len) { + if (q + 8 <= len) { + printk("%sath10k: [%04d]: %08X %08X %08X %08X %08X %08X %08X %08X\n", + lvl, q, + ibuf[q], ibuf[q+1], ibuf[q+2], ibuf[q+3], + ibuf[q+4], ibuf[q+5], ibuf[q+6], ibuf[q+7]); + q += 8; + } + else if (q + 7 <= len) { + printk("%sath10k: [%04d]: %08X %08X %08X %08X %08X %08X %08X\n", + lvl, q, + ibuf[q], ibuf[q+1], ibuf[q+2], ibuf[q+3], + ibuf[q+4], ibuf[q+5], ibuf[q+6]); + q += 7; + } + else if (q + 6 <= len) { + printk("%sath10k: [%04d]: %08X %08X %08X %08X %08X %08X\n", + lvl, q, + ibuf[q], ibuf[q+1], ibuf[q+2], ibuf[q+3], + ibuf[q+4], ibuf[q+5]); + q += 6; + } + else if (q + 5 <= len) { + printk("%sath10k: [%04d]: %08X %08X %08X %08X %08X\n", + lvl, q, + ibuf[q], ibuf[q+1], ibuf[q+2], ibuf[q+3], + ibuf[q+4]); + q += 5; + } + else if (q + 4 <= len) { + printk("%sath10k: [%04d]: %08X %08X %08X %08X\n", + lvl, q, + ibuf[q], ibuf[q+1], ibuf[q+2], ibuf[q+3]); + q += 4; + } + else if (q + 3 <= len) { + printk("%sath10k: [%04d]: %08X %08X %08X\n", + lvl, q, + ibuf[q], ibuf[q+1], ibuf[q+2]); + q += 3; + } + else if (q + 2 <= len) { + printk("%sath10k: [%04d]: %08X %08X\n", + lvl, q, + ibuf[q], ibuf[q+1]); + q += 2; + } + else if (q + 1 <= len) { + printk("%sath10k: [%04d]: %08X\n", + lvl, q, + ibuf[q]); + q += 1; + } + else { + break; + } + }/* while */ + + dev_printk(lvl, ar->dev, "ATH10K_END\n"); +} +EXPORT_SYMBOL(ath10k_dbg_print_fw_dbg_buffer); diff --git a/drivers/net/wireless/ath/ath10k/debug.h b/drivers/net/wireless/ath/ath10k/debug.h index 613ad7e..6356dce 100644 --- a/drivers/net/wireless/ath/ath10k/debug.h +++ b/drivers/net/wireless/ath/ath10k/debug.h @@ -38,6 +38,7 @@ enum ath10k_debug_mask { ATH10K_DBG_WMI_PRINT = 0x00002000, ATH10K_DBG_PCI_PS = 0x00004000, ATH10K_DBG_AHB = 0x00008000, + ATH10K_DBG_FW = 0x80000000, ATH10K_DBG_ANY = 0xffffffff, }; @@ -193,4 +194,8 @@ static inline void ath10k_dbg_dump(struct ath10k *ar, { } #endif /* CONFIG_ATH10K_DEBUG */ + +void ath10k_dbg_print_fw_dbg_buffer(struct ath10k *ar, __le32 *buffer, + int len, const char* lvl); + #endif /* _DEBUG_H_ */ diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c index e6315ec..dbf0db8 100644 --- a/drivers/net/wireless/ath/ath10k/pci.c +++ b/drivers/net/wireless/ath/ath10k/pci.c @@ -1623,6 +1623,9 @@ static void ath10k_pci_dump_dbglog(struct ath10k *ar) WARN_ON(len & 0x3); ath10k_dbg_save_fw_dbg_buffer(ar, (__le32 *)(buffer), len >> 2); + ath10k_dbg_print_fw_dbg_buffer(ar, (__le32 *)(buffer), + dbuf.length/sizeof(__le32), + KERN_ERR); kfree(buffer); next: diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c index d9e4b77..6cfba41 100644 --- a/drivers/net/wireless/ath/ath10k/wmi.c +++ b/drivers/net/wireless/ath/ath10k/wmi.c @@ -2510,6 +2510,18 @@ int ath10k_wmi_event_debug_mesg(struct ath10k *ar, struct sk_buff *skb) (skb->len - 4)/sizeof(__le32)); spin_unlock_bh(&ar->data_lock); + if (ev->dropped_count) + ath10k_warn(ar, "WARNING: Dropped dbglog buffers: %d\n", __le32_to_cpu(ev->dropped_count)); + + if (ath10k_debug_mask & ATH10K_DBG_FW) + ath10k_dbg_print_fw_dbg_buffer(ar, ev->messages, + (skb->len - 4)/sizeof(__le32), + KERN_INFO); + else + ath10k_dbg_print_fw_dbg_buffer(ar, ev->messages, + (skb->len - 4)/sizeof(__le32), + KERN_DEBUG); + return 0; }