2019-02-20 22:05:48 +00:00
|
|
|
From 4ab2cf03da91785f2c34d79a302e53da06928bc1 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Arend van Spriel <arend.vanspriel@broadcom.com>
|
|
|
|
Date: Thu, 14 Feb 2019 13:43:51 +0100
|
|
|
|
Subject: [PATCH] brcmfmac: check and dump trap info during sdio probe
|
|
|
|
|
|
|
|
When the firmware crashes during the probe sequence we provide little
|
|
|
|
information on what really failed. This patch checks the sdpcm shared
|
|
|
|
location and show the trap information if a firmware trap has happened.
|
|
|
|
|
|
|
|
Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
|
|
|
|
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
|
|
|
|
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
|
|
|
|
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
|
|
|
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
|
|
|
---
|
|
|
|
.../broadcom/brcm80211/brcmfmac/sdio.c | 59 +++++++++++++------
|
|
|
|
1 file changed, 40 insertions(+), 19 deletions(-)
|
|
|
|
|
|
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
|
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
2019-07-06 22:08:20 +00:00
|
|
|
@@ -3010,21 +3010,35 @@ static int brcmf_sdio_trap_info(struct s
|
2019-02-20 22:05:48 +00:00
|
|
|
if (error < 0)
|
|
|
|
return error;
|
|
|
|
|
|
|
|
- seq_printf(seq,
|
|
|
|
- "dongle trap info: type 0x%x @ epc 0x%08x\n"
|
|
|
|
- " cpsr 0x%08x spsr 0x%08x sp 0x%08x\n"
|
|
|
|
- " lr 0x%08x pc 0x%08x offset 0x%x\n"
|
|
|
|
- " r0 0x%08x r1 0x%08x r2 0x%08x r3 0x%08x\n"
|
|
|
|
- " r4 0x%08x r5 0x%08x r6 0x%08x r7 0x%08x\n",
|
|
|
|
- le32_to_cpu(tr.type), le32_to_cpu(tr.epc),
|
|
|
|
- le32_to_cpu(tr.cpsr), le32_to_cpu(tr.spsr),
|
|
|
|
- le32_to_cpu(tr.r13), le32_to_cpu(tr.r14),
|
|
|
|
- le32_to_cpu(tr.pc), sh->trap_addr,
|
|
|
|
- le32_to_cpu(tr.r0), le32_to_cpu(tr.r1),
|
|
|
|
- le32_to_cpu(tr.r2), le32_to_cpu(tr.r3),
|
|
|
|
- le32_to_cpu(tr.r4), le32_to_cpu(tr.r5),
|
|
|
|
- le32_to_cpu(tr.r6), le32_to_cpu(tr.r7));
|
|
|
|
-
|
|
|
|
+ if (seq)
|
|
|
|
+ seq_printf(seq,
|
|
|
|
+ "dongle trap info: type 0x%x @ epc 0x%08x\n"
|
|
|
|
+ " cpsr 0x%08x spsr 0x%08x sp 0x%08x\n"
|
|
|
|
+ " lr 0x%08x pc 0x%08x offset 0x%x\n"
|
|
|
|
+ " r0 0x%08x r1 0x%08x r2 0x%08x r3 0x%08x\n"
|
|
|
|
+ " r4 0x%08x r5 0x%08x r6 0x%08x r7 0x%08x\n",
|
|
|
|
+ le32_to_cpu(tr.type), le32_to_cpu(tr.epc),
|
|
|
|
+ le32_to_cpu(tr.cpsr), le32_to_cpu(tr.spsr),
|
|
|
|
+ le32_to_cpu(tr.r13), le32_to_cpu(tr.r14),
|
|
|
|
+ le32_to_cpu(tr.pc), sh->trap_addr,
|
|
|
|
+ le32_to_cpu(tr.r0), le32_to_cpu(tr.r1),
|
|
|
|
+ le32_to_cpu(tr.r2), le32_to_cpu(tr.r3),
|
|
|
|
+ le32_to_cpu(tr.r4), le32_to_cpu(tr.r5),
|
|
|
|
+ le32_to_cpu(tr.r6), le32_to_cpu(tr.r7));
|
|
|
|
+ else
|
|
|
|
+ pr_debug("dongle trap info: type 0x%x @ epc 0x%08x\n"
|
|
|
|
+ " cpsr 0x%08x spsr 0x%08x sp 0x%08x\n"
|
|
|
|
+ " lr 0x%08x pc 0x%08x offset 0x%x\n"
|
|
|
|
+ " r0 0x%08x r1 0x%08x r2 0x%08x r3 0x%08x\n"
|
|
|
|
+ " r4 0x%08x r5 0x%08x r6 0x%08x r7 0x%08x\n",
|
|
|
|
+ le32_to_cpu(tr.type), le32_to_cpu(tr.epc),
|
|
|
|
+ le32_to_cpu(tr.cpsr), le32_to_cpu(tr.spsr),
|
|
|
|
+ le32_to_cpu(tr.r13), le32_to_cpu(tr.r14),
|
|
|
|
+ le32_to_cpu(tr.pc), sh->trap_addr,
|
|
|
|
+ le32_to_cpu(tr.r0), le32_to_cpu(tr.r1),
|
|
|
|
+ le32_to_cpu(tr.r2), le32_to_cpu(tr.r3),
|
|
|
|
+ le32_to_cpu(tr.r4), le32_to_cpu(tr.r5),
|
|
|
|
+ le32_to_cpu(tr.r6), le32_to_cpu(tr.r7));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2019-07-06 22:08:20 +00:00
|
|
|
@@ -3078,8 +3092,10 @@ static int brcmf_sdio_checkdied(struct b
|
2019-02-20 22:05:48 +00:00
|
|
|
else if (sh.flags & SDPCM_SHARED_ASSERT)
|
|
|
|
brcmf_err("assertion in dongle\n");
|
|
|
|
|
|
|
|
- if (sh.flags & SDPCM_SHARED_TRAP)
|
|
|
|
+ if (sh.flags & SDPCM_SHARED_TRAP) {
|
|
|
|
brcmf_err("firmware trap in dongle\n");
|
|
|
|
+ brcmf_sdio_trap_info(NULL, bus, &sh);
|
|
|
|
+ }
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2019-07-06 22:08:20 +00:00
|
|
|
@@ -4210,7 +4226,7 @@ static void brcmf_sdio_firmware_callback
|
2019-02-20 22:05:48 +00:00
|
|
|
} else {
|
|
|
|
/* Disable F2 again */
|
|
|
|
sdio_disable_func(sdiod->func2);
|
|
|
|
- goto release;
|
|
|
|
+ goto checkdied;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (brcmf_chip_sr_capable(bus->ci)) {
|
2019-07-06 22:08:20 +00:00
|
|
|
@@ -4231,8 +4247,10 @@ static void brcmf_sdio_firmware_callback
|
2019-02-20 22:05:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* If we didn't come up, turn off backplane clock */
|
|
|
|
- if (err != 0)
|
|
|
|
+ if (err != 0) {
|
|
|
|
brcmf_sdio_clkctl(bus, CLK_NONE, false);
|
|
|
|
+ goto checkdied;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
sdio_release_host(sdiod->func1);
|
|
|
|
|
2019-07-06 22:08:20 +00:00
|
|
|
@@ -4246,12 +4264,15 @@ static void brcmf_sdio_firmware_callback
|
2019-02-20 22:05:48 +00:00
|
|
|
err = brcmf_attach(sdiod->dev, sdiod->settings);
|
|
|
|
if (err != 0) {
|
|
|
|
brcmf_err("brcmf_attach failed\n");
|
|
|
|
- goto fail;
|
|
|
|
+ sdio_claim_host(sdiod->func1);
|
|
|
|
+ goto checkdied;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ready */
|
|
|
|
return;
|
|
|
|
|
|
|
|
+checkdied:
|
|
|
|
+ brcmf_sdio_checkdied(bus);
|
|
|
|
release:
|
|
|
|
sdio_release_host(sdiod->func1);
|
|
|
|
fail:
|