From: greearb@candelatech.com To: ath10k@lists.infradead.org Cc: linux-wireless@vger.kernel.org, Ben Greear <greearb@candelatech.com> Subject: [PATCH 20/21] ath10k: read firmware crash over ioread32 if CE fails. Date: Mon, 9 May 2016 16:11:14 -0700 [thread overview] Message-ID: <1462835475-11079-21-git-send-email-greearb@candelatech.com> (raw) In-Reply-To: <1462835475-11079-1-git-send-email-greearb@candelatech.com> From: Ben Greear <greearb@candelatech.com> This might work around problem where sometimes host cannot access firmware crash over normal CE transport. Requires CT firmware with matching logic in it's assert handler (-13 and higher releases). Signed-off-by: Ben Greear <greearb@candelatech.com> --- drivers/net/wireless/ath/ath10k/hw.h | 5 ++++ drivers/net/wireless/ath/ath10k/pci.c | 56 ++++++++++++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/ath/ath10k/hw.h b/drivers/net/wireless/ath/ath10k/hw.h index d3f37d5..5ff1fac 100644 --- a/drivers/net/wireless/ath/ath10k/hw.h +++ b/drivers/net/wireless/ath/ath10k/hw.h @@ -603,6 +603,7 @@ enum ath10k_hw_4addr_pad { #define PCIE_INTR_ENABLE_ADDRESS 0x0008 #define PCIE_INTR_CAUSE_ADDRESS 0x000c #define PCIE_INTR_CLR_ADDRESS ar->regs->pcie_intr_clr_address +#define SCRATCH_2_ADDRESS 0x002c #define SCRATCH_3_ADDRESS ar->regs->scratch_3_address #define CPU_INTR_ADDRESS 0x0010 @@ -614,6 +615,10 @@ enum ath10k_hw_4addr_pad { #define FW_IND_INITIALIZED 2 #define FW_IND_HOST_READY 0x80000000 +/* CT firmware only */ +#define FW_IND_SCRATCH2_WR (1<<14) /* scratch2 has data written to it */ +#define FW_IND_SCRATCH2_RD (1<<15) /* scratch2 has been read (by host) */ + /* HOST_REG interrupt from firmware */ #define PCIE_INTR_FIRMWARE_MASK ar->regs->pcie_intr_fw_mask #define PCIE_INTR_CE_MASK_ALL ar->regs->pcie_intr_ce_mask_all diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c index 2adc459..330c150 100644 --- a/drivers/net/wireless/ath/ath10k/pci.c +++ b/drivers/net/wireless/ath/ath10k/pci.c @@ -1507,6 +1507,54 @@ static void ath10k_pci_dump_exc_stack(struct ath10k *ar, hi_err_stack); } +/* Only CT firmware can do this. Attempt to read crash dump over pci + * registers since normal CE transport is not working. + */ +static int ath10k_ct_fw_crash_regs_harder(struct ath10k *ar, + __le32 *reg_dump_values, + int len) +{ + u32 val; + int i; + int q; +#define MAX_SPIN_TRIES 1000000 + + if (!test_bit(ATH10K_FW_FEATURE_WMI_10X_CT, + ar->running_fw->fw_file.fw_features)) { + return -EINVAL; + } + + for (i = 0; i<MAX_SPIN_TRIES; i++) { + val = ath10k_pci_read32(ar, FW_INDICATOR_ADDRESS); + if (val & FW_IND_SCRATCH2_WR) + goto pingpong; + } + return -EBUSY; + +pingpong: + ath10k_warn(ar, "Trying to read crash dump over pingpong registers.\n"); + /* Firmware is trying to send us info it seems. */ + for (q = 0; q<len; q++) { + reg_dump_values[q] = ath10k_pci_read32(ar, SOC_CORE_BASE_ADDRESS + SCRATCH_2_ADDRESS); + val = ath10k_pci_read32(ar, FW_INDICATOR_ADDRESS); + val |= FW_IND_SCRATCH2_RD; /* tell firmware we read it */ + val &= ~FW_IND_SCRATCH2_WR; /* clear firmware's write flag */ + ath10k_pci_write32(ar, FW_INDICATOR_ADDRESS, val); + + for (i = 0; i<MAX_SPIN_TRIES; i++) { + val = ath10k_pci_read32(ar, FW_INDICATOR_ADDRESS); + if (val & FW_IND_SCRATCH2_WR) + break; + } + if (!(val & FW_IND_SCRATCH2_WR)) { + ath10k_err(ar, "failed to read reg %i via pingpong method.\n", + q); + return 0; // partial read is better than nothing I guess + } + } + return 0; +} + static void ath10k_pci_dump_registers(struct ath10k *ar, struct ath10k_fw_crash_data *crash_data) { @@ -1520,7 +1568,13 @@ static void ath10k_pci_dump_registers(struct ath10k *ar, REG_DUMP_COUNT_QCA988X * sizeof(__le32)); if (ret) { ath10k_err(ar, "failed to read firmware dump area: %d\n", ret); - return; + + /* Try to read this directly over registers...only works on new + * CT firmware. + */ + ret = ath10k_ct_fw_crash_regs_harder(ar, reg_dump_values, REG_DUMP_COUNT_QCA988X); + if (ret) + return; } BUILD_BUG_ON(REG_DUMP_COUNT_QCA988X % 4); -- 2.4.3
WARNING: multiple messages have this Message-ID (diff)
From: greearb@candelatech.com To: ath10k@lists.infradead.org Cc: Ben Greear <greearb@candelatech.com>, linux-wireless@vger.kernel.org Subject: [PATCH 20/21] ath10k: read firmware crash over ioread32 if CE fails. Date: Mon, 9 May 2016 16:11:14 -0700 [thread overview] Message-ID: <1462835475-11079-21-git-send-email-greearb@candelatech.com> (raw) In-Reply-To: <1462835475-11079-1-git-send-email-greearb@candelatech.com> From: Ben Greear <greearb@candelatech.com> This might work around problem where sometimes host cannot access firmware crash over normal CE transport. Requires CT firmware with matching logic in it's assert handler (-13 and higher releases). Signed-off-by: Ben Greear <greearb@candelatech.com> --- drivers/net/wireless/ath/ath10k/hw.h | 5 ++++ drivers/net/wireless/ath/ath10k/pci.c | 56 ++++++++++++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/ath/ath10k/hw.h b/drivers/net/wireless/ath/ath10k/hw.h index d3f37d5..5ff1fac 100644 --- a/drivers/net/wireless/ath/ath10k/hw.h +++ b/drivers/net/wireless/ath/ath10k/hw.h @@ -603,6 +603,7 @@ enum ath10k_hw_4addr_pad { #define PCIE_INTR_ENABLE_ADDRESS 0x0008 #define PCIE_INTR_CAUSE_ADDRESS 0x000c #define PCIE_INTR_CLR_ADDRESS ar->regs->pcie_intr_clr_address +#define SCRATCH_2_ADDRESS 0x002c #define SCRATCH_3_ADDRESS ar->regs->scratch_3_address #define CPU_INTR_ADDRESS 0x0010 @@ -614,6 +615,10 @@ enum ath10k_hw_4addr_pad { #define FW_IND_INITIALIZED 2 #define FW_IND_HOST_READY 0x80000000 +/* CT firmware only */ +#define FW_IND_SCRATCH2_WR (1<<14) /* scratch2 has data written to it */ +#define FW_IND_SCRATCH2_RD (1<<15) /* scratch2 has been read (by host) */ + /* HOST_REG interrupt from firmware */ #define PCIE_INTR_FIRMWARE_MASK ar->regs->pcie_intr_fw_mask #define PCIE_INTR_CE_MASK_ALL ar->regs->pcie_intr_ce_mask_all diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c index 2adc459..330c150 100644 --- a/drivers/net/wireless/ath/ath10k/pci.c +++ b/drivers/net/wireless/ath/ath10k/pci.c @@ -1507,6 +1507,54 @@ static void ath10k_pci_dump_exc_stack(struct ath10k *ar, hi_err_stack); } +/* Only CT firmware can do this. Attempt to read crash dump over pci + * registers since normal CE transport is not working. + */ +static int ath10k_ct_fw_crash_regs_harder(struct ath10k *ar, + __le32 *reg_dump_values, + int len) +{ + u32 val; + int i; + int q; +#define MAX_SPIN_TRIES 1000000 + + if (!test_bit(ATH10K_FW_FEATURE_WMI_10X_CT, + ar->running_fw->fw_file.fw_features)) { + return -EINVAL; + } + + for (i = 0; i<MAX_SPIN_TRIES; i++) { + val = ath10k_pci_read32(ar, FW_INDICATOR_ADDRESS); + if (val & FW_IND_SCRATCH2_WR) + goto pingpong; + } + return -EBUSY; + +pingpong: + ath10k_warn(ar, "Trying to read crash dump over pingpong registers.\n"); + /* Firmware is trying to send us info it seems. */ + for (q = 0; q<len; q++) { + reg_dump_values[q] = ath10k_pci_read32(ar, SOC_CORE_BASE_ADDRESS + SCRATCH_2_ADDRESS); + val = ath10k_pci_read32(ar, FW_INDICATOR_ADDRESS); + val |= FW_IND_SCRATCH2_RD; /* tell firmware we read it */ + val &= ~FW_IND_SCRATCH2_WR; /* clear firmware's write flag */ + ath10k_pci_write32(ar, FW_INDICATOR_ADDRESS, val); + + for (i = 0; i<MAX_SPIN_TRIES; i++) { + val = ath10k_pci_read32(ar, FW_INDICATOR_ADDRESS); + if (val & FW_IND_SCRATCH2_WR) + break; + } + if (!(val & FW_IND_SCRATCH2_WR)) { + ath10k_err(ar, "failed to read reg %i via pingpong method.\n", + q); + return 0; // partial read is better than nothing I guess + } + } + return 0; +} + static void ath10k_pci_dump_registers(struct ath10k *ar, struct ath10k_fw_crash_data *crash_data) { @@ -1520,7 +1568,13 @@ static void ath10k_pci_dump_registers(struct ath10k *ar, REG_DUMP_COUNT_QCA988X * sizeof(__le32)); if (ret) { ath10k_err(ar, "failed to read firmware dump area: %d\n", ret); - return; + + /* Try to read this directly over registers...only works on new + * CT firmware. + */ + ret = ath10k_ct_fw_crash_regs_harder(ar, reg_dump_values, REG_DUMP_COUNT_QCA988X); + if (ret) + return; } BUILD_BUG_ON(REG_DUMP_COUNT_QCA988X % 4); -- 2.4.3 _______________________________________________ ath10k mailing list ath10k@lists.infradead.org http://lists.infradead.org/mailman/listinfo/ath10k
next prev parent reply other threads:[~2016-05-09 23:11 UTC|newest] Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top 2016-05-09 23:10 [PATCH 00/21] ath10k patches, generic and CT firmware related greearb 2016-05-09 23:10 ` greearb 2016-05-09 23:10 ` [PATCH 01/21] ath10k: Fix crash related to printing features greearb 2016-05-09 23:10 ` greearb 2016-05-09 23:10 ` [PATCH 02/21] ath10k: fix typo in logging message greearb 2016-05-09 23:10 ` greearb 2016-05-09 23:10 ` [PATCH 03/21] ath10k: Support setting debug mask from driver code greearb 2016-05-09 23:10 ` greearb 2016-05-11 10:40 ` Michal Kazior 2016-05-11 10:40 ` Michal Kazior 2016-05-11 15:10 ` Ben Greear 2016-05-11 15:10 ` Ben Greear 2016-05-09 23:10 ` [PATCH 04/21] ath10k: rate-limit packet tx errors greearb 2016-05-09 23:10 ` greearb 2016-05-09 23:10 ` [PATCH 05/21] ath10k: save firmware debug log messages greearb 2016-05-09 23:10 ` greearb 2016-05-09 23:11 ` [PATCH 06/21] ath10k: save firmware stacks upon firmware crash greearb 2016-05-09 23:11 ` greearb 2016-05-09 23:11 ` [PATCH 07/21] ath10k: save firmware RAM and ROM BSS sections on crash greearb 2016-05-09 23:11 ` greearb 2016-05-09 23:11 ` [PATCH 08/21] ath10k: make firmware text debug messages more verbose greearb 2016-05-09 23:11 ` greearb 2016-05-09 23:11 ` [PATCH 09/21] ath10k: print fw debug messages in hex greearb 2016-05-09 23:11 ` greearb 2016-05-09 23:11 ` [PATCH 10/21] ath10k: support logging ath10k_info as KERN_DEBUG greearb 2016-05-09 23:11 ` greearb 2016-05-09 23:11 ` [PATCH 11/21] ath10k: add fw-powerup-fail to ethtool stats greearb 2016-05-09 23:11 ` greearb 2016-05-09 23:11 ` [PATCH 12/21] ath10k: Support up to 64 vdevs greearb 2016-05-09 23:11 ` greearb 2016-05-09 23:11 ` [PATCH 13/21] ath10k: Document cycle count related counters greearb 2016-05-09 23:11 ` greearb 2016-05-11 10:24 ` Michal Kazior 2016-05-11 10:24 ` Michal Kazior 2016-05-09 23:11 ` [PATCH 14/21] ath10k: Add tx/rx bytes, cycle counters to ethtool stats greearb 2016-05-09 23:11 ` greearb 2016-05-09 23:11 ` [PATCH 15/21] ath10k: support CT firmware flag greearb 2016-05-09 23:11 ` greearb 2016-05-10 7:20 ` Mohammed Shafi Shajakhan 2016-05-10 7:20 ` Mohammed Shafi Shajakhan 2016-05-10 14:52 ` Ben Greear 2016-05-10 14:52 ` Ben Greear 2016-05-09 23:11 ` [PATCH 16/21] ath10k: Support 32+ stations greearb 2016-05-09 23:11 ` greearb 2016-05-09 23:11 ` [PATCH 17/21] ath10k: Enable detecting failure to install key in firmware (CT) greearb 2016-05-09 23:11 ` greearb 2016-05-09 23:11 ` [PATCH 18/21] ath10k: Note limitation on beaconing vdevs greearb 2016-05-09 23:11 ` greearb 2016-05-09 23:11 ` [PATCH 19/21] ath10k: Enable adhoc mode for CT firmware greearb 2016-05-09 23:11 ` greearb 2016-05-09 23:11 ` greearb [this message] 2016-05-09 23:11 ` [PATCH 20/21] ath10k: read firmware crash over ioread32 if CE fails greearb 2016-05-09 23:11 ` [PATCH 21/21] ath10k: Read dbglog buffers over register ping-pong greearb 2016-05-09 23:11 ` greearb
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1462835475-11079-21-git-send-email-greearb@candelatech.com \ --to=greearb@candelatech.com \ --cc=ath10k@lists.infradead.org \ --cc=linux-wireless@vger.kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.