From patchwork Mon May 9 23:11:15 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Greear X-Patchwork-Id: 9051411 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 76035BF29F for ; Mon, 9 May 2016 23:11:37 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 7C5FE2012D for ; Mon, 9 May 2016 23:11:36 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 96DA520123 for ; Mon, 9 May 2016 23:11:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753528AbcEIXLc (ORCPT ); Mon, 9 May 2016 19:11:32 -0400 Received: from mail2.candelatech.com ([208.74.158.173]:49996 "EHLO mail2.candelatech.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753504AbcEIXL3 (ORCPT ); Mon, 9 May 2016 19:11:29 -0400 Received: from ben-dt3.candelatech.com (firewall.candelatech.com [50.251.239.81]) by mail2.candelatech.com (Postfix) with ESMTP id 5830340C28A; Mon, 9 May 2016 16:11:28 -0700 (PDT) From: greearb@candelatech.com To: ath10k@lists.infradead.org Cc: linux-wireless@vger.kernel.org, Ben Greear Subject: [PATCH 21/21] ath10k: Read dbglog buffers over register ping-pong. Date: Mon, 9 May 2016 16:11:15 -0700 Message-Id: <1462835475-11079-22-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 gives much better debugging capability when debugging crashes in the firmware that cause CE transport loss. (Such as AXI errors). Signed-off-by: Ben Greear --- drivers/net/wireless/ath/ath10k/pci.c | 47 ++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c index 330c150..4069e72 100644 --- a/drivers/net/wireless/ath/ath10k/pci.c +++ b/drivers/net/wireless/ath/ath10k/pci.c @@ -1532,7 +1532,7 @@ static int ath10k_ct_fw_crash_regs_harder(struct ath10k *ar, return -EBUSY; pingpong: - ath10k_warn(ar, "Trying to read crash dump over pingpong registers.\n"); + ath10k_warn(ar, "Trying to read crash dump over pingpong registers, len %d\n", len); /* Firmware is trying to send us info it seems. */ for (q = 0; q 1500) { + ath10k_err(ar, "dbuf length is greater than 1500: %d\n", len); + len = 1500; + } + if (ath10k_ct_fw_crash_regs_harder(ar, buffer, len/4)) + goto free_and_cont; + + ath10k_dbg_save_fw_dbg_buffer(ar, buffer, len/4); + ath10k_dbg_print_fw_dbg_buffer(ar, buffer, len/4, KERN_ERR); + + /* See if the second one is available */ + if (ath10k_ct_fw_crash_regs_harder(ar, (__le32 *)(&dbuf), sizeof(dbuf)/4)) + goto free_and_cont; + + len = le32_to_cpu(dbuf.length); + if (len > 1500) { + ath10k_err(ar, "dbuf[2] length is greater than 1500: %d\n", len); + len = 1500; + } + + if (ath10k_ct_fw_crash_regs_harder(ar, buffer, len/4)) + goto free_and_cont; + + ath10k_dbg_save_fw_dbg_buffer(ar, buffer, len/4); + ath10k_dbg_print_fw_dbg_buffer(ar, buffer, len/4, KERN_ERR); + + free_and_cont: + kfree(buffer); } BUILD_BUG_ON(REG_DUMP_COUNT_QCA988X % 4); @@ -1723,6 +1767,7 @@ static void ath10k_pci_fw_crashed_dump(struct ath10k *ar) spin_unlock_bh(&ar->data_lock); + /* ath10k_set_debug_mask(0); // stop more log spam */ queue_work(ar->workqueue, &ar->restart_work); }