aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/brcm/349-v5.1-0005-brcmfmac-check-and-dump-trap-info-during-sdio-probe.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/kernel/mac80211/patches/brcm/349-v5.1-0005-brcmfmac-check-and-dump-trap-info-during-sdio-probe.patch')
-rw-r--r--package/kernel/mac80211/patches/brcm/349-v5.1-0005-brcmfmac-check-and-dump-trap-info-during-sdio-probe.patch121
1 files changed, 121 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/brcm/349-v5.1-0005-brcmfmac-check-and-dump-trap-info-during-sdio-probe.patch b/package/kernel/mac80211/patches/brcm/349-v5.1-0005-brcmfmac-check-and-dump-trap-info-during-sdio-probe.patch
new file mode 100644
index 0000000000..dce4331585
--- /dev/null
+++ b/package/kernel/mac80211/patches/brcm/349-v5.1-0005-brcmfmac-check-and-dump-trap-info-during-sdio-probe.patch
@@ -0,0 +1,121 @@
+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
+@@ -2999,21 +2999,35 @@ static int brcmf_sdio_trap_info(struct s
+ 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;
+ }
+
+@@ -3067,8 +3081,10 @@ static int brcmf_sdio_checkdied(struct b
+ 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;
+ }
+@@ -4199,7 +4215,7 @@ static void brcmf_sdio_firmware_callback
+ } else {
+ /* Disable F2 again */
+ sdio_disable_func(sdiod->func2);
+- goto release;
++ goto checkdied;
+ }
+
+ if (brcmf_chip_sr_capable(bus->ci)) {
+@@ -4220,8 +4236,10 @@ static void brcmf_sdio_firmware_callback
+ }
+
+ /* 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);
+
+@@ -4235,12 +4253,15 @@ static void brcmf_sdio_firmware_callback
+ 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: