Search Linux Wireless

Re: brcmfmac with BCM4359 on arm64 (RK3399) and SDIO

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 10/12/2018 10:59 AM, Christoph Müllner wrote:


On 10/12/18 10:00 AM, Arend van Spriel wrote:
On 10/11/2018 6:04 PM, Christoph Müllner wrote:
Hi Franky and Arend,

today I could get a SDIO Wifi module, which includes a BCM43455.
I was able to get this up and running without any issues with the
brcmfmac
driver and a 4.19 kernel. For me that's enough evidence to say that
the SDIO
driver works.

However, the BCM4359 still does not work.
It times out in brcmf_sdio_firmware_callback(), while enabling func2.

I've inserted tons of debug log outputs in both, the DHD driver and the
brcmfmac driver, and compared them. Differences which I've found so far
are: a) brcmfmac strips out whitespaces from nvram contents and
b) DHD downloads firmware first and brcmfmac downloads nvram first.
I've adapted the DHD driver to behave like brcmfmac in both cases
and it still works.

I've increased the timeout for enabling func2 from 3 seconds to 10
seconds,
but that did not help.

Any ideas left?

When enabling func2 fails it generally means the firmware crashed. I am
not sure if the patch below works to get console information. It might
show up empty or simply fail if firmware did not fill shared memory
info, but it may be worth a try.

I added the patch and additionally added debug output for all error
cases in the two called functions. Here's the output:

[   14.746092] brcmfmac: brcmf_sdio_firmware_callback: enable F2: err=-62
[   14.767523] brcmfmac: brcmf_sdio_checkdied: firmware not built with
-assert
[   14.778777] brcmfmac: brcmf_sdio_checkdied: firmware trap in dongle
[   14.789220] brcmfmac: brcmf_sdio_readconsole: brcmf_sdio_readconsole:
bus->console_addr == 0!

Do you have an educated guess, what causes the firmware crash, when
being loaded via the brcmfmac driver?

Maybe we can find out with the patch below.

Regards,
Arend

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/ne
index b2e1ab5..b1a4631 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
@@ -2969,21 +2969,35 @@ static int brcmf_sdio_trap_info(struct seq_file *seq, str
        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;
 }

@@ -3037,8 +3051,10 @@ static int brcmf_sdio_checkdied(struct brcmf_sdio *bus)
        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;
 }




[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux