WIP SDIO works!
(Josh, check out line 7030 of cfg80211.c - this affects USB work too.)
* * Weirdness warning! * *
If you comment out "define PTHREAD_PRINTER" on sdio.c:3873, you get
[00017.665] 02952.05847> brcmfmac 0x41c8954f6000 (brcmf_sdio_wd_timer)(0): 'WD would be active, but state is 0'
[00017.665] 02952.03371> aml_sd_emmc_irq_thread: Got a spurious interrupt
[00017.734] 02319.02556> Waiting for GPIO Test Input Interrupt
...and I have no idea why. But in 10 trials each, it happens if
and only if that line is commented out.
To get the driver working, I completely disabled the interrupt
handling thread, and I'm polling for interrupts every 10 msec.
GPIO interrupt just doesn't work yet. Depending on which firmware
file I use, we either get one interrupt and then never again, or
we get constant interrupts although the chipset says there's no
interrupt condition. Penguin can't reproduce the constant-interrupts.
F2 transfers larger than 512 bytes fail. I worked around that in bcmsdh.c.
[00166.884] 02935.02981> brcmfmac main (brcmf_proto_bcdc_query_dcmd)(56): 'Enter, cmd 262 len 1546, ifidx 0'
[00166.894] 02935.05849> Request transfer size is greater than max transfer size
[00166.894] 02935.05849> aml_sd_emmc_request: Failed to setup data descriptors
[00166.894] 02935.05849> sdio: SDIO_IO_RW_DIRECT_EXTENDED failed, retcode = -2
[00166.894] 02935.05849> sdio_rw_data: Error reading data.func: 2 status: -2
[00166.894] 02935.05849> brcmfmac bwdg (brcmf_sdiod_transfer)(58): 'Why did this fail?? result -2'
Porting errors I've made (look out for similar ones):
- Not resetting a completion, causing it to fall through before it
was signaled the second time the code waits.
- Putting an extra & on a pointer (taking its address rather than
reading its data) - I've done this at least twice.
If you want to see what the firmware is doing,
brcmf_debug_check_console() may be useful with tonight's "debug"
firmware from Penguin (I'll send it via email). Also,
PTHREAD_PRINTER will dump all SDIO transactions after a
time delay (adjust the delay to something useful).
Test: All the following work:
wlan scan
wlan connect GoogleGuest-Legacy
ping google.com
curl www.google.com
Change-Id: I18c803dc48690633bcf9e1e925fad98a533a074b
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/BUILD.gn b/drivers/wlan/third_party/broadcom/brcmfmac/BUILD.gn
index 602ad25..1f6b266 100644
--- a/drivers/wlan/third_party/broadcom/brcmfmac/BUILD.gn
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/BUILD.gn
@@ -29,8 +29,6 @@
]
sources = [
- "sdio_test.c",
-
"bcdc.c",
"bcdc.h",
"bcmsdh.c",
@@ -66,6 +64,7 @@
"fwil_types.h",
"fwsignal.c",
"fwsignal.h",
+ "linuxisms.c",
"linuxisms.h",
"msgbuf.c",
"msgbuf.h",
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/bcdc.c b/drivers/wlan/third_party/broadcom/brcmfmac/bcdc.c
index 7873032..bfddabf 100644
--- a/drivers/wlan/third_party/broadcom/brcmfmac/bcdc.c
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/bcdc.c
@@ -92,6 +92,7 @@
* the BCDC header and packet data in the tx path.
*/
#define BRCMF_PROT_FW_SIGNAL_MAX_TXBYTES 12
+void brcmf_debug_check_console();
#define RETRIES 2 /* # of retries to retrieve matching dcmd response */
/* Must be atleast SDPCM_RESERVE
@@ -152,7 +153,7 @@
zx_status_t ret;
struct brcmf_bcdc* bcdc = (struct brcmf_bcdc*)drvr->proto->pd;
- //brcmf_dbg(BCDC, "Enter\n");
+ // brcmf_dbg(BCDC, "Enter\n");
len += sizeof(struct brcmf_proto_bcdc_dcmd);
do {
ret = brcmf_bus_rxctl(drvr->bus_if, (unsigned char*)&bcdc->msg, len, rxlen_out);
@@ -175,19 +176,27 @@
uint32_t id, flags;
brcmf_dbg(BCDC, "Enter, cmd %d len %d, ifidx %d\n", cmd, len, ifidx);
- PAUSE; brcmf_dbg(BCDC, "aaaEnter, cmd %d len %d, ifidx %d\n", cmd, len, ifidx);
+ //PAUSE; brcmf_dbg(BCDC, "aaaEnter, cmd %d len %d, ifidx %d\n", cmd, len, ifidx);
*fwerr = ZX_OK;
ret = brcmf_proto_bcdc_msg(drvr, ifidx, cmd, buf, len, false);
if (ret != ZX_OK) {
brcmf_err("brcmf_proto_bcdc_msg failed w/status %d\n", ret);
+ brcmf_debug_check_console();
goto done;
}
+ zx_nanosleep(zx_deadline_after(ZX_MSEC(2)));
+ // brcmf_dbg(TEMP, "2 msec after sending message...");
+ // brcmf_debug_check_console();
retry:
/* wait for interrupt and get first fragment */
ret = brcmf_proto_bcdc_cmplt(drvr, bcdc->reqid, len, &rxlen);
if (ret != ZX_OK) {
+ brcmf_dbg(TEMP, "Just got back from message cmplt, result %d", ret);
+ }
+ // brcmf_debug_check_console();
+ if (ret != ZX_OK) {
goto done;
}
@@ -235,16 +244,23 @@
int rxlen_out;
brcmf_dbg(BCDC, "Enter, cmd %d len %d ifidx %d\n", cmd, len, ifidx);
- brcmf_hexdump("set dcmd", buf, len);
+ //brcmf_hexdump("set dcmd", buf, len);
*fwerr = ZX_OK;
ret = brcmf_proto_bcdc_msg(drvr, ifidx, cmd, buf, len, true);
if (ret != ZX_OK) {
goto done;
}
+ zx_nanosleep(zx_deadline_after(ZX_MSEC(2)));
+ //brcmf_dbg(TEMP, "2 msec after sending message...");
+ // brcmf_debug_check_console();
ret = brcmf_proto_bcdc_cmplt(drvr, bcdc->reqid, len, &rxlen_out);
if (ret != ZX_OK) {
+ brcmf_dbg(TEMP, "Just got back from message cmplt, result %d", ret);
+ }
+ // brcmf_debug_check_console();
+ if (ret != ZX_OK) {
goto done;
}
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/bcmsdh.c b/drivers/wlan/third_party/broadcom/brcmfmac/bcmsdh.c
index 907a3e6..7084ce9 100644
--- a/drivers/wlan/third_party/broadcom/brcmfmac/bcmsdh.c
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/bcmsdh.c
@@ -20,6 +20,7 @@
#include <lib/sync/completion.h>
#include <zircon/status.h>
+#include <pthread.h>
#include <stdatomic.h>
#ifndef _ALL_SOURCE
#define _ALL_SOURCE // Enables thrd_create_with_name in <threads.h>.
@@ -72,22 +73,6 @@
return sum;
}
-extern thrd_t gl_interrupt_thread;
-static int brcmf_sdiod_oob_irqhandler(void* cookie) {
- struct brcmf_sdio_dev* sdiodev = cookie;
- zx_status_t status;
-
- gl_interrupt_thread = thrd_current();
- while ((status = zx_interrupt_wait(sdiodev->irq_handle, NULL)) == ZX_OK) {
- //brcmf_dbg(INTR, "OOB intr triggered\n");
-
- brcmf_sdio_isr(sdiodev->bus);
- }
-
- brcmf_err("ISR exiting with status %s\n", zx_status_get_string(status));
- return (int)status;
-}
-
static void brcmf_sdiod_ib_irqhandler(struct brcmf_sdio_dev* sdiodev) {
brcmf_dbg(INTR, "IB intr triggered\n");
@@ -96,7 +81,6 @@
/* dummy handler for SDIO function 2 interrupt */
static void brcmf_sdiod_dummy_irqhandler(struct brcmf_sdio_dev* sdiodev) {}
-bool gl_intr_print;
extern atomic_int dw_state;
extern atomic_int dw_count;
extern bool gl_print_sdio;
@@ -122,10 +106,10 @@
// thrd_success and maybe thrd_nomem. See zircon/third_party/ulib/musl/include/threads.h
ret = enable_irq_wake(sdiodev->irq_handle);
- brcmf_dbg(TEMP, "ddpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
+ //brcmf_dbg(TEMP, "ddpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
remember_sdio(15, 0xffff, 1, &ret, 4, 0);
- brcmf_dbg(SDIO, "4Enter, register OOB IRQ\n"); PAUSE; PAUSE;
- brcmf_dbg(TEMP, "edpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
+ //brcmf_dbg(SDIO, "4Enter, register OOB IRQ\n"); PAUSE; PAUSE;
+ //brcmf_dbg(TEMP, "edpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
remember_sdio(16, 0xffff, 1, &ret, 4, 0);
if (ret != ZX_OK) {
brcmf_err("enable_irq_wake failed %d\n", ret);
@@ -133,28 +117,30 @@
}
sdiodev->irq_wake = true;
+ sdio_claim_host(sdiodev->func1);
+
if (sdiodev->bus_if->chip == BRCM_CC_43362_CHIP_ID) {
- brcmf_dbg(SDIO, "5Enter, register OOB IRQ\n"); PAUSE; PAUSE;
+ ///brcmf_dbg(SDIO, "5Enter, register OOB IRQ\n"); PAUSE; PAUSE;
/* assign GPIO to SDIO core */
addr = CORE_CC_REG(SI_ENUM_BASE, gpiocontrol);
- brcmf_dbg(SDIO, "6Enter, register OOB IRQ\n"); PAUSE; PAUSE;
+ //brcmf_dbg(SDIO, "6Enter, register OOB IRQ\n"); PAUSE; PAUSE;
gpiocontrol = brcmf_sdiod_func1_rl(sdiodev, addr, &ret);
- brcmf_dbg(SDIO, "7Enter, register OOB IRQ\n"); PAUSE; PAUSE;
+ //brcmf_dbg(SDIO, "7Enter, register OOB IRQ\n"); PAUSE; PAUSE;
gpiocontrol |= 0x2;
brcmf_sdiod_func1_wl(sdiodev, addr, gpiocontrol, &ret);
brcmf_sdiod_func1_wb(sdiodev, SBSDIO_GPIO_SELECT, 0xf, &ret);
brcmf_sdiod_func1_wb(sdiodev, SBSDIO_GPIO_OUT, 0, &ret);
brcmf_sdiod_func1_wb(sdiodev, SBSDIO_GPIO_EN, 0x2, &ret);
- brcmf_dbg(SDIO, "8Enter, register OOB IRQ\n"); PAUSE; PAUSE;
+ //brcmf_dbg(SDIO, "8Enter, register OOB IRQ\n"); PAUSE; PAUSE;
}
- brcmf_dbg(SDIO, "9Enter, register OOB IRQ\n"); PAUSE; PAUSE;
+ //brcmf_dbg(SDIO, "9Enter, register OOB IRQ\n"); PAUSE; PAUSE;
/* must configure SDIO_CCCR_INT_ENABLE to enable irq */
- brcmf_dbg(TEMP, "fdpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
+ //brcmf_dbg(TEMP, "fdpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
remember_sdio(17, 0xffff, 1, &ret, 4, 0);
data = brcmf_sdiod_func0_rb(sdiodev, SDIO_CCCR_INT_ENABLE, &ret);
- brcmf_dbg(TEMP, "gdpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
+ //brcmf_dbg(TEMP, "gdpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
remember_sdio(18, 0xffff, 1, &ret, 4, 0);
data |= SDIO_CCCR_IEN_FUNC1 | SDIO_CCCR_IEN_FUNC2 | SDIO_CCCR_IEN_FUNC0;
brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_INT_ENABLE, data, &ret);
@@ -165,47 +151,52 @@
if (pdata->oob_irq_flags & IRQ_FLAG_LEVEL_HIGH) {
data |= SDIO_CCCR_BRCM_SEPINT_ACT_HI;
}
- gl_intr_print = true;
brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_BRCM_SEPINT, data, &ret);
- brcmf_dbg(SDIO, "aEnter, register OOB IRQ\n"); PAUSE; PAUSE;
+ //brcmf_dbg(SDIO, "aEnter, register OOB IRQ\n"); PAUSE; PAUSE;
sdio_get_oob_irq(&sdiodev->sdio_proto, &sdiodev->irq_handle);
PAUSE; PAUSE; brcmf_dbg(SDIO, "Did get OOB IRQ 100 msec ago");
- thrd_create_with_name(&sdiodev->isr_thread, brcmf_sdiod_oob_irqhandler, sdiodev,
- "brcmf-sdio-isr");
- remember_sdio(12, 0xffff, 1, &ret, 4, 0);
- brcmf_dbg(TEMP, "adpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
- brcmf_dbg(TEMP, "bdpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
- brcmf_dbg(SDIO, "2Enter, register OOB IRQ\n"); PAUSE; PAUSE;
- brcmf_dbg(TEMP, "cdpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
- thrd_detach(sdiodev->isr_thread);
- remember_sdio(13, 0xffff, 1, &ret, 4, 0);
- brcmf_dbg(SDIO, "3Enter, register OOB IRQ\n"); PAUSE; PAUSE;
- brcmf_dbg(TEMP, "ddpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
- remember_sdio(21, 0xffff, 1, &ret, 4, 0); PAUSE; PAUSE;
- brcmf_dbg(TEMP, "gdpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
- remember_sdio(22, 0xffff, 1, &ret, 4, 0); PAUSE; PAUSE;
- brcmf_dbg(TEMP, "hdpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
- remember_sdio(23, 0xffff, 1, &ret, 4, 0); PAUSE; PAUSE;
- brcmf_dbg(TEMP, "idpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
- remember_sdio(24, 0xffff, 1, &ret, 4, 0); PAUSE; PAUSE; PAUSE; PAUSE; PAUSE; PAUSE;
- brcmf_dbg(TEMP, "jdpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
- remember_sdio(25, 0xffff, 1, &ret, 4, 0);
- sdiodev->oob_irq_requested = true;
- remember_sdio(24, 0xffff, 1, &ret, 4, 0);
- brcmf_dbg(TEMP, "jdpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
- PAUSE; PAUSE;
- remember_sdio(24, 0xffff, 1, &ret, 4, 0);
- brcmf_dbg(TEMP, "jdpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
+ brcmf_dbg(TEMP, "* * * NOT starting oob_irqhandler! Depending on watchdog.* * *");
+ //thrd_create_with_name(&sdiodev->isr_thread, brcmf_sdio_oob_irqhandler, sdiodev,
+ // "brcmf-sdio-isr");
+ //thrd_detach(sdiodev->isr_thread);
+ //brcmf_dbg(TEMP, "adpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
+ //brcmf_dbg(TEMP, "bdpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
+ //brcmf_dbg(SDIO, "2Enter, register OOB IRQ\n"); PAUSE; PAUSE;
+ //brcmf_dbg(TEMP, "cdpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
+ remember_sdio(13, 0xffff, 1, &ret, 4, 0);
+ //brcmf_dbg(SDIO, "3Enter, register OOB IRQ\n"); PAUSE; PAUSE;
+ //brcmf_dbg(TEMP, "ddpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
+ //remember_sdio(21, 0xffff, 1, &ret, 4, 0); PAUSE; PAUSE;
+ //brcmf_dbg(TEMP, "gdpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
+ //remember_sdio(22, 0xffff, 1, &ret, 4, 0); PAUSE; PAUSE;
+ //brcmf_dbg(TEMP, "hdpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
+ //remember_sdio(23, 0xffff, 1, &ret, 4, 0); PAUSE; PAUSE;
+ //brcmf_dbg(TEMP, "idpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
+ //remember_sdio(24, 0xffff, 1, &ret, 4, 0); PAUSE; PAUSE; PAUSE; PAUSE; PAUSE; PAUSE;
+ //brcmf_dbg(TEMP, "jdpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
+ //remember_sdio(25, 0xffff, 1, &ret, 4, 0);
+ sdiodev->oob_irq_requested = true;
+ //remember_sdio(24, 0xffff, 1, &ret, 4, 0);
+ //brcmf_dbg(TEMP, "jdpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
+ //PAUSE; PAUSE;
+ //remember_sdio(24, 0xffff, 1, &ret, 4, 0);
+ //brcmf_dbg(TEMP, "jdpc state %d, times %d", atomic_load(&dw_state), atomic_load(&dw_count));
+
+ sdio_release_host(sdiodev->func1);
+
} else {
brcmf_dbg(SDIO, "Entering\n");
+ sdio_claim_host(sdiodev->func1);
+
sdio_enable_fn_intr(&sdiodev->sdio_proto, SDIO_FN_1);
(void)brcmf_sdiod_ib_irqhandler; // TODO(cphoenix): If we use these, plug them in later.
sdio_enable_fn_intr(&sdiodev->sdio_proto, SDIO_FN_2);
(void)brcmf_sdiod_dummy_irqhandler;
+ sdio_release_host(sdiodev->func1);
sdiodev->sd_irq_requested = true;
}
@@ -220,8 +211,10 @@
struct brcmfmac_sdio_pd* pdata;
pdata = &sdiodev->settings->bus.sdio;
+ sdio_claim_host(sdiodev->func1);
brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_BRCM_SEPINT, 0, NULL);
brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_INT_ENABLE, 0, NULL);
+ sdio_release_host(sdiodev->func1);
sdiodev->oob_irq_requested = false;
if (sdiodev->irq_wake) {
@@ -233,8 +226,10 @@
}
if (sdiodev->sd_irq_requested) {
+ sdio_claim_host(sdiodev->func1);
sdio_disable_fn_intr(&sdiodev->sdio_proto, SDIO_FN_2);
sdio_disable_fn_intr(&sdiodev->sdio_proto, SDIO_FN_1);
+ sdio_release_host(sdiodev->func1);
sdiodev->sd_irq_requested = false;
}
}
@@ -276,8 +271,11 @@
int dw_state;
uint32_t checksum;
thrd_t thread;
+ zx_time_t time;
} sdio_record_t;
-thrd_t gl_interrupt_thread, gl_main_thread, gl_worker_thread, gl_watchdog_thread;
+thrd_t gl_interrupt_thread, gl_main_thread, gl_worker_thread, gl_watchdog_thread,
+ gl_bus_watchdog_thread;
+extern thrd_t gl_workqueue_runner_thread;
static sdio_record_t sdio_records[SR_DATA_RECORD_COUNT];
@@ -291,15 +289,22 @@
} else if (rec->thread == gl_worker_thread) {
name = "work";
} else if (rec->thread == gl_watchdog_thread) {
- name = "watch";
+ name = "wdog";
+ } else if (rec->thread == gl_bus_watchdog_thread) {
+ name = "bwdg";
+ } else if (rec->thread == gl_workqueue_runner_thread) {
+ name = "wrun";
} else if (rec->thread == gl_main_thread) {
- name = "";
+ name = "main";
} else {
sprintf(namebuf, "%p", rec->thread);
name = namebuf;
}
- brcmf_dbg(TEMP, "sdio %d: F%d%s%d%s %x %lx (%x) %s %d", i, rec->func, rec->write ? "w" : "r",
- rec->size, rec->fifo ? "f" : "", rec->addr, *(uint64_t*)rec->data, rec->checksum, name,
+ int sec = rec->time / ZX_SEC(1);
+ int msec = (rec->time - ZX_SEC(sec)) / ZX_MSEC(1);
+ brcmf_dbg(TEMP, "sdio %d %d.%d %s: F%d%s%d%s %x %lx (%x) %d", i, sec, msec, name,
+ rec->func, rec->write ? "w" : "r",
+ rec->size, rec->fifo ? "f" : "", rec->addr, *(uint64_t*)rec->data, rec->checksum,
rec->dw_state);
}
bool gl_print_sdio;
@@ -318,9 +323,14 @@
rec->dw_state = atomic_load(&dw_state);
rec->checksum = checksum(data, size);
rec->thread = thrd_current();
+ rec->time = zx_deadline_after(0);
if (gl_print_sdio && rec->thread == gl_main_thread) {
pr(12345, rec);
}
+ if (func == 2) {
+ //pr(54321, rec);
+ //brcmf_hexdump("F2", data, size);
+ }
}
void psr() {
@@ -334,6 +344,38 @@
}
}
atomic_bool gl_writing_firmware;
+static zx_status_t brcmf_sdiod_transferfff(struct brcmf_sdio_dev* sdiodev, uint8_t func,
+ uint32_t addr, bool write, void* data, size_t size,
+ bool fifo) {
+ sdio_rw_txn_t txn;
+
+ txn.addr = addr;
+ txn.write = write;
+ txn.virt = data;
+ txn.data_size = size;
+ txn.incr = !fifo;
+ txn.fifo = fifo;
+ txn.use_dma = false; // TODO(cphoenix): Decide when to use DMA
+ txn.buf_offset = 0;
+ zx_status_t result;
+ atomic_store(&dw_state, 3513);
+ brcmf_dbg(TEMP, "sdio F%d%s%ld%s %x %lx %p", func, write ? "w" : "r",
+ size, fifo ? "f" : "", addr, *(uint64_t*)data, data);
+
+ result = sdio_do_rw_txn(&sdiodev->sdio_proto, func, &txn);
+ atomic_store(&dw_state, 3514);
+ if (result != ZX_OK) {
+ brcmf_dbg(TEMP, "Why did this fail?? result %d", result);
+ return result;
+ }
+ atomic_store(&dw_state, 3515);
+ atomic_store(&dw_state, 3516);
+
+ remember_sdio(func, addr, write, data, size, fifo);
+ atomic_store(&dw_state, 3517);
+
+ return result;
+}
static zx_status_t brcmf_sdiod_transfer(struct brcmf_sdio_dev* sdiodev, uint8_t func,
uint32_t addr, bool write, void* data, size_t size,
bool fifo) {
@@ -354,8 +396,7 @@
brcmf_dbg(TEMP, "Why did this fail?? result %d", result);
return result;
}
- if (!(addr == 0xd020 && *(uint32_t*)data == 0x80000000 && atomic_load(&dw_state) == 0) &&
- !atomic_load(&gl_writing_firmware)) {
+ if (!atomic_load(&gl_writing_firmware)) {
remember_sdio(func, addr, write, data, size, fifo);
}
return result;
@@ -475,6 +516,26 @@
return data;
}
+void brcmf_sdiod_func1_wlfff(struct brcmf_sdio_dev* sdiodev, uint32_t addr, uint32_t data,
+ zx_status_t* ret) {
+ zx_status_t retval;
+ atomic_store(&dw_state, 3411);
+
+ retval = brcmf_sdiod_set_backplane_window(sdiodev, addr);
+ atomic_store(&dw_state, 3412);
+ if (retval == ZX_OK) {
+ addr &= SBSDIO_SB_OFT_ADDR_MASK;
+ addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
+ atomic_store(&dw_state, 3413);
+ retval = brcmf_sdiod_transferfff(sdiodev, SDIO_FN_1, addr, true, &data, sizeof(data), false);
+ atomic_store(&dw_state, 3414);
+ }
+ if (ret) {
+ *ret = retval;
+ }
+ atomic_store(&dw_state, 3415);
+}
+
void brcmf_sdiod_func1_wl(struct brcmf_sdio_dev* sdiodev, uint32_t addr, uint32_t data,
zx_status_t* ret) {
zx_status_t retval;
@@ -490,19 +551,59 @@
}
}
+#define F2_XFER_SIZE 512
+
zx_status_t brcmf_sdiod_read(struct brcmf_sdio_dev* sdiodev, uint8_t func, uint32_t addr,
void* data, size_t size) {
- return brcmf_sdiod_transfer(sdiodev, func, addr, false, data, size, false);
+ zx_status_t err = ZX_OK;
+ while (func == 2 && size > F2_XFER_SIZE) {
+ err = brcmf_sdiod_transfer(sdiodev, func, addr, false, data, F2_XFER_SIZE, false);
+ if (err != ZX_OK) {
+ break;
+ }
+ data += F2_XFER_SIZE;
+ size -= F2_XFER_SIZE;
+ addr += F2_XFER_SIZE;
+ }
+ if (err == ZX_OK) {
+ err = brcmf_sdiod_transfer(sdiodev, func, addr, false, data, size, false);
+ }
+ return err;
}
zx_status_t brcmf_sdiod_write(struct brcmf_sdio_dev* sdiodev, uint8_t func, uint32_t addr,
void* data, size_t size) {
- return brcmf_sdiod_transfer(sdiodev, func, addr, true, data, size, false);
+ zx_status_t err = ZX_OK;
+ while (func == 2 && size > F2_XFER_SIZE) {
+ err = brcmf_sdiod_transfer(sdiodev, func, addr, true, data, F2_XFER_SIZE, false);
+ if (err != ZX_OK) {
+ break;
+ }
+ data += F2_XFER_SIZE;
+ size -= F2_XFER_SIZE;
+ addr += F2_XFER_SIZE;
+ }
+ if (err == ZX_OK) {
+ err = brcmf_sdiod_transfer(sdiodev, func, addr, true, data, size, false);
+ }
+ return err;
}
zx_status_t brcmf_sdiod_read_fifo(struct brcmf_sdio_dev* sdiodev, uint8_t func, uint32_t addr,
void* data, size_t size) {
- return brcmf_sdiod_transfer(sdiodev, func, addr, false, data, size, true);
+ zx_status_t err = ZX_OK;
+ while (func == 2 && size > F2_XFER_SIZE) {
+ err = brcmf_sdiod_transfer(sdiodev, func, addr, false, data, F2_XFER_SIZE, true);
+ if (err != ZX_OK) {
+ break;
+ }
+ data += F2_XFER_SIZE;
+ size -= F2_XFER_SIZE;
+ }
+ if (err == ZX_OK) {
+ err = brcmf_sdiod_transfer(sdiodev, func, addr, false, data, size, true);
+ }
+ return err;
}
static zx_status_t brcmf_sdiod_netbuf_read(struct brcmf_sdio_dev* sdiodev, uint32_t func,
@@ -537,7 +638,7 @@
static zx_status_t brcmf_sdiod_netbuf_write(struct brcmf_sdio_dev* sdiodev, uint32_t func,
uint32_t addr, struct brcmf_netbuf* netbuf) {
unsigned int req_sz;
- zx_status_t err;
+ zx_status_t err = ZX_OK;
/* Single netbuf use the standard mmc interface */
req_sz = netbuf->len + 3;
@@ -575,7 +676,7 @@
uint32_t addr = sdiodev->cc_core->base;
zx_status_t err = ZX_OK;
- brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", addr, pkt->len);
+ // THROTTLE(20, brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", addr, pkt->len););
err = brcmf_sdiod_set_backplane_window(sdiodev, addr);
if (err != ZX_OK) {
@@ -586,6 +687,7 @@
addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
err = brcmf_sdiod_netbuf_read(sdiodev, SDIO_FN_2, addr, pkt);
+ // THROTTLE(20, brcmf_dbg(SDIO, "err = %d\n", err););
done:
return err;
@@ -713,6 +815,7 @@
} else {
this_transfer_size = packet_size;
}
+ sdio_claim_host(sdiodev->func1);
/* Do the transfer(s) */
while (size) {
@@ -757,6 +860,8 @@
brcmf_netbuf_free(pkt);
+ sdio_release_host(sdiodev->func1);
+
return err;
}
@@ -799,12 +904,16 @@
atomic_store(&sdiodev->freezer->freezing, 1);
brcmf_sdio_trigger_dpc(sdiodev->bus);
sync_completion_wait(&sdiodev->freezer->thread_freeze, ZX_TIME_INFINITE);
+ sdio_claim_host(sdiodev->func1);
res = brcmf_sdio_sleep(sdiodev->bus, true);
+ sdio_release_host(sdiodev->func1);
return res;
}
static void brcmf_sdiod_freezer_off(struct brcmf_sdio_dev* sdiodev) {
+ sdio_claim_host(sdiodev->func1);
brcmf_sdio_sleep(sdiodev->bus, false);
+ sdio_release_host(sdiodev->func1);
atomic_store(&sdiodev->freezer->freezing, 0);
sync_completion_signal(&sdiodev->freezer->resumed);
}
@@ -849,10 +958,14 @@
brcmf_sdiod_freezer_detach(sdiodev);
/* Disable Function 2 */
+ sdio_claim_host(sdiodev->func2);
sdio_disable_fn(&sdiodev->sdio_proto, SDIO_FN_2);
+ sdio_release_host(sdiodev->func2);
/* Disable Function 1 */
+ sdio_claim_host(sdiodev->func1);
sdio_disable_fn(&sdiodev->sdio_proto, SDIO_FN_1);
+ sdio_release_host(sdiodev->func1);
sdiodev->sbwad = 0;
@@ -956,10 +1069,13 @@
zx_status_t brcmf_sdio_register(zx_device_t* zxdev, sdio_protocol_t* sdio_proto) {
zx_status_t err;
- struct brcmf_sdio_dev* sdiodev;
- struct brcmf_bus* bus_if;
struct brcmf_device* dev;
+ struct brcmf_bus* bus_if = NULL;
+ struct sdio_func* func1 = NULL;
+ struct sdio_func* func2 = NULL;
+ struct brcmf_sdio_dev* sdiodev = NULL;
+
brcmf_dbg(SDIO, "Enter\n");
sdio_hw_info_t devinfo;
sdio_get_dev_hw_info(sdio_proto, &devinfo);
@@ -984,20 +1100,45 @@
// TODO(cphoenix): Linux power management stuff
brcmf_sdiod_acpi_set_power_manageable(NULL, 0);
+ pthread_mutexattr_t attr_recursive;
+ if (pthread_mutexattr_init(&attr_recursive)) {
+ return ZX_ERR_INTERNAL;
+ }
+ if (pthread_mutexattr_settype(&attr_recursive, PTHREAD_MUTEX_RECURSIVE)) {
+ return ZX_ERR_INTERNAL;
+ }
+
bus_if = calloc(1, sizeof(struct brcmf_bus));
if (!bus_if) {
- return ZX_ERR_NO_MEMORY;
+ err = ZX_ERR_NO_MEMORY;
+ goto fail;
+ }
+ func1 = calloc(1, sizeof(struct sdio_func));
+ if (!func1) {
+ err = ZX_ERR_NO_MEMORY;
+ goto fail;
+ } else {
+ pthread_mutex_init(&func1->lock, &attr_recursive);
+ }
+ func2 = calloc(1, sizeof(struct sdio_func));
+ if (!func2) {
+ err = ZX_ERR_NO_MEMORY;
+ goto fail;
+ } else {
+ pthread_mutex_init(&func2->lock, &attr_recursive);
}
sdiodev = calloc(1, sizeof(struct brcmf_sdio_dev));
if (!sdiodev) {
- free(bus_if);
- return ZX_ERR_NO_MEMORY;
+ err = ZX_ERR_NO_MEMORY;
+ goto fail;
}
dev = &sdiodev->dev;
dev->zxdev = zxdev;
memcpy(&sdiodev->sdio_proto, sdio_proto, sizeof(sdiodev->sdio_proto));
sdiodev->bus_if = bus_if;
+ sdiodev->func1 = func1;
+ sdiodev->func2 = func2;
bus_if->bus_priv.sdio = sdiodev;
bus_if->proto_type = BRCMF_PROTO_BCDC;
dev->bus = bus_if;
@@ -1018,8 +1159,15 @@
return ZX_OK;
fail:
- dev->bus = NULL;
free(sdiodev);
+ if (func2) {
+ pthread_mutex_destroy(&func2->lock);
+ free(func2);
+ }
+ if (func1) {
+ pthread_mutex_destroy(&func1->lock);
+ free(func1);
+ }
free(bus_if);
return err;
}
@@ -1042,6 +1190,14 @@
brcmf_sdiod_remove(sdiodev);
free(bus_if);
+ if (sdiodev->func1) {
+ pthread_mutex_destroy(&sdiodev->func1->lock);
+ free(sdiodev->func1);
+ }
+ if (sdiodev->func2) {
+ pthread_mutex_destroy(&sdiodev->func2->lock);
+ free(sdiodev->func2);
+ }
free(sdiodev);
}
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/cfg80211.c b/drivers/wlan/third_party/broadcom/brcmfmac/cfg80211.c
index 24d6eba..fb4a0da 100644
--- a/drivers/wlan/third_party/broadcom/brcmfmac/cfg80211.c
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/cfg80211.c
@@ -7027,7 +7027,7 @@
goto ops_out;
}
wiphy->ops = ops;
- wiphy->cfg80211_info = malloc(sizeof(struct brcmf_cfg80211_info));
+ wiphy->cfg80211_info = calloc(1, sizeof(struct brcmf_cfg80211_info));
if (wiphy->cfg80211_info == NULL) {
free(wiphy);
goto ops_out;
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/chip.c b/drivers/wlan/third_party/broadcom/brcmfmac/chip.c
index a749d2a..f90bea1 100644
--- a/drivers/wlan/third_party/broadcom/brcmfmac/chip.c
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/chip.c
@@ -361,31 +361,25 @@
/* if core is already in reset, skip reset */
regdata = ci->ops->read32(ci->ctx, core->wrapbase + BC_CORE_RESET_CONTROL);
gl_compare_now = false;
- brcmf_dbg(TEMP, "En2");
if ((regdata & BC_CORE_RESET_CONTROL_RESET) != 0) {
goto in_reset_configure;
}
- brcmf_dbg(TEMP, "En3");
/* configure reset */
ci->ops->write32(ci->ctx, core->wrapbase + BC_CORE_CONTROL,
prereset | BC_CORE_CONTROL_FGC | BC_CORE_CONTROL_CLOCK);
ci->ops->read32(ci->ctx, core->wrapbase + BC_CORE_CONTROL);
- brcmf_dbg(TEMP, "En4");
/* put in reset */
ci->ops->write32(ci->ctx, core->wrapbase + BC_CORE_RESET_CONTROL, BC_CORE_RESET_CONTROL_RESET);
- brcmf_dbg(TEMP, "En5");
usleep_range(10, 20);
- brcmf_dbg(TEMP, "About to wait");
/* wait till reset is 1 */
uint32_t spinresult;
SPINWAIT((spinresult = ci->ops->read32(ci->ctx, core->wrapbase + BC_CORE_RESET_CONTROL)) !=
BC_CORE_RESET_CONTROL_RESET,
300);
- brcmf_dbg(TEMP, "Survived wait, spinresult %d", spinresult);
+ brcmf_dbg(TEMP, "Survived wait, spinresult %d (should be 1)", spinresult);
in_reset_configure:
- brcmf_dbg(TEMP, "En6");
/* in-reset configure */
ci->ops->write32(ci->ctx, core->wrapbase + BC_CORE_CONTROL, reset | BC_CORE_CONTROL_FGC |
@@ -672,14 +666,11 @@
nab = (corecap & ARMCR4_TCBANB_MASK) >> ARMCR4_TCBANB_SHIFT;
nbb = (corecap & ARMCR4_TCBBNB_MASK) >> ARMCR4_TCBBNB_SHIFT;
totb = nab + nbb;
- brcmf_dbg(TEMP, "corecap 0x%x, nab %d, nbb %d, totb %d", corecap, nab, nbb, totb);
for (idx = 0; idx < totb; idx++) {
brcmf_chip_core_write32(cr4, ARMCR4_BANKIDX, idx);
bxinfo = brcmf_chip_core_read32(cr4, ARMCR4_BANKINFO);
memsize += ((bxinfo & ARMCR4_BSZ_MASK) + 1) * ARMCR4_BSZ_MULT;
- brcmf_dbg(TEMP, "memsize %d, bxinfo 0x%x", memsize, bxinfo);
}
- brcmf_dbg(TEMP, "memsize 0x%x", memsize);
return memsize;
}
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/common.c b/drivers/wlan/third_party/broadcom/brcmfmac/common.c
index 65bd32e..0e33453 100644
--- a/drivers/wlan/third_party/broadcom/brcmfmac/common.c
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/common.c
@@ -377,6 +377,12 @@
#endif
#if defined(CONFIG_BRCM_TRACING) || defined(CONFIG_BRCMDBG)
+
+#include <threads.h>
+
+extern thrd_t gl_interrupt_thread, gl_main_thread, gl_worker_thread, gl_watchdog_thread,
+ gl_bus_watchdog_thread, gl_workqueue_runner_thread;
+
extern atomic_int dw_count;
void __brcmf_dbg(uint32_t filter, const char* func, const char* fmt, ...) {
va_list args;
@@ -402,7 +408,27 @@
} else if (n_printed > 0 && msg[n_printed - 1] == '\n') {
msg[--n_printed] = 0;
}
- zxlogf(INFO, "brcmfmac (%s)(%d): '%s'\n", func, atomic_load(&dw_count), msg);
+ char namebuf[64];
+ char* name;
+ thrd_t thread = thrd_current();
+ if (thread == gl_interrupt_thread) {
+ name = "intr";
+ } else if (thread == gl_worker_thread) {
+ name = "work";
+ } else if (thread == gl_watchdog_thread) {
+ name = "wdog";
+ } else if (thread == gl_bus_watchdog_thread) {
+ name = "bwdg";
+ } else if (thread == gl_workqueue_runner_thread) {
+ name = "wrun";
+ } else if (thread == gl_main_thread) {
+ name = "main";
+ } else {
+ sprintf(namebuf, "%p", thread);
+ name = namebuf;
+ }
+
+ zxlogf(INFO, "brcmfmac %s (%s)(%d): '%s'\n", name, func, atomic_load(&dw_count), msg);
}
}
#endif
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/core.c b/drivers/wlan/third_party/broadcom/brcmfmac/core.c
index 2991054..074a449 100644
--- a/drivers/wlan/third_party/broadcom/brcmfmac/core.c
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/core.c
@@ -682,7 +682,6 @@
if (if_out) {
*if_out = NULL;
}
-
brcmf_dbg(TRACE, "Enter, bsscfgidx=%d, ifidx=%d\n", bsscfgidx, ifidx);
ifp = drvr->iflist[bsscfgidx];
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/debug.c b/drivers/wlan/third_party/broadcom/brcmfmac/debug.c
index c391ae7..8796660 100644
--- a/drivers/wlan/third_party/broadcom/brcmfmac/debug.c
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/debug.c
@@ -26,13 +26,13 @@
static zx_handle_t root_folder;
-void brcmf_hexdump(char* prefix, const void* buf, size_t len) {
+void brcmf_hexdump(const char* prefix, const void* buf, size_t len) {
if (len > 4096) {
- brcmf_dbg(INFO, "Truncating hexdump to 4096 bytes");
+ brcmf_dbg(INFO, "%s: Truncating hexdump to 4096 bytes", prefix);
len = 4096;
}
if (len == 0) {
- brcmf_dbg(INFO, "Empty hexdump %p", buf);
+ brcmf_dbg(INFO, "%s: Empty hexdump %p", prefix, buf);
return;
}
char output[150];
@@ -44,8 +44,9 @@
next += sprintf(next, "%02x ", *bytes++);
if ((i % 32) == 31) {
brcmf_dbg(INFO, "%s", output);
+ zx_nanosleep(zx_deadline_after(ZX_MSEC(1)));
next = output;
- next += sprintf(next, "%s %4lx: ", prefix, i + 1);
+ next += min(snprintf(next, 30, "%s %4lx: ", prefix, i), 30);
}
}
if ((i % 32) != 0) {
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/debug.h b/drivers/wlan/third_party/broadcom/brcmfmac/debug.h
index 050bdd3..55511df 100644
--- a/drivers/wlan/third_party/broadcom/brcmfmac/debug.h
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/debug.h
@@ -71,6 +71,8 @@
__brcmf_dbg(BRCMF_##filter##_VAL, __func__, fmt, ##__VA_ARGS__); \
} while (0)
+#define THROTTLE(n, event) { static int times = n; if (times) { event; times--;}}
+
// clang-format off
#define BRCMF_DATA_ON() (brcmf_msg_filter & BRCMF_DATA_VAL)
@@ -110,11 +112,11 @@
// probably too spammy.
#define brcmf_dbg_hex_dump(test, data, len, fmt, ...) \
do { \
- brcmf_hexdump("dbg_hex_dump", (void*)data, len); \
+ brcmf_hexdump(__func__, (void*)data, len); \
if (test) brcmu_dbg_hex_dump(data, len, fmt, ##__VA_ARGS__); \
} while (0)
-void brcmf_hexdump(char* prefix, const void* buf, size_t len);
+void brcmf_hexdump(const char* prefix, const void* buf, size_t len);
void brcmf_alphadump(const void* buf, size_t len);
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/fuchsia.print b/drivers/wlan/third_party/broadcom/brcmfmac/fuchsia.print
new file mode 100644
index 0000000..e5ccf76
--- /dev/null
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/fuchsia.print
@@ -0,0 +1,294 @@
+[00016.682] 02954.03014> brcmfmac: Bind was called!!
+[00016.682] 02954.03014> brcmfmac 0xb1aebbab5000 (brcmf_core_init)(0): 'brcmfmac: core_init was called'
+[00016.682] 02954.03014> brcmfmac 0xb1aebbab5000 (brcmf_sdio_register)(0): 'Enter'
+[00016.682] 02954.03014> brcmfmac 0xb1aebbab5000 (brcmf_sdio_register)(0): 'sdio vendor ID: 0x02d0'
+[00016.682] 02954.03014> brcmfmac 0xb1aebbab5000 (brcmf_sdio_register)(0): 'sdio device ID: 0x4356'
+[00016.682] 02954.03014> brcmfmac 0xb1aebbab5000 (brcmf_sdio_register)(0): 'F2 found, calling brcmf_sdiod_probe...'
+[00016.682] 02954.03014> brcmfmac 0xb1aebbab5000 (brcmf_sdio_probe)(0): 'Enter'
+[00016.683] 02954.03014> brcmfmac main (brcmf_sdio_probe_attach)(0): 'brcmfmac: F1 signature read @0x18000000=0x17224356'
+[00016.683] 02954.05148> brcmfmac 0x24a67fa4b000 (sdio_printer)(0): 'SDIO printer started'
+[00016.683] 02954.03014> brcmfmac main (brcmf_sdio_probe_attach)(0): 'Survived signature read'
+[00016.683] 02954.03014> brcmfmac main (brcmf_chip_recognition)(0): 'found AXI chip: BCM4356, rev=2'
+[00016.683] 02954.03014> brcmfmac main (brcmf_chip_recognition)(0): 'about to erom_scan in SOCI_AI'
+[00016.684] 02954.03014> brcmfmac main (brcmf_chip_recognition)(0): 'Survived erom scan'
+[00016.684] 02954.03014> brcmfmac main (brcmf_chip_cores_check)(0): ' [1 ] core 0x800:47 base 0x18000000 wrap 0x18100000'
+[00016.684] 02954.03014> brcmfmac main (brcmf_chip_cores_check)(0): ' [2 ] core 0x812:48 base 0x18001000 wrap 0x18101000'
+[00016.684] 02954.03014> brcmfmac main (brcmf_chip_cores_check)(0): ' [3 ] core 0x83e:6 base 0x18002000 wrap 0x18102000'
+[00016.684] 02954.03014> brcmfmac main (brcmf_chip_cores_check)(0): ' [4 ] core 0x83c:11 base 0x18003000 wrap 0x18103000'
+[00016.684] 02954.03014> brcmfmac main (brcmf_chip_cores_check)(0): ' [5 ] core 0x81a:22 base 0x18004000 wrap 0x18104000'
+[00016.684] 02954.03014> brcmfmac main (brcmf_chip_cores_check)(0): ' [6 ] core 0x829:21 base 0x18005000 wrap 0x18105000'
+[00016.684] 02954.03014> brcmfmac main (brcmf_chip_cores_check)(0): ' [7 ] core 0x83d:2 base 0x18006000 wrap 0x18106000'
+[00016.684] 02954.03014> brcmfmac main (brcmf_chip_cores_check)(0): ' [8 ] core 0x135:0 base 0x00000000 wrap 0x1810a000'
+[00016.684] 02954.03014> brcmfmac main (brcmf_chip_cores_check)(0): ' [9 ] core 0x240:0 base 0x00000000 wrap 0x00000000'
+[00016.684] 02954.03014> brcmfmac main (brcmf_chip_recognition)(0): 'Survived cores_check'
+[00016.684] 02954.03014> brcmfmac main (brcmf_chip_set_passive)(0): 'Enter'
+[00016.684] 02954.03014> brcmfmac main (brcmf_chip_get_core)(0): 'Enter, coreid 2110'
+[00016.684] 02954.03014> brcmfmac main (brcmf_chip_get_core)(0): 'Found'
+[00016.684] 02954.03014> brcmfmac main (brcmf_chip_set_passive)(0): 'cr4 arm 0x97da7f1e71e0'
+[00016.684] 02954.03014> brcmfmac main (brcmf_chip_cr4_set_passive)(0): '1'
+[00016.684] 02954.03014> brcmfmac main (brcmf_chip_get_core)(0): 'Enter, coreid 2110'
+[00016.684] 02954.03014> brcmfmac main (brcmf_chip_get_core)(0): 'Found'
+[00016.685] 02954.03014> brcmfmac main (brcmf_chip_disable_arm)(0): 'About to resetcore, id 2110, val 32, CPUHALT'
+[00016.685] 02954.03014> brcmfmac main (brcmf_chip_resetcore)(0): '->resetcore'
+[00016.685] 02954.03014> brcmfmac main (brcmf_chip_ai_resetcore)(0): 'Enter'
+[00016.685] 02954.03014> brcmfmac main (brcmf_chip_ai_coredisable)(0): 'Enter'
+[00016.685] 02954.03014> brcmfmac main (brcmf_sdiod_set_backplane_window)(0): 'bar0 equal, addr was 0x18102800'
+[00016.685] 02954.03014> brcmfmac main (brcmf_chip_ai_coredisable)(0): 'Survived wait, spinresult 1 (should be 1)'
+[00016.685] 02954.03014> brcmfmac main (brcmf_chip_ai_resetcore)(0): 'Past disable'
+[00016.685] 02954.03014> brcmfmac main (brcmf_chip_resetcore)(0): '<-resetcore'
+[00016.685] 02954.03014> brcmfmac main (brcmf_chip_cr4_set_passive)(0): '2'
+[00016.685] 02954.03014> brcmfmac main (brcmf_chip_get_core)(0): 'Enter, coreid 2066'
+[00016.685] 02954.03014> brcmfmac main (brcmf_chip_get_core)(0): 'Found'
+[00016.685] 02954.03014> brcmfmac main (brcmf_chip_cr4_set_passive)(0): 'resetcore, id 2066, val 12, PHYCLOCKEN'
+[00016.688] 02797.02835> [INFO] driver_bind: binding
+[00016.688] 02797.02835> [INFO] ARM mali ID 8201000
+[00016.688] 02797.02835> [INFO] Cache coherency unsupported
+[00016.735] 02954.03014> brcmfmac main (brcmf_chip_resetcore)(0): '->resetcore'
+[00016.735] 02954.03014> brcmfmac main (brcmf_chip_ai_resetcore)(0): 'Enter'
+[00016.735] 02954.03014> brcmfmac main (brcmf_chip_ai_coredisable)(0): 'Enter'
+[00016.735] 02954.03014> brcmfmac main (brcmf_sdiod_set_backplane_window)(0): 'bar0 equal, addr was 0x18101800'
+[00016.735] 02954.03014> brcmfmac main (brcmf_chip_ai_resetcore)(0): 'Past disable'
+[00016.735] 02954.03014> brcmfmac main (brcmf_chip_resetcore)(0): '<-resetcore'
+[00016.735] 02954.03014> brcmfmac main (brcmf_chip_cr4_set_passive)(0): '4'
+[00016.785] 02954.03014> brcmfmac main (brcmf_chip_recognition)(0): 'Survived set_passive'
+[00016.835] 02954.03014> brcmfmac main (brcmf_chip_get_core)(0): 'Enter, coreid 2110'
+[00016.835] 02954.03014> brcmfmac main (brcmf_chip_get_core)(0): 'Found'
+[00016.835] 02954.03014> brcmfmac main (brcmf_chip_get_raminfo)(0): 'ramsize 786432 in mem'
+[00016.835] 02954.03014> brcmfmac main (brcmf_chip_get_raminfo)(0): 'chip ID is 17238 0x4356'
+[00016.836] 02954.03014> brcmfmac main (brcmf_chip_get_raminfo)(0): 'RAM: base=0x180000 size=786432 (0xc0000) sr=0 (0x0)'
+[00016.836] 02954.03014> brcmfmac main (brcmf_chip_recognition)(0): 'chip_get_raminfo returned 0'
+[00016.886] 02954.03014> brcmfmac main (brcmf_chip_attach)(0): 'survived chip_recognition, err ZX_OK'
+[00016.886] 02954.03014> brcmfmac main (brcmf_chip_setup)(0): 'ccrev=47, pmurev=24, pmucaps=0x420e5f18'
+[00016.886] 02954.03014> brcmfmac main (brcmf_chip_attach)(0): 'survived chip_setup, err ZX_OK'
+[00016.886] 02954.03014> brcmfmac main (brcmf_chip_get_core)(0): 'Enter, coreid 2089'
+[00016.886] 02954.03014> brcmfmac main (brcmf_chip_get_core)(0): 'Found'
+[00016.886] 02954.03014> brcmfmac main (brcmf_chip_get_core)(0): 'Enter, coreid 2048'
+[00016.886] 02954.03014> brcmfmac main (brcmf_chip_get_core)(0): 'Found'
+[00016.886] 02954.03014> brcmfmac main (brcmf_get_module_param)(0): 'Enter, bus=0, chip=17238, rev=2'
+[00016.886] 02954.03014> brcmfmac main (brcmf_sdio_kso_init)(0): 'Enter'
+[00016.886] 02954.03014> brcmfmac main (brcmf_sdio_drivestrengthinit)(0): 'No SDIO driver strength init needed for chip 4356 rev 2 pmurev 24'
+[00016.886] 02954.03014> brcmfmac main (brcmf_sdio_probe_attach)(0): 'Exit'
+[00016.886] 02954.03014> brcmfmac main (brcmf_attach)(0): 'Enter'
+[00016.886] 02954.03014> brcmfmac main (brcmf_proto_attach)(0): 'Enter'
+[00016.886] 02954.03014> brcmfmac main (brcmf_sdio_probe)(0): 'completed!!'
+[00016.886] 02954.03014> brcmfmac main (brcmf_fw_map_chip_to_name)(0): 'using brcmfmac/brcmfmac4356-sdio.bin for chip 0x004356(17238) rev 0x000002'
+[00016.886] 02954.03014> brcmfmac main (brcmf_fw_get_firmwares_pcie)(0): 'enter: dev=sdio'
+[00016.886] 02954.05850> brcmfmac 0x556a76e79000 (brcmf_sdio_clkctl)(0): 'in 1'
+[00016.886] 02954.05850> brcmfmac 0x556a76e79000 (brcmf_sdio_htclk)(0): 'Enter, on 1, pendok 1, sr 0, alp 0'
+[00016.887] 02954.05850> brcmfmac 0x556a76e79000 (brcmf_sdio_htclk)(0): 'CLKCTL: turned ON'
+[00016.887] 02954.05850> brcmfmac 0x556a76e79000 (brcmf_sdio_clkctl)(0): '0 -> 3'
+[00016.887] 02954.05850> brcmfmac 0x556a76e79000 (brcmf_sdio_watchdog_thread)(0): 'Watchdog sees intstatus 0x80020000'
+[00016.950] 02954.03014> brcmfmac main (request_firmware_nowait)(0): 'load_firmware of 'brcmfmac/brcmfmac4356-sdio.bin' -> ret 0, size 555412'
+[00016.951] 02954.03014> brcmfmac main (brcmf_fw_request_code_done)(0): 'enter: dev=sdio'
+[00016.953] 02954.03014> brcmfmac main (request_firmware_nowait)(0): 'load_firmware of 'brcmfmac/brcmfmac4356-sdio.txt' -> ret 0, size 2844'
+[00016.953] 02954.03014> brcmfmac main (brcmf_fw_request_nvram_done)(0): 'enter: dev=sdio'
+[00016.953] 02954.03014> brcmfmac main (brcmf_sdio_firmware_callback)(0): 'Enter: dev=sdio, err=0'
+[00016.953] 02954.03014> brcmfmac main (brcmf_sdio_firmware_callback)(0): 'sdiod 0x97da7f21e000, sdiodev 0x97da7f21e000'
+[00016.953] 02954.03014> brcmfmac main (brcmf_sdio_download_firmware)(0): 'firmware rstvec: b83ef180'
+[00016.953] 02954.03014> brcmfmac main (brcmf_sdio_download_code_file)(0): 'Enter, addr 0x180000'
+[00016.957] 02319.02556> Waiting for GPIO Test Input Interrupt
+[00016.983] 05897.05909> netstack: started
+[00016.984] 05897.05909> netstack: socket server started
+[00016.985] 05897.06139> netstack: starting http pprof server on 0.0.0.0:6060
+[00016.987] 05897.06200> netstack: watching for ethernet devices
+[00016.993] 05897.06200> netstack: NIC en2 added using ethernet device "/dev/class/ethernet/000"
+[00016.994] 05897.06200> netstack: NIC en2: link-local IPv6: fe80::9aaa:fcff:fe60:47d4
+[00017.036] 02954.03014> brcmfmac main (brcmf_sdio_verifymemory)(0): 'Compare RAM dl & ul at 0x00180000; size=555412'
+[00017.120] 02954.03014> brcmfmac main (brcmf_sdio_download_nvram)(0): 'Enter'
+[00017.120] 02954.03014> brcmfmac main (brcmf_sdio_verifymemory)(0): 'Compare RAM dl & ul at 0x0023f5ac; size=2644'
+[00017.121] 02954.03014> brcmfmac main (brcmf_sdio_download_firmware)(0): 'Firmware sent'
+[00017.121] 02954.03014> brcmfmac main (brcmf_chip_set_active)(0): 'Enter'
+[00017.121] 02954.03014> brcmfmac main (brcmf_chip_get_core)(0): 'Enter, coreid 2110'
+[00017.121] 02954.03014> brcmfmac main (brcmf_chip_get_core)(0): 'Found'
+[00017.121] 02954.03014> brcmfmac main (brcmf_chip_cr4_set_active)(0): 'Enter'
+[00017.121] 02954.03014> brcmfmac main (brcmf_chip_get_core)(0): 'Enter, coreid 2110'
+[00017.121] 02954.03014> brcmfmac main (brcmf_chip_get_core)(0): 'Found'
+[00017.121] 02954.03014> brcmfmac main (brcmf_chip_resetcore)(0): '->resetcore'
+[00017.121] 02954.03014> brcmfmac main (brcmf_chip_ai_resetcore)(0): 'Enter'
+[00017.121] 02954.03014> brcmfmac main (brcmf_chip_ai_coredisable)(0): 'Enter'
+[00017.121] 02954.03014> brcmfmac main (brcmf_chip_ai_coredisable)(0): 'Survived wait, spinresult 1 (should be 1)'
+[00017.121] 02954.03014> brcmfmac main (brcmf_chip_ai_resetcore)(0): 'Past disable'
+[00017.121] 02954.03014> brcmfmac main (brcmf_chip_resetcore)(0): '<-resetcore'
+[00017.121] 02954.03014> brcmfmac main (brcmf_chip_cr4_set_active)(0): 'Ex'
+[00017.121] 02954.03014> brcmfmac main (brcmf_sdio_download_firmware)(0): 'I guess I succeeded'
+[00017.121] 02954.03014> brcmfmac main (brcmf_sdio_htclk)(0): 'Enter, on 0, pendok 0, sr 0, alp 1'
+[00017.121] 02954.03014> brcmfmac main (brcmf_sdio_htclk)(0): 'CLKCTL: turned OFF'
+[00017.121] 02954.03014> brcmfmac main (brcmf_sdio_clkctl)(0): '3 -> 1'
+[00017.121] 02954.03014> brcmfmac main (brcmf_sdio_firmware_callback)(0): 'dpc state 0, times 0'
+[00017.321] 02954.03014> brcmfmac main (brcmf_sdio_clkctl)(0): 'in 1'
+[00017.321] 02954.03014> brcmfmac main (brcmf_sdio_clkctl)(0): 'in 2'
+[00017.321] 02954.03014> brcmfmac main (brcmf_sdio_sdclk)(0): 'Enter'
+[00017.321] 02954.03014> brcmfmac main (brcmf_sdio_htclk)(0): 'Enter, on 1, pendok 0, sr 0, alp 0'
+[00017.321] 02954.03014> brcmfmac main (brcmf_sdio_htclk)(0): 'CLKCTL: turned ON'
+[00017.321] 02954.03014> brcmfmac main (brcmf_sdio_clkctl)(0): '0 -> 3'
+[00017.330] 07350.07362> netcfg: started
+[00017.331] 02954.03014> brcmfmac main (brcmf_sdio_firmware_callback)(0): 'enable F2: err=0'
+[00017.331] 02954.03014> brcmfmac main (brcmf_chip_sr_capable)(0): 'Enter'
+[00017.332] 02954.03014> brcmfmac main (brcmf_sdio_firmware_callback)(0): 'About to sr_init() (after 100 msec pause)'
+[00017.350] 07445.07457> thermd: started
+[00017.373] 07541.07553> [INFO:main.cc(52)] no kernel crash log found
+[00017.380] 07610.07630> [INFO:main.cc(35)] Trace Manager starting with config: /pkg/data/tracing.config
+[00017.418] 07815.07827> wlanstack2 [I]: Starting
+[00017.420] 07815.07827> wlanstack2::telemetry [I]: Telemetry started
+[00017.432] 02954.03014> brcmfmac main (brcmf_sdio_sr_init)(0): 'Enter'
+[00017.432] 02954.03014> brcmfmac main (brcmf_sdio_sr_init)(0): 'SR enabled'
+[00017.522] 08118.08130> [INFO:cobalt_main.cc(80)] Cobalt client schedule params: schedule_interval=180 seconds, min_interval=10 seconds.
+[00017.531] 08254.08266> [INFO:main.cc(32)] cpuperf_provider: unsupported architecture
+[00017.532] 02954.03014> brcmfmac main (brcmf_sdio_firmware_callback)(0): 'Did sr_init() (100 msec ago)'
+[00017.532] 02954.03014> brcmfmac main (brcmf_sdio_readshared)(0): 'rambase 0x180000, ramsize 0xc0000, shaddr 0x23fffc'
+[00017.532] 02954.03014> brcmfmac main (brcmf_sdio_readshared)(0): 'Final shaddr is 0x23fffc'
+[00017.532] 02954.03014> brcmfmac main (brcmf_sdio_readshared)(0): 'sdpcm_shared address 0x001D9480'
+[00017.532] 02954.03014> brcmfmac main (brcmf_sdio_firmware_callback)(0): 'Readshared returned 0'
+[00017.532] 02954.03014> brcmfmac main (brcmf_sdio_firmware_callback)(0): 'console_addr 0x23debc'
+[00017.532] 02954.03014> brcmfmac main (brcmf_sdio_readconsole)(0): 'Got into readconsole'
+[00017.532] 02954.03014> brcmfmac main (brcmf_sdio_readconsole)(0): 'log struct read: addr 0x23dec4, rv 0'
+[00017.532] 02954.03014> brcmfmac main (brcmf_sdio_readconsole)(0): 'log_le.buf_size is 1024 0x400'
+[00017.532] 02954.03014> brcmfmac main (brcmf_sdio_readconsole)(0): 'brcmfmac: CONSOLE: hndarm_armr addr: 0x18002000, cr4_idx: 0'
+[00017.532] 02954.03014> brcmfmac main (brcmf_sdio_readconsole)(0): 'brcmfmac: CONSOLE: 000000.001 '
+[00017.532] 02954.03014> brcmfmac main (brcmf_sdio_readconsole)(0): 'brcmfmac: CONSOLE: RTE (USB-SDIO-PCIE-CDC) 7.35.184.r1 (TOB) (r559293) on BCM4356 r2 @ 37.4/240.8/240.8MHz'
+[00017.532] 02954.03014> brcmfmac main (brcmf_sdio_readconsole)(0): 'brcmfmac: CONSOLE: 000000.001 sdpcmdcdc0: Broadcom SDPCMD CDC driver'
+[00017.532] 02954.03014> brcmfmac main (brcmf_sdio_readconsole)(0): 'brcmfmac: CONSOLE: 000000.003 reclaim section 0: Returned 58500 bytes to the heap'
+[00017.532] 02954.03014> brcmfmac main (brcmf_sdio_readconsole)(0): 'brcmfmac: CONSOLE: 000000.052 wl0: wlc_ampdu_tx_set: AGG Mode = MAC+AQM txmaxpkts 1024'
+[00017.532] 02954.03014> brcmfmac main (brcmf_sdio_readconsole)(0): 'brcmfmac: CONSOLE: 000000.057 wl0: Broadcom BCM4356 802.11 Wireless Controller 7.35.184.r1 (TOB) (r559293)'
+[00017.532] 02954.03014> brcmfmac main (brcmf_sdio_readconsole)(0): 'brcmfmac: CONSOLE: 000000.057 TCAM: 256 used: 211 exceed:0'
+[00017.532] 02954.03014> brcmfmac main (brcmf_sdio_readconsole)(0): 'brcmfmac: CONSOLE: 000000.058 reclaim section 1: Returned 120976 bytes to the heap'
+[00017.532] 02954.03014> brcmfmac main (brcmf_sdio_readconsole)(0): 'brcmfmac: CONSOLE: '
+[00017.532] 02954.03014> brcmfmac main (brcmf_sdio_firmware_callback)(0): 'Should have seen readconsole output'
+[00017.532] 02954.03014> brcmfmac main (brcmf_sdiod_change_state)(0): '0 -> 1'
+[00017.532] 02954.03014> brcmfmac main (brcmf_bus_change_state)(0): '0 -> 1'
+[00017.532] 02954.03014> brcmfmac main (brcmf_sdiod_intr_register)(0): 'Enter, register OOB IRQ in 100 msec, 0x97da7f21e018 0x97da7f21e028'
+[00017.633] 02954.03014> brcmfmac: * * ERROR * * Called linux function enable_irq_wake
+[00017.633] 01858.01882> GPIO Interrupt index 2 allocated
+[00017.733] 02954.03014> brcmfmac main (brcmf_sdiod_intr_register)(0): 'Did get OOB IRQ 100 msec ago'
+[00017.733] 02954.03014> brcmfmac main (brcmf_sdio_firmware_callback)(0): 'Done, register OOB IRQ'
+[00017.733] 02954.03014> brcmfmac main (brcmf_sdio_firmware_callback)(0): ' * * Did interrupts and released host.'
+[00017.733] 02954.03014> brcmfmac main (brcmf_sdio_firmware_callback)(0): ' * * Really, BusStarted'
+[00017.733] 02954.03014> brcmfmac main (brcmf_sdio_firmware_callback)(0): ' * * Really, BusStarted'
+[00017.733] 02954.08545> brcmfmac intr (brcmf_sdio_oob_irqhandler)(0): 'OOB intr triggered'
+[00017.733] 02954.08545> brcmfmac intr (brcmf_sdio_intr_rstatus)(0): 'intstatus val 0xc0'
+[00017.733] 02954.08545> brcmfmac intr (brcmf_sdio_dpc)(1): 'Enter'
+[00017.733] 02954.08545> brcmfmac intr (brcmf_sdio_hostmail)(1): 'Enter'
+[00017.733] 02954.08545> brcmfmac intr (brcmf_sdiod_transferfff)(1): 'sdio F1w4 d040 4000800000002 0x3005edde2f10'
+[00017.733] 02954.08545> brcmfmac intr (brcmf_sdio_hostmail)(1): 'Dongle ready, protocol version 4'
+[00017.733] 02954.08545> brcmfmac intr (brcmf_sdio_readshared)(1): 'rambase 0x180000, ramsize 0xc0000, shaddr 0x23fffc'
+[00017.733] 02954.08545> brcmfmac intr (brcmf_sdio_readshared)(1): 'Final shaddr is 0x23fffc'
+[00017.734] 02954.08545> brcmfmac intr (brcmf_sdio_readshared)(1): 'sdpcm_shared address 0x001D9480'
+[00017.734] 02954.08545> brcmfmac intr (brcmf_sdio_dpc)(1): 'rxskip 0, FRAME_IND 0x40'
+[00017.734] 02954.08545> brcmfmac intr (brcmf_sdio_readframes)(1): 'Enter'
+[00017.734] 02954.08545> brcmfmac intr (brcmf_sdiod_recv_pkt)(1): 'addr = 0x18000000, size = 64'
+[00017.734] 02954.08545> brcmfmac intr (brcmf_hexdump)(1): 'F2 0: 0c 00 f3 ff 00 01 00 0c 00 19 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 '
+[00017.735] 02954.08545> brcmfmac intr (brcmf_hexdump)(1): 'F2 1f: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 '
+[00017.736] 02954.08545> brcmfmac intr (brcmf_sdiod_recv_pkt)(1): 'err = 0'
+[00017.736] 02954.08545> brcmfmac intr (brcmf_hexdump)(1): 'brcmf_sdio_readframes 0: 0c 00 f3 ff 00 01 00 0c 00 19 00 00 '
+[00017.736] 02954.08545> brcmfmac intr (brcmf_sdiod_recv_pkt)(1): 'addr = 0x18000000, size = 0'
+[00017.736] 02954.08545> brcmfmac intr (brcmf_hexdump)(1): 'F2: Empty hexdump 0x97ed4de76040'
+[00017.736] 02954.08545> brcmfmac intr (brcmf_sdiod_recv_pkt)(1): 'err = 0'
+[00017.736] 02954.08545> brcmfmac intr (brcmf_sdio_readframes)(1): 'head_read 64'
+[00017.736] 02954.08545> brcmfmac intr (brcmf_sdio_readframes)(1): 'Got here 2'
+[00017.736] 02954.08545> brcmfmac intr (brcmf_sdio_readframes)(1): 'Got here 56'
+[00017.736] 02954.08545> brcmfmac intr (brcmf_hexdump)(1): 'brcmf_sdio_readframes 0: 0c 00 f3 ff 00 01 00 0c 00 19 00 00 '
+[00017.736] 02954.08545> brcmfmac intr (brcmf_sdiod_recv_pkt)(1): 'addr = 0x18000000, size = 64'
+[00017.736] 02954.08545> brcmfmac intr (brcmf_hexdump)(1): 'F2 0: 0c 00 f3 ff 01 01 00 0c 00 19 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 '
+[00017.737] 02954.08545> brcmfmac intr (brcmf_hexdump)(1): 'F2 1f: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 '
+[00017.738] 02954.08545> brcmfmac intr (brcmf_sdiod_recv_pkt)(1): 'err = 0'
+[00017.738] 02954.08545> brcmfmac intr (brcmf_hexdump)(1): 'brcmf_sdio_readframes 0: 0c 00 f3 ff 01 01 00 0c 00 19 00 00 '
+[00017.738] 02954.08545> brcmfmac intr (brcmf_sdiod_recv_pkt)(1): 'addr = 0x18000000, size = 0'
+[00017.738] 02954.08545> brcmfmac intr (brcmf_hexdump)(1): 'F2: Empty hexdump 0x97ed4de76040'
+[00017.738] 02954.08545> brcmfmac intr (brcmf_sdiod_recv_pkt)(1): 'err = 0'
+[00017.738] 02954.08545> brcmfmac intr (brcmf_sdio_readframes)(1): 'head_read 64'
+[00017.738] 02954.08545> brcmfmac intr (brcmf_sdio_readframes)(1): 'Got here 2'
+[00017.738] 02954.08545> brcmfmac intr (brcmf_sdio_readframes)(1): 'Got here 56'
+[00017.738] 02954.08545> brcmfmac intr (brcmf_hexdump)(1): 'brcmf_sdio_readframes 0: 0c 00 f3 ff 01 01 00 0c 00 19 00 00 '
+[00017.738] 02954.08545> brcmfmac intr (brcmf_sdiod_recv_pkt)(1): 'addr = 0x18000000, size = 64'
+[00017.738] 02954.08545> brcmfmac intr (brcmf_hexdump)(1): 'F2 0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 '
+[00017.739] 02954.08545> brcmfmac intr (brcmf_hexdump)(1): 'F2 1f: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 '
+[00017.740] 02954.08545> brcmfmac intr (brcmf_sdiod_recv_pkt)(1): 'err = 0'
+[00017.740] 02954.08545> brcmfmac intr (brcmf_hexdump)(1): 'brcmf_sdio_readframes 0: 00 00 00 00 00 00 00 00 00 00 00 00 '
+[00017.740] 02954.08545> brcmfmac intr (brcmf_sdio_readframes)(1): 'processed 2 frames'
+[00017.744] 02954.05138> brcmfmac wdog (brcmf_sdio_watchdog)(1): 'Enter'
+[00017.744] 02954.05850> brcmfmac bwdg (brcmf_sdio_bus_watchdog)(1): 'Enter'
+[00017.754] 02954.05138> brcmfmac wdog (brcmf_sdio_watchdog)(1): 'Enter'
+[00017.754] 02954.05850> brcmfmac bwdg (brcmf_sdio_bus_watchdog)(1): 'Enter'
+[00017.764] 02954.05138> brcmfmac wdog (brcmf_sdio_watchdog)(1): 'Enter'
+[00017.764] 02954.05850> brcmfmac bwdg (brcmf_sdio_bus_watchdog)(1): 'Enter'
+[00017.774] 02954.05138> brcmfmac wdog (brcmf_sdio_watchdog)(1): 'Enter'
+[00017.774] 02954.05850> brcmfmac bwdg (brcmf_sdio_bus_watchdog)(1): 'Enter'
+[00017.784] 02954.05138> brcmfmac wdog (brcmf_sdio_watchdog)(1): 'Enter'
+[00017.784] 02954.05850> brcmfmac bwdg (brcmf_sdio_bus_watchdog)(1): 'Enter'
+[00017.794] 02954.05138> brcmfmac wdog (brcmf_sdio_watchdog)(1): 'Enter'
+[00017.794] 02954.05850> brcmfmac bwdg (brcmf_sdio_bus_watchdog)(1): 'Enter'
+[00017.804] 02954.05138> brcmfmac wdog (brcmf_sdio_watchdog)(1): 'Enter'
+[00017.804] 02954.05850> brcmfmac bwdg (brcmf_sdio_bus_watchdog)(1): 'Enter'
+[00017.814] 02954.05138> brcmfmac wdog (brcmf_sdio_watchdog)(1): 'Enter'
+[00017.814] 02954.05850> brcmfmac bwdg (brcmf_sdio_bus_watchdog)(1): 'Enter'
+[00017.824] 02954.05138> brcmfmac wdog (brcmf_sdio_watchdog)(1): 'Enter'
+[00017.824] 02954.05850> brcmfmac bwdg (brcmf_sdio_bus_watchdog)(1): 'Enter'
+[00017.833] 02954.03014> brcmfmac main (brcmf_bus_started)(1): 'Enter'
+[00017.833] 02954.03014> brcmfmac main (brcmf_add_if)(1): 'Enter, bsscfgidx=0, ifidx=0'
+[00017.833] 02954.03014> brcmfmac main (brcmf_add_if)(1): 'allocate netdev interface'
+[00017.833] 02954.03014> brcmfmac main (brcmf_add_if)(1): ' ==== if:wlan (0x97da7f1f2438M) created ==='
+[00017.834] 02954.05138> brcmfmac wdog (brcmf_sdio_watchdog)(1): 'Enter'
+[00017.834] 02954.05850> brcmfmac bwdg (brcmf_sdio_bus_watchdog)(1): 'Enter'
+[00017.844] 02954.05138> brcmfmac wdog (brcmf_sdio_watchdog)(1): 'Enter'
+[00017.844] 02954.05850> brcmfmac bwdg (brcmf_sdio_bus_watchdog)(1): 'Enter'
+[00017.854] 02954.05138> brcmfmac wdog (brcmf_sdio_watchdog)(1): 'Enter'
+[00017.854] 02954.05850> brcmfmac bwdg (brcmf_sdio_bus_watchdog)(1): 'Enter'
+[00017.864] 02954.05138> brcmfmac wdog (brcmf_sdio_watchdog)(1): 'Enter'
+[00017.864] 02954.05850> brcmfmac bwdg (brcmf_sdio_bus_watchdog)(1): 'Enter'
+[00017.874] 02954.05138> brcmfmac wdog (brcmf_sdio_watchdog)(1): 'Enter'
+[00017.874] 02954.05850> brcmfmac bwdg (brcmf_sdio_bus_watchdog)(1): 'Enter'
+[00017.883] 02954.03014> brcmfmac main (brcmf_add_if)(1): 'Exit'
+[00017.883] 02954.03014> brcmfmac main (brcmf_bus_change_state)(1): '1 -> 1'
+[00017.883] 02954.03014> brcmfmac main (brcmf_proto_bcdc_query_dcmd)(1): 'Enter, cmd 262 len 20, ifidx 0'
+[00017.884] 02954.05138> brcmfmac wdog (brcmf_sdio_watchdog)(1): 'Enter'
+[00017.884] 02954.05850> brcmfmac bwdg (brcmf_sdio_bus_watchdog)(1): 'Enter'
+[00017.894] 02954.05138> brcmfmac wdog (brcmf_sdio_watchdog)(1): 'Enter'
+[00017.894] 02954.05850> brcmfmac bwdg (brcmf_sdio_bus_watchdog)(1): 'Enter'
+[00017.904] 02954.05138> brcmfmac wdog (brcmf_sdio_watchdog)(1): 'Enter'
+[00017.904] 02954.05850> brcmfmac bwdg (brcmf_sdio_bus_watchdog)(1): 'Enter'
+[00017.914] 02954.05138> brcmfmac wdog (brcmf_sdio_watchdog)(1): 'Enter'
+[00017.914] 02954.05850> brcmfmac bwdg (brcmf_sdio_bus_watchdog)(1): 'Enter'
+[00017.924] 02954.05138> brcmfmac wdog (brcmf_sdio_watchdog)(1): 'Enter'
+[00017.924] 02954.05850> brcmfmac bwdg (brcmf_sdio_bus_watchdog)(1): 'Enter'
+[00017.933] 02954.03014> brcmfmac main (brcmf_proto_bcdc_query_dcmd)(1): 'aaaEnter, cmd 262 len 20, ifidx 0'
+[00017.933] 02954.03014> brcmfmac main (brcmf_sdio_bus_txctl)(1): 'Enter'
+[00017.933] 02954.03014> brcmfmac main (brcmf_sdio_trigger_dpc)(1): 'About to call workqueue_schedule'
+[00017.933] 02954.05143> brcmfmac wrun (workqueue_runner)(1): 'Got work!'
+[00017.933] 02954.05143> brcmfmac work (brcmf_sdio_dpc)(2): 'Enter'
+[00017.933] 02954.05143> brcmfmac work (brcmf_sdio_dpc)(2): 'rxskip 0, FRAME_IND 0x0'
+[00017.933] 02954.05143> brcmfmac work (brcmf_sdio_tx_ctrlframe)(2): 'Enter'
+[00017.933] 02954.05143> brcmfmac work (brcmf_hexdump)(2): 'brcmf_sdio_tx_ctrlframe 0:'
+[00017.934] 02954.05143> brcmfmac work (brcmf_hexdump)(2): 'brcmf_sdio_tx_ctrlframe 1f:'
+[00017.934] 02954.05143> brcmfmac work (brcmf_hexdump)(2): 'brcmf_sdio_tx_ctrlframe 0:'
+[00017.935] 02954.05143> brcmfmac work (brcmf_hexdump)(2): 'F2 0: 30 00 cf ff ff 00 00 0c 00 00 00 00 06 01 00 00 14 00 00 00 00 00 01 00 00 00 00 00 63 75 72 5f '
+[00017.936] 02954.05143> brcmfmac work (brcmf_hexdump)(2): 'F2 1f: 65 74 68 65 72 61 64 64 72 00 00 00 00 00 00 00 '
+[00017.936] 02954.05143> brcmfmac work (brcmf_sdio_tx_ctrlframe)(2): 'Exit'
+[00017.936] 02954.05143> brcmfmac work (brcmf_sdio_dpc)(2): 'Wait event wakeup...'
+[00017.936] 02954.05143> brcmfmac work (brcmf_sdio_dpc)(2): 'Woke up'
+[00017.936] 02954.03014> brcmfmac main (brcmf_sdio_bus_txctl)(2): 'ctrl_frame complete, err=0'
+[00017.936] 02954.03014> brcmfmac main (brcmf_proto_bcdc_cmplt)(2): 'Enter'
+[00017.936] 02954.03014> brcmfmac main (brcmf_sdio_bus_rxctl)(2): 'Enter'
+[00017.943] 02954.05138> brcmfmac wdog (brcmf_sdio_watchdog)(2): 'Enter'
+[00017.943] 02954.05850> brcmfmac bwdg (brcmf_sdio_bus_watchdog)(2): 'Enter'
+[00019.243] 03541.04856> aml-dwmac: Link is now up
+[00019.243] 05897.07680> netstack: NIC en2: restarting
+[00020.350] 03053.03101> [aml_scpi_set_dvfs_idx 189]OPP index for cluster 0 to 6
+[00020.352] 03053.03101> [aml_scpi_set_dvfs_idx 189]OPP index for cluster 1 to 4
+[00020.353] 02797.02835> [aml_gpu_set_clk_freq_source 34]Setting clock source to 3: 6
+[00020.436] 02954.03014> brcmfmac main ERROR(brcmf_sdio_bus_rxctl): 'resumed on timeout'
+[00020.436] 02954.03014> brcmfmac main (brcmf_sdio_readshared)(2): 'rambase 0x180000, ramsize 0xc0000, shaddr 0x23fffc'
+[00020.436] 02954.03014> brcmfmac main (brcmf_sdio_readshared)(2): 'Final shaddr is 0x23fffc'
+[00020.436] 02954.03014> brcmfmac main (brcmf_sdio_readshared)(2): 'sdpcm_shared address 0x001D9480'
+[00020.436] 02954.03014> brcmfmac main (brcmf_sdio_checkdied)(2): 'firmware not built with -assert'
+[00020.436] 02954.03014> brcmfmac main (brcmf_fil_cmd_data)(2): 'Failed: (unknown) (-22)'
+[00020.436] 02954.03014> brcmfmac main ERROR(brcmf_c_preinit_dcmds): 'Retrieving cur_etheraddr failed, -22'
+[00020.436] 02954.03014> brcmfmac main ERROR(brcmf_bus_started): 'failed: -22'
+[00020.436] 02954.03014> brcmfmac main ERROR(brcmf_sdio_firmware_callback): 'dongle is not responding'
+[00020.436] 02954.03014> brcmfmac main (brcmf_sdio_firmware_callback)(2): 'failed: dev=sdio, err=-22'
+[00020.436] 02954.03014> brcmfmac main ERROR(brcmf_sdio_firmware_callback): '* * Used to call device_release_driver(&sdiodev->func2->dev);'
+[00020.436] 02954.03014> brcmfmac main ERROR(brcmf_sdio_firmware_callback): '* * Used to call device_release_driver(dev);'
+[00020.436] 02954.03014> brcmfmac main (brcmf_sdio_register)(2): 'F2 init completed...'
+[00020.436] 02954.03014> brcmfmac main (brcmfmac_module_init)(2): 'Successfully exiting driver init'
+[00020.436] 02954.03014> devhost: WARNING: driver '/system/driver/brcmfmac.so' did not add device in bind()
+[00022.001] 05897.06260> netstack: NIC en2: DHCP acquired IP 192.168.42.73 for 24h0m0s
+[00022.001] 05897.06260> netstack: NIC en2: Adding DNS servers: [8.8.8.8]
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/fuchsia.psr b/drivers/wlan/third_party/broadcom/brcmfmac/fuchsia.psr
new file mode 100644
index 0000000..15079d4
--- /dev/null
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/fuchsia.psr
@@ -0,0 +1,283 @@
+[00017.734] 02954.08545> brcmfmac intr (pr)(1): 'sdio 54321 17.734 intr: F2r64f 8000 c000100fff3000c (0) 26'
+[00017.736] 02954.08545> brcmfmac intr (pr)(1): 'sdio 54321 17.736 intr: F2r0f 8000 0 (0) 26'
+[00017.736] 02954.08545> brcmfmac intr (pr)(1): 'sdio 54321 17.736 intr: F2r64f 8000 c000101fff3000c (0) 26'
+[00017.738] 02954.08545> brcmfmac intr (pr)(1): 'sdio 54321 17.738 intr: F2r0f 8000 0 (0) 26'
+[00017.738] 02954.08545> brcmfmac intr (pr)(1): 'sdio 54321 17.738 intr: F2r64f 8000 0 (0) 26'
+[00017.935] 02954.05143> brcmfmac work (pr)(2): 'sdio 54321 17.935 work: F2w48 8000 c0000ffffcf0030 (c100) 28'
+[00026.683] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 0 16.682 main: F1w1 1000a 0 (0) 0'
+[00026.693] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 1 16.682 main: F1w1 1000b 0 (0) 0'
+[00026.703] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 2 16.682 main: F1w1 1000c 18 (c18) 0'
+[00026.713] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 3 16.683 main: F1r4 8000 17224356 (c72f) 0'
+[00026.723] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 4 16.683 main: F1w1 1000e 28 (1428) 0'
+[00026.733] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 5 16.683 main: F1r1 1000e e8 (74e8) 0'
+[00026.743] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 6 16.683 main: F1w1 1000e 28 (1428) 0'
+[00026.753] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 7 16.683 main: F1r1 1000e e8 (74e8) 0'
+[00026.763] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 8 16.683 main: F1r1 1000e e8 (74e8) 0'
+[00026.773] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 9 16.683 main: F1w1 1000e 21 (10a1) 0'
+[00026.783] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 10 16.683 main: F1w1 1000f 0 (0) 0'
+[00026.793] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 11 16.683 main: F1r4 8000 17224356 (c72f) 0'
+[00026.803] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 12 16.683 main: F1r4 80fc 1810d000 (fd78) 0'
+[00026.813] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 13 16.683 main: F1w1 1000a 80 (4080) 0'
+[00026.823] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 14 16.683 main: F1w1 1000b 10 (810) 0'
+[00026.833] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 15 16.683 main: F1w1 1000c 18 (c18) 0'
+[00026.843] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 16 16.683 main: F1r4 d000 4bf80001 (8fb3) 0'
+[00026.853] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 17 16.683 main: F1r4 d004 2f084411 (3a7) 0'
+[00026.863] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 18 16.683 main: F1r4 d008 3 (5598) 0'
+[00026.873] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 19 16.683 main: F1r4 d00c 18000005 (f2b0) 0'
+[00026.883] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 20 16.683 main: F1r4 d010 1c000135 (af30) 0'
+[00026.893] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 21 16.683 main: F1r4 d014 1000000 (81) 0'
+[00026.903] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 22 16.683 main: F1r4 d018 181000c5 (8690) 0'
+[00026.913] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 23 16.683 main: F1r4 d01c 18107185 (8354) 0'
+[00026.923] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 24 16.683 main: F1r4 d020 4bf81201 (e3fb) 0'
+[00026.933] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 25 16.683 main: F1r4 d024 30004211 (9130) 0'
+[00026.943] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 26 16.683 main: F1r4 d028 103 (539c) 0'
+[00026.953] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 27 16.683 main: F1r4 d02c 18001005 (92f0) 0'
+[00026.963] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 28 16.683 main: F1r4 d030 181010c5 (e6d0) 0'
+[00026.973] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 29 16.683 main: F1r4 d034 4bf83e01 (b4b) 0'
+[00026.983] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 30 16.683 main: F1r4 d038 6084411 (170e) 0'
+[00026.993] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 31 16.683 main: F1r4 d03c 203 (5990) 0'
+[00027.003] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 32 16.683 main: F1r4 d040 18002005 (3230) 0'
+[00027.013] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 33 16.683 main: F1r4 d044 18006015 (7bb0) 0'
+[00027.023] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 34 16.683 main: F1r4 d048 135 (a12c) 0'
+[00027.033] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 35 16.683 main: F1r4 d04c a0000 (ab54) 0'
+[00027.043] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 36 16.683 main: F1r4 d050 180135 (3a1c) 0'
+[00027.053] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 37 16.683 main: F1r4 d054 80000 (8910) 0'
+[00027.063] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 38 16.683 main: F1r4 d058 200135 (856c) 0'
+[00027.073] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 39 16.683 main: F1r4 d05c 40000 (4488) 0'
+[00027.083] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 40 16.683 main: F1r4 d060 181020c5 (4610) 0'
+[00027.093] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 41 16.683 main: F1r4 d064 18108185 (a094) 0'
+[00027.103] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 42 16.683 main: F1r4 d068 4bf83c01 (743) 0'
+[00027.113] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 43 16.683 main: F1r4 d06c b084411 (1183) 0'
+[00027.123] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 44 16.683 main: F1r4 d070 303 (5f94) 0'
+[00027.133] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 45 16.683 main: F1r4 d074 18003005 (5270) 0'
+[00027.143] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 46 16.683 main: F1r4 d078 8000135 (a524) 0'
+[00027.153] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 47 16.683 main: F1r4 d07c 8000000 (408) 0'
+[00027.163] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 48 16.683 main: F1r4 d080 13d (c56c) 0'
+[00027.173] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 49 16.683 main: F1r4 d084 80000000 (4080) 0'
+[00027.183] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 50 16.683 main: F1r4 d088 8 (6440) 0'
+[00027.193] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 51 16.683 main: F1r4 d08c 80000000 (4080) 0'
+[00027.203] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 52 16.683 main: F1r4 d090 181030c5 (2650) 0'
+[00027.213] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 53 16.683 main: F1r4 d094 18109185 (c0d4) 0'
+[00027.223] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 54 16.683 main: F1r4 d098 4bf81a01 (d3db) 0'
+[00027.233] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 55 16.683 main: F1r4 d09c 16004211 (8216) 0'
+[00027.243] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 56 16.683 main: F1r4 d0a0 403 (4d88) 0'
+[00027.253] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 57 16.683 main: F1r4 d0a4 18004005 (73b0) 0'
+[00027.263] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 58 16.683 main: F1r4 d0a8 181040c5 (790) 0'
+[00027.273] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 59 16.683 main: F1r4 d0ac 4bf82901 (7917) 0'
+[00027.283] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 60 16.683 main: F1r4 d0b0 15004211 (8395) 0'
+[00027.293] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 61 16.683 main: F1r4 d0b4 503 (4b8c) 0'
+[00027.303] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 62 16.683 main: F1r4 d0b8 18005005 (13f0) 0'
+[00027.313] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 63 16.683 main: F1r4 d0bc 181050c5 (67d0) 0'
+[00027.323] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 64 16.683 main: F1r4 d0c0 4bf83d01 (147) 0'
+[00027.333] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 65 16.683 main: F1r4 d0c4 2004211 (8802) 0'
+[00027.344] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 66 16.684 main: F1r4 d0c8 903 (63bc) 0'
+[00027.354] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 67 16.684 main: F1r4 d0cc 18006005 (b330) 0'
+[00027.364] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 68 16.684 main: F1r4 d0d0 181060c5 (c710) 0'
+[00027.374] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 69 16.684 main: F1r4 d0d4 43b13501 (e5dd) 0'
+[00027.384] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 70 16.684 main: F1r4 d0d8 80201 (4990) 0'
+[00027.394] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 71 16.684 main: F1r4 d0dc 18000045 (d0b0) 0'
+[00027.404] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 72 16.684 main: F1r4 d0dc 18000045 (d0b0) 0'
+[00027.414] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 73 16.684 main: F1r4 d0e0 18001045 (b0f0) 0'
+[00027.424] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 74 16.684 main: F1r4 d0e4 18002045 (1030) 0'
+[00027.434] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 75 16.684 main: F1r4 d0e8 18003045 (7070) 0'
+[00027.444] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 76 16.684 main: F1r4 d0ec 18004045 (51b0) 0'
+[00027.454] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 77 16.684 main: F1r4 d0f0 18005045 (31f0) 0'
+[00027.464] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 78 16.684 main: F1r4 d0f4 18006045 (9130) 0'
+[00027.474] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 79 16.684 main: F1r4 d0f8 18007045 (f170) 0'
+[00027.484] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 80 16.684 main: F1r4 d0fc 18008055 (1a30) 0'
+[00027.494] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 81 16.684 main: F1r4 d100 1810a085 (6610) 0'
+[00027.504] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 82 16.684 main: F1r4 d104 43b24001 (e96f) 0'
+[00027.514] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 83 16.684 main: F1r4 d104 43b24001 (e96f) 0'
+[00027.524] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 84 16.684 main: F1r4 d108 80211 (8110) 0'
+[00027.534] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 85 16.684 main: F1r4 d10c 603 (4180) 0'
+[00027.544] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 86 16.684 main: F1r4 d110 19000075 (89b1) 0'
+[00027.554] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 87 16.684 main: F1r4 d114 1000000 (81) 0'
+[00027.564] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 88 16.684 main: F1r4 d118 1810b085 (650) 0'
+[00027.574] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 89 16.684 main: F1r4 d11c 43b36701 (2ad1) 0'
+[00027.584] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 90 16.684 main: F1r4 d11c 43b36701 (2ad1) 0'
+[00027.594] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 91 16.684 main: F1r4 d120 201 (c080) 0'
+[00027.604] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 92 16.684 main: F1r4 d124 1810c005 (6390) 0'
+[00027.614] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 93 16.684 main: F1r4 d128 43b36601 (2cd5) 0'
+[00027.624] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 94 16.684 main: F1r4 d12c 201 (c080) 0'
+[00027.634] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 95 16.684 main: F1r4 d130 1810d005 (3d0) 0'
+[00027.644] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 96 16.684 main: F1r4 d134 43b30101 (7f49) 0'
+[00027.654] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 97 16.684 main: F1r4 d138 201 (c080) 0'
+[00027.664] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 98 16.684 main: F1r4 d13c 18200035 (8f70) 0'
+[00027.674] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 99 16.684 main: F1r4 d140 100000 (1220) 0'
+[00027.684] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 100 16.684 main: F1r4 d144 43bfff01 (b529) 0'
+[00027.694] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 101 16.684 main: F1r4 d148 80201 (4990) 0'
+[00027.704] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 102 16.684 main: F1r4 d14c a0035 (c7c) 0'
+[00027.714] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 103 16.684 main: F1r4 d14c a0035 (c7c) 0'
+[00027.724] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 104 16.684 main: F1r4 d150 e0000 (efdc) 0'
+[00027.734] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 105 16.684 main: F1r4 d154 240035 (c7e0) 0'
+[00027.744] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 106 16.684 main: F1r4 d158 7dc0000 (5bf) 0'
+[00027.754] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 107 16.684 main: F1r4 d15c 10000035 (af38) 0'
+[00027.764] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 108 16.684 main: F1r4 d160 8000000 (408) 0'
+[00027.774] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 109 16.684 main: F1r4 d164 18008035 (a930) 0'
+[00027.784] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 110 16.684 main: F1r4 d168 f8000 (fcfe) 0'
+[00027.794] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 111 16.684 main: F1r4 d16c 1810e035 (fa90) 0'
+[00027.804] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 112 16.684 main: F1r4 d170 f2000 (3e7e) 0'
+[00027.814] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 113 16.684 main: F1r4 d174 18300035 (9d50) 0'
+[00027.824] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 114 16.684 main: F1r4 d178 d00000 (cba0) 0'
+[00027.834] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 115 16.684 main: F1r4 d17c 1a000035 (aa32) 0'
+[00027.844] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 116 16.684 main: F1r4 d180 2000000 (102) 0'
+[00027.854] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 117 16.684 main: F1r4 d184 1d000035 (a9b5) 0'
+[00027.864] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 118 16.684 main: F1r4 d188 e3000008 (1523) 0'
+[00027.874] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 119 16.684 main: F1r4 d18c 7fffffff (1365) 0'
+[00027.884] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 120 16.684 main: F1r4 d190 1810e085 (e710) 0'
+[00027.894] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 121 16.684 main: F1r4 d194 f (3f8) 0'
+[00027.904] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 122 16.684 main: F1r4 d194 f (3f8) 0'
+[00027.914] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 123 16.685 main: F1w1 1000a 0 (0) 0'
+[00027.924] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 124 16.685 main: F1w1 1000b 10 (810) 0'
+[00027.934] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 125 16.685 main: F1w1 1000c 18 (c18) 0'
+[00027.944] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 126 16.685 main: F1r4 a408 21 (5d88) 0'
+[00027.954] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 127 16.685 main: F1r4 a800 0 (0) 0'
+[00027.965] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 128 16.685 main: F1w4 a408 23 (c498) 0'
+[00027.975] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 129 16.685 main: F1r4 a408 23 (c498) 0'
+[00027.985] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 130 16.685 main: F1w4 a800 1 (cc88) 0'
+[00027.995] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 131 16.685 main: F1r4 a800 1 (cc88) 0'
+[00028.005] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 132 16.685 main: F1w4 a408 23 (c498) 0'
+[00028.015] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 133 16.685 main: F1r4 a408 23 (c498) 0'
+[00028.025] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 134 16.685 main: F1r4 a800 1 (cc88) 0'
+[00028.035] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 135 16.685 main: F1w4 a800 0 (0) 0'
+[00028.045] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 136 16.685 main: F1r4 a800 0 (0) 0'
+[00028.055] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 137 16.685 main: F1w4 a408 21 (5d88) 0'
+[00028.065] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 138 16.685 main: F1r4 a408 21 (5d88) 0'
+[00028.075] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 139 16.735 main: F1r4 9800 1 (cc88) 0'
+[00028.085] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 140 16.735 main: F1w4 9408 7 (67b8) 0'
+[00028.095] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 141 16.735 main: F1r4 9408 7 (67b8) 0'
+[00028.105] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 142 16.735 main: F1r4 9800 1 (cc88) 0'
+[00028.115] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 143 16.735 main: F1w4 9800 0 (0) 0'
+[00028.125] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 144 16.735 main: F1r4 9800 0 (0) 0'
+[00028.135] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 145 16.735 main: F1w4 9408 5 (fea8) 0'
+[00028.145] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 146 16.735 main: F1r4 9408 5 (fea8) 0'
+[00028.155] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 147 16.835 main: F1w1 1000a 0 (0) 0'
+[00028.165] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 148 16.835 main: F1w1 1000b 0 (0) 0'
+[00028.175] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 149 16.835 main: F1w1 1000c 18 (c18) 0'
+[00028.185] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 150 16.835 main: F1r4 a004 524 (bd34) 0'
+[00028.195] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 151 16.835 main: F1w4 a040 0 (0) 0'
+[00028.205] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 152 16.835 main: F1r4 a044 108c0f (3be8) 0'
+[00028.215] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 153 16.835 main: F1w4 a040 1 (cc88) 0'
+[00028.225] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 154 16.835 main: F1r4 a044 108c0f (3be8) 0'
+[00028.235] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 155 16.835 main: F1w4 a040 2 (9910) 0'
+[00028.245] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 156 16.835 main: F1r4 a044 108c0f (3be8) 0'
+[00028.255] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 157 16.835 main: F1w4 a040 3 (5598) 0'
+[00028.265] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 158 16.835 main: F1r4 a044 108c0f (3be8) 0'
+[00028.275] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 159 16.835 main: F1w4 a040 4 (3220) 0'
+[00028.285] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 160 16.835 main: F1r4 a044 108c0f (3be8) 0'
+[00028.295] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 161 16.835 main: F1w4 a040 5 (fea8) 0'
+[00028.305] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 162 16.835 main: F1r4 a044 108c0f (3be8) 0'
+[00028.315] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 163 16.886 main: F1r4 8004 58680009 (6140) 0'
+[00028.325] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 164 16.886 main: F1r4 80ac e (cf70) 0'
+[00028.335] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 165 16.886 main: F1r4 8604 420e5f18 (a122) 0'
+[00028.345] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 166 16.886 main: F1r1 1001f 3 (183) 0'
+[00028.355] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 167 16.886 main: F0r1 f1 1 (81) 0'
+[00028.365] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 168 16.886 main: F0w1 f1 3 (183) 0'
+[00028.375] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 169 16.886 main: F1r4 8600 1770180 (4b8b) 0'
+[00028.385] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 170 16.886 main: F1w4 8600 1774180 (ca8b) 0'
+[00028.395] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 171 16.886 main: F1w1 1000e 0 (0) 0'
+[00028.405] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 172 16.887 bwdg: F1w1 1000e 10 (810) 0'
+[00028.415] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 173 16.887 bwdg: F1r1 1000e d0 (68d0) 0'
+[00028.425] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 174 16.887 bwdg: F1r4 d020 80020000 (62c4) 0'
+[00028.435] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 175 16.953 main: F3w4 ffff 0 (0) 0'
+[00028.445] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 176 17.120 main: F4w4 ffff 0 (0) 0'
+[00028.455] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 177 17.121 main: F5w4 ffff 0 (0) 0'
+[00028.465] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 178 17.121 main: F1w1 1000a 0 (0) 0'
+[00028.475] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 179 17.121 main: F1w1 1000b 0 (0) 0'
+[00028.485] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 180 17.121 main: F1w1 1000c 18 (c18) 0'
+[00028.495] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 181 17.121 main: F1w4 d020 ffffffff (53e5) 0'
+[00028.505] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 182 17.121 main: F1w1 1000a 0 (0) 0'
+[00028.515] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 183 17.121 main: F1w1 1000b 0 (0) 0'
+[00028.525] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 184 17.121 main: F1w1 1000c 0 (0) 0'
+[00028.535] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 185 17.121 main: F1w4 8000 b83ef180 (e4c0) 0'
+[00028.545] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 186 17.121 main: F1w1 1000a 0 (0) 0'
+[00028.555] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 187 17.121 main: F1w1 1000b 10 (810) 0'
+[00028.565] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 188 17.121 main: F1w1 1000c 18 (c18) 0'
+[00028.575] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 189 17.121 main: F1r4 a800 0 (0) 0'
+[00028.585] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 190 17.121 main: F1w4 a408 23 (c498) 0'
+[00028.595] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 191 17.121 main: F1r4 a408 23 (c498) 0'
+[00028.605] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 192 17.121 main: F1w4 a800 1 (cc88) 0'
+[00028.615] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 193 17.121 main: F1r4 a800 1 (cc88) 0'
+[00028.625] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 194 17.121 main: F1w4 a408 3 (5598) 0'
+[00028.635] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 195 17.121 main: F1r4 a408 3 (5598) 0'
+[00028.645] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 196 17.121 main: F1r4 a800 1 (cc88) 0'
+[00028.656] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 197 17.121 main: F1w4 a800 0 (0) 0'
+[00028.666] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 198 17.121 main: F1r4 a800 0 (0) 0'
+[00028.676] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 199 17.121 main: F1w4 a408 1 (cc88) 0'
+[00028.686] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 200 17.121 main: F1r4 a408 1 (cc88) 0'
+[00028.696] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 201 17.121 main: F1w1 1000e 0 (0) 0'
+[00028.706] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 202 17.321 main: F1w1 1000e 10 (810) 0'
+[00028.716] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 203 17.321 main: F1r1 1000e d0 (68d0) 0'
+[00028.726] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 204 17.321 main: F1r1 1000e d0 (68d0) 0'
+[00028.736] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 205 17.321 main: F1w1 1000e d2 (69d2) 0'
+[00028.746] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 206 17.321 main: F1w1 1000a 0 (0) 0'
+[00028.756] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 207 17.321 main: F1w1 1000b 0 (0) 0'
+[00028.766] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 208 17.321 main: F1w1 1000c 18 (c18) 0'
+[00028.776] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 209 17.321 main: F1w4 d048 40000 (4488) 0'
+[00028.786] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 210 17.331 main: F1w4 d024 200000f0 (2fa0) 0'
+[00028.796] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 211 17.331 main: F1w1 10008 8 (408) 0'
+[00028.806] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 212 17.331 main: F1w4 8650 3 (5598) 0'
+[00028.816] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 213 17.332 main: F1r4 8654 f012c37 (c025) 0'
+[00028.826] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 214 17.432 main: F1r1 1001e 0 (0) 0'
+[00028.836] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 215 17.432 main: F1w1 1001e 2 (102) 0'
+[00028.846] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 216 17.432 main: F0w1 f0 6 (306) 0'
+[00028.856] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 217 17.432 main: F1w1 1000e 2 (102) 0'
+[00028.866] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 218 17.532 main: F1w1 1000a 80 (4080) 0'
+[00028.876] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 219 17.532 main: F1w1 1000b 23 (11a3) 0'
+[00028.886] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 220 17.532 main: F1w1 1000c 0 (0) 0'
+[00028.896] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 221 17.532 main: F1r4 fffc 1d9480 (f0ca) 0'
+[00028.906] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 222 17.532 main: F1w1 1000a 80 (4080) 0'
+[00028.916] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 223 17.532 main: F1w1 1000b 1d (e9d) 0'
+[00028.926] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 224 17.532 main: F1w1 1000c 0 (0) 0'
+[00028.936] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 225 17.532 main: F1r64 9480 1 (6240) 0'
+[00028.946] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 226 17.532 main: F1w1 1000a 80 (4080) 0'
+[00028.956] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 227 17.532 main: F1w1 1000b 23 (11a3) 0'
+[00028.966] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 228 17.532 main: F1w1 1000c 0 (0) 0'
+[00028.976] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 229 17.532 main: F1r24 dec4 4000023dab4 (1880) 0'
+[00028.986] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 230 17.532 main: F1r76 dab4 615f6d7261646e68 (96ce) 0'
+[00028.996] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 231 17.532 main: F1r256 db00 2e35332e37202943 (210) 0'
+[00029.006] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 232 17.532 main: F1r256 dc00 77203735302e3030 (0) 0'
+[00029.016] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 233 17.532 main: F1r256 dd00 0 (0) 0'
+[00029.026] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 234 17.532 main: F1r180 de00 0 (0) 0'
+[00029.036] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 235 17.532 main: F11w4 ffff 0 (0) 0'
+[00029.046] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 236 17.633 main: F15w4 ffff 0 (0) 0'
+[00029.056] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 237 17.633 main: F16w4 ffff 0 (0) 0'
+[00029.066] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 238 17.633 main: F17w4 ffff 0 (0) 0'
+[00029.076] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 239 17.633 main: F0r1 4 0 (0) 0'
+[00029.086] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 240 17.633 main: F18w4 ffff 0 (0) 0'
+[00029.096] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 241 17.633 main: F0w1 4 7 (387) 0'
+[00029.106] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 242 17.633 main: F0w1 f2 7 (387) 0'
+[00029.116] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 243 17.733 main: F12w4 ffff 0 (0) 0'
+[00029.126] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 244 17.733 main: F13w4 ffff 0 (0) 0'
+[00029.136] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 245 17.733 intr: F1w1 1000a 0 (0) 0'
+[00029.146] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 246 17.733 intr: F1w1 1000b 0 (0) 0'
+[00029.156] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 247 17.733 intr: F1w1 1000c 18 (c18) 0'
+[00029.166] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 248 17.733 intr: F1r4 d020 8000c0 (f700) 0'
+[00029.176] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 249 17.733 intr: F1w4 d020 c0 (6600) 0'
+[00029.186] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 250 17.733 intr: F1r4 d04c 40008 (20c8) 231'
+[00029.196] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 251 17.733 intr: F1w4 d040 2 (9910) 3516'
+[00029.206] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 252 17.734 intr: F1w1 1000a 80 (4080) 233'
+[00029.216] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 253 17.734 intr: F1w1 1000b 23 (11a3) 233'
+[00029.226] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 254 17.734 intr: F1w1 1000c 0 (0) 233'
+[00029.236] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 255 17.734 intr: F1r4 fffc 1d9480 (f0ca) 233'
+[00029.246] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 256 17.734 intr: F1w1 1000a 80 (4080) 233'
+[00029.256] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 257 17.734 intr: F1w1 1000b 1d (e9d) 233'
+[00029.266] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 258 17.734 intr: F1w1 1000c 0 (0) 233'
+[00029.276] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 259 17.734 intr: F1r64 9480 1 (6240) 233'
+[00029.286] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 260 17.734 intr: F1w1 1000a 0 (0) 26'
+[00029.296] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 261 17.734 intr: F1w1 1000b 0 (0) 26'
+[00029.306] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 262 17.734 intr: F1w1 1000c 18 (c18) 26'
+[00029.316] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 263 17.734 intr: F2r64f 8000 c000100fff3000c (0) 26'
+[00029.326] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 264 17.736 intr: F2r0f 8000 0 (0) 26'
+[00029.337] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 265 17.736 intr: F2r64f 8000 c000101fff3000c (0) 26'
+[00029.347] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 266 17.738 intr: F2r0f 8000 0 (0) 26'
+[00029.357] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 267 17.738 intr: F2r64f 8000 0 (0) 26'
+[00029.367] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 268 17.935 work: F2w48 8000 c0000ffffcf0030 (c100) 28'
+[00029.377] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 269 20.436 main: F1w1 1000a 80 (4080) 0'
+[00029.387] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 270 20.436 main: F1w1 1000b 23 (11a3) 0'
+[00029.397] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 271 20.436 main: F1w1 1000c 0 (0) 0'
+[00029.407] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 272 20.436 main: F1r4 fffc 1d9480 (f0ca) 0'
+[00029.417] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 273 20.436 main: F1w1 1000a 80 (4080) 0'
+[00029.427] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 274 20.436 main: F1w1 1000b 1d (e9d) 0'
+[00029.437] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 275 20.436 main: F1w1 1000c 0 (0) 0'
+[00029.447] 02954.05148> brcmfmac 0x24a67fa4b000 (pr)(2): 'sdio 276 20.436 main: F1r64 9480 1 (6240) 0'
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/fwil.c b/drivers/wlan/third_party/broadcom/brcmfmac/fwil.c
index 28356a8..a5fd0d05 100644
--- a/drivers/wlan/third_party/broadcom/brcmfmac/fwil.c
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/fwil.c
@@ -155,7 +155,7 @@
mtx_lock(&ifp->drvr->proto_block);
err = brcmf_fil_cmd_data(ifp, cmd, data, len, false);
- brcmf_dbg(FIL, "ifidx=%d, cmd=%d, len=%d\n", ifp->ifidx, cmd, len);
+ // brcmf_dbg(FIL, "ifidx=%d, cmd=%d, len=%d\n", ifp->ifidx, cmd, len);
//brcmf_dbg_hex_dump(BRCMF_FIL_ON(), data, min_t(uint, len, MAX_HEX_DUMP_LEN), "data\n");
mtx_unlock(&ifp->drvr->proto_block);
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/linux.print b/drivers/wlan/third_party/broadcom/brcmfmac/linux.print
new file mode 100644
index 0000000..4f68e94
--- /dev/null
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/linux.print
@@ -0,0 +1,508 @@
+
+Ubuntu 16.04.5 LTS Khadas ttyAML0
+
+Khadas login: [ 33.249643] brcmfmac: brcmf_driver_register: 15 seconds...
+khadas
+Password:
+Last login: Sun Sep 9 17:50:08 CST 2018 on ttyAML0
+
+Welcome to Fenix 0.3 Ubuntu 16.04.5 LTS Linux 4.17.3
+ _ ___ _ __ _____ __ __ ____
+| |/ / |__ __ _ __| | __ _ ___ \ \ / /_ _| \/ |___ \
+| ' /| '_ \ / _` |/ _` |/ _` / __| \ \ / / | || |\/| | __) |
+| . \| | | | (_| | (_| | (_| \__ \ \ V / | || | | |/ __/
+|_|\_\_| |_|\__,_|\__,_|\__,_|___/ \_/ |___|_| |_|_____|
+
+
+ * Website: https://www.khadas.com
+ * Documentation: https://docs.khadas.com
+ * Forum: https://forum.khadas.com
+
+khadas@Khadas:~$ sudo sysctl -w net.core.message_cost=0[ 38.373738] brcmfmac: brcmf_driver_register: 10 seconds...
+
+[sudo] password for khadas:
+net.core.message_cost = 0
+khadas@Khadas:~$ [ 43.490267] brcmfmac: brcmf_driver_register: 5 seconds...
+[ 48.610311] brcmfmac: brcmf_driver_register: Here we go!
+[ 48.611366] brcmfmac: brcmf_sdio_probe: cphoenix got here
+[ 48.616193] brcmfmac: brcmf_sdio_probe_attach: cphoenix got here
+[ 48.621433] brcmfmac: brcmf_sdio_probe_attach: * * * * About to run_sdio_test * * *
+[ 48.629071] brcmfmac: brcmf_sdio_probe_attach: * * * * Did run_sdio_test * * *
+[ 48.636612] brcmfmac: brcmf_sdio_probe_attach: F1 signature read @0x18000000=0x17224356
+[ 48.644146] brcmfmac: brcmf_chip_attach: Enter cphoenix Wed
+[ 48.649638] brcmfmac: brcmf_chip_attach: Enter cphoenix Wed2
+[ 48.655241] brcmfmac: brcmf_chip_attach: Enter cphoenix Wed3
+[ 48.660830] brcmfmac: brcmf_chip_attach: Enter cphoenix Wed4
+[ 48.666437] brcmfmac: brcmf_chip_attach: Enter cphoenix Wed5
+[ 48.672053] brcmfmac: brcmf_chip_attach: Enter cphoenix Wed6, ptr 00000000a98b9780
+[ 48.679562] brcmfmac: brcmf_chip_attach: Enter cphoenix Wed7
+[ 48.685162] brcmfmac: brcmf_chip_attach: Pre-prepare
+[ 48.690070] brcmfmac: brcmf_sdio_buscoreprep: Enter
+[ 48.695038] brcmfmac: brcmf_sdio_buscoreprep: Exit
+[ 48.699646] brcmfmac: brcmf_chip_attach: Post-prepare, err 0
+[ 48.707293] brcmfmac: brcmf_chip_attach: Post-recognition, err 0
+[ 48.711231] brcmfmac: brcmf_chip_attach: Post-setup, err 0
+[ 48.716636] brcmfmac: brcmf_chip_attach: Exit
+[ 48.720973] brcmfmac: brcmf_sdio_probe_attach: SDIO core: id 2089, rev 21, base 0x18005000
+[ 48.729169] brcmfmac: brcmf_sdio_kso_init: Enter
+[ 48.733742] brcmfmac: brcmf_sdio_kso_init: Exit
+[ 48.738199] brcmfmac: brcmf_sdio_drivestrengthinit: Enter
+[ 48.743853] brcmfmac: brcmf_sdio_probe: About to prepare_fw_request
+[ 48.749761] brcmfmac: brcmf_sdio_prepare_fw_request: Enter
+[ 48.755191] brcmfmac: brcmf_fw_alloc_request: Enter
+[ 48.760039] brcmfmac: brcmf_sdio_probe: Did prepare_fw_request
+[ 48.797794] brcmfmac: brcmf_fw_request_nvram_done: fw->data found, size 2844, raw 0
+[ 48.801491] brcmfmac: brcmf_sdio_firmware_callback: Enter: dev=mmc2:0001:1, err=0
+[ 48.807280] brcmfmac: brcmf_sdio_firmware_callback: fw->nvram found, size 2644
+[ 48.814462] brcmfmac: brcmf_sdio_firmware_callback: Into download_firmware
+[ 48.821250] brcmfmac: brcmf_sdio_download_firmware: Got here
+[ 48.826864] brcmfmac: brcmf_sdio_download_firmware: Got here
+[ 48.832461] brcmfmac: brcmf_sdio_htclk: Enter, on 1, pendok 0, sr 0, alp 1
+[ 48.839371] brcmfmac: brcmf_sdio_htclk: CLKCTL: turned ON
+[ 48.844642] brcmfmac: brcmf_sdio_htclk: Exit
+[ 48.848849] brcmfmac: brcmf_sdio_download_firmware: Got here
+[ 48.854454] brcmfmac: brcmf_sdio_download_firmware: firmware rstvec: b83ef180
+[ 48.886095] brcmfmac: brcmf_sdio_verifymemory: Compare RAM dl & ul at 0x00180000; size=555412
+[ 48.928186] brcmfmac: brcmf_sdio_verifymemory: Compare RAM dl & ul at 0x0023f5ac; size=2644
+[ 48.931141] brcmfmac: brcmf_sdio_buscore_activate: Enter, rstvec 0xb83ef180
+[ 48.938059] brcmfmac: brcmf_sdio_buscore_activate: Exit
+[ 48.943436] brcmfmac: brcmf_sdio_htclk: Enter, on 0, pendok 0, sr 0, alp 1
+[ 48.949923] brcmfmac: brcmf_sdio_htclk: Exit
+[ 48.954076] brcmfmac: brcmf_sdio_download_firmware: Doing release_host
+[ 48.960505] brcmfmac: brcmf_sdio_firmware_callback: Back from download_firmware
+[ 48.967744] brcmfmac: brcmf_sdio_htclk: Enter, on 1, pendok 0, sr 0, alp 0
+[ 48.974609] brcmfmac: brcmf_sdio_htclk: CLKCTL: turned ON
+[ 48.979911] brcmfmac: brcmf_sdio_htclk: Exit
+[ 49.008291] brcmfmac: brcmf_bus_change_state: 0 -> 1
+[ 49.008326] brcmfmac: brcmf_sdiod_intr_register: Enter
+[ 49.014188] brcmfmac: brcmf_add_if: Enter, bsscfgidx=0, ifidx=0
+[ 49.014930] brcmfmac: brcmf_sdio_intr_rstatus: core->base 0x18005000, SD_REG(int) 0x20
+[ 49.018656] brcmfmac: brcmf_add_if: ==== pid:98, if:wlan%d (00:00:00:00:00:00) created ===
+[ 49.018663] brcmfmac: brcmf_bus_change_state: 0 -> 1
+[ 49.018674] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=bus:txglomalign, len=4
+[ 49.018681] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 20 ifidx 0
+[ 49.018693] brcmfmac: brcmf_hexdump: set dcmd 0: 62 75 73 3a 74 78 67 6c 6f 6d 61 6c 69 67 6e 00 08 00 00 00
+[ 49.064680] brcmfmac: brcmf_sdio_intr_rstatus: times 1, val 8000c0, intmask 200000f0
+[ 49.072710] brcmfmac: brcmf_sdio_hostmail: Enter
+[ 49.078300] brcmfmac: brcmf_sdio_intr_rstatus: core->base 0x18005000, SD_REG(int) 0x20
+[ 49.084660] brcmfmac: brcmf_sdio_intr_rstatus: times 2, val 8000c0, intmask 200000f0
+[ 49.092401] brcmfmac: brcmf_sdio_hostmail: Enter
+[ 49.097440] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=bus:rxglom, len=4
+[ 49.104175] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 15 ifidx 0
+[ 49.111351] brcmfmac: brcmf_hexdump: set dcmd 0: 62 75 73 3a 72 78 67 6c 6f 6d 00 01 00 00 00
+[ 49.130581] brcmfmac: brcmf_sdio_intr_rstatus: core->base 0x18005000, SD_REG(int) 0x20
+[ 49.132929] brcmfmac: brcmf_sdio_intr_rstatus: times 3, val 800040, intmask 200000f0
+[ 49.141764] brcmfmac: brcmf_c_preinit_dcmds: Enter
+[ 49.150227] brcmfmac: brcmf_sdio_intr_rstatus: core->base 0x18005000, SD_REG(int) 0x20
+[ 49.153157] brcmfmac: brcmf_sdio_intr_rstatus: times 4, val 800040, intmask 200000f0
+[ 49.162207] brcmfmac: brcmf_sdio_intr_rstatus: core->base 0x18005000, SD_REG(int) 0x20
+[ 49.168702] brcmfmac: brcmf_sdio_intr_rstatus: times 5, val 800040, intmask 200000f0
+[ 49.178297] brcmfmac: brcmf_sdio_get_fwname: Enter
+[ 49.181156] brcmfmac: brcmf_fw_alloc_request: Enter
+[ 49.198312] brcmfmac: brcmf_sdio_intr_rstatus: core->base 0x18005000, SD_REG(int) 0x20
+[ 49.200610] brcmfmac: brcmf_sdio_intr_rstatus: times 6, val 800040, intmask 200000f0
+[ 49.214425] brcmfmac: brcmf_sdio_intr_rstatus: core->base 0x18005000, SD_REG(int) 0x20
+[ 49.216688] brcmfmac: brcmf_sdio_intr_rstatus: times 7, val 800040, intmask 200000f0
+[ 49.224597] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=mpc, len=4
+[ 49.231059] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 8 ifidx 0
+[ 49.238131] brcmfmac: brcmf_hexdump: set dcmd 0: 6d 70 63 00 01 00 00 00
+[ 49.246288] brcmfmac: brcmf_sdio_intr_rstatus: core->base 0x18005000, SD_REG(int) 0x20
+[ 49.253042] brcmfmac: brcmf_sdio_intr_rstatus: times 8, val 800040, intmask 200000f0
+[ 49.261763] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=join_pref, len=8
+[ 49.267920] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 18 ifidx 0
+[ 49.275297] brcmfmac: brcmf_hexdump: set dcmd 0: 6a 6f 69 6e 5f 70 72 65 66 00 04 02 08 01 01 02 00 00
+[ 49.286768] brcmfmac: brcmf_sdio_intr_rstatus: core->base 0x18005000, SD_REG(int) 0x20
+[ 49.292512] brcmfmac: brcmf_sdio_intr_rstatus: times 9, val 800040, intmask 200000f0
+[ 49.306483] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=event_msgs, len=18
+[ 49.308259] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 29 ifidx 0
+[ 49.315583] brcmfmac: brcmf_hexdump: set dcmd 0: 65 76 65 6e 74 5f 6d 73 67 73 00 00 00 00 00 00 00 40 00 00 04 00 00 00 00 00 80 00 00
+[ 49.330776] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 185 len 4 ifidx 0
+[ 49.334911] brcmfmac: brcmf_hexdump: set dcmd 0: 28 00 00 00
+[ 49.351102] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 187 len 4 ifidx 0
+[ 49.352633] brcmfmac: brcmf_hexdump: set dcmd 0: 28 00 00 00
+[ 49.370802] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=txbf, len=4
+[ 49.371962] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 9 ifidx 0
+[ 49.379082] brcmfmac: brcmf_hexdump: set dcmd 0: 74 78 62 66 00 01 00 00 00
+[ 49.399662] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=pfn_gscan_cfg, len=18
+[ 49.401761] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 32 ifidx 0
+[ 49.408957] brcmfmac: brcmf_hexdump: set dcmd 0: 70 66 6e 5f 67 73 63 61 6e 5f 63 66 67 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+[ 50.524603] brcmfmac: brcmf_sdio_readframes: RXHEADER FAILED: -110
+[ 50.525224] brcmfmac: brcmf_sdio_rxfail: abort command, terminate frame, send NAK
+[ 50.533960] brcmfmac: brcmf_sdio_hostmail: Enter
+[ 50.690881] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=bw_cap, len=8
+[ 50.692240] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 15 ifidx 0
+[ 50.699569] brcmfmac: brcmf_hexdump: set dcmd 0: 62 77 5f 63 61 70 00 02 00 00 00 03 00 00 00
+[ 50.723730] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=obss_coex, len=4
+[ 50.725395] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 14 ifidx 0
+[ 50.732865] brcmfmac: brcmf_hexdump: set dcmd 0: 6f 62 73 73 5f 63 6f 65 78 00 ff ff ff ff
+[ 50.747161] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=event_msgs, len=18
+[ 50.748946] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 29 ifidx 0
+[ 50.756237] brcmfmac: brcmf_hexdump: set dcmd 0: 65 76 65 6e 74 5f 6d 73 67 73 00 61 15 0b 00 02 42 c0 10 60 09 00 00 00 00 00 00 00 00
+[ 50.783103] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=tdls_enable, len=4
+[ 50.784933] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 16 ifidx 0
+[ 50.792379] brcmfmac: brcmf_hexdump: set dcmd 0: 74 64 6c 73 5f 65 6e 61 62 6c 65 00 01 00 00 00
+[ 50.803221] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=event_msgs, len=18
+[ 50.808493] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 29 ifidx 0
+[ 50.815628] brcmfmac: brcmf_hexdump: set dcmd 0: 65 76 65 6e 74 5f 6d 73 67 73 00 61 15 0b 00 02 42 c0 10 60 09 00 10 00 00 00 00 00 00
+[ 50.848482] brcmfmac: brcmf_sdio_firmware_callback: aReading interrupt reg: 0x0
+[ 50.851301] brcmfmac: brcmf_sdio_firmware_callback: bReading interrupt reg: 0x800040
+[ 50.858983] brcmfmac: brcmf_sdio_firmware_callback: cReading interrupt reg: 0x0
+[ 50.865554] brcmfmac: brcmf_sdio_firmware_callback: dReading interrupt reg: 0x0
+[ 50.872971] brcmfmac: brcmf_sdio_firmware_callback: eReading interrupt reg: 0x0
+[ 50.958577] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 2 len 4 ifidx 0
+[ 50.959893] brcmfmac: brcmf_hexdump: set dcmd 0: 00 00 00 00
+[ 51.007476] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 185 len 4 ifidx 0
+[ 51.007996] brcmfmac: brcmf_add_if: Enter, bsscfgidx=0, ifidx=0
+[ 51.009023] brcmfmac: brcmf_hexdump: set dcmd 0: 28 00 00 00
+[ 51.042535] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 187 len 4 ifidx 0
+[ 51.044062] brcmfmac: brcmf_hexdump: set dcmd 0: 28 00 00 00
+[ 51.062938] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 258 len 4 ifidx 0
+[ 51.064428] brcmfmac: brcmf_hexdump: set dcmd 0: 78 00 00 00
+[ 51.082366] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 86 len 4 ifidx 0
+[ 51.083761] brcmfmac: brcmf_hexdump: set dcmd 0: 02 00 00 00
+[ 51.090398] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=bcn_timeout, len=4
+[ 51.097075] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 16 ifidx 0
+[ 51.109397] brcmfmac: brcmf_hexdump: set dcmd 0: 62 63 6e 5f 74 69 6d 65 6f 75 74 00 02 00 00 00
+[ 51.130963] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=roam_off, len=4
+[ 51.132462] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 13 ifidx 0
+[ 51.139689] brcmfmac: brcmf_hexdump: set dcmd 0: 72 6f 61 6d 5f 6f 66 66 00 00 00 00 00
+[ 51.150345] brcmfmac: brcmf_fil_cmd_data_set: ifidx=0, cmd=55, len=8
+[ 51.160197] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 55 len 8 ifidx 0
+[ 51.167191] brcmfmac: brcmf_hexdump: set dcmd 0: b5 ff ff ff 03 00 00 00
+[ 51.186927] brcmfmac: brcmf_fil_cmd_data_set: ifidx=0, cmd=57, len=8
+[ 51.187640] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 57 len 8 ifidx 0
+[ 51.194676] brcmfmac: brcmf_hexdump: set dcmd 0: 14 00 00 00 03 00 00 00
+[ 51.206944] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 20 len 4 ifidx 0
+[ 51.214053] brcmfmac: brcmf_hexdump: set dcmd 0: 01 00 00 00
+[ 51.226840] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=arp_ol, len=4
+[ 51.232744] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 11 ifidx 0
+[ 51.239910] brcmfmac: brcmf_hexdump: set dcmd 0: 61 72 70 5f 6f 6c 00 09 00 00 00
+[ 51.262879] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=arpoe, len=4
+[ 51.264110] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 10 ifidx 0
+[ 51.271310] brcmfmac: brcmf_hexdump: set dcmd 0: 61 72 70 6f 65 00 01 00 00 00
+[ 51.299122] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=ndoe, len=4
+[ 51.300420] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 9 ifidx 0
+[ 51.307741] brcmfmac: brcmf_hexdump: set dcmd 0: 6e 64 6f 65 00 01 00 00 00
+[ 51.318342] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=mcast_list, len=4
+[ 51.327942] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 15 ifidx 0
+[ 51.327953] brcmfmac: brcmf_hexdump: set dcmd 0: 6d 63 61 73 74 5f 6c 69 73 74 00 00 00 00 00
+[ 51.338498] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=allmulti, len=4
+[ 51.338504] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 13 ifidx 0
+[ 51.338512] brcmfmac: brcmf_hexdump: set dcmd 0: 61 6c 6c 6d 75 6c 74 69 00 00 00 00 00
+[ 51.346845] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 10 len 4 ifidx 0
+[ 51.372347] brcmfmac: brcmf_hexdump: set dcmd 0: 00 00 00 00
+[ 51.402630] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 86 len 4 ifidx 0
+[ 51.405547] brcmfmac: brcmf_hexdump: set dcmd 0: 02 00 00 00
+[ 51.422908] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=arp_ol, len=4
+[ 51.425291] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 11 ifidx 0
+[ 51.432756] brcmfmac: brcmf_hexdump: set dcmd 0: 61 72 70 5f 6f 6c 00 09 00 00 00
+[ 51.444354] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=arpoe, len=4
+[ 51.453043] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 10 ifidx 0
+[ 51.460106] brcmfmac: brcmf_hexdump: set dcmd 0: 61 72 70 6f 65 00 01 00 00 00
+[ 51.478898] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=ndoe, len=4
+[ 51.480271] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 9 ifidx 0
+[ 51.487396] brcmfmac: brcmf_hexdump: set dcmd 0: 6e 64 6f 65 00 01 00 00 00
+[ 51.506673] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=mcast_list, len=10
+[ 51.508423] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 21 ifidx 0
+[ 51.515665] brcmfmac: brcmf_hexdump: set dcmd 0: 6d 63 61 73 74 5f 6c 69 73 74 00 01 00 00 00 01 00 5e 00 00 01
+[ 51.530654] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=allmulti, len=4
+[ 51.539006] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 13 ifidx 0
+[ 51.546131] brcmfmac: brcmf_hexdump: set dcmd 0: 61 6c 6c 6d 75 6c 74 69 00 00 00 00 00
+[ 51.575221] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 10 len 4 ifidx 0
+[ 51.576655] brcmfmac: brcmf_hexdump: set dcmd 0: 00 00 00 00
+[ 51.586578] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=arp_ol, len=4
+[ 51.595423] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 11 ifidx 0
+[ 51.602549] brcmfmac: brcmf_hexdump: set dcmd 0: 61 72 70 5f 6f 6c 00 09 00 00 00
+[ 51.614163] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=arpoe, len=4
+[ 51.622977] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 10 ifidx 0
+[ 51.630139] brcmfmac: brcmf_hexdump: set dcmd 0: 61 72 70 6f 65 00 01 00 00 00
+[ 51.654469] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=ndoe, len=4
+[ 51.655694] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 9 ifidx 0
+[ 51.662776] brcmfmac: brcmf_hexdump: set dcmd 0: 6e 64 6f 65 00 01 00 00 00
+[ 51.727293] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=pmkid_info, len=356
+[ 51.733627] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 367 ifidx 0
+[ 51.740811] brcmfmac: brcmf_hexdump: set dcmd 0: 70 6d 6b 69 64 5f 69 6e 66 6f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+[ 51.754008] brcmfmac: brcmf_hexdump: set dcmd 20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+[ 51.754024] brcmfmac: brcmf_hexdump: set dcmd 40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+[ 51.754059] brcmfmac: brcmf_hexdump: set dcmd 60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+[ 51.786241] brcmfmac: brcmf_hexdump: set dcmd 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+[ 51.786284] brcmfmac: brcmf_hexdump: set dcmd a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+[ 51.818252] brcmfmac: brcmf_hexdump: set dcmd c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+[ 51.850440] brcmfmac: brcmf_hexdump: set dcmd e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+[ 51.869333] brcmfmac: brcmf_hexdump: set dcmd 100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+[ 51.882506] brcmfmac: brcmf_hexdump: set dcmd 120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+[ 51.901644] brcmfmac: brcmf_hexdump: set dcmd 140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+[ 51.914848] brcmfmac: brcmf_hexdump: set dcmd 160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+[ 52.003940] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 3 len 4 ifidx 0
+[ 52.005282] brcmfmac: brcmf_hexdump: set dcmd 0: 01 00 00 00
+[ 52.030357] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=apsta, len=4
+[ 52.031612] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 10 ifidx 0
+[ 52.038821] brcmfmac: brcmf_hexdump: set dcmd 0: 61 70 73 74 61 00 01 00 00 00
+[ 52.067050] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 2 len 4 ifidx 0
+[ 52.068753] brcmfmac: brcmf_hexdump: set dcmd 0: 01 00 00 00
+[ 52.122590] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=p2p_disc, len=4
+[ 52.122894] brcmfmac: brcmf_add_if: Enter, bsscfgidx=0, ifidx=0
+[ 52.129586] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 13 ifidx 0
+[ 52.129677] brcmfmac: brcmf_hexdump: set dcmd 0: 70 32 70 5f 64 69 73 63 00 00 00 00 00
+[ 52.154754] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=p2p_da_override, len=6
+[ 52.164746] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 22 ifidx 0
+[ 52.171579] brcmfmac: brcmf_hexdump: set dcmd 0: 70 32 70 5f 64 61 5f 6f 76 65 72 72 69 64 65 00 4e 62 64 f2 46 fc
+[ 52.190014] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=p2p_disc, len=4
+[ 52.195203] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 13 ifidx 0
+[ 52.202398] brcmfmac: brcmf_hexdump: set dcmd 0: 70 32 70 5f 64 69 73 63 00 01 00 00 00
+[ 52.226167] brcmfmac: brcmf_add_if: Enter, bsscfgidx=1, ifidx=0
+[ 52.226448] brcmfmac: brcmf_add_if: ==== pid:35, if:wl0 (4e:62:64:f2:46:fc) created ===
+[ 52.273264] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=p2p_disc, len=4
+[ 52.274813] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 13 ifidx 0
+[ 52.281967] brcmfmac: brcmf_hexdump: set dcmd 0: 70 32 70 5f 64 69 73 63 00 01 00 00 00
+[ 52.315213] brcmfmac: brcmf_fil_bsscfg_data_set: ifidx=0, bsscfgidx=1, name=p2p_state, len=6
+[ 52.318176] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 27 ifidx 0
+[ 52.325310] brcmfmac: brcmf_hexdump: set dcmd 0: 62 73 73 63 66 67 3a 70 32 70 5f 73 74 61 74 65 00 01 00 00 00 00 a0 00 00 00 00
+[ 52.350058] brcmfmac: brcmf_fil_bsscfg_data_set: ifidx=0, bsscfgidx=1, name=wsec, len=4
+[ 52.352416] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 20 ifidx 0
+[ 52.359617] brcmfmac: brcmf_hexdump: set dcmd 0: 62 73 73 63 66 67 3a 77 73 65 63 00 01 00 00 00 04 00 00 00
+[ 52.395946] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=escan, len=180
+[ 52.400971] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 186 ifidx 0
+[ 52.408265] brcmfmac: brcmf_hexdump: set dcmd 0: 65 73 63 61 6e 00 01 00 00 00 01 00 34 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+[ 52.421338] brcmfmac: brcmf_hexdump: set dcmd 20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ff ff ff ff 02 00 ff ff ff ff ff ff
+[ 52.421364] brcmfmac: brcmf_hexdump: set dcmd 40: ff ff ff ff ff ff ff ff ff ff 24 00 01 00 01 10 02 10 03 10 04 10 05 10 06 10 07 10 08 10 09 10
+[ 52.421443] brcmfmac: brcmf_hexdump: set dcmd 60: 0a 10 0b 10 24 d0 28 d0 2c d0 30 d0 34 d0 38 d0 3c d0 40 d0 64 d0 68 d0 6c d0 70 d0 74 d0 78 d0
+[ 52.453618] brcmfmac: brcmf_hexdump: set dcmd 80: 7c d0 80 d0 84 d0 88 d0 8c d0 90 d0 95 d0 99 d0 9d d0 a1 d0 a5 d0 00 00 00 00 00 00 00 00 00 00
+[ 52.453633] brcmfmac: brcmf_hexdump: set dcmd a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+[ 53.050833] brcmfmac: brcmf_sdiod_sglist_rw: CMD53 sg block read failed -84
+[ 53.052185] brcmfmac: brcmf_sdio_rxglom: glom read of 1024 bytes failed: -5
+[ 54.076479] brcmfmac: brcmf_sdio_isr: failed backplane access
+[ 54.076775] brcmfmac: brcmf_sdio_rxfail: abort command, terminate frame
+[ 54.083957] brcmfmac: brcmf_sdio_readframes: brcmf_sdio_readframes: glom superframe w/o descriptor!
+[ 54.097611] brcmfmac: brcmf_sdio_rxfail: terminate frame
+[ 55.257795] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=escan, len=180
+[ 55.259204] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 186 ifidx 0
+[ 55.266519] brcmfmac: brcmf_hexdump: set dcmd 0: 65 73 63 61 6e 00 01 00 00 00 01 00 34 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+[ 55.285020] brcmfmac: brcmf_hexdump: set dcmd 20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ff ff ff ff 02 00 ff ff ff ff ff ff
+[ 55.298221] brcmfmac: brcmf_hexdump: set dcmd 40: ff ff ff ff ff ff ff ff ff ff 24 00 01 00 01 10 02 10 03 10 04 10 05 10 06 10 07 10 08 10 09 10
+[ 55.318574] brcmfmac: brcmf_hexdump: set dcmd 60: 0a 10 0b 10 24 d0 28 d0 2c d0 30 d0 34 d0 38 d0 3c d0 40 d0 64 d0 68 d0 6c d0 70 d0 74 d0 78 d0
+[ 55.331773] brcmfmac: brcmf_hexdump: set dcmd 80: 7c d0 80 d0 84 d0 88 d0 8c d0 90 d0 95 d0 99 d0 9d d0 a1 d0 a5 d0 00 00 00 00 00 00 00 00 00 00
+[ 55.350649] brcmfmac: brcmf_hexdump: set dcmd a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+[ 55.627606] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=mcast_list, len=10
+[ 55.632811] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 21 ifidx 0
+[ 55.639999] brcmfmac: brcmf_hexdump: set dcmd 0: 6d 63 61 73 74 5f 6c 69 73 74 00 01 00 00 00 01 00 5e 00 00 01
+[ 55.657784] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=allmulti, len=4
+[ 55.664608] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 13 ifidx 0
+[ 55.671791] brcmfmac: brcmf_hexdump: set dcmd 0: 61 6c 6c 6d 75 6c 74 69 00 00 00 00 00
+[ 55.694066] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 10 len 4 ifidx 0
+[ 55.695531] brcmfmac: brcmf_hexdump: set dcmd 0: 00 00 00 00
+[ 55.713985] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=arp_ol, len=4
+[ 55.715301] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 11 ifidx 0
+[ 55.722510] brcmfmac: brcmf_hexdump: set dcmd 0: 61 72 70 5f 6f 6c 00 09 00 00 00
+[ 55.734488] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=arpoe, len=4
+[ 55.742398] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 10 ifidx 0
+[ 55.749584] brcmfmac: brcmf_hexdump: set dcmd 0: 61 72 70 6f 65 00 01 00 00 00
+[ 55.770188] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=ndoe, len=4
+[ 55.771409] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 9 ifidx 0
+[ 55.778718] brcmfmac: brcmf_hexdump: set dcmd 0: 6e 64 6f 65 00 01 00 00 00
+[ 56.873440] brcmfmac: brcmf_sdio_readframes: RXHEADER FAILED: -110
+[ 56.877391] brcmfmac: brcmf_sdio_rxfail: abort command, terminate frame, send NAK
+[ 56.885342] brcmfmac: brcmf_sdio_hostmail: Enter
+[ 57.913582] brcmfmac: brcmf_sdio_readframes: read 432 bytes from channel 1 failed: -110
+[ 57.923217] brcmfmac: brcmf_sdio_rxfail: abort command, terminate frame, send NAK
+[ 57.933914] brcmfmac: brcmf_sdio_hostmail: Enter
+[ 57.943632] brcmfmac: brcmf_sdio_rxglom: descriptor len 4 bad: 0
+[ 57.948340] brcmfmac: brcmf_sdio_readframes: brcmf_sdio_readframes: glom superframe w/o descriptor!
+[ 57.957215] brcmfmac: brcmf_sdio_rxfail: terminate frame
+[ 57.963157] brcmfmac: brcmf_sdio_rxglom: descriptor len 6 bad: 0
+[ 57.975601] brcmfmac: brcmf_sdio_hdparse: HW header length too long
+[ 57.981735] brcmfmac: brcmf_sdio_rxfail: terminate frame
+[ 57.987440] brcmfmac: brcmf_sdio_rxglom: descriptor len 5 bad: 0
+[ 57.992955] brcmfmac: brcmf_sdio_readframes: RXHEADER FAILED: -84
+[ 57.998976] brcmfmac: brcmf_sdio_rxfail: abort command, terminate frame, send NAK
+[ 58.014082] brcmfmac: brcmf_sdio_hostmail: Enter
+[ 58.018190] brcmfmac: brcmf_sdio_hdparse: HW header length too long
+[ 58.024381] brcmfmac: brcmf_sdio_rxfail: terminate frame
+[ 58.030633] brcmfmac: brcmf_sdio_rxglom: descriptor len 6 bad: 0
+[ 58.042763] brcmfmac: brcmf_sdio_readframes: RXHEADER FAILED: -84
+[ 58.048800] brcmfmac: brcmf_sdio_rxfail: abort command, terminate frame, send NAK
+[ 58.056717] brcmfmac: brcmf_sdio_hostmail: Enter
+[ 58.068008] brcmfmac: brcmf_sdio_hdparse: HW header length too long
+[ 58.074156] brcmfmac: brcmf_sdio_rxfail: terminate frame
+[ 58.080188] brcmfmac: brcmf_sdio_rxglom: descriptor len 6 bad: 0
+[ 58.085375] brcmfmac: brcmf_sdio_hdparse: HW header length too long
+[ 58.098625] brcmfmac: brcmf_sdio_rxfail: terminate frame
+[ 58.104596] brcmfmac: brcmf_sdio_hdparse: HW superframe header length error
+[ 58.113454] brcmfmac: brcmf_sdio_rxfail: abort command, terminate frame
+[ 58.124595] brcmfmac: brcmf_sdio_readframes: RXHEADER FAILED: -84
+[ 58.130525] brcmfmac: brcmf_sdio_rxfail: abort command, terminate frame, send NAK
+[ 58.138487] brcmfmac: brcmf_sdio_hostmail: Enter
+[ 58.149957] brcmfmac: brcmf_sdio_readframes: brcmf_sdio_readframes: glom superframe w/o descriptor!
+[ 58.158630] brcmfmac: brcmf_sdio_rxfail: terminate frame
+[ 58.164488] brcmfmac: brcmf_sdio_rxglom: descriptor len 4 bad: 0
+[ 58.169959] brcmfmac: brcmf_sdio_readframes: brcmf_sdio_readframes: glom superframe w/o descriptor!
+[ 58.184511] brcmfmac: brcmf_sdio_rxfail: terminate frame
+[ 58.189891] brcmfmac: brcmf_sdio_rxglom: descriptor len 3 bad: 0
+[ 58.195927] brcmfmac: brcmf_sdio_readframes: brcmf_sdio_readframes: glom superframe w/o descriptor!
+[ 58.204702] brcmfmac: brcmf_sdio_rxfail: terminate frame
+[ 58.216196] brcmfmac: brcmf_sdio_rxglom: descriptor len 3 bad: 0
+[ 58.221670] brcmfmac: brcmf_sdio_hdparse: HW superframe header length error
+[ 58.228452] brcmfmac: brcmf_sdio_rxfail: abort command, terminate frame
+[ 58.235089] brcmfmac: brcmf_sdio_readframes: RXHEADER FAILED: -84
+[ 58.246334] brcmfmac: brcmf_sdio_rxfail: abort command, terminate frame, send NAK
+[ 58.254424] brcmfmac: brcmf_sdio_hostmail: Enter
+[ 58.258448] brcmfmac: brcmf_sdio_hdparse: HW header length too long
+[ 58.264534] brcmfmac: brcmf_sdio_rxfail: terminate frame
+[ 58.277139] brcmfmac: brcmf_sdio_hdparse: HW superframe header length error
+[ 58.283879] brcmfmac: brcmf_sdio_rxfail: abort command, terminate frame
+[ 58.290552] brcmfmac: brcmf_sdio_readframes: RXHEADER FAILED: -84
+[ 58.303599] brcmfmac: brcmf_sdio_rxfail: abort command, terminate frame, send NAK
+[ 58.311697] brcmfmac: brcmf_sdio_hostmail: Enter
+[ 58.315799] brcmfmac: brcmf_sdio_readframes: brcmf_sdio_readframes: glom superframe w/o descriptor!
+[ 58.324564] brcmfmac: brcmf_sdio_rxfail: terminate frame
+[ 58.356050] brcmfmac: brcmf_cfg80211_connect: Enter
+[ 58.356082] brcmfmac: brcmf_cfg80211_connect: ssid fx-netgear-2g
+[ 58.361899] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=wpaie, len=0
+[ 58.368688] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 6 ifidx 0
+[ 58.375756] brcmfmac: brcmf_hexdump: set dcmd 0: 77 70 61 69 65 00
+[ 58.393579] brcmfmac: brcmf_cfg80211_connect: Channel was 0
+[ 58.394853] brcmfmac: brcmf_cfg80211_connect: ie (000000003feee4af), ie_len (6)
+[ 58.402121] brcmfmac: brcmf_fil_bsscfg_data_set: ifidx=0, bsscfgidx=0, name=wpa_auth, len=4
+[ 58.417551] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 13 ifidx 0
+[ 58.424730] brcmfmac: brcmf_hexdump: set dcmd 0: 77 70 61 5f 61 75 74 68 00 00 00 00 00
+[ 58.445589] brcmfmac: brcmf_fil_bsscfg_data_set: ifidx=0, bsscfgidx=0, name=auth, len=4
+[ 58.448070] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 9 ifidx 0
+[ 58.455173] brcmfmac: brcmf_hexdump: set dcmd 0: 61 75 74 68 00 00 00 00 00
+[ 58.465582] brcmfmac: brcmf_fil_bsscfg_data_set: ifidx=0, bsscfgidx=0, name=wsec, len=4
+[ 58.477549] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 9 ifidx 0
+[ 58.484602] brcmfmac: brcmf_hexdump: set dcmd 0: 77 73 65 63 00 00 00 00 00
+[ 58.501638] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 205 len 4 ifidx 0
+[ 58.505881] brcmfmac: brcmf_hexdump: set dcmd 0: 00 00 00 00
+[ 58.521674] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=join_pref, len=8
+[ 58.526200] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 18 ifidx 0
+[ 58.533350] brcmfmac: brcmf_hexdump: set dcmd 0: 6a 6f 69 6e 5f 70 72 65 66 00 04 02 08 01 01 02 00 00
+[ 58.545615] brcmfmac: brcmf_fil_bsscfg_data_set: ifidx=0, bsscfgidx=0, name=join, len=68
+[ 58.558093] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 73 ifidx 0
+[ 58.565282] brcmfmac: brcmf_hexdump: set dcmd 0: 6a 6f 69 6e 00 0d 00 00 00 66 78 2d 6e 65 74 67 65 61 72 2d 32 67 00 00 00 00 00 00 00 00 00 00
+[ 58.578447] brcmfmac: brcmf_hexdump: set dcmd 20: 00 00 00 00 00 00 00 00 00 ff 00 00 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
+[ 58.598792] brcmfmac: brcmf_hexdump: set dcmd 40: ff ff ff 00 00 00 00 00 00
+[ 61.438109] brcmfmac: brcmf_fil_cmd_data_set: ifidx=0, cmd=121, len=6
+[ 61.438948] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 121 len 6 ifidx 0
+[ 61.446273] brcmfmac: brcmf_hexdump: set dcmd 0: cc 40 d0 34 aa 78
+[ 61.461181] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=mcast_list, len=16
+[ 61.467051] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 27 ifidx 0
+[ 61.474207] brcmfmac: brcmf_hexdump: set dcmd 0: 6d 63 61 73 74 5f 6c 69 73 74 00 02 00 00 00 01 00 5e 00 00 01 33 33 00 00 00 01
+[ 61.502086] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=allmulti, len=4
+[ 61.503585] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 13 ifidx 0
+[ 61.510857] brcmfmac: brcmf_hexdump: set dcmd 0: 61 6c 6c 6d 75 6c 74 69 00 00 00 00 00
+[ 61.542048] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 10 len 4 ifidx 0
+[ 61.545864] brcmfmac: brcmf_hexdump: set dcmd 0: 00 00 00 00
+[ 61.566093] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=nd_hostip_clear, len=0
+[ 61.570517] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 16 ifidx 0
+[ 61.577696] brcmfmac: brcmf_hexdump: set dcmd 0: 6e 64 5f 68 6f 73 74 69 70 5f 63 6c 65 61 72 00
+[ 61.601993] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=arp_ol, len=4
+[ 61.603317] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 11 ifidx 0
+[ 61.610951] brcmfmac: brcmf_hexdump: set dcmd 0: 61 72 70 5f 6f 6c 00 09 00 00 00
+[ 61.621978] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=arpoe, len=4
+[ 61.632270] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 10 ifidx 0
+[ 61.639399] brcmfmac: brcmf_hexdump: set dcmd 0: 61 72 70 6f 65 00 01 00 00 00
+[ 61.661992] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=ndoe, len=4
+[ 61.663147] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 9 ifidx 0
+[ 61.670276] brcmfmac: brcmf_hexdump: set dcmd 0: 6e 64 6f 65 00 01 00 00 00
+[ 61.681851] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=mcast_list, len=22
+[ 61.691805] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 33 ifidx 0
+[ 61.698893] brcmfmac: brcmf_hexdump: set dcmd 0: 6d 63 61 73 74 5f 6c 69 73 74 00 03 00 00 00 01 00 5e 00 00 01 33 33 00 00 00 01 33 33 ff be 03
+[ 61.712113] brcmfmac: brcmf_hexdump: set dcmd 20: 45
+[ 61.742775] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=allmulti, len=4
+[ 61.744380] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 13 ifidx 0
+[ 61.751904] brcmfmac: brcmf_hexdump: set dcmd 0: 61 6c 6c 6d 75 6c 74 69 00 00 00 00 00
+[ 61.762511] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 10 len 4 ifidx 0
+[ 61.772677] brcmfmac: brcmf_hexdump: set dcmd 0: 00 00 00 00
+[ 61.782182] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=arp_ol, len=4
+[ 61.785624] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 11 ifidx 0
+[ 61.799866] brcmfmac: brcmf_hexdump: set dcmd 0: 61 72 70 5f 6f 6c 00 09 00 00 00
+[ 61.822081] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=arpoe, len=4
+[ 61.823347] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 10 ifidx 0
+[ 61.830570] brcmfmac: brcmf_hexdump: set dcmd 0: 61 72 70 6f 65 00 01 00 00 00
+[ 61.841891] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=ndoe, len=4
+[ 61.851976] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 9 ifidx 0
+[ 61.858982] brcmfmac: brcmf_hexdump: set dcmd 0: 6e 64 6f 65 00 01 00 00 00
+[ 63.141305] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=mcast_list, len=28
+[ 63.143091] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 39 ifidx 0
+[ 63.150285] brcmfmac: brcmf_hexdump: set dcmd 0: 6d 63 61 73 74 5f 6c 69 73 74 00 04 00 00 00 01 00 5e 00 00 01 33 33 00 00 00 01 33 33 ff be 03
+[ 63.168712] brcmfmac: brcmf_hexdump: set dcmd 20: 45 33 33 00 00 00 fb
+[ 63.182138] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=allmulti, len=4
+[ 63.187851] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 13 ifidx 0
+[ 63.195019] brcmfmac: brcmf_hexdump: set dcmd 0: 61 6c 6c 6d 75 6c 74 69 00 00 00 00 00
+[ 63.218752] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 10 len 4 ifidx 0
+[ 63.220260] brcmfmac: brcmf_hexdump: set dcmd 0: 00 00 00 00
+[ 63.237364] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=arp_ol, len=4
+[ 63.238684] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 11 ifidx 0
+[ 63.245958] brcmfmac: brcmf_hexdump: set dcmd 0: 61 72 70 5f 6f 6c 00 09 00 00 00
+[ 63.257379] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=arpoe, len=4
+[ 63.266563] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 10 ifidx 0
+[ 63.273731] brcmfmac: brcmf_hexdump: set dcmd 0: 61 72 70 6f 65 00 01 00 00 00
+[ 63.297453] brcmfmac: brcmf_sdio_intr_rstatus: core->base 0x18005000, SD_REG(int) 0x20
+[ 63.299744] brcmfmac: brcmf_sdio_intr_rstatus: times 256, val c00040, intmask 200000f0
+[ 63.308239] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=ndoe, len=4
+[ 63.319687] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 9 ifidx 0
+[ 63.326781] brcmfmac: brcmf_hexdump: set dcmd 0: 6e 64 6f 65 00 01 00 00 00
+[ 63.445754] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=arp_hostip, len=4
+[ 63.447425] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 15 ifidx 0
+[ 63.454662] brcmfmac: brcmf_hexdump: set dcmd 0: 61 72 70 5f 68 6f 73 74 69 70 00 0a 00 00 0a
+[ 63.472289] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=mcast_list, len=34
+[ 63.476473] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 45 ifidx 0
+[ 63.483610] brcmfmac: brcmf_hexdump: set dcmd 0: 6d 63 61 73 74 5f 6c 69 73 74 00 05 00 00 00 01 00 5e 00 00 01 33 33 00 00 00 01 33 33 ff be 03
+[ 63.496721] brcmfmac: brcmf_hexdump: set dcmd 20: 45 33 33 00 00 00 fb 01 00 5e 00 00 fb
+[ 63.530607] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=allmulti, len=4
+[ 63.532192] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 13 ifidx 0
+[ 63.539687] brcmfmac: brcmf_hexdump: set dcmd 0: 61 6c 6c 6d 75 6c 74 69 00 00 00 00 00
+[ 63.561540] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 10 len 4 ifidx 0
+[ 63.562973] brcmfmac: brcmf_hexdump: set dcmd 0: 00 00 00 00
+[ 63.573390] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=arp_ol, len=4
+[ 63.581359] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 11 ifidx 0
+[ 63.588519] brcmfmac: brcmf_hexdump: set dcmd 0: 61 72 70 5f 6f 6c 00 09 00 00 00
+[ 63.609614] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=arpoe, len=4
+[ 63.610926] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 10 ifidx 0
+[ 63.618353] brcmfmac: brcmf_hexdump: set dcmd 0: 61 72 70 6f 65 00 01 00 00 00
+[ 63.637886] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=ndoe, len=4
+[ 63.639046] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 9 ifidx 0
+[ 63.646203] brcmfmac: brcmf_hexdump: set dcmd 0: 6e 64 6f 65 00 01 00 00 00
+[ 79.018195] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=escan, len=180
+[ 79.019639] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 186 ifidx 0
+[ 79.027185] brcmfmac: brcmf_hexdump: set dcmd 0: 65 73 63 61 6e 00 01 00 00 00 01 00 34 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+[ 79.040131] brcmfmac: brcmf_hexdump: set dcmd 20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ff ff ff ff 02 00 ff ff ff ff ff ff
+[ 79.053308] brcmfmac: brcmf_hexdump: set dcmd 40: ff ff ff ff ff ff ff ff ff ff 24 00 01 00 01 10 02 10 03 10 04 10 05 10 06 10 07 10 08 10 09 10
+[ 79.066479] brcmfmac: brcmf_hexdump: set dcmd 60: 0a 10 0b 10 24 d0 28 d0 2c d0 30 d0 34 d0 38 d0 3c d0 40 d0 64 d0 68 d0 6c d0 70 d0 74 d0 78 d0
+[ 79.079695] brcmfmac: brcmf_hexdump: set dcmd 80: 7c d0 80 d0 84 d0 88 d0 8c d0 90 d0 95 d0 99 d0 9d d0 a1 d0 a5 d0 00 00 00 00 00 00 00 00 00 00
+[ 79.092885] brcmfmac: brcmf_hexdump: set dcmd a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+[ 79.841830] brcmfmac: brcmf_sdiod_sglist_rw: CMD53 sg block read failed -84
+[ 79.843254] brcmfmac: brcmf_sdio_rxglom: glom read of 1024 bytes failed: -5
+[ 79.850138] brcmfmac: brcmf_sdio_rxfail: abort command, terminate frame
+[ 79.857221] brcmfmac: brcmf_sdio_hdparse: Wrong channel for subframe
+[ 79.863040] brcmfmac: brcmf_sdio_rxfail: abort command, terminate frame
+[ 82.857197] brcmfmac: brcmf_sdiod_sglist_rw: CMD53 sg block read failed -84
+[ 82.858546] brcmfmac: brcmf_sdio_rxglom: glom read of 2560 bytes failed: -5
+[ 83.887567] brcmfmac: brcmf_sdio_isr: failed backplane access
+[ 83.887926] brcmfmac: brcmf_sdio_rxfail: abort command, terminate frame
+[ 83.895294] brcmfmac: brcmf_sdio_hdparse: HW header length too long
+[ 83.900570] brcmfmac: brcmf_sdio_rxfail: terminate frame
+[ 83.906597] brcmfmac: brcmf_sdio_rxglom: descriptor len 4 bad: 0
+[ 83.911971] brcmfmac: brcmf_sdio_readframes: brcmf_sdio_readframes: glom superframe w/o descriptor!
+[ 83.920710] brcmfmac: brcmf_sdio_rxfail: terminate frame
+[ 122.040684] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=escan, len=180
+[ 122.042313] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 186 ifidx 0
+[ 122.049429] brcmfmac: brcmf_hexdump: set dcmd 0: 65 73 63 61 6e 00 01 00 00 00 01 00 34 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+[ 122.062573] brcmfmac: brcmf_hexdump: set dcmd 20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ff ff ff ff 02 00 ff ff ff ff ff ff
+[ 122.075767] brcmfmac: brcmf_hexdump: set dcmd 40: ff ff ff ff ff ff ff ff ff ff 24 00 01 00 01 10 02 10 03 10 04 10 05 10 06 10 07 10 08 10 09 10
+[ 122.088997] brcmfmac: brcmf_hexdump: set dcmd 60: 0a 10 0b 10 24 d0 28 d0 2c d0 30 d0 34 d0 38 d0 3c d0 40 d0 64 d0 68 d0 6c d0 70 d0 74 d0 78 d0
+[ 122.102178] brcmfmac: brcmf_hexdump: set dcmd 80: 7c d0 80 d0 84 d0 88 d0 8c d0 90 d0 95 d0 99 d0 9d d0 a1 d0 a5 d0 00 00 00 00 00 00 00 00 00 00
+[ 122.115380] brcmfmac: brcmf_hexdump: set dcmd a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+[ 122.750537] brcmfmac: brcmf_sdio_readframes: RXHEADER FAILED: -84
+[ 122.751085] brcmfmac: brcmf_sdio_rxfail: abort command, terminate frame, send NAK
+[ 122.760338] brcmfmac: brcmf_sdio_hostmail: Enter
+[ 185.019997] brcmfmac: brcmf_fil_iovar_data_set: ifidx=0, name=escan, len=180
+[ 185.021421] brcmfmac: brcmf_proto_bcdc_set_dcmd: Enter, cmd 263 len 186 ifidx 0
+[ 185.028944] brcmfmac: brcmf_hexdump: set dcmd 0: 65 73 63 61 6e 00 01 00 00 00 01 00 34 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+[ 185.042012] brcmfmac: brcmf_hexdump: set dcmd 20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ff ff ff ff 02 00 ff ff ff ff ff ff
+[ 185.055080] brcmfmac: brcmf_hexdump: set dcmd 40: ff ff ff ff ff ff ff ff ff ff 24 00 01 00 01 10 02 10 03 10 04 10 05 10 06 10 07 10 08 10 09 10
+[ 185.068280] brcmfmac: brcmf_hexdump: set dcmd 60: 0a 10 0b 10 24 d0 28 d0 2c d0 30 d0 34 d0 38 d0 3c d0 40 d0 64 d0 68 d0 6c d0 70 d0 74 d0 78 d0
+[ 185.081514] brcmfmac: brcmf_hexdump: set dcmd 80: 7c d0 80 d0 84 d0 88 d0 8c d0 90 d0 95 d0 99 d0 9d d0 a1 d0 a5 d0 00 00 00 00 00 00 00 00 00 00
+[ 185.094685] brcmfmac: brcmf_hexdump: set dcmd a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+[ 185.847073] brcmfmac: brcmf_sdio_intr_rstatus: core->base 0x18005000, SD_REG(int) 0x20
+[ 185.849438] brcmfmac: brcmf_sdio_intr_rstatus: times 512, val c00040, intmask 200000f0
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/linux.psr b/drivers/wlan/third_party/broadcom/brcmfmac/linux.psr
new file mode 100644
index 0000000..ff61e73
--- /dev/null
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/linux.psr
@@ -0,0 +1,630 @@
+[ 50.879615] brcmfmac: psr: Dumping 1026 sdio records
+[ 50.884546] brcmfmac: psr: sdio 0 53: F1w1 1000a 0 (0)
+[ 50.906164] brcmfmac: psr: sdio 1 53: F1w1 1000b 0 (0)
+[ 50.925980] brcmfmac: psr: sdio 2 53: F1w1 1000c 18 (c18)
+[ 50.946535] brcmfmac: psr: sdio 3 53: F1r4 8000 17224356 (c72f)
+[ 50.969990] brcmfmac: psr: sdio 4 53: F1w1 1000e 28 (1428)
+[ 50.990036] brcmfmac: psr: sdio 5 53: F1r1 1000e e8 (74e8)
+[ 51.010003] brcmfmac: psr: sdio 6 53: F1w1 1000e 28 (1428)
+[ 51.029968] brcmfmac: psr: sdio 7 53: F1r1 1000e e8 (74e8)
+[ 51.050000] brcmfmac: psr: sdio 8 53: F1r1 1000e e8 (74e8)
+[ 51.069963] brcmfmac: psr: sdio 9 53: F1w1 1000e 21 (10a1)
+[ 51.093971] brcmfmac: psr: sdio 10 53: F1w1 1000f 0 (0)
+[ 51.121941] brcmfmac: psr: sdio 11 53: F1r4 8000 17224356 (c72f)
+[ 51.141999] brcmfmac: psr: sdio 12 53: F1r4 80fc 1810d000 (fd78)
+[ 51.169972] brcmfmac: psr: sdio 13 53: F1w1 1000a 80 (4080)
+[ 51.197974] brcmfmac: psr: sdio 14 53: F1w1 1000b 10 (810)
+[ 51.225951] brcmfmac: psr: sdio 15 53: F1w1 1000c 18 (c18)
+[ 51.245945] brcmfmac: psr: sdio 16 53: F1r4 d000 4bf80001 (8fb3)
+[ 51.269940] brcmfmac: psr: sdio 17 53: F1r4 d004 2f084411 (3a7)
+[ 51.293924] brcmfmac: psr: sdio 18 53: F1r4 d008 3 (5598)
+[ 51.313951] brcmfmac: psr: sdio 19 53: F1r4 d00c 18000005 (f2b0)
+[ 51.337933] brcmfmac: psr: sdio 20 53: F1r4 d010 1c000135 (af30)
+[ 51.365930] brcmfmac: psr: sdio 21 53: F1r4 d014 1000000 (81)
+[ 51.398152] brcmfmac: psr: sdio 22 53: F1r4 d018 181000c5 (8690)
+[ 51.417973] brcmfmac: psr: sdio 23 53: F1r4 d01c 18107185 (8354)
+[ 51.442251] brcmfmac: psr: sdio 24 53: F1r4 d020 4bf81201 (e3fb)
+[ 51.465922] brcmfmac: psr: sdio 25 53: F1r4 d024 30004211 (9130)
+[ 51.489947] brcmfmac: psr: sdio 26 53: F1r4 d028 103 (539c)
+[ 51.517984] brcmfmac: psr: sdio 27 53: F1r4 d02c 18001005 (92f0)
+[ 51.549911] brcmfmac: psr: sdio 28 53: F1r4 d030 181010c5 (e6d0)
+[ 51.577978] brcmfmac: psr: sdio 29 53: F1r4 d034 4bf83e01 (b4b)
+[ 51.613901] brcmfmac: psr: sdio 30 53: F1r4 d038 6084411 (170e)
+[ 51.633913] brcmfmac: psr: sdio 31 53: F1r4 d03c 203 (5990)
+[ 51.661931] brcmfmac: psr: sdio 32 53: F1r4 d040 18002005 (3230)
+[ 51.685899] brcmfmac: psr: sdio 33 53: F1r4 d044 18006015 (7bb0)
+[ 51.705933] brcmfmac: psr: sdio 34 53: F1r4 d048 135 (a12c)
+[ 51.725987] brcmfmac: psr: sdio 35 53: F1r4 d04c a0000 (ab54)
+[ 51.746000] brcmfmac: psr: sdio 36 53: F1r4 d050 180135 (3a1c)
+[ 51.778089] brcmfmac: psr: sdio 37 53: F1r4 d054 80000 (8910)
+[ 51.817882] brcmfmac: psr: sdio 38 53: F1r4 d058 200135 (856c)
+[ 51.849969] brcmfmac: psr: sdio 39 53: F1r4 d05c 40000 (4488)
+[ 51.874107] brcmfmac: psr: sdio 40 53: F1r4 d060 181020c5 (4610)
+[ 51.905885] brcmfmac: psr: sdio 41 53: F1r4 d064 18108185 (a094)
+[ 51.937882] brcmfmac: psr: sdio 42 53: F1r4 d068 4bf83c01 (743)
+[ 51.957982] brcmfmac: psr: sdio 43 53: F1r4 d06c b084411 (1183)
+[ 51.977965] brcmfmac: psr: sdio 44 53: F1r4 d070 303 (5f94)
+[ 51.997960] brcmfmac: psr: sdio 45 53: F1r4 d074 18003005 (5270)
+[ 52.017879] brcmfmac: psr: sdio 46 53: F1r4 d078 8000135 (a524)
+[ 52.038111] brcmfmac: psr: sdio 47 53: F1r4 d07c 8000000 (408)
+[ 52.061870] brcmfmac: psr: sdio 48 53: F1r4 d080 13d (c56c)
+[ 52.081949] brcmfmac: psr: sdio 49 53: F1r4 d084 80000000 (4080)
+[ 52.102068] brcmfmac: psr: sdio 50 53: F1r4 d088 8 (6440)
+[ 52.121969] brcmfmac: psr: sdio 51 53: F1r4 d08c 80000000 (4080)
+[ 52.141949] brcmfmac: psr: sdio 52 53: F1r4 d090 181030c5 (2650)
+[ 52.174064] brcmfmac: psr: sdio 53 53: F1r4 d094 18109185 (c0d4)
+[ 52.205877] brcmfmac: psr: sdio 54 53: F1r4 d098 4bf81a01 (d3db)
+[ 52.234825] brcmfmac: psr: sdio 55 53: F1r4 d09c 16004211 (8216)
+[ 52.257914] brcmfmac: psr: sdio 56 53: F1r4 d0a0 403 (4d88)
+[ 52.277867] brcmfmac: psr: sdio 57 53: F1r4 d0a4 18004005 (73b0)
+[ 52.305865] brcmfmac: psr: sdio 58 53: F1r4 d0a8 181040c5 (790)
+[ 52.325937] brcmfmac: psr: sdio 59 53: F1r4 d0ac 4bf82901 (7917)
+[ 52.362085] brcmfmac: psr: sdio 60 53: F1r4 d0b0 15004211 (8395)
+[ 52.393885] brcmfmac: psr: sdio 61 53: F1r4 d0b4 503 (4b8c)
+[ 52.414097] brcmfmac: psr: sdio 62 53: F1r4 d0b8 18005005 (13f0)
+[ 52.446085] brcmfmac: psr: sdio 63 53: F1r4 d0bc 181050c5 (67d0)
+[ 52.513935] brcmfmac: psr: sdio 64 53: F1r4 d0c0 4bf83d01 (147)
+[ 52.533925] brcmfmac: psr: sdio 65 53: F1r4 d0c4 2004211 (8802)
+[ 52.553920] brcmfmac: psr: sdio 66 53: F1r4 d0c8 903 (63bc)
+[ 52.573937] brcmfmac: psr: sdio 67 53: F1r4 d0cc 18006005 (b330)
+[ 52.594099] brcmfmac: psr: sdio 68 53: F1r4 d0d0 181060c5 (c710)
+[ 52.613930] brcmfmac: psr: sdio 69 53: F1r4 d0d4 43b13501 (e5dd)
+[ 52.634106] brcmfmac: psr: sdio 70 53: F1r4 d0d8 80201 (4990)
+[ 52.654051] brcmfmac: psr: sdio 71 53: F1r4 d0dc 18000045 (d0b0)
+[ 52.673939] brcmfmac: psr: sdio 72 53: F1r4 d0dc 18000045 (d0b0)
+[ 52.694090] brcmfmac: psr: sdio 73 53: F1r4 d0e0 18001045 (b0f0)
+[ 52.713935] brcmfmac: psr: sdio 74 53: F1r4 d0e4 18002045 (1030)
+[ 52.733938] brcmfmac: psr: sdio 75 53: F1r4 d0e8 18003045 (7070)
+[ 52.754066] brcmfmac: psr: sdio 76 53: F1r4 d0ec 18004045 (51b0)
+[ 52.773909] brcmfmac: psr: sdio 77 53: F1r4 d0f0 18005045 (31f0)
+[ 52.793909] brcmfmac: psr: sdio 78 53: F1r4 d0f4 18006045 (9130)
+[ 52.813958] brcmfmac: psr: sdio 79 53: F1r4 d0f8 18007045 (f170)
+[ 52.834090] brcmfmac: psr: sdio 80 53: F1r4 d0fc 18008055 (1a30)
+[ 52.854096] brcmfmac: psr: sdio 81 53: F1r4 d100 1810a085 (6610)
+[ 52.873911] brcmfmac: psr: sdio 82 53: F1r4 d104 43b24001 (e96f)
+[ 52.893892] brcmfmac: psr: sdio 83 53: F1r4 d104 43b24001 (e96f)
+[ 52.913911] brcmfmac: psr: sdio 84 53: F1r4 d108 80211 (8110)
+[ 52.933910] brcmfmac: psr: sdio 85 53: F1r4 d10c 603 (4180)
+[ 52.954077] brcmfmac: psr: sdio 86 53: F1r4 d110 19000075 (89b1)
+[ 52.973898] brcmfmac: psr: sdio 87 53: F1r4 d114 1000000 (81)
+[ 52.994043] brcmfmac: psr: sdio 88 53: F1r4 d118 1810b085 (650)
+[ 53.014056] brcmfmac: psr: sdio 89 53: F1r4 d11c 43b36701 (2ad1)
+[ 53.033926] brcmfmac: psr: sdio 90 53: F1r4 d11c 43b36701 (2ad1)
+[ 53.053833] brcmfmac: psr: sdio 91 53: F1r4 d120 201 (c080)
+[ 53.081787] brcmfmac: psr: sdio 92 53: F1r4 d124 1810c005 (6390)
+[ 53.102057] brcmfmac: psr: sdio 93 53: F1r4 d128 43b36601 (2cd5)
+[ 53.121876] brcmfmac: psr: sdio 94 53: F1r4 d12c 201 (c080)
+[ 53.142047] brcmfmac: psr: sdio 95 53: F1r4 d130 1810d005 (3d0)
+[ 53.161871] brcmfmac: psr: sdio 96 53: F1r4 d134 43b30101 (7f49)
+[ 53.181889] brcmfmac: psr: sdio 97 53: F1r4 d138 201 (c080)
+[ 53.202035] brcmfmac: psr: sdio 98 53: F1r4 d13c 18200035 (8f70)
+[ 53.222024] brcmfmac: psr: sdio 99 53: F1r4 d140 100000 (1220)
+[ 53.242020] brcmfmac: psr: sdio 100 53: F1r4 d144 43bfff01 (b529)
+[ 53.261876] brcmfmac: psr: sdio 101 53: F1r4 d148 80201 (4990)
+[ 53.281880] brcmfmac: psr: sdio 102 53: F1r4 d14c a0035 (c7c)
+[ 53.302029] brcmfmac: psr: sdio 103 53: F1r4 d14c a0035 (c7c)
+[ 53.322020] brcmfmac: psr: sdio 104 53: F1r4 d150 e0000 (efdc)
+[ 53.342008] brcmfmac: psr: sdio 105 53: F1r4 d154 240035 (c7e0)
+[ 53.361866] brcmfmac: psr: sdio 106 53: F1r4 d158 7dc0000 (5bf)
+[ 53.382032] brcmfmac: psr: sdio 107 53: F1r4 d15c 10000035 (af38)
+[ 53.401861] brcmfmac: psr: sdio 108 53: F1r4 d160 8000000 (408)
+[ 53.421992] brcmfmac: psr: sdio 109 53: F1r4 d164 18008035 (a930)
+[ 53.442006] brcmfmac: psr: sdio 110 53: F1r4 d168 f8000 (fcfe)
+[ 53.461848] brcmfmac: psr: sdio 111 53: F1r4 d16c 1810e035 (fa90)
+[ 53.481849] brcmfmac: psr: sdio 112 53: F1r4 d170 f2000 (3e7e)
+[ 53.501988] brcmfmac: psr: sdio 113 53: F1r4 d174 18300035 (9d50)
+[ 53.521863] brcmfmac: psr: sdio 114 53: F1r4 d178 d00000 (cba0)
+[ 53.542035] brcmfmac: psr: sdio 115 53: F1r4 d17c 1a000035 (aa32)
+[ 53.561974] brcmfmac: psr: sdio 116 53: F1r4 d180 2000000 (102)
+[ 53.581854] brcmfmac: psr: sdio 117 53: F1r4 d184 1d000035 (a9b5)
+[ 53.602002] brcmfmac: psr: sdio 118 53: F1r4 d188 e3000008 (1523)
+[ 53.621848] brcmfmac: psr: sdio 119 53: F1r4 d18c 7fffffff (1365)
+[ 53.642000] brcmfmac: psr: sdio 120 53: F1r4 d190 1810e085 (e710)
+[ 53.661987] brcmfmac: psr: sdio 121 53: F1r4 d194 f (3f8)
+[ 53.681984] brcmfmac: psr: sdio 122 53: F1r4 d194 f (3f8)
+[ 53.701985] brcmfmac: psr: sdio 123 53: F1w1 1000a 0 (0)
+[ 53.721982] brcmfmac: psr: sdio 124 53: F1w1 1000b 10 (810)
+[ 53.741972] brcmfmac: psr: sdio 125 53: F1w1 1000c 18 (c18)
+[ 53.761816] brcmfmac: psr: sdio 126 53: F1r4 a408 21 (5d88)
+[ 53.782003] brcmfmac: psr: sdio 127 53: F1r4 a800 0 (0)
+[ 53.801959] brcmfmac: psr: sdio 128 53: F1w4 a408 23 (c498)
+[ 53.821955] brcmfmac: psr: sdio 129 53: F1r4 a408 23 (c498)
+[ 53.841970] brcmfmac: psr: sdio 130 53: F1w4 a800 1 (cc88)
+[ 53.861941] brcmfmac: psr: sdio 131 53: F1r4 a800 1 (cc88)
+[ 53.881966] brcmfmac: psr: sdio 132 53: F1w4 a408 23 (c498)
+[ 53.901946] brcmfmac: psr: sdio 133 53: F1r4 a408 23 (c498)
+[ 53.921959] brcmfmac: psr: sdio 134 53: F1r4 a800 1 (cc88)
+[ 53.941969] brcmfmac: psr: sdio 135 53: F1w4 a800 0 (0)
+[ 53.961939] brcmfmac: psr: sdio 136 53: F1r4 a800 0 (0)
+[ 53.981958] brcmfmac: psr: sdio 137 53: F1w4 a408 21 (5d88)
+[ 54.002015] brcmfmac: psr: sdio 138 53: F1r4 a408 21 (5d88)
+[ 54.021840] brcmfmac: psr: sdio 139 53: F1r4 9800 1 (cc88)
+[ 54.041998] brcmfmac: psr: sdio 140 53: F1w4 9408 7 (67b8)
+[ 54.061988] brcmfmac: psr: sdio 141 53: F1r4 9408 7 (67b8)
+[ 54.081779] brcmfmac: psr: sdio 142 53: F1r4 9800 1 (cc88)
+[ 54.105793] brcmfmac: psr: sdio 143 53: F1w4 9800 0 (0)
+[ 54.125832] brcmfmac: psr: sdio 144 53: F1r4 9800 0 (0)
+[ 54.145968] brcmfmac: psr: sdio 145 53: F1w4 9408 5 (fea8)
+[ 54.165960] brcmfmac: psr: sdio 146 53: F1r4 9408 5 (fea8)
+[ 54.185806] brcmfmac: psr: sdio 147 53: F1w1 1000a 0 (0)
+[ 54.205791] brcmfmac: psr: sdio 148 53: F1w1 1000b 0 (0)
+[ 54.225731] brcmfmac: psr: sdio 149 53: F1w1 1000c 18 (c18)
+[ 54.245977] brcmfmac: psr: sdio 150 53: F1r4 a004 524 (bd34)
+[ 54.265796] brcmfmac: psr: sdio 151 53: F1w4 a040 0 (0)
+[ 54.285808] brcmfmac: psr: sdio 152 53: F1r4 a044 108c0f (3be8)
+[ 54.305970] brcmfmac: psr: sdio 153 53: F1w4 a040 1 (cc88)
+[ 54.325804] brcmfmac: psr: sdio 154 53: F1r4 a044 108c0f (3be8)
+[ 54.345969] brcmfmac: psr: sdio 155 53: F1w4 a040 2 (9910)
+[ 54.365968] brcmfmac: psr: sdio 156 53: F1r4 a044 108c0f (3be8)
+[ 54.385786] brcmfmac: psr: sdio 157 53: F1w4 a040 3 (5598)
+[ 54.405957] brcmfmac: psr: sdio 158 53: F1r4 a044 108c0f (3be8)
+[ 54.425791] brcmfmac: psr: sdio 159 53: F1w4 a040 4 (3220)
+[ 54.445942] brcmfmac: psr: sdio 160 53: F1r4 a044 108c0f (3be8)
+[ 54.465772] brcmfmac: psr: sdio 161 53: F1w4 a040 5 (fea8)
+[ 54.485951] brcmfmac: psr: sdio 162 53: F1r4 a044 108c0f (3be8)
+[ 54.505784] brcmfmac: psr: sdio 163 53: F1r4 8004 58680009 (6140)
+[ 54.525798] brcmfmac: psr: sdio 164 53: F1r4 80ac e (cf70)
+[ 54.545695] brcmfmac: psr: sdio 165 53: F1r4 8604 420e5f18 (a122)
+[ 54.566025] brcmfmac: psr: sdio 166 53: F1r1 1001f 3 (183)
+[ 54.585766] brcmfmac: psr: sdio 167 53: F0r1 f1 1 (81)
+[ 54.605774] brcmfmac: psr: sdio 168 53: F0w1 f1 3 (183)
+[ 54.625761] brcmfmac: psr: sdio 169 53: F1r4 8600 1770180 (4b8b)
+[ 54.645775] brcmfmac: psr: sdio 170 53: F1w4 8600 1774180 (ca8b)
+[ 54.665933] brcmfmac: psr: sdio 171 53: F1w1 1000e 0 (0)
+[ 54.685939] brcmfmac: psr: sdio 172 152: F1w1 1000e 8 (408)
+[ 54.705921] brcmfmac: psr: sdio 173 152: F1r1 1000e c8 (64c8)
+[ 54.725782] brcmfmac: psr: sdio 174 152: F3w4 ffff 0 (0)
+[ 63.009252] brcmfmac: psr: sdio 566 152: F4w4 ffff 0 (0)
+[ 63.149597] brcmfmac: psr: sdio 573 152: F5w4 ffff 0 (0)
+[ 63.173368] brcmfmac: psr: sdio 574 152: F1w1 1000a 0 (0)
+[ 63.197146] brcmfmac: psr: sdio 575 152: F1w1 1000b 0 (0)
+[ 63.225409] brcmfmac: psr: sdio 576 152: F1w1 1000c 18 (c18)
+[ 63.249177] brcmfmac: psr: sdio 577 152: F1w4 d020 ffffffff (53e5)
+[ 63.277151] brcmfmac: psr: sdio 578 152: F1w1 1000a 0 (0)
+[ 63.305365] brcmfmac: psr: sdio 579 152: F1w1 1000b 0 (0)
+[ 63.329214] brcmfmac: psr: sdio 580 152: F1w1 1000c 0 (0)
+[ 63.357375] brcmfmac: psr: sdio 581 152: F11w4 8000 b83ef180 (e4c0)
+[ 63.377205] brcmfmac: psr: sdio 582 152: F1w1 1000a 0 (0)
+[ 63.397185] brcmfmac: psr: sdio 583 152: F1w1 1000b 10 (810)
+[ 63.417176] brcmfmac: psr: sdio 584 152: F1w1 1000c 18 (c18)
+[ 63.437421] brcmfmac: psr: sdio 585 152: F1r4 a800 0 (0)
+[ 63.457173] brcmfmac: psr: sdio 586 152: F1w4 a408 23 (c498)
+[ 63.485182] brcmfmac: psr: sdio 587 152: F1r4 a408 23 (c498)
+[ 63.521377] brcmfmac: psr: sdio 588 152: F1w4 a800 1 (cc88)
+[ 63.541237] brcmfmac: psr: sdio 589 152: F1r4 a800 1 (cc88)
+[ 63.573150] brcmfmac: psr: sdio 590 152: F1w4 a408 3 (5598)
+[ 63.593120] brcmfmac: psr: sdio 591 152: F1r4 a408 3 (5598)
+[ 63.621193] brcmfmac: psr: sdio 592 152: F1r4 a800 1 (cc88)
+[ 63.650634] brcmfmac: psr: sdio 593 152: F1w4 a800 0 (0)
+[ 63.677268] brcmfmac: psr: sdio 594 152: F1r4 a800 0 (0)
+[ 63.697158] brcmfmac: psr: sdio 595 152: F1w4 a408 1 (cc88)
+[ 63.717169] brcmfmac: psr: sdio 596 152: F1r4 a408 1 (cc88)
+[ 63.741168] brcmfmac: psr: sdio 597 152: F1w1 1000e 0 (0)
+[ 63.761188] brcmfmac: psr: sdio 598 152: F1w1 1000e 10 (810)
+[ 63.781203] brcmfmac: psr: sdio 599 152: F1r1 1000e d0 (68d0)
+[ 63.801243] brcmfmac: psr: sdio 600 152: F1r1 1000e d0 (68d0)
+[ 63.825323] brcmfmac: psr: sdio 601 152: F1w1 1000e d2 (69d2)
+[ 63.845213] brcmfmac: psr: sdio 602 152: F1w1 1000a 0 (0)
+[ 63.865145] brcmfmac: psr: sdio 603 152: F1w1 1000b 0 (0)
+[ 63.885150] brcmfmac: psr: sdio 604 152: F1w1 1000c 18 (c18)
+[ 63.905190] brcmfmac: psr: sdio 605 152: F1w4 d048 40000 (4488)
+[ 63.925189] brcmfmac: psr: sdio 606 152: F1w4 d024 200000f0 (2fa0)
+[ 63.945131] brcmfmac: psr: sdio 607 152: F1w1 10008 8 (408)
+[ 63.965280] brcmfmac: psr: sdio 608 152: F1w4 8650 3 (5598)
+[ 63.985213] brcmfmac: psr: sdio 609 152: F1r4 8654 f012c37 (c025)
+[ 64.005127] brcmfmac: psr: sdio 610 152: F1r1 1001e 0 (0)
+[ 64.025126] brcmfmac: psr: sdio 611 152: F1w1 1001e 2 (102)
+[ 64.045163] brcmfmac: psr: sdio 612 152: F0w1 f0 6 (306)
+[ 64.065185] brcmfmac: psr: sdio 613 152: F1w1 1000e 2 (102)
+[ 64.085254] brcmfmac: psr: sdio 614 1896: F1r4 d020 8000c0 (f700)
+[ 64.105153] brcmfmac: psr: sdio 615 1896: F1w4 d020 c0 (6600)
+[ 64.125154] brcmfmac: psr: sdio 616 370: F1r4 d04c 40008 (20c8)
+[ 64.149201] brcmfmac: psr: sdio 617 370: F1w4 d040 2 (9910)
+[ 64.169109] brcmfmac: psr: sdio 618 370: F12r64f 8000 c000100fff3000c (0)
+[ 64.189116] brcmfmac: psr: sdio 619 370: F12r0f 8000 0 (0)
+[ 64.209219] brcmfmac: psr: sdio 620 370: F12r64f 8000 0 (0)
+[ 64.229121] brcmfmac: psr: sdio 621 370: F12w48 8000 c0000ffffcf0030 (32c0)
+[ 64.249154] brcmfmac: psr: sdio 622 1896: F1r4 d020 8000c0 (f700)
+[ 64.269206] brcmfmac: psr: sdio 623 1896: F1w4 d020 c0 (6600)
+[ 64.293128] brcmfmac: psr: sdio 624 370: F1r4 d04c 40002 (dd98)
+[ 64.313120] brcmfmac: psr: sdio 625 370: F1w4 d040 2 (9910)
+[ 64.333149] brcmfmac: psr: sdio 626 370: F12r64f 8000 c000001ffcf0030 (0)
+[ 64.353123] brcmfmac: psr: sdio 627 370: F12r64f 8000 0 (0)
+[ 64.373160] brcmfmac: psr: sdio 628 370: F12w48 8000 c000000ffd4002b (8940)
+[ 64.393151] brcmfmac: psr: sdio 629 1896: F1r4 d020 800040 (b300)
+[ 64.413143] brcmfmac: psr: sdio 630 1896: F1w4 d020 40 (2200)
+[ 64.437118] brcmfmac: psr: sdio 631 370: F12r64f 8000 c000002ffd4002b (0)
+[ 64.461288] brcmfmac: psr: sdio 632 370: F12r64f 8000 0 (0)
+[ 64.481235] brcmfmac: psr: sdio 633 370: F12w56 8000 1000034ffc70038 (c100)
+[ 64.501353] brcmfmac: psr: sdio 634 1896: F1r4 d020 800040 (b300)
+[ 64.521193] brcmfmac: psr: sdio 635 1896: F1w4 d020 40 (2200)
+[ 64.541208] brcmfmac: psr: sdio 636 370: F12r64f 8000 c000003ffcf0030 (0)
+[ 64.561352] brcmfmac: psr: sdio 637 370: F12r64f 8000 0 (0)
+[ 64.581179] brcmfmac: psr: sdio 638 370: F12w104 8000 1000064ff970068 (e841)
+[ 64.601182] brcmfmac: psr: sdio 639 1896: F1r4 d020 800040 (b300)
+[ 64.621169] brcmfmac: psr: sdio 640 1896: F1w4 d020 40 (2200)
+[ 64.641178] brcmfmac: psr: sdio 641 370: F12r64f 8000 c000004ff9f0060 (8a81)
+[ 64.661165] brcmfmac: psr: sdio 642 370: F12r32f 8000 0 (c5c2)
+[ 64.681331] brcmfmac: psr: sdio 643 370: F12r64f 8000 0 (0)
+[ 64.701173] brcmfmac: psr: sdio 644 370: F12w296 8000 1000124fed70128 (0)
+[ 64.721330] brcmfmac: psr: sdio 645 1896: F1r4 d020 800040 (b300)
+[ 64.741344] brcmfmac: psr: sdio 646 1896: F1w4 d020 40 (2200)
+[ 64.761335] brcmfmac: psr: sdio 647 370: F12r64f 8000 c000005fedf0120 (b740)
+[ 64.781158] brcmfmac: psr: sdio 648 370: F12r224f 8000 722e3438312e3533 (0)
+[ 64.801310] brcmfmac: psr: sdio 649 370: F12r64f 8000 0 (0)
+[ 64.821154] brcmfmac: psr: sdio 650 370: F12w304 8000 1000127fecf0130 (0)
+[ 64.841188] brcmfmac: psr: sdio 651 1896: F1r4 d020 800040 (b300)
+[ 64.861157] brcmfmac: psr: sdio 652 1896: F1w4 d020 40 (2200)
+[ 64.881284] brcmfmac: psr: sdio 653 370: F12r64f 8000 c000006fedc0123 (7c3c)
+[ 64.901135] brcmfmac: psr: sdio 654 370: F12r232f 8000 6d6c430a312e3132 (0)
+[ 64.921142] brcmfmac: psr: sdio 655 370: F12r64f 8000 0 (0)
+[ 64.941305] brcmfmac: psr: sdio 656 370: F12w48 8000 1000028ffcf0030 (d349)
+[ 64.961275] brcmfmac: psr: sdio 657 1896: F1r4 d020 800040 (b300)
+[ 64.981260] brcmfmac: psr: sdio 658 1896: F1w4 d020 40 (2200)
+[ 65.001283] brcmfmac: psr: sdio 659 370: F12r64f 8000 c000007ffdb0024 (0)
+[ 65.021131] brcmfmac: psr: sdio 660 370: F12r64f 8000 0 (0)
+[ 65.041272] brcmfmac: psr: sdio 661 370: F12w56 8000 1000032ffc70038 (3332)
+[ 65.061127] brcmfmac: psr: sdio 662 1896: F1r4 d020 800040 (b300)
+[ 65.081294] brcmfmac: psr: sdio 663 1896: F1w4 d020 40 (2200)
+[ 65.101284] brcmfmac: psr: sdio 664 370: F12r64f 8000 c000008ffd1002e (0)
+[ 65.121267] brcmfmac: psr: sdio 665 370: F12r64f 8000 0 (0)
+[ 65.141287] brcmfmac: psr: sdio 666 370: F12w72 8000 100003dffb70048 (1b3c)
+[ 65.161132] brcmfmac: psr: sdio 667 1896: F1r4 d020 800040 (b300)
+[ 65.186090] brcmfmac: psr: sdio 668 1896: F1w4 d020 40 (2200)
+[ 65.205250] brcmfmac: psr: sdio 669 370: F12r64f 8000 c000009ffc60039 (0)
+[ 65.225066] brcmfmac: psr: sdio 670 370: F12r64f 8000 0 (0)
+[ 65.245286] brcmfmac: psr: sdio 671 370: F12w72 8000 100003dffb70048 (cebc)
+[ 65.265132] brcmfmac: psr: sdio 672 1896: F1r4 d020 800040 (b300)
+[ 65.285283] brcmfmac: psr: sdio 673 1896: F1w4 d020 40 (2200)
+[ 65.305293] brcmfmac: psr: sdio 674 370: F12r64f 8000 c00000affc60039 (0)
+[ 65.325127] brcmfmac: psr: sdio 675 370: F12r64f 8000 0 (0)
+[ 65.345277] brcmfmac: psr: sdio 676 370: F12w40 8000 1000024ffd70028 (9340)
+[ 65.365254] brcmfmac: psr: sdio 677 1896: F1r4 d020 800040 (b300)
+[ 65.385242] brcmfmac: psr: sdio 678 1896: F1w4 d020 40 (2200)
+[ 65.405278] brcmfmac: psr: sdio 679 370: F12r64f 8000 c00000bffdf0020 (0)
+[ 65.425115] brcmfmac: psr: sdio 680 370: F12r64f 8000 0 (0)
+[ 65.445053] brcmfmac: psr: sdio 681 370: F12w40 8000 1000024ffd70028 (7d40)
+[ 65.465121] brcmfmac: psr: sdio 682 1896: F1r4 d020 800040 (b300)
+[ 65.485290] brcmfmac: psr: sdio 683 1896: F1w4 d020 40 (2200)
+[ 65.505122] brcmfmac: psr: sdio 684 370: F12r64f 8000 c00000cffdf0020 (0)
+[ 65.525109] brcmfmac: psr: sdio 685 370: F12r64f 8000 0 (0)
+[ 65.545148] brcmfmac: psr: sdio 686 370: F12w48 8000 1000029ffcf0030 (e98c)
+[ 65.565280] brcmfmac: psr: sdio 687 1896: F1r4 d020 800040 (b300)
+[ 65.585118] brcmfmac: psr: sdio 688 1896: F1w4 d020 40 (2200)
+[ 65.605303] brcmfmac: psr: sdio 689 370: F12r64f 8000 c00000dffda0025 (0)
+[ 65.625275] brcmfmac: psr: sdio 690 370: F12r64f 8000 0 (0)
+[ 65.645132] brcmfmac: psr: sdio 691 370: F12w1024 8000 1000224fbff0400 (0)
+[ 65.665125] brcmfmac: psr: sdio 692 1896: F1r4 d020 800040 (b300)
+[ 65.685299] brcmfmac: psr: sdio 693 1896: F1w4 d020 40 (2200)
+[ 65.705263] brcmfmac: psr: sdio 694 370: F12r64f 8000 c00000efddf0220 (f9bf)
+[ 65.725111] brcmfmac: psr: sdio 695 370: F12r480f 8000 61626c6175642063 (168a)
+[ 65.745112] brcmfmac: psr: sdio 696 370: F12r64f 8000 0 (0)
+[ 65.765276] brcmfmac: psr: sdio 697 370: F12w72 8000 1000040ffb70048 (d04f)
+[ 65.785251] brcmfmac: psr: sdio 698 1896: F1r4 d020 800040 (b300)
+[ 65.805236] brcmfmac: psr: sdio 699 1896: F1w4 d020 40 (2200)
+[ 65.825273] brcmfmac: psr: sdio 700 370: F12r64f 8000 c00000fffc3003c (0)
+[ 65.845121] brcmfmac: psr: sdio 701 370: F12r64f 8000 0 (0)
+[ 65.865252] brcmfmac: psr: sdio 702 370: F12w48 8000 1000028ffcf0030 (11dc)
+[ 65.885102] brcmfmac: psr: sdio 703 1896: F1r4 d020 800040 (b300)
+[ 65.905106] brcmfmac: psr: sdio 704 1896: F1w4 d020 40 (2200)
+[ 65.925268] brcmfmac: psr: sdio 705 370: F12r64f 8000 c000010ffdb0024 (0)
+[ 65.945120] brcmfmac: psr: sdio 706 370: F12r64f 8000 0 (0)
+[ 65.965290] brcmfmac: psr: sdio 707 370: F12w56 8000 100002effc70038 (c800)
+[ 65.985111] brcmfmac: psr: sdio 708 1896: F1r4 d020 800040 (b300)
+[ 66.005242] brcmfmac: psr: sdio 709 1896: F1w4 d020 40 (2200)
+[ 66.025239] brcmfmac: psr: sdio 710 370: F12r64f 8000 c000011ffd5002a (0)
+[ 66.045090] brcmfmac: psr: sdio 711 370: F12r64f 8000 0 (0)
+[ 66.065272] brcmfmac: psr: sdio 712 370: F12w56 8000 1000030ffc70038 (da00)
+[ 66.085095] brcmfmac: psr: sdio 713 1896: F1r4 d020 800040 (b300)
+[ 66.105231] brcmfmac: psr: sdio 714 1896: F1w4 d020 40 (2200)
+[ 66.125224] brcmfmac: psr: sdio 715 370: F12r64f 8000 c000012ffd3002c (0)
+[ 66.145107] brcmfmac: psr: sdio 716 370: F12r64f 8000 0 (0)
+[ 66.165234] brcmfmac: psr: sdio 717 370: F12w48 8000 1000028ffcf0030 (eaca)
+[ 66.185269] brcmfmac: psr: sdio 718 1896: F1r4 d020 800040 (b300)
+[ 66.205114] brcmfmac: psr: sdio 719 1896: F1w4 d020 40 (2200)
+[ 66.225261] brcmfmac: psr: sdio 720 370: F12r64f 8000 c000013ffdb0024 (0)
+[ 66.245106] brcmfmac: psr: sdio 721 370: F12r64f 8000 0 (0)
+[ 66.265107] brcmfmac: psr: sdio 722 370: F12w56 8000 1000034ffc70038 (6c80)
+[ 66.285085] brcmfmac: psr: sdio 723 1896: F1r4 d020 800040 (b300)
+[ 66.305088] brcmfmac: psr: sdio 724 1896: F1w4 d020 40 (2200)
+[ 66.325229] brcmfmac: psr: sdio 725 370: F12r64f 8000 c000014ffcf0030 (0)
+[ 66.345228] brcmfmac: psr: sdio 726 370: F12r64f 8000 0 (0)
+[ 66.365073] brcmfmac: psr: sdio 727 370: F12w48 8000 100002cffcf0030 (9ec1)
+[ 66.385092] brcmfmac: psr: sdio 728 1896: F1r4 d020 800040 (b300)
+[ 66.405274] brcmfmac: psr: sdio 729 1896: F1w4 d020 40 (2200)
+[ 66.425239] brcmfmac: psr: sdio 730 370: F12r64f 8000 c000015ffd70028 (0)
+[ 66.445101] brcmfmac: psr: sdio 731 370: F12r64f 8000 0 (0)
+[ 66.465088] brcmfmac: psr: sdio 732 370: F12w40 8000 1000024ffd70028 (5094)
+[ 66.485079] brcmfmac: psr: sdio 733 1896: F1r4 d020 800040 (b300)
+[ 66.505232] brcmfmac: psr: sdio 734 1896: F1w4 d020 40 (2200)
+[ 66.525085] brcmfmac: psr: sdio 735 370: F12r64f 8000 c000016ffdf0020 (0)
+[ 66.545095] brcmfmac: psr: sdio 736 370: F12r64f 8000 0 (0)
+[ 66.565086] brcmfmac: psr: sdio 737 370: F12w48 8000 100002cffcf0030 (99c1)
+[ 66.585225] brcmfmac: psr: sdio 738 1896: F1r4 d020 800040 (b300)
+[ 66.605077] brcmfmac: psr: sdio 739 1896: F1w4 d020 40 (2200)
+[ 66.625263] brcmfmac: psr: sdio 740 370: F12r64f 8000 c000017ffd70028 (0)
+[ 66.645171] brcmfmac: psr: sdio 741 370: F12r64f 8000 0 (0)
+[ 66.665081] brcmfmac: psr: sdio 742 370: F12w48 8000 100002cffcf0030 (9520)
+[ 66.685073] brcmfmac: psr: sdio 743 1896: F1r4 d020 800040 (b300)
+[ 66.705082] brcmfmac: psr: sdio 744 1896: F1w4 d020 40 (2200)
+[ 66.725234] brcmfmac: psr: sdio 745 370: F12r64f 8000 c000018ffd70028 (0)
+[ 66.745219] brcmfmac: psr: sdio 746 370: F12r64f 8000 0 (0)
+[ 66.765071] brcmfmac: psr: sdio 747 370: F12w48 8000 100002affcf0030 (4480)
+[ 66.785079] brcmfmac: psr: sdio 748 1896: F1r4 d020 800040 (b300)
+[ 66.805211] brcmfmac: psr: sdio 749 1896: F1w4 d020 40 (2200)
+[ 66.825219] brcmfmac: psr: sdio 750 370: F12r64f 8000 c000019ffd90026 (0)
+[ 66.845062] brcmfmac: psr: sdio 751 370: F12r64f 8000 0 (0)
+[ 66.865259] brcmfmac: psr: sdio 752 370: F12w48 8000 100002bffcf0030 (85a0)
+[ 66.885065] brcmfmac: psr: sdio 753 1896: F1r4 d020 800040 (b300)
+[ 66.905202] brcmfmac: psr: sdio 754 1896: F1w4 d020 40 (2200)
+[ 66.925193] brcmfmac: psr: sdio 755 155: F12r64f 8000 c00001affd80027 (0)
+[ 66.945213] brcmfmac: psr: sdio 756 155: F12r64f 8000 0 (0)
+[ 66.965213] brcmfmac: psr: sdio 757 155: F12w48 8000 100002bffcf0030 (9d90)
+[ 66.985198] brcmfmac: psr: sdio 758 1896: F1r4 d020 800040 (b300)
+[ 67.005179] brcmfmac: psr: sdio 759 1896: F1w4 d020 40 (2200)
+[ 67.025230] brcmfmac: psr: sdio 760 155: F12r64f 8000 c00001bffd80027 (0)
+[ 67.045143] brcmfmac: psr: sdio 761 155: F12r64f 8000 0 (0)
+[ 67.065068] brcmfmac: psr: sdio 762 155: F12w48 8000 100002cffcf0030 (9410)
+[ 67.085052] brcmfmac: psr: sdio 763 1896: F1r4 d020 800040 (b300)
+[ 67.105061] brcmfmac: psr: sdio 764 1896: F1w4 d020 40 (2200)
+[ 67.125191] brcmfmac: psr: sdio 765 155: F12r64f 8000 c00001cffd70028 (0)
+[ 67.145205] brcmfmac: psr: sdio 766 155: F12r64f 8000 0 (0)
+[ 67.165049] brcmfmac: psr: sdio 767 155: F12w2048 8000 10005fef7ff0800 (0)
+[ 67.185047] brcmfmac: psr: sdio 768 1896: F1r4 d020 800040 (b300)
+[ 67.205045] brcmfmac: psr: sdio 769 1896: F1w4 d020 40 (2200)
+[ 67.225178] brcmfmac: psr: sdio 770 155: F12r64f 8000 c00001df9d90626 (8b80)
+[ 67.245195] brcmfmac: psr: sdio 771 155: F12r1536f 8000 100a00001009 (0)
+[ 67.265064] brcmfmac: psr: sdio 772 155: F12r64f 8000 655c17b90000682b (e53b)
+[ 67.285039] brcmfmac: psr: sdio 773 155: F0w1 6 2 (102)
+[ 67.305203] brcmfmac: psr: sdio 774 155: F1w1 1000d 1 (81)
+[ 67.325042] brcmfmac: psr: sdio 775 155: F1r1 1001c 0 (0)
+[ 67.345039] brcmfmac: psr: sdio 776 155: F1r1 1001b 0 (0)
+[ 67.365028] brcmfmac: psr: sdio 777 155: F1w4 d040 1 (cc88)
+[ 67.385043] brcmfmac: psr: sdio 778 155: F12w56 8000 1000032ffc70038 (7aa0)
+[ 67.405029] brcmfmac: psr: sdio 779 1896: F1r4 d020 80 (4400)
+[ 67.425210] brcmfmac: psr: sdio 780 1896: F1w4 d020 80 (4400)
+[ 67.445194] brcmfmac: psr: sdio 781 155: F1r4 d04c 1 (cc88)
+[ 67.465030] brcmfmac: psr: sdio 782 155: F1w4 d040 2 (9910)
+[ 67.485211] brcmfmac: psr: sdio 783 155: F12r64f 8000 c00001effd1002e (0)
+[ 67.505050] brcmfmac: psr: sdio 784 155: F12r64f 8000 0 (0)
+[ 67.525180] brcmfmac: psr: sdio 785 155: F12w56 8000 1000032ffc70038 (4cc0)
+[ 67.544988] brcmfmac: psr: sdio 786 1896: F1r4 d020 40 (2200)
+[ 67.565044] brcmfmac: psr: sdio 787 1896: F1w4 d020 40 (2200)
+[ 67.585041] brcmfmac: psr: sdio 788 155: F12r64f 8000 c00001fffd1002e (0)
+[ 67.605049] brcmfmac: psr: sdio 789 155: F12r64f 8000 0 (0)
+[ 67.625192] brcmfmac: psr: sdio 790 155: F12w56 8000 1000032ffc70038 (5ee0)
+[ 67.645190] brcmfmac: psr: sdio 791 1896: F1r4 d020 800040 (b300)
+[ 67.665023] brcmfmac: psr: sdio 792 1896: F1w4 d020 40 (2200)
+[ 67.685207] brcmfmac: psr: sdio 793 155: F12r64f 8000 c000020ffd1002e (0)
+[ 67.705029] brcmfmac: psr: sdio 794 155: F12r64f 8000 0 (0)
+[ 67.725174] brcmfmac: psr: sdio 795 155: F12w56 8000 1000032ffc70038 (2000)
+[ 67.745022] brcmfmac: psr: sdio 796 1896: F1r4 d020 800040 (b300)
+[ 67.765245] brcmfmac: psr: sdio 797 1896: F1w4 d020 40 (2200)
+[ 67.785048] brcmfmac: psr: sdio 798 155: F12r64f 8000 c000021ffd1002e (0)
+[ 67.805188] brcmfmac: psr: sdio 799 155: F12r64f 8000 0 (0)
+[ 67.825189] brcmfmac: psr: sdio 800 155: F12w56 8000 1000032ffc70038 (3220)
+[ 67.845050] brcmfmac: psr: sdio 801 1896: F1r4 d020 800040 (b300)
+[ 67.865051] brcmfmac: psr: sdio 802 1896: F1w4 d020 40 (2200)
+[ 67.885044] brcmfmac: psr: sdio 803 155: F12r64f 8000 c000022ffd1002e (0)
+[ 67.905034] brcmfmac: psr: sdio 804 155: F12r64f 8000 0 (0)
+[ 67.925210] brcmfmac: psr: sdio 805 155: F12w56 8000 1000032ffc70038 (440)
+[ 67.945035] brcmfmac: psr: sdio 806 1896: F1r4 d020 800040 (b300)
+[ 67.965205] brcmfmac: psr: sdio 807 1896: F1w4 d020 40 (2200)
+[ 67.985029] brcmfmac: psr: sdio 808 155: F12r64f 8000 c000023ffd1002e (0)
+[ 68.005023] brcmfmac: psr: sdio 809 155: F12r64f 8000 0 (0)
+[ 68.024963] brcmfmac: psr: sdio 810 155: F12w56 8000 1000032ffc70038 (1660)
+[ 68.045052] brcmfmac: psr: sdio 811 1896: F1r4 d020 800040 (b300)
+[ 68.064984] brcmfmac: psr: sdio 812 1896: F1w4 d020 40 (2200)
+[ 68.085235] brcmfmac: psr: sdio 813 155: F12r64f 8000 c000024ffd1002e (0)
+[ 68.105035] brcmfmac: psr: sdio 814 155: F12r64f 8000 0 (0)
+[ 68.125038] brcmfmac: psr: sdio 815 155: F12w56 8000 1000032ffc70038 (f980)
+[ 68.145023] brcmfmac: psr: sdio 816 1896: F1r4 d020 800040 (b300)
+[ 68.165059] brcmfmac: psr: sdio 817 1896: F1w4 d020 40 (2200)
+[ 68.185043] brcmfmac: psr: sdio 818 155: F12r64f 8000 c000025ffd1002e (0)
+[ 68.205034] brcmfmac: psr: sdio 819 155: F12r64f 8000 0 (0)
+[ 68.225178] brcmfmac: psr: sdio 820 155: F12w56 8000 1000032ffc70038 (eba0)
+[ 68.245029] brcmfmac: psr: sdio 821 1896: F1r4 d020 800040 (b300)
+[ 68.265047] brcmfmac: psr: sdio 822 1896: F1w4 d020 40 (2200)
+[ 68.285191] brcmfmac: psr: sdio 823 155: F12r64f 8000 c000026ffd1002e (0)
+[ 68.305014] brcmfmac: psr: sdio 824 155: F12r64f 8000 0 (0)
+[ 68.325200] brcmfmac: psr: sdio 825 155: F12w56 8000 1000032ffc70038 (ddc0)
+[ 68.345026] brcmfmac: psr: sdio 826 1896: F1r4 d020 800040 (b300)
+[ 68.365188] brcmfmac: psr: sdio 827 1896: F1w4 d020 40 (2200)
+[ 68.385011] brcmfmac: psr: sdio 828 155: F12r64f 8000 c000027ffd1002e (0)
+[ 68.405015] brcmfmac: psr: sdio 829 155: F12r64f 8000 0 (0)
+[ 68.425172] brcmfmac: psr: sdio 830 155: F12w56 8000 1000032ffc70038 (cfe0)
+[ 68.445181] brcmfmac: psr: sdio 831 1896: F1r4 d020 800040 (b300)
+[ 68.465012] brcmfmac: psr: sdio 832 1896: F1w4 d020 40 (2200)
+[ 68.485027] brcmfmac: psr: sdio 833 155: F12r64f 8000 c000028ffd1002e (0)
+[ 68.505006] brcmfmac: psr: sdio 834 155: F12r64f 8000 0 (0)
+[ 68.525160] brcmfmac: psr: sdio 835 155: F12w56 8000 1000032ffc70038 (6800)
+[ 68.545045] brcmfmac: psr: sdio 836 1896: F1r4 d020 800040 (b300)
+[ 68.565022] brcmfmac: psr: sdio 837 1896: F1w4 d020 40 (2200)
+[ 68.585169] brcmfmac: psr: sdio 838 155: F12r64f 8000 c000029ffd1002e (0)
+[ 68.605163] brcmfmac: psr: sdio 839 155: F12r64f 8000 0 (0)
+[ 68.625166] brcmfmac: psr: sdio 840 155: F12w56 8000 1000032ffc70038 (b180)
+[ 68.645008] brcmfmac: psr: sdio 841 1896: F1r4 d020 800040 (b300)
+[ 68.664999] brcmfmac: psr: sdio 842 1896: F1w4 d020 40 (2200)
+[ 68.685151] brcmfmac: psr: sdio 843 155: F12r64f 8000 c00002affd1002e (0)
+[ 68.704991] brcmfmac: psr: sdio 844 155: F12r64f 8000 0 (0)
+[ 68.725168] brcmfmac: psr: sdio 845 155: F12w56 8000 1000032ffc70038 (f900)
+[ 68.745006] brcmfmac: psr: sdio 846 1896: F1r4 d020 800040 (b300)
+[ 68.765158] brcmfmac: psr: sdio 847 1896: F1w4 d020 40 (2200)
+[ 68.784991] brcmfmac: psr: sdio 848 155: F12r64f 8000 c00002bffd1002e (0)
+[ 68.804993] brcmfmac: psr: sdio 849 155: F12r64f 8000 0 (0)
+[ 68.825150] brcmfmac: psr: sdio 850 155: F12w56 8000 1000032ffc70038 (280)
+[ 68.845143] brcmfmac: psr: sdio 851 1896: F1r4 d020 800040 (b300)
+[ 68.864991] brcmfmac: psr: sdio 852 1896: F1w4 d020 40 (2200)
+[ 68.884990] brcmfmac: psr: sdio 853 155: F12r64f 8000 c00002cffd1002e (0)
+[ 68.904981] brcmfmac: psr: sdio 854 155: F12r64f 8000 0 (0)
+[ 68.925148] brcmfmac: psr: sdio 855 155: F12w56 8000 1000032ffc70038 (4a00)
+[ 68.944983] brcmfmac: psr: sdio 856 1896: F1r4 d020 800040 (b300)
+[ 68.964997] brcmfmac: psr: sdio 857 1896: F1w4 d020 40 (2200)
+[ 68.985168] brcmfmac: psr: sdio 858 155: F12r64f 8000 c00002dffd1002e (0)
+[ 69.005143] brcmfmac: psr: sdio 859 155: F12r64f 8000 0 (0)
+[ 69.025138] brcmfmac: psr: sdio 860 155: F12w56 8000 1000032ffc70038 (9380)
+[ 69.044996] brcmfmac: psr: sdio 861 1896: F1r4 d020 800040 (b300)
+[ 69.065112] brcmfmac: psr: sdio 862 1896: F1w4 d020 40 (2200)
+[ 69.085138] brcmfmac: psr: sdio 863 155: F12r64f 8000 c00002effd1002e (0)
+[ 69.104980] brcmfmac: psr: sdio 864 155: F12r64f 8000 0 (0)
+[ 69.125146] brcmfmac: psr: sdio 865 155: F12w56 8000 1000032ffc70038 (db00)
+[ 69.144982] brcmfmac: psr: sdio 866 1896: F1r4 d020 800040 (b300)
+[ 69.164983] brcmfmac: psr: sdio 867 1896: F1w4 d020 40 (2200)
+[ 69.184998] brcmfmac: psr: sdio 868 155: F12r64f 8000 c00002fffd1002e (0)
+[ 69.205001] brcmfmac: psr: sdio 869 155: F12r64f 8000 0 (0)
+[ 69.225137] brcmfmac: psr: sdio 870 155: F12w56 8000 1000032ffc70038 (ec80)
+[ 69.245141] brcmfmac: psr: sdio 871 1896: F1r4 d020 800040 (b300)
+[ 69.264980] brcmfmac: psr: sdio 872 1896: F1w4 d020 40 (2200)
+[ 69.285140] brcmfmac: psr: sdio 873 155: F12r64f 8000 c000030ffd1002e (0)
+[ 69.304990] brcmfmac: psr: sdio 874 155: F12r64f 8000 0 (0)
+[ 69.325131] brcmfmac: psr: sdio 875 155: F12w56 8000 1000032ffc70038 (e000)
+[ 69.344968] brcmfmac: psr: sdio 876 1896: F1r4 d020 800040 (b300)
+[ 69.365125] brcmfmac: psr: sdio 877 1896: F1w4 d020 40 (2200)
+[ 69.384974] brcmfmac: psr: sdio 878 155: F12r64f 8000 c000031ffd1002e (0)
+[ 69.405132] brcmfmac: psr: sdio 879 155: F12r64f 8000 0 (0)
+[ 69.424961] brcmfmac: psr: sdio 880 155: F12w56 8000 1000032ffc70038 (3980)
+[ 69.444961] brcmfmac: psr: sdio 881 1896: F1r4 d020 800040 (b300)
+[ 69.465109] brcmfmac: psr: sdio 882 1896: F1w4 d020 40 (2200)
+[ 69.484961] brcmfmac: psr: sdio 883 155: F12r64f 8000 c000032ffd1002e (0)
+[ 69.504954] brcmfmac: psr: sdio 884 155: F12r64f 8000 0 (0)
+[ 69.525131] brcmfmac: psr: sdio 885 155: F12w56 8000 1000032ffc70038 (7100)
+[ 69.545133] brcmfmac: psr: sdio 886 1896: F1r4 d020 800040 (b300)
+[ 69.565137] brcmfmac: psr: sdio 887 1896: F1w4 d020 40 (2200)
+[ 69.584976] brcmfmac: psr: sdio 888 155: F12r64f 8000 c000033ffd1002e (0)
+[ 69.604963] brcmfmac: psr: sdio 889 155: F12r64f 8000 0 (0)
+[ 69.625115] brcmfmac: psr: sdio 890 155: F12w56 8000 1000032ffc70038 (8a80)
+[ 69.645116] brcmfmac: psr: sdio 891 1896: F1r4 d020 800040 (b300)
+[ 69.664950] brcmfmac: psr: sdio 892 1896: F1w4 d020 40 (2200)
+[ 69.685120] brcmfmac: psr: sdio 893 155: F12r64f 8000 c000034ffd1002e (0)
+[ 69.704956] brcmfmac: psr: sdio 894 155: F12r64f 8000 0 (0)
+[ 69.725103] brcmfmac: psr: sdio 895 155: F12w56 8000 1000032ffc70038 (c200)
+[ 69.744954] brcmfmac: psr: sdio 896 1896: F1r4 d020 800040 (b300)
+[ 69.765095] brcmfmac: psr: sdio 897 1896: F1w4 d020 40 (2200)
+[ 69.785099] brcmfmac: psr: sdio 898 155: F12r64f 8000 c000035ffd1002e (0)
+[ 69.805094] brcmfmac: psr: sdio 899 155: F12r64f 8000 0 (0)
+[ 69.825093] brcmfmac: psr: sdio 900 155: F12w56 8000 1000032ffc70038 (1b80)
+[ 69.845093] brcmfmac: psr: sdio 901 1896: F1r4 d020 800040 (b300)
+[ 69.864931] brcmfmac: psr: sdio 902 1896: F1w4 d020 40 (2200)
+[ 69.885097] brcmfmac: psr: sdio 903 155: F12r64f 8000 c000036ffd1002e (0)
+[ 69.904946] brcmfmac: psr: sdio 904 155: F12r64f 8000 0 (0)
+[ 69.925112] brcmfmac: psr: sdio 905 155: F12w56 8000 1000032ffc70038 (5300)
+[ 69.944945] brcmfmac: psr: sdio 906 1896: F1r4 d020 800040 (b300)
+[ 69.965106] brcmfmac: psr: sdio 907 1896: F1w4 d020 40 (2200)
+[ 69.984942] brcmfmac: psr: sdio 908 155: F12r64f 8000 c000037ffd1002e (0)
+[ 70.004950] brcmfmac: psr: sdio 909 155: F12r64f 8000 0 (0)
+[ 70.025098] brcmfmac: psr: sdio 910 155: F12w56 8000 1000032ffc70038 (7480)
+[ 70.045093] brcmfmac: psr: sdio 911 1896: F1r4 d020 800040 (b300)
+[ 70.064933] brcmfmac: psr: sdio 912 1896: F1w4 d020 40 (2200)
+[ 70.085110] brcmfmac: psr: sdio 913 155: F12r64f 8000 c000038ffd1002e (0)
+[ 70.104948] brcmfmac: psr: sdio 914 155: F12r64f 8000 0 (0)
+[ 70.125118] brcmfmac: psr: sdio 915 155: F12w56 8000 1000032ffc70038 (3c00)
+[ 70.144948] brcmfmac: psr: sdio 916 1896: F1r4 d020 800040 (b300)
+[ 70.164946] brcmfmac: psr: sdio 917 1896: F1w4 d020 40 (2200)
+[ 70.184955] brcmfmac: psr: sdio 918 155: F12r64f 8000 c000039ffd1002e (0)
+[ 70.204938] brcmfmac: psr: sdio 919 155: F12r64f 8000 0 (0)
+[ 70.225082] brcmfmac: psr: sdio 920 155: F12w56 8000 1000032ffc70038 (e580)
+[ 70.244939] brcmfmac: psr: sdio 921 1896: F1r4 d020 800040 (b300)
+[ 70.264931] brcmfmac: psr: sdio 922 1896: F1w4 d020 40 (2200)
+[ 70.284944] brcmfmac: psr: sdio 923 155: F12r64f 8000 c00003affd1002e (0)
+[ 70.304929] brcmfmac: psr: sdio 924 155: F12r64f 8000 0 (0)
+[ 70.325102] brcmfmac: psr: sdio 925 155: F12w56 8000 1000032ffc70038 (ad00)
+[ 70.344931] brcmfmac: psr: sdio 926 1896: F1r4 d020 800040 (b300)
+[ 70.365078] brcmfmac: psr: sdio 927 1896: F1w4 d020 40 (2200)
+[ 70.384931] brcmfmac: psr: sdio 928 155: F12r64f 8000 c00003bffd1002e (0)
+[ 70.404934] brcmfmac: psr: sdio 929 155: F12r64f 8000 0 (0)
+[ 70.425082] brcmfmac: psr: sdio 930 155: F12w56 8000 1000032ffc70038 (5680)
+[ 70.445082] brcmfmac: psr: sdio 931 1896: F1r4 d020 800040 (b300)
+[ 70.464915] brcmfmac: psr: sdio 932 1896: F1w4 d020 40 (2200)
+[ 70.485100] brcmfmac: psr: sdio 933 155: F12r64f 8000 c00003cffd1002e (0)
+[ 70.504920] brcmfmac: psr: sdio 934 155: F12r64f 8000 0 (0)
+[ 70.525078] brcmfmac: psr: sdio 935 155: F12w56 8000 1000032ffc70038 (c20)
+[ 70.544949] brcmfmac: psr: sdio 936 1896: F1r4 d020 800040 (b300)
+[ 70.565041] brcmfmac: psr: sdio 937 1896: F1w4 d020 40 (2200)
+[ 70.585097] brcmfmac: psr: sdio 938 155: F12r64f 8000 c00003dffd1002e (0)
+[ 70.604872] brcmfmac: psr: sdio 939 155: F12r64f 8000 0 (0)
+[ 70.625116] brcmfmac: psr: sdio 940 155: F12w56 8000 1000032ffc70038 (d5a0)
+[ 70.644935] brcmfmac: psr: sdio 941 1896: F1r4 d020 800040 (b300)
+[ 70.665094] brcmfmac: psr: sdio 942 1896: F1w4 d020 40 (2200)
+[ 70.685099] brcmfmac: psr: sdio 943 155: F12r64f 8000 c00003effd1002e (0)
+[ 70.704917] brcmfmac: psr: sdio 944 155: F12r64f 8000 0 (0)
+[ 70.725092] brcmfmac: psr: sdio 945 155: F12w56 8000 1000032ffc70038 (9d20)
+[ 70.744921] brcmfmac: psr: sdio 946 1896: F1r4 d020 800040 (b300)
+[ 70.765074] brcmfmac: psr: sdio 947 1896: F1w4 d020 40 (2200)
+[ 70.784931] brcmfmac: psr: sdio 948 155: F12r64f 8000 c00003fffd1002e (0)
+[ 70.804917] brcmfmac: psr: sdio 949 155: F12r64f 8000 0 (0)
+[ 70.825076] brcmfmac: psr: sdio 950 155: F12w56 8000 1000032ffc70038 (22a0)
+[ 70.845069] brcmfmac: psr: sdio 951 1896: F1r4 d020 800040 (b300)
+[ 70.864908] brcmfmac: psr: sdio 952 1896: F1w4 d020 40 (2200)
+[ 70.885106] brcmfmac: psr: sdio 953 155: F12r64f 8000 c000040ffd1002e (0)
+[ 70.904913] brcmfmac: psr: sdio 954 155: F12r64f 8000 0 (0)
+[ 70.925061] brcmfmac: psr: sdio 955 155: F12w56 8000 1000032ffc70038 (6a20)
+[ 70.944901] brcmfmac: psr: sdio 956 1896: F1r4 d020 800040 (b300)
+[ 70.964923] brcmfmac: psr: sdio 957 1896: F1w4 d020 40 (2200)
+[ 70.985081] brcmfmac: psr: sdio 958 155: F12r64f 8000 c000041ffd1002e (0)
+[ 71.005073] brcmfmac: psr: sdio 959 155: F12r64f 8000 0 (0)
+[ 71.024901] brcmfmac: psr: sdio 960 155: F12w56 8000 100002effc70038 (2ba0)
+[ 71.044902] brcmfmac: psr: sdio 961 1896: F1r4 d020 800040 (b300)
+[ 71.065051] brcmfmac: psr: sdio 962 1896: F1w4 d020 40 (2200)
+[ 71.085071] brcmfmac: psr: sdio 963 155: F12r64f 8000 c000042ffd5002a (0)
+[ 71.104855] brcmfmac: psr: sdio 964 155: F12r64f 8000 0 (0)
+[ 71.124919] brcmfmac: psr: sdio 965 155: F12w56 8000 1000031ffc70038 (f600)
+[ 71.144902] brcmfmac: psr: sdio 966 1896: F1r4 d020 800040 (b300)
+[ 71.165050] brcmfmac: psr: sdio 967 1896: F1w4 d020 40 (2200)
+[ 71.184921] brcmfmac: psr: sdio 968 155: F12r64f 8000 c000043ffd2002d (0)
+[ 71.204917] brcmfmac: psr: sdio 969 155: F12r64f 8000 0 (0)
+[ 71.225039] brcmfmac: psr: sdio 970 155: F12w56 8000 1000031ffc70038 (8600)
+[ 71.245055] brcmfmac: psr: sdio 971 1896: F1r4 d020 800040 (b300)
+[ 71.264890] brcmfmac: psr: sdio 972 1896: F1w4 d020 40 (2200)
+[ 71.285070] brcmfmac: psr: sdio 973 155: F12r64f 8000 c000044ffd2002d (0)
+[ 71.304899] brcmfmac: psr: sdio 974 155: F12r64f 8000 0 (0)
+[ 71.325054] brcmfmac: psr: sdio 975 155: F12w48 8000 100002bffcf0030 (a5e0)
+[ 71.345056] brcmfmac: psr: sdio 976 1896: F1r4 d020 800040 (b300)
+[ 71.365059] brcmfmac: psr: sdio 977 1896: F1w4 d020 40 (2200)
+[ 71.384882] brcmfmac: psr: sdio 978 155: F12r64f 8000 c000045ffd80027 (0)
+[ 71.405060] brcmfmac: psr: sdio 979 155: F12r64f 8000 0 (0)
+[ 71.425028] brcmfmac: psr: sdio 980 155: F12w56 8000 100002fffc70038 (2300)
+[ 71.444904] brcmfmac: psr: sdio 981 1896: F1r4 d020 800040 (b300)
+[ 71.465047] brcmfmac: psr: sdio 982 1896: F1w4 d020 40 (2200)
+[ 71.484876] brcmfmac: psr: sdio 983 155: F12r64f 8000 c000046ffd4002b (0)
+[ 71.504898] brcmfmac: psr: sdio 984 155: F12r64f 8000 0 (0)
+[ 71.525053] brcmfmac: psr: sdio 985 155: F12w2048 8000 10005fef7ff0800 (0)
+[ 71.544875] brcmfmac: psr: sdio 986 1896: F1r4 d020 800040 (b300)
+[ 71.564904] brcmfmac: psr: sdio 987 1896: F1w4 d020 40 (2200)
+[ 71.585006] brcmfmac: psr: sdio 988 155: F12r64f 8000 c000047f9d90626 (b38)
+[ 71.604886] brcmfmac: psr: sdio 989 155: F12r1536f 8000 180500001804 (0)
+[ 71.624890] brcmfmac: psr: sdio 990 155: F12r64f 8000 0 (0)
+[ 71.645020] brcmfmac: psr: sdio 991 155: F12w56 8000 100002effc70038 (7414)
+[ 71.664867] brcmfmac: psr: sdio 992 1896: F1r4 d020 800040 (b300)
+[ 71.684882] brcmfmac: psr: sdio 993 1896: F1w4 d020 40 (2200)
+[ 71.705025] brcmfmac: psr: sdio 994 155: F12r64f 8000 c000048ffd5002a (0)
+[ 71.725014] brcmfmac: psr: sdio 995 155: F12r64f 8000 0 (0)
+[ 71.745013] brcmfmac: psr: sdio 996 155: F12w72 8000 100003dffb70048 (e3b8)
+[ 71.764893] brcmfmac: psr: sdio 997 1896: F1r4 d020 800040 (b300)
+[ 71.784865] brcmfmac: psr: sdio 998 1896: F1w4 d020 40 (2200)
+[ 71.805019] brcmfmac: psr: sdio 999 155: F12r64f 8000 c000049ffc60039 (8000)
+[ 71.824863] brcmfmac: psr: sdio 1000 155: F12r64f 8000 0 (0)
+[ 71.845042] brcmfmac: psr: sdio 1001 155: F12w56 8000 1000030ffc70038 (8d0)
+[ 71.864871] brcmfmac: psr: sdio 1002 1896: F1r4 d020 800040 (b300)
+[ 71.884854] brcmfmac: psr: sdio 1003 1896: F1w4 d020 40 (2200)
+[ 71.904788] brcmfmac: psr: sdio 1004 155: F12r64f 8000 c00004affd3002c (0)
+[ 71.924798] brcmfmac: psr: sdio 1005 155: F12r64f 8000 0 (0)
+[ 71.944872] brcmfmac: psr: sdio 1006 155: F12w72 8000 100003dffb70048 (e3b8)
+[ 71.964861] brcmfmac: psr: sdio 1007 1896: F1r4 d020 800040 (b300)
+[ 71.985013] brcmfmac: psr: sdio 1008 1896: F1w4 d020 40 (2200)
+[ 72.005025] brcmfmac: psr: sdio 1009 155: F12r64f 8000 c00004bffc60039 (8000)
+[ 72.024875] brcmfmac: psr: sdio 1010 155: F12r64f 8000 0 (0)
+[ 72.045025] brcmfmac: psr: sdio 1011 155: F12w56 8000 100002dffc70038 (30)
+[ 72.064854] brcmfmac: psr: sdio 1012 1896: F1r4 d020 800040 (b300)
+[ 72.084834] brcmfmac: psr: sdio 1013 1896: F1w4 d020 40 (2200)
+[ 72.104864] brcmfmac: psr: sdio 1014 155: F12r64f 8000 c00004cffd60029 (0)
+[ 72.124867] brcmfmac: psr: sdio 1015 152: F1r4 d020 0 (0)
+[ 72.145003] brcmfmac: psr: sdio 1016 155: F12r64f 8000 0 (0)
+[ 72.164848] brcmfmac: psr: sdio 1017 155: F12w56 8000 100002dffc70038 (30)
+[ 72.184864] brcmfmac: psr: sdio 1018 152: F1r4 d020 800040 (b300)
+[ 72.204877] brcmfmac: psr: sdio 1019 1896: F1r4 d020 800040 (b300)
+[ 72.225016] brcmfmac: psr: sdio 1020 1896: F1w4 d020 40 (2200)
+[ 72.244975] brcmfmac: psr: sdio 1021 155: F12r64f 8000 c00004dffd60029 (0)
+[ 72.264843] brcmfmac: psr: sdio 1022 155: F12r64f 8000 0 (0)
+[ 72.284990] brcmfmac: psr: sdio 1023 152: F1r4 d020 0 (0)
+[ 72.304972] brcmfmac: psr: sdio 1024 152: F1r4 d020 0 (0)
+[ 72.324974] brcmfmac: psr: sdio 1025 152: F1r4 d020 0 (0)
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/linuxisms.c b/drivers/wlan/third_party/broadcom/brcmfmac/linuxisms.c
new file mode 100644
index 0000000..1aca4bb
--- /dev/null
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/linuxisms.c
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2018 The Fuchsia Authors.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "linuxisms.h"
+
+#include <pthread.h>
+
+#include "debug.h"
+
+void sdio_claim_host(struct sdio_func* func) {
+ pthread_mutex_lock(&func->lock);
+}
+
+void sdio_release_host(struct sdio_func* func) {
+ pthread_mutex_unlock(&func->lock);
+}
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/linuxisms.h b/drivers/wlan/third_party/broadcom/brcmfmac/linuxisms.h
index 8855d40..5b3fe57 100644
--- a/drivers/wlan/third_party/broadcom/brcmfmac/linuxisms.h
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/linuxisms.h
@@ -28,6 +28,7 @@
#include <ddk/device.h>
#include <ddk/protocol/usb.h> // Remove when the USB structs move out
#include <netinet/if_ether.h>
+#include <pthread.h>
#include <stdarg.h>
#include <stdint.h>
#include <stdio.h>
@@ -574,6 +575,15 @@
struct brcmf_cfg80211_info* cfg80211_info;
};
+// This stubs the use of struct sdio_func, which we only use for locking.
+
+struct sdio_func {
+ pthread_mutex_t lock;
+};
+
+void sdio_claim_host(struct sdio_func* func);
+void sdio_release_host(struct sdio_func* func);
+
struct cfg80211_ssid {
size_t ssid_len;
char* ssid;
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/sdio.c b/drivers/wlan/third_party/broadcom/brcmfmac/sdio.c
index 35fe653..e7be1f6 100644
--- a/drivers/wlan/third_party/broadcom/brcmfmac/sdio.c
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/sdio.c
@@ -504,7 +504,7 @@
sync_completion_t watchdog_wait;
atomic_bool watchdog_should_stop;
pthread_t watchdog_tsk;
- bool wd_active;
+ atomic_bool wd_active;
struct workqueue_struct* brcmf_wq;
struct work_struct datawork;
@@ -582,6 +582,7 @@
atomic_int dw_state;
atomic_int dw_count;
+struct brcmf_sdio* gl_sdio_bus;
BRCMF_FW_NVRAM_DEF(43143, "brcmfmac43143-sdio.bin", "brcmfmac43143-sdio.txt");
BRCMF_FW_NVRAM_DEF(43241B0, "brcmfmac43241b0-sdio.bin", "brcmfmac43241b0-sdio.txt");
@@ -948,6 +949,7 @@
struct sdpcm_shared_le sh_le;
uint32_t addr_le;
+ sdio_claim_host(bus->sdiodev->func1);
brcmf_sdio_bus_sleep(bus, false, false);
/*
@@ -956,13 +958,13 @@
*/
shaddr = bus->ci->rambase + bus->ci->ramsize - 4;
- brcmf_dbg(TEMP, "rambase 0x%x, ramsize 0x%x, shaddr 0x%x",
- bus->ci->rambase, bus->ci->ramsize, shaddr);
+ // brcmf_dbg(TEMP, "rambase 0x%x, ramsize 0x%x, shaddr 0x%x",
+ // bus->ci->rambase, bus->ci->ramsize, shaddr);
if (!bus->ci->rambase && brcmf_chip_sr_capable(bus->ci)) {
- brcmf_dbg(TEMP, "Subtracting srsize: 0x%x", bus->ci->srsize);
+ // brcmf_dbg(TEMP, "Subtracting srsize: 0x%x", bus->ci->srsize);
shaddr -= bus->ci->srsize;
}
- brcmf_dbg(TEMP, "Final shaddr is 0x%x", shaddr);
+ // brcmf_dbg(TEMP, "Final shaddr is 0x%x", shaddr);
rv = brcmf_sdiod_ramrw(bus->sdiodev, false, shaddr, (uint8_t*)&addr_le, 4);
if (rv != ZX_OK) {
goto fail;
@@ -979,7 +981,7 @@
goto fail;
}
- brcmf_dbg(INFO, "sdpcm_shared address 0x%08X\n", addr);
+ // brcmf_dbg(INFO, "sdpcm_shared address 0x%08X\n", addr);
/* Read hndrte_shared structure */
rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr, (uint8_t*)&sh_le,
@@ -988,6 +990,8 @@
goto fail;
}
+ sdio_release_host(bus->sdiodev->func1);
+
/* Endianness */
sh->flags = sh_le.flags;
sh->trap_addr = sh_le.trap_addr;
@@ -1006,6 +1010,7 @@
fail:
brcmf_err("unable to obtain sdpcm_shared info: rv=%d (addr=0x%x)\n", rv, addr);
+ sdio_release_host(bus->sdiodev->func1);
return rv;
}
@@ -1020,6 +1025,10 @@
static void brcmf_sdio_get_console_addr(struct brcmf_sdio* bus) {}
#endif /* DEBUG */
+
+void brcmf_sdiod_func1_wlfff(struct brcmf_sdio_dev* sdiodev, uint32_t addr, uint32_t data,
+ zx_status_t* ret);
+
static uint32_t brcmf_sdio_hostmail(struct brcmf_sdio* bus) {
struct brcmf_sdio_dev* sdiod = bus->sdiodev;
struct brcmf_core* core = bus->sdio_core;
@@ -1029,15 +1038,19 @@
zx_status_t ret;
brcmf_dbg(SDIO, "Enter\n");
+ atomic_store(&dw_state, 231);
/* Read mailbox data and ack that we did so */
hmb_data = brcmf_sdiod_func1_rl(sdiod, core->base + SD_REG(tohostmailboxdata), &ret);
+ atomic_store(&dw_state, 2311);
if (ret == ZX_OK) {
- brcmf_sdiod_func1_wl(sdiod, core->base + SD_REG(tosbmailbox), SMB_INT_ACK, &ret);
+ brcmf_sdiod_func1_wlfff(sdiod, core->base + SD_REG(tosbmailbox), SMB_INT_ACK, &ret);
}
+ atomic_store(&dw_state, 2312);
bus->sdcnt.f1regdata += 2;
+ atomic_store(&dw_state, 232);
/* dongle indicates the firmware has halted/crashed */
if (hmb_data & HMB_DATA_FWHALT) {
@@ -1054,6 +1067,7 @@
bus->rxskip = false;
intstatus |= I_HMB_FRAME_IND;
}
+ atomic_store(&dw_state, 233);
/*
* DEVREADY does not occur with gSPI.
@@ -1075,6 +1089,7 @@
*/
brcmf_sdio_get_console_addr(bus);
}
+ atomic_store(&dw_state, 234);
/*
* Flow Control has been moved into the RX headers and this out of band
@@ -1095,12 +1110,14 @@
bus->sdcnt.fc_rcvd++;
bus->flowcontrol = fcbits;
}
+ atomic_store(&dw_state, 235);
/* Shouldn't be any others */
if (hmb_data & ~(HMB_DATA_DEVREADY | HMB_DATA_NAKHANDLED | HMB_DATA_FC | HMB_DATA_FWREADY |
HMB_DATA_FWHALT | HMB_DATA_FCDATA_MASK | HMB_DATA_VERSION_MASK)) {
brcmf_err("Unknown mailbox data content: 0x%02x\n", hmb_data);
}
+ atomic_store(&dw_state, 236);
return intstatus;
}
@@ -1113,8 +1130,9 @@
uint8_t hi, lo;
zx_status_t err;
- brcmf_err("%sterminate frame%s\n", abort ? "abort command, " : "", rtx ? ", send NAK" : "");
-
+ THROTTLE(20,
+ brcmf_err("%sterminate frame%s\n", abort ? "abort command, " : "", rtx ? ", send NAK" : "");
+ )
if (abort) {
brcmf_sdiod_abort(bus->sdiodev, SDIO_FN_2);
}
@@ -1141,7 +1159,7 @@
if (!retries) {
brcmf_err("count never zeroed: last 0x%04x\n", lastrbc);
} else {
- brcmf_dbg(SDIO, "flush took %d iterations\n", 0xffff - retries);
+ THROTTLE(20, brcmf_dbg(SDIO, "flush took %d iterations\n", 0xffff - retries););
}
if (rtx) {
@@ -1150,6 +1168,7 @@
bus->sdcnt.f1regdata++;
if (err == ZX_OK) {
+ brcmf_dbg(TEMP, "* * * SETTING rxskip TO TRUE * * *");
bus->rxskip = true;
}
}
@@ -1275,15 +1294,15 @@
//trace_brcmf_sdpcm_hdr(SDPCM_RX, header);
/* hw header */
- len = *(uint16_t*)&header;
- checksum = *(uint16_t*)&header + sizeof(uint16_t);
+ len = *(uint16_t*)header;
+ checksum = *(uint16_t*)(header + sizeof(uint16_t));
/* All zero means no more to read */
if (!(len | checksum)) {
bus->rxpending = false;
return ZX_ERR_BUFFER_TOO_SMALL;
}
if ((uint16_t)(~(len ^ checksum))) {
- brcmf_err("HW header checksum error\n");
+ THROTTLE(20, brcmf_err("HW header checksum error\n"););
bus->sdcnt.rx_badhdr++;
brcmf_sdio_rxfail(bus, false, false);
return ZX_ERR_IO;
@@ -1508,16 +1527,20 @@
* read directly into the chained packet, or allocate a large
* packet and and copy into the chain.
*/
+ sdio_claim_host(bus->sdiodev->func1);
errcode = brcmf_sdiod_recv_chain(bus->sdiodev, &bus->glom, dlen);
+ sdio_release_host(bus->sdiodev->func1);
bus->sdcnt.f2rxdata++;
/* On failure, kill the superframe */
if (errcode != ZX_OK) {
brcmf_err("glom read of %d bytes failed: %d\n", dlen, errcode);
+ sdio_claim_host(bus->sdiodev->func1);
brcmf_sdio_rxfail(bus, true, false);
bus->sdcnt.rxglomfail++;
brcmf_sdio_free_glom(bus);
+ sdio_release_host(bus->sdiodev->func1);
return 0;
}
@@ -1526,7 +1549,9 @@
rd_new.seq_num = rxseq;
rd_new.len = dlen;
+ sdio_claim_host(bus->sdiodev->func1);
errcode = brcmf_sdio_hdparse(bus, pfirst->data, &rd_new, BRCMF_SDIO_FT_SUPER);
+ sdio_release_host(bus->sdiodev->func1);
bus->cur_read.len = rd_new.len_nxtfrm << 4;
/* Remove superframe header, remember offset */
@@ -1543,7 +1568,9 @@
rd_new.len = pnext->len;
rd_new.seq_num = rxseq++;
+ sdio_claim_host(bus->sdiodev->func1);
errcode = brcmf_sdio_hdparse(bus, pnext->data, &rd_new, BRCMF_SDIO_FT_SUB);
+ sdio_release_host(bus->sdiodev->func1);
brcmf_dbg_hex_dump(BRCMF_GLOM_ON(), pnext->data, 32, "subframe:\n");
num++;
@@ -1551,9 +1578,11 @@
if (errcode != ZX_OK) {
/* Terminate frame on error */
+ sdio_claim_host(bus->sdiodev->func1);
brcmf_sdio_rxfail(bus, true, false);
bus->sdcnt.rxglomfail++;
brcmf_sdio_free_glom(bus);
+ sdio_release_host(bus->sdiodev->func1);
bus->cur_read.len = 0;
return 0;
}
@@ -1600,7 +1629,10 @@
static int brcmf_sdio_dcmd_resp_wait(struct brcmf_sdio* bus, bool* pending) {
/* Wait until control frame is available */
*pending = false; // TODO(cphoenix): Does signal_pending() have meaning in Garnet?
- return sync_completion_wait(&bus->dcmd_resp_wait, ZX_MSEC(DCMD_RESP_TIMEOUT_MSEC));
+ zx_status_t result;
+ result = sync_completion_wait(&bus->dcmd_resp_wait, ZX_MSEC(DCMD_RESP_TIMEOUT_MSEC));
+ sync_completion_reset(&bus->dcmd_resp_wait);
+ return result;
}
static zx_status_t brcmf_sdio_dcmd_resp_wake(struct brcmf_sdio* bus) {
@@ -1614,7 +1646,7 @@
uint8_t* rbuf;
zx_status_t sdret;
- brcmf_dbg(TRACE, "Enter\n");
+ //brcmf_dbg(TRACE, "Enter\n");
if (bus->rxblen) {
buf = calloc(1, bus->rxblen);
@@ -1679,7 +1711,7 @@
gotpkt:
- brcmf_dbg_hex_dump(BRCMF_BYTES_ON() && BRCMF_CTL_ON(), buf, len, "RxCtrl:\n");
+ // brcmf_dbg_hex_dump(BRCMF_BYTES_ON() && BRCMF_CTL_ON(), buf, len, "RxCtrl:\n");
/* Point to valid data and indicate its length */
//spin_lock_bh(&bus->rxctl_lock);
@@ -1727,7 +1759,7 @@
struct brcmf_sdio_hdrinfo rd_new;
uint8_t head_read = 0;
- brcmf_dbg(TRACE, "Enter\n");
+ // THROTTLE(20, brcmf_dbg(TRACE, "Enter\n"););
/* Not finished unless we encounter no more frames indication */
bus->rxpending = true;
@@ -1749,6 +1781,7 @@
rd->len_left = rd->len;
/* read header first for unknow frame length */
+ sdio_claim_host(bus->sdiodev->func1);
if (!rd->len) {
ret = brcmf_sdiod_recv_buf(bus->sdiodev, bus->rxhdr, BRCMF_FIRSTREAD);
bus->sdcnt.f2rxhdrs++;
@@ -1756,13 +1789,16 @@
brcmf_err("RXHEADER FAILED: %d\n", ret);
bus->sdcnt.rx_hdrfail++;
brcmf_sdio_rxfail(bus, true, true);
+ sdio_release_host(bus->sdiodev->func1);
continue;
}
- brcmf_dbg_hex_dump(BRCMF_BYTES_ON() || BRCMF_HDRS_ON(), bus->rxhdr, SDPCM_HDRLEN,
- "RxHdr:\n");
+ // THROTTLE(20,
+ // brcmf_dbg_hex_dump(BRCMF_BYTES_ON() || BRCMF_HDRS_ON(), bus->rxhdr, SDPCM_HDRLEN,
+ // "RxHdr:\n"););
if (brcmf_sdio_hdparse(bus, bus->rxhdr, rd, BRCMF_SDIO_FT_NORMAL) != ZX_OK) {
+ sdio_release_host(bus->sdiodev->func1);
if (!bus->rxpending) {
break;
} else {
@@ -1777,6 +1813,7 @@
rd->len_nxtfrm = 0;
/* treat all packet as event if we don't know */
rd->channel = SDPCM_EVENT_CHANNEL;
+ sdio_release_host(bus->sdiodev->func1);
continue;
}
rd->len_left = rd->len > BRCMF_FIRSTREAD ? rd->len - BRCMF_FIRSTREAD : 0;
@@ -1790,6 +1827,7 @@
/* Give up on data, request rtx of events */
brcmf_err("brcmu_pkt_buf_get_netbuf failed\n");
brcmf_sdio_rxfail(bus, false, RETRYCHAN(rd->channel));
+ sdio_release_host(bus->sdiodev->func1);
continue;
}
brcmf_netbuf_shrink_head(pkt, head_read);
@@ -1797,52 +1835,65 @@
ret = brcmf_sdiod_recv_pkt(bus->sdiodev, pkt);
bus->sdcnt.f2rxdata++;
+ sdio_release_host(bus->sdiodev->func1);
if (ret != ZX_OK) {
brcmf_err("read %d bytes from channel %d failed: %d\n", rd->len, rd->channel, ret);
brcmu_pkt_buf_free_netbuf(pkt);
+ sdio_claim_host(bus->sdiodev->func1);
brcmf_sdio_rxfail(bus, true, RETRYCHAN(rd->channel));
+ sdio_release_host(bus->sdiodev->func1);
continue;
}
-
+ // brcmf_dbg(TEMP, "head_read %d", head_read);
if (head_read) {
brcmf_netbuf_grow_head(pkt, head_read);
memcpy(pkt->data, bus->rxhdr, head_read);
head_read = 0;
+ //brcmf_dbg(TEMP, "Got here 2");
} else {
memcpy(bus->rxhdr, pkt->data, SDPCM_HDRLEN);
rd_new.seq_num = rd->seq_num;
+ sdio_claim_host(bus->sdiodev->func1);
if (brcmf_sdio_hdparse(bus, bus->rxhdr, &rd_new, BRCMF_SDIO_FT_NORMAL) != ZX_OK) {
rd->len = 0;
brcmu_pkt_buf_free_netbuf(pkt);
}
+ // brcmf_dbg(TEMP, "Got here 25");
bus->sdcnt.rx_readahead_cnt++;
if (rd->len != roundup(rd_new.len, 16)) {
brcmf_err("frame length mismatch:read %d, should be %d\n", rd->len,
roundup(rd_new.len, 16) >> 4);
rd->len = 0;
brcmf_sdio_rxfail(bus, true, true);
+ sdio_release_host(bus->sdiodev->func1);
brcmu_pkt_buf_free_netbuf(pkt);
+ // brcmf_dbg(TEMP, "Got here 3");
continue;
}
+ sdio_release_host(bus->sdiodev->func1);
rd->len_nxtfrm = rd_new.len_nxtfrm;
rd->channel = rd_new.channel;
rd->dat_offset = rd_new.dat_offset;
- brcmf_dbg_hex_dump(!(BRCMF_BYTES_ON() && BRCMF_DATA_ON()) && BRCMF_HDRS_ON(),
- bus->rxhdr, SDPCM_HDRLEN, "RxHdr:\n");
+ // brcmf_dbg_hex_dump(!(BRCMF_BYTES_ON() && BRCMF_DATA_ON()) && BRCMF_HDRS_ON(),
+ // bus->rxhdr, SDPCM_HDRLEN, "RxHdr:\n");
if (rd_new.channel == SDPCM_CONTROL_CHANNEL) {
brcmf_err("readahead on control packet %d?\n", rd_new.seq_num);
/* Force retry w/normal header read */
rd->len = 0;
+ sdio_claim_host(bus->sdiodev->func1);
brcmf_sdio_rxfail(bus, false, true);
+ sdio_release_host(bus->sdiodev->func1);
brcmu_pkt_buf_free_netbuf(pkt);
+ // brcmf_dbg(TEMP, "Got here 4");
continue;
}
}
+ // brcmf_dbg(TEMP, "Got here 56");
- brcmf_dbg_hex_dump(BRCMF_BYTES_ON() && BRCMF_DATA_ON(), pkt->data, rd->len, "Rx Data:\n");
+ // brcmf_dbg_hex_dump(BRCMF_BYTES_ON() && BRCMF_DATA_ON(), pkt->data, rd->len, "Rx Data:\n");
/* Save superframe descriptor and allocate packet frame */
if (rd->channel == SDPCM_GLOM_CHANNEL) {
@@ -1857,7 +1908,9 @@
"%s: glom superframe w/o "
"descriptor!\n",
__func__);
+ sdio_claim_host(bus->sdiodev->func1);
brcmf_sdio_rxfail(bus, false, false);
+ sdio_release_host(bus->sdiodev->func1);
}
/* prepare the descriptor for the next read */
rd->len = rd->len_nxtfrm << 4;
@@ -1889,9 +1942,9 @@
rxcount = maxframes - rxleft;
/* Message if we hit the limit */
if (!rxleft) {
- brcmf_dbg(DATA, "hit rx limit of %d frames\n", maxframes);
+ THROTTLE(20, brcmf_dbg(DATA, "hit rx limit of %d frames\n", maxframes););
} else {
- brcmf_dbg(DATA, "processed %d frames\n", rxcount);
+ // brcmf_dbg(DATA, "processed %d frames\n", rxcount);
}
/* Back off rxseq if awaiting rtx, update rx_seq */
if (bus->rxskip) {
@@ -2135,6 +2188,7 @@
goto done;
}
+ sdio_claim_host(bus->sdiodev->func1);
ret = brcmf_sdiod_send_pkt(bus->sdiodev, pktq);
bus->sdcnt.f2txdata++;
@@ -2142,6 +2196,7 @@
brcmf_sdio_txfail(bus);
}
+ sdio_release_host(bus->sdiodev->func1);
done:
brcmf_sdio_txpkt_postp(bus, pktq);
@@ -2199,7 +2254,9 @@
/* In poll mode, need to check for other events */
if (!bus->intr) {
/* Check device status, signal pending interrupt */
+ sdio_claim_host(bus->sdiodev->func1);
intstatus = brcmf_sdiod_func1_rl(bus->sdiodev, intstat_addr, &ret);
+ sdio_release_host(bus->sdiodev->func1);
bus->sdcnt.f2txdata++;
if (ret != ZX_OK) {
@@ -2228,8 +2285,7 @@
// TODO(cphoenix): ret, err, rv, error, status - more consistency is better.
zx_status_t ret;
- brcmf_dbg(TRACE, "Enter\n"); PAUSE;
- brcmf_dbg(TRACE, "Enterrr\n");
+ //brcmf_dbg(TRACE, "Enter\n");
/* Back the pointer to make room for bus header */
frame -= bus->tx_hdrlen;
@@ -2261,34 +2317,26 @@
hd_info.seq_num = bus->tx_seq;
hd_info.lastfrm = true;
hd_info.tail_pad = pad;
- brcmf_dbg(TRACE, "Ente2r\n");
brcmf_sdio_hdpack(bus, frame, &hd_info);
- brcmf_dbg(TRACE, "3Enter\n");
if (bus->txglom) {
brcmf_sdio_update_hwhdr(frame, len);
}
- brcmf_dbg(TRACE, "4Enter\n");
- brcmf_dbg_hex_dump(BRCMF_BYTES_ON() && BRCMF_CTL_ON(), frame, len, "Tx Frame:\n");
- brcmf_dbg_hex_dump(!(BRCMF_BYTES_ON() && BRCMF_CTL_ON()) && BRCMF_HDRS_ON(), frame,
- min_t(uint16_t, len, 16), "TxHdr:\n");
+// brcmf_dbg_hex_dump(BRCMF_BYTES_ON() && BRCMF_CTL_ON(), frame, len, "Tx Frame:\n");
+ // brcmf_dbg_hex_dump(!(BRCMF_BYTES_ON() && BRCMF_CTL_ON()) && BRCMF_HDRS_ON(), frame,
+ // min_t(uint16_t, len, 16), "TxHdr:\n");
do {
- brcmf_dbg(TRACE, "Ente5r\n");
- //gl_compare_now = true;
ret = brcmf_sdiod_send_buf(bus->sdiodev, frame, len);
- brcmf_dbg(TRACE, "Ente6\n");
if (ret != ZX_OK) {
- brcmf_dbg(TRACE, "Ente7r\n");
brcmf_sdio_txfail(bus);
- brcmf_dbg(TRACE, "Ente8r\n");
} else {
bus->tx_seq = (bus->tx_seq + 1) % SDPCM_SEQ_WRAP;
}
} while (ret != ZX_OK && retries++ < TXRETRIES);
- brcmf_dbg(TRACE, "Entexxxxr\n");
+ //brcmf_dbg(TRACE, "Exit\n");
return ret;
}
@@ -2315,6 +2363,7 @@
}
if (sdiodev->state != BRCMF_SDIOD_NOMEDIUM) {
+ sdio_claim_host(sdiodev->func1);
/* Enable clock for device interrupts */
brcmf_sdio_bus_sleep(bus, false, false);
@@ -2342,6 +2391,7 @@
/* Clear any pending interrupts now that F2 is disabled */
brcmf_sdiod_func1_wl(sdiodev, core->base + SD_REG(intstatus), local_hostintmask, NULL);
+ sdio_release_host(sdiodev->func1);
}
/* Clear the data packet queues */
brcmu_pktq_flush(&bus->txq, true, NULL, NULL);
@@ -2373,7 +2423,6 @@
uint32_t addr;
unsigned long val;
zx_status_t ret;
- static int times = 0;
brcmf_sdio_bus_sleep(bus, false, true);
@@ -2385,13 +2434,9 @@
return ret;
}
- times++;
- if (times < 10 || (times & 0x3ff) == 0) {
- brcmf_err("core->base 0x%x, SD_REG(int) 0x%lx\n", core->base, SD_REG(intstatus));
- brcmf_err("times %d, val %lx, intmask %x\n", times, val, bus->hostintmask);
- }
+ // THROTTLE(20, brcmf_dbg(TEMP, "val 0x%lx, hostmask 0x%x", val, bus->hostintmask););
val &= bus->hostintmask;
- atomic_store(&bus->fcstate, !!(val & I_HMB_FC_STATE));
+ atomic_store(&bus->fcstate, !!(val & I_HMB_FC_STATE)); // Flow Control, 0x10
/* Clear interrupts */
if (val) {
@@ -2413,11 +2458,12 @@
uint framecnt; /* Temporary counter of tx/rx frames */
zx_status_t err = ZX_OK;
- //brcmf_dbg(TRACE, "Enter\n");
+ // THROTTLE(20, brcmf_dbg(TRACE, "Enter\n"););
atomic_store(&dw_state, 11);
bool save_print_sdio = print_sdio;
print_sdio = false;
+ sdio_claim_host(bus->sdiodev->func1);
/* If waiting for HTAVAIL, check status */
if (!bus->sr_enabled && bus->clkstate == CLK_PENDING) {
@@ -2469,7 +2515,7 @@
* crossed another change interrupt. If change still set, assume
* FC ON for safety, let next loop through do the debounce.
*/
- if (intstatus & I_HMB_FC_CHANGE) {
+ if (intstatus & I_HMB_FC_CHANGE) { // 0x20
atomic_store(&dw_state, 21);
intstatus &= ~I_HMB_FC_CHANGE;
@@ -2486,12 +2532,14 @@
atomic_store(&dw_state, 23);
/* Handle host mailbox indication */
- if (intstatus & I_HMB_HOST_INT) {
+ if (intstatus & I_HMB_HOST_INT) { // 0x80
intstatus &= ~I_HMB_HOST_INT;
intstatus |= brcmf_sdio_hostmail(bus);
}
atomic_store(&dw_state, 24);
+ sdio_release_host(bus->sdiodev->func1);
+
/* Generally don't ask for these, can get CRC errors... */
if (intstatus & I_WR_OOSYNC) {
brcmf_err("Dongle reports WR_OOSYNC\n");
@@ -2513,7 +2561,7 @@
brcmf_dbg(INFO, "Dongle reports CHIPACTIVE\n");
intstatus &= ~I_CHIPACTIVE;
}
-
+ //THROTTLE(100, brcmf_dbg(TEMP, "rxskip %d, FRAME_IND 0x%lx", bus->rxskip, intstatus & I_HMB_FRAME_IND););
/* Ignore frame indications if rxskip is set */
if (bus->rxskip) {
intstatus &= ~I_HMB_FRAME_IND;
@@ -2521,6 +2569,7 @@
atomic_store(&dw_state, 25);
/* On frame indication, read available frames */
+ // I_HMB_FRAME_IND = (1 << 6)
if ((intstatus & I_HMB_FRAME_IND) && (bus->clkstate == CLK_AVAIL)) {
atomic_store(&dw_state, 26);
@@ -2539,15 +2588,20 @@
if (atomic_load(&bus->ctrl_frame_stat) && (bus->clkstate == CLK_AVAIL) && data_ok(bus)) {
atomic_store(&dw_state, 28);
+ sdio_claim_host(bus->sdiodev->func1);
+ if (atomic_load(&bus->ctrl_frame_stat)) {
- err = brcmf_sdio_tx_ctrlframe(bus, bus->ctrl_frame_buf, bus->ctrl_frame_len);
- bus->ctrl_frame_err = err;
- atomic_thread_fence(memory_order_seq_cst);
- atomic_store(&bus->ctrl_frame_stat, false);
+ err = brcmf_sdio_tx_ctrlframe(bus, bus->ctrl_frame_buf, bus->ctrl_frame_len);
+ bus->ctrl_frame_err = err;
+ atomic_thread_fence(memory_order_seq_cst);
+ atomic_store(&bus->ctrl_frame_stat, false);
atomic_store(&dw_state, 29);
- brcmf_dbg(TEMP, "Wait event wakeup...");
+ }
+ sdio_release_host(bus->sdiodev->func1);
+
+ //brcmf_dbg(TEMP, "Wait event wakeup...");
brcmf_sdio_wait_event_wakeup(bus);
- brcmf_dbg(TEMP, "Woke up");
+ //brcmf_dbg(TEMP, "Woke up");
atomic_store(&dw_state, 30);
}
@@ -2570,12 +2624,14 @@
atomic_store(&bus->intstatus, 0);
atomic_store(&dw_state, 35);
if (atomic_load(&bus->ctrl_frame_stat)) {
+ sdio_claim_host(bus->sdiodev->func1);
atomic_store(&dw_state, 36);
bus->ctrl_frame_err = ZX_ERR_IO_REFUSED;
atomic_thread_fence(memory_order_seq_cst);
atomic_store(&bus->ctrl_frame_stat, false);
brcmf_sdio_wait_event_wakeup(bus);
atomic_store(&dw_state, 37);
+ sdio_release_host(bus->sdiodev->func1);
}
atomic_store(&dw_state, 38);
@@ -2709,7 +2765,7 @@
uint32_t n, idx, addr;
zx_status_t rv;
- brcmf_dbg(TEMP, "Got into readconsole");
+ //brcmf_dbg(TEMP, "Got into readconsole");
/* Don't do anything until FWREADY updates console address */
if (bus->console_addr == 0) {
brcmf_dbg(TEMP, "Console not ready yet: console_addr is 0");
@@ -2719,11 +2775,11 @@
/* Read console log struct */
addr = bus->console_addr + offsetof(struct rte_console, log_le);
rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr, (uint8_t*)&c->log_le, sizeof(c->log_le));
- brcmf_dbg(TEMP, "log struct read: addr 0x%x, rv %d", addr, rv);
+// brcmf_dbg(TEMP, "log struct read: addr 0x%x, rv %d", addr, rv);
if (rv != ZX_OK) {
return rv;
}
- brcmf_dbg(TEMP, "log_le.buf_size is %d 0x%x", c->log_le.buf_size, c->log_le.buf_size);
+ // brcmf_dbg(TEMP, "log_le.buf_size is %d 0x%x", c->log_le.buf_size, c->log_le.buf_size);
/* Allocate console buffer (one time only) */
if (c->buf == NULL) {
@@ -2798,12 +2854,13 @@
struct brcmf_sdio* bus = sdiodev->bus;
zx_status_t ret;
- brcmf_dbg(TRACE, "Enter\n");
+ // brcmf_dbg(TRACE, "Enter\n");
if (sdiodev->state != BRCMF_SDIOD_DATA) {
return ZX_ERR_IO;
}
/* Send from dpc */
+ sync_completion_reset(&bus->ctrl_wait);
bus->ctrl_frame_buf = msg;
bus->ctrl_frame_len = msglen;
atomic_thread_fence(memory_order_seq_cst);
@@ -2813,13 +2870,18 @@
sync_completion_wait(&bus->ctrl_wait, ZX_MSEC(CTL_DONE_TIMEOUT_MSEC));
ret = ZX_OK;
if (atomic_load(&bus->ctrl_frame_stat)) {
- brcmf_dbg(SDIO, "ctrl_frame timeout\n");
- atomic_store(&bus->ctrl_frame_stat, false);
- ret = ZX_ERR_SHOULD_WAIT;
+ sdio_claim_host(bus->sdiodev->func1);
+ if (atomic_load(&bus->ctrl_frame_stat)) {
+ brcmf_dbg(SDIO, "ctrl_frame timeout\n");
+ atomic_store(&bus->ctrl_frame_stat, false);
+ ret = ZX_ERR_SHOULD_WAIT;
+ }
+ sdio_release_host(bus->sdiodev->func1);
}
if (ret == ZX_OK) {
- brcmf_dbg(SDIO, "ctrl_frame complete, err=%d\n", bus->ctrl_frame_err);
- PAUSE; brcmf_dbg(SDIO, "aaactrl_frame complete, err=%d\n", bus->ctrl_frame_err);
+ if (bus->ctrl_frame_err != ZX_OK) {
+ brcmf_dbg(SDIO, "ctrl_frame complete, err=%d\n", bus->ctrl_frame_err);
+ }
atomic_thread_fence(memory_order_seq_cst);
ret = bus->ctrl_frame_err;
}
@@ -2938,6 +3000,7 @@
return ZX_OK;
}
+ sdio_claim_host(bus->sdiodev->func1);
if (sh->assert_file_addr != 0) {
error = brcmf_sdiod_ramrw(bus->sdiodev, false, sh->assert_file_addr, (uint8_t*)file, 80);
if (error != ZX_OK) {
@@ -2950,6 +3013,7 @@
return error;
}
}
+ sdio_release_host(bus->sdiodev->func1);
seq_printf(seq, "dongle assert: %s:%d: assert(%s)\n", file, sh->assert_line, expr);
return ZX_OK;
@@ -3073,7 +3137,7 @@
struct brcmf_sdio_dev* sdiodev = bus_if->bus_priv.sdio;
struct brcmf_sdio* bus = sdiodev->bus;
- brcmf_dbg(TRACE, "Enter\n");
+ //brcmf_dbg(TRACE, "Enter\n");
if (sdiodev->state != BRCMF_SDIOD_DATA) {
return ZX_ERR_IO;
}
@@ -3094,7 +3158,9 @@
free(buf);
if (rxlen) {
- brcmf_dbg(CTL, "resumed on rxctl frame, got %d expected %d\n", rxlen, msglen);
+ if (rxlen != msglen) {
+ brcmf_dbg(CTL, "resumed on rxctl frame, got %d expected %d\n", rxlen, msglen);
+ }
} else if (timeout) {
brcmf_err("resumed on timeout\n");
brcmf_sdio_checkdied(bus);
@@ -3222,12 +3288,13 @@
zx_status_t bcmerror = 0;
uint32_t rstvec;
+ sdio_claim_host(bus->sdiodev->func1);
brcmf_sdio_clkctl(bus, CLK_AVAIL, false);
rstvec = *(uint32_t*)fw->data;
brcmf_dbg(SDIO, "firmware rstvec: %x\n", rstvec);
print_sdio = false;
- //atomic_store(&gl_writing_firmware, true);
+ atomic_store(&gl_writing_firmware, true);
remember_sdio(3, 0xffff, 1, &bcmerror, 4, 0);
bcmerror = brcmf_sdio_download_code_file(bus, fw);
@@ -3263,6 +3330,7 @@
err:
brcmf_sdio_clkctl(bus, CLK_SDONLY, false);
+ sdio_release_host(bus->sdiodev->func1);
return bcmerror;
}
@@ -3348,7 +3416,7 @@
* a device perspective, ie. bus:txglom affects the
* bus transfers from device to host.
*/
- if (core->rev < 12) {
+ if (1 || core->rev < 12) {
/* for sdio core rev < 12, disable txgloming */
value = 0;
err = brcmf_iovar_data_set(dev, "bus:txglom", &value, sizeof(uint32_t));
@@ -3357,6 +3425,7 @@
value = sdiodev->settings->bus.sdio.sd_sgentry_align;
/* SDIO ADMA requires at least 32 bit alignment */
value = max(value, ALIGNMENT);
+ value = 0; // TODO(cphoenix): Get glomming working
err = brcmf_iovar_data_set(dev, "bus:txglomalign", &value, sizeof(uint32_t));
}
@@ -3394,6 +3463,7 @@
address = bus->ci->rambase;
offset = 0;
err = ZX_OK;
+ sdio_claim_host(sdiodev->func1);
while (offset < mem_size) {
len = ((offset + MEMBLOCK) < mem_size) ? MEMBLOCK : mem_size - offset;
err = brcmf_sdiod_ramrw(sdiodev, false, address, data, len);
@@ -3407,13 +3477,14 @@
}
done:
+ sdio_release_host(sdiodev->func1);
return err;
}
void brcmf_sdio_trigger_dpc(struct brcmf_sdio* bus) {
if (!atomic_load(&bus->dpc_triggered)) {
atomic_store(&bus->dpc_triggered, true);
- brcmf_dbg(TEMP, "About to call workqueue_schedule");
+ //brcmf_dbg(TEMP, "About to call workqueue_schedule");
workqueue_schedule(bus->brcmf_wq, &bus->datawork);
} else {
brcmf_dbg(TEMP, "trigger_dpc found it already triggered!");
@@ -3445,8 +3516,40 @@
}
+void brcmf_debug_check_console() {
+ zx_status_t result;
+ sdio_claim_host(gl_sdio_bus->sdiodev->func1);
+ /* Make sure backplane clock is on */
+ brcmf_sdio_bus_sleep(gl_sdio_bus, false, false);
+ //brcmf_dbg(TEMP, "Trying readconsole");
+ result = brcmf_sdio_readconsole(gl_sdio_bus);
+ if (result != ZX_OK) { /* stop on error */
+ brcmf_dbg(TEMP, "Got error %d reading console", result);
+ }
+ sdio_release_host(gl_sdio_bus->sdiodev->func1);
+
+}
+
+void brcmf_sdio_event_handler(struct brcmf_sdio* bus);
+
static void brcmf_sdio_bus_watchdog(struct brcmf_sdio* bus) {
- //brcmf_dbg(TIMER, "Enter\n");
+ //THROTTLE(20, brcmf_dbg(TIMER, "Enter\n"););
+
+ uint32_t intstatus;
+ intstatus = atomic_load(&bus->intstatus);
+ if (intstatus == 0) {
+ sdio_claim_host(bus->sdiodev->func1);
+ if (brcmf_sdio_intr_rstatus(bus)) {
+ brcmf_err("failed backplane access\n");
+ }
+ sdio_release_host(bus->sdiodev->func1);
+ }
+ intstatus = atomic_load(&bus->intstatus);
+ if (intstatus != 0) {
+ atomic_store(&bus->dpc_triggered, true);
+ // THROTTLE(20, brcmf_dbg(TEMP, "Calling event handler: intstatus is 0x%x", intstatus););
+ brcmf_sdio_event_handler(bus);
+ }
/* Poll period: check device if appropriate. */
if (!bus->sr_enabled && bus->poll && (++bus->polltick >= bus->pollrate)) {
@@ -3460,8 +3563,12 @@
if (!atomic_load(&bus->dpc_triggered)) {
uint8_t devpend;
+ sdio_claim_host(bus->sdiodev->func1);
+
devpend = brcmf_sdiod_func0_rb(bus->sdiodev, SDIO_CCCR_INTx, NULL);
+ sdio_release_host(bus->sdiodev->func1);
intstatus = devpend & (INTR_STATUS_FUNC1 | INTR_STATUS_FUNC2);
+ THROTTLE(20, brcmf_dbg(TEMP, "intstatus 0x%x", intstatus););
}
/* If there is something, make like the ISR and
@@ -3484,15 +3591,19 @@
bus->console.count += BRCMF_WD_POLL_MSEC;
if (bus->console.count >= bus->console_interval) {
bus->console.count -= bus->console_interval;
+ sdio_claim_host(bus->sdiodev->func1);
/* Make sure backplane clock is on */
brcmf_sdio_bus_sleep(bus, false, false);
if (brcmf_sdio_readconsole(bus) != ZX_OK) { /* stop on error */
bus->console_interval = 0;
}
+ sdio_release_host(bus->sdiodev->func1);
}
}
#endif /* DEBUG */
+// TODO(cphoenix): Turn "idle" back on once things are working, and see if anything breaks.
+#ifdef DO_IDLE
/* On idle timeout clear activity flag and/or turn off clock */
if (!atomic_load(&bus->dpc_triggered)) {
atomic_thread_fence(memory_order_seq_cst);
@@ -3500,9 +3611,11 @@
bus->idlecount++;
if (bus->idlecount > bus->idletime) {
brcmf_dbg(SDIO, "idle\n");
+ sdio_claim_host(bus->sdiodev->func1);
brcmf_sdio_wd_timer(bus, false);
bus->idlecount = 0;
brcmf_sdio_bus_sleep(bus, true, false);
+ sdio_release_host(bus->sdiodev->func1);
}
} else {
bus->idlecount = 0;
@@ -3510,25 +3623,19 @@
} else {
bus->idlecount = 0;
}
+#endif // DO_IDLE
}
-extern thrd_t gl_worker_thread;
-static void brcmf_sdio_dataworker(struct work_struct* work) {
- struct brcmf_sdio* bus = containerof(work, struct brcmf_sdio, datawork);
- gl_worker_thread = thrd_current();
- // We need this since dataworker can be called from both ISR and workqueue.
+void brcmf_sdio_event_handler(struct brcmf_sdio* bus) {
atomic_store(&dw_state, 1);
atomic_fetch_add(&dw_count, 1);
+ // We need this since dataworker can be called from both ISR and workqueue.
static mtx_t lock = {}; //MTX_INIT;
- atomic_store(&dw_state, 2);
- if (atomic_load(&bus->doing_txctl)) {
- brcmf_dbg(TEMP, "Got to dataworker while doing txctl");
- }
+ atomic_store(&dw_state, 2);
mtx_lock(&lock);
- if (atomic_load(&bus->doing_txctl)) {
- brcmf_dbg(TEMP, "past mutex while doing txctl");
- }
+ atomic_store(&dw_state, 211);
+
bus->dpc_running = true;
atomic_thread_fence(memory_order_seq_cst);
while (atomic_load(&bus->dpc_triggered)) {
@@ -3550,6 +3657,42 @@
atomic_store(&dw_state, 0);
}
+extern thrd_t gl_worker_thread;
+static void brcmf_sdio_dataworker(struct work_struct* work) {
+ struct brcmf_sdio* bus = containerof(work, struct brcmf_sdio, datawork);
+ gl_worker_thread = thrd_current();
+ brcmf_sdio_event_handler(bus);
+}
+
+extern thrd_t gl_interrupt_thread;
+int brcmf_sdio_oob_irqhandler(void* cookie) {
+ struct brcmf_sdio_dev* sdiodev = cookie;
+ zx_status_t status;
+ uint32_t intstatus;
+
+ gl_interrupt_thread = thrd_current();
+ while ((status = zx_interrupt_wait(sdiodev->irq_handle, NULL)) == ZX_OK) {
+ THROTTLE(20, brcmf_dbg(INTR, "OOB intr triggered"););
+ sdio_claim_host(sdiodev->func1);
+ if (brcmf_sdio_intr_rstatus(sdiodev->bus)) {
+ brcmf_err("failed backplane access\n");
+ }
+ intstatus = atomic_load(&sdiodev->bus->intstatus);
+ atomic_store(&sdiodev->bus->dpc_triggered, true);
+ brcmf_sdio_event_handler(sdiodev->bus);
+ sdio_release_host(sdiodev->func1);
+ if (intstatus == 0) {
+ THROTTLE(20, brcmf_dbg(TEMP, "Zero intstatus; pausing 5 msec"););
+ zx_nanosleep(zx_deadline_after(ZX_MSEC(5)));
+ }
+ THROTTLE(20, brcmf_dbg(INTR, "Done with OOB intr"););
+ }
+
+ brcmf_err("ISR exiting with status %s\n", zx_status_get_string(status));
+ return (int)status;
+}
+
+
static void brcmf_sdio_drivestrengthinit(struct brcmf_sdio_dev* sdiodev, struct brcmf_chip* ci,
uint32_t drivestrength) {
const struct sdiod_drive_str* str_tab = NULL;
@@ -3713,6 +3856,8 @@
.write32 = brcmf_sdio_buscore_write32,
};
+//#define DEBUG_RUNNER
+#ifdef DEBUG_RUNNER
pthread_t debug_thread;
static void* debug_runner(void* foo) {
brcmf_dbg(TEMP, "Debug runner started");
@@ -3722,17 +3867,20 @@
}
return NULL;
}
+#endif // DEBUG_RUNNER
extern void psr();
-/*
+#define PTHREAD_PRINTER
+#ifdef PTHREAD_PRINTER
pthread_t sdio_thread;
static void* sdio_printer(void* foo) {
brcmf_dbg(TEMP, "SDIO printer started");
- zx_nanosleep(zx_deadline_after(ZX_SEC(15)));
+ zx_nanosleep(zx_deadline_after(ZX_SEC(1000)));
psr();
return NULL;
-}*/
+}
+#endif // PTHREAD_PRINTER
struct brcmf_sdio_dev* gl_sdiodev;
void* gl_firmware;
@@ -3753,9 +3901,14 @@
uint32_t drivestrength;
sdiodev = bus->sdiodev;
+ sdio_claim_host(sdiodev->func1);
+#ifdef DEBUG_RUNNER
pthread_create(&debug_thread, NULL, debug_runner, NULL);
- // pthread_create(&sdio_thread, NULL, sdio_printer, NULL);
+#endif // DEBUG_RUNNER
+#ifdef PTHREAD_PRINTER
+ pthread_create(&sdio_thread, NULL, sdio_printer, NULL);
+#endif // PTHREAD_PRINTER
/* brcmf_dbg(TEMP, " * * * Running SDIO test * * * *");
gl_sdiodev = sdiodev;
@@ -3880,6 +4033,8 @@
goto fail;
}
+ sdio_release_host(sdiodev->func1);
+
brcmu_pktq_init(&bus->txq, (PRIOMASK + 1), TXQLEN);
/* allocate header buffer */
@@ -3901,15 +4056,27 @@
return true;
fail:
+ sdio_release_host(sdiodev->func1);
brcmf_dbg(TEMP, "* * FAIL");
return false;
}
-extern thrd_t gl_watchdog_thread;
+extern thrd_t gl_bus_watchdog_thread, gl_watchdog_thread;
static void* brcmf_sdio_watchdog_thread(void* data) {
struct brcmf_sdio* bus = (struct brcmf_sdio*)data;
+ struct brcmf_core* core = bus->sdio_core;
+ uint32_t addr;
+ uint32_t val;
+ zx_status_t ret;
- gl_watchdog_thread = thrd_current();
+ THROTTLE(20,
+ brcmf_sdio_bus_sleep(bus, false, true);
+ addr = core->base + SD_REG(intstatus);
+ val = brcmf_sdiod_func1_rl(bus->sdiodev, addr, &ret);
+ brcmf_dbg(TEMP, "Watchdog sees intstatus 0x%x", val);
+ );
+
+ gl_bus_watchdog_thread = thrd_current();
/* Run until signal received */
brcmf_sdiod_freezer_count(bus->sdiodev);
while (1) {
@@ -3917,10 +4084,17 @@
break;
}
brcmf_sdiod_freezer_uncount(bus->sdiodev);
- sync_completion_wait(&bus->watchdog_wait, ZX_TIME_INFINITE);
- brcmf_sdiod_freezer_count(bus->sdiodev);
- brcmf_sdiod_try_freeze(bus->sdiodev);
- brcmf_sdio_bus_watchdog(bus);
+ // Currently we're depending on watchdog for all interrupt handling.
+ //sync_completion_wait(&bus->watchdog_wait, ZX_TIME_INFINITE);
+ zx_nanosleep(zx_deadline_after(ZX_MSEC(10)));
+ if (atomic_load(&bus->wd_active)) {
+ // THROTTLE(150, brcmf_dbg(TEMP, "Watchdog active"););
+ brcmf_sdiod_freezer_count(bus->sdiodev);
+ brcmf_sdiod_try_freeze(bus->sdiodev);
+ brcmf_sdio_bus_watchdog(bus);
+ } else {
+ // THROTTLE(150, brcmf_dbg(TEMP, "Watchdog inactive"););
+ }
/* Count the tick for reference */
bus->sdcnt.tickcnt++;
sync_completion_reset(&bus->watchdog_wait);
@@ -3928,26 +4102,25 @@
return NULL;
}
-extern bool gl_intr_print;
static void brcmf_sdio_watchdog(void* data) {
- static int times = 3;
- if (gl_intr_print) {
- times = 3;
- gl_intr_print = false;
- }
- if (times) brcmf_dbg(TEMP, "Enter");
+ gl_watchdog_thread = thrd_current();
+ // THROTTLE(20, brcmf_dbg(TEMP, "Enter"););
pthread_mutex_lock(&irq_callback_lock);
struct brcmf_sdio* bus = data;
if (bus->watchdog_tsk) {
+ // Currently signaling watchdog_wait does nothing; brcmf_sdio_watchdog_thread() will
+ // wake up every 10 msec regardless, and do its thing if bus->wd_active is true. This
+ // is because we're currently depending on watchdog for interrupt handling, and the
+ // watchdog was being activated too frequently - because, ironically, each time it
+ // was turned on, it reset the timer for 10 msec in the future. So, bypass all that logic.
sync_completion_signal(&bus->watchdog_wait);
/* Reschedule the watchdog */
- if (bus->wd_active) {
+ if (atomic_load(&bus->wd_active)) {
brcmf_timer_set(&bus->timer, ZX_MSEC(BRCMF_WD_POLL_MSEC));
}
}
pthread_mutex_unlock(&irq_callback_lock);
- if (times) times--;
}
static zx_status_t brcmf_sdio_get_fwname(struct brcmf_device* dev, uint32_t chip, uint32_t chiprev,
@@ -4014,6 +4187,7 @@
// Magic 200 ms pause here, because 100ms worked in the hard-coded debug recipe.
zx_nanosleep(zx_deadline_after(ZX_MSEC(200)));
+ sdio_claim_host(sdiodev->func1);
/* Make sure backplane clock is on, needed to generate F2 interrupt */
bus->clkstate = CLK_NONE; // TEMP FOR DEBUG
@@ -4074,32 +4248,39 @@
brcmf_dbg(TEMP, "Readshared returned %d", err);
bus->console_addr = sh.console_addr;
brcmf_dbg(TEMP, "console_addr 0x%x", bus->console_addr);
+ gl_sdio_bus = bus;
brcmf_sdio_readconsole(bus);
brcmf_dbg(TEMP, "Should have seen readconsole output");
//brcmf_dbg(TEMP, "About to pause 100 sec to avoid interrupts - wait for SDIO printout.");
//zx_nanosleep(zx_deadline_after(ZX_SEC(100)));
if (err == ZX_OK) {
/* Allow full data communication using DPC from now on. */
- brcmf_dbg(TEMP, "About to change_state() (after 100 msec pause)"); PAUSE; PAUSE;
+ //brcmf_dbg(TEMP, "About to change_state() (after 100 msec pause)"); PAUSE; PAUSE;
brcmf_sdiod_change_state(bus->sdiodev, BRCMF_SDIOD_DATA);
- PAUSE; PAUSE; brcmf_dbg(TEMP, "Did change_state() (100 msec ago)");
+ brcmf_sdio_wd_timer(bus, true); // Won't take effect until state is BRCMF_SDIOD_DATA
- brcmf_dbg(TEMP, "About to intr_register() (after 100 msec pause)"); PAUSE; PAUSE;
+ //PAUSE; PAUSE; brcmf_dbg(TEMP, "Did change_state() (100 msec ago)");
+
+ //brcmf_dbg(TEMP, "About to intr_register() (after 100 msec pause)"); PAUSE; PAUSE;
err = brcmf_sdiod_intr_register(sdiodev);
if (err != ZX_OK) {
brcmf_err("intr register failed:%d\n", err);
}
}
- brcmf_dbg(SDIO, "Done, register OOB IRQ\n"); PAUSE; PAUSE;
+ brcmf_dbg(SDIO, "Done, register OOB IRQ\n");
/* If we didn't come up, turn off backplane clock */
if (err != ZX_OK) {
- brcmf_dbg(SDIO, "Err, register OOB IRQ\n"); PAUSE; PAUSE;
+ brcmf_dbg(SDIO, "Err %d on register OOB IRQ\n", err);
brcmf_sdio_clkctl(bus, CLK_NONE, false);
}
- brcmf_dbg(SDIO, "BusStarted\n"); PAUSE; PAUSE;
+ sdio_release_host(sdiodev->func1);
+ //PAUSE; PAUSE;
+ brcmf_dbg(SDIO, " * * Did interrupts and released host.\n");
- brcmf_dbg(SDIO, " * * Really, BusStarted\n"); PAUSE; PAUSE;
+ //brcmf_dbg(SDIO, "BusStarted\n"); PAUSE; PAUSE;
+
+ brcmf_dbg(SDIO, " * * Really, BusStarted\n");// PAUSE; PAUSE;
/*uint32_t addr = 0x18005020;
brcmf_dbg(TEMP, "aReading interrupt reg: 0x%x\n", brcmf_sdiod_func1_rl(bus->sdiodev, addr, NULL));
brcmf_err("bReading interrupt reg: 0x%x\n", brcmf_sdiod_func1_rl(bus->sdiodev, addr, NULL));
@@ -4110,6 +4291,8 @@
// psr();
// brcmf_dbg(TEMP, "last_here cpfwe cpfwe apfwce bpfwce");
// PAUSE; brcmf_dbg(TEMP, "aaaalast_here cpfwe cpfwe apfwce bpfwce");
+
+
err = brcmf_bus_started(dev);
if (err != ZX_OK) {
brcmf_err("dongle is not responding\n");
@@ -4118,6 +4301,7 @@
return;
release:
+ sdio_release_host(sdiodev->func1);
fail:
brcmf_dbg(TRACE, "failed: dev=%s, err=%d\n", device_get_name(dev->zxdev), err);
// TODO(cphoenix): Do the right calls here to release the driver
@@ -4221,6 +4405,8 @@
}
}
+ sdio_claim_host(bus->sdiodev->func1);
+
/* Disable F2 to clear any intermediate frame state on the dongle */
sdio_disable_fn(&bus->sdiodev->sdio_proto, SDIO_FN_2);
@@ -4229,6 +4415,8 @@
/* Done with backplane-dependent accesses, can drop clock... */
brcmf_sdiod_func1_wb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, 0, NULL);
+ sdio_release_host(bus->sdiodev->func1);
+
/* ...and initialize clock/power states */
bus->clkstate = CLK_SDONLY;
bus->idletime = BRCMF_IDLE_INTERVAL;
@@ -4278,6 +4466,7 @@
if (bus->ci) {
if (bus->sdiodev->state != BRCMF_SDIOD_NOMEDIUM) {
+ sdio_claim_host(bus->sdiodev->func1);
brcmf_sdio_wd_timer(bus, false);
brcmf_sdio_clkctl(bus, CLK_AVAIL, false);
/* Leave the device in state where it is
@@ -4287,6 +4476,7 @@
msleep(20);
brcmf_chip_set_passive(bus->ci);
brcmf_sdio_clkctl(bus, CLK_NONE, false);
+ sdio_release_host(bus->sdiodev->func1);
}
brcmf_chip_detach(bus->ci);
}
@@ -4304,27 +4494,30 @@
void brcmf_sdio_wd_timer(struct brcmf_sdio* bus, bool active) {
/* Totally stop the timer */
- if (!active && bus->wd_active) {
+ if (!active && atomic_load(&bus->wd_active)) {
brcmf_timer_stop(&bus->timer);
- bus->wd_active = false;
+ atomic_store(&bus->wd_active, false);
return;
}
/* don't start the wd until fw is loaded */
if (bus->sdiodev->state != BRCMF_SDIOD_DATA) {
+ THROTTLE(20, brcmf_dbg(TEMP, "WD would be active, but state is %d", bus->sdiodev->state););
return;
}
if (active) {
brcmf_timer_set(&bus->timer, ZX_MSEC(BRCMF_WD_POLL_MSEC));
- bus->wd_active = true;
+ atomic_store(&bus->wd_active, true);
}
}
zx_status_t brcmf_sdio_sleep(struct brcmf_sdio* bus, bool sleep) {
zx_status_t ret;
+ sdio_claim_host(bus->sdiodev->func1);
ret = brcmf_sdio_bus_sleep(bus, sleep, false);
+ sdio_release_host(bus->sdiodev->func1);
return ret;
}
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/sdio.h b/drivers/wlan/third_party/broadcom/brcmfmac/sdio.h
index 47b850f..99a2bd4 100644
--- a/drivers/wlan/third_party/broadcom/brcmfmac/sdio.h
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/sdio.h
@@ -188,6 +188,8 @@
struct brcmf_sdiod_freezer;
struct brcmf_sdio_dev {
+ struct sdio_func *func1;
+ struct sdio_func *func2;
uint32_t manufacturer_id;
uint32_t product_id;
sdio_protocol_t sdio_proto;
@@ -401,5 +403,6 @@
void brcmf_sdio_wowl_config(struct brcmf_device* dev, bool enabled);
zx_status_t brcmf_sdio_sleep(struct brcmf_sdio* bus, bool sleep);
void brcmf_sdio_trigger_dpc(struct brcmf_sdio* bus);
+int brcmf_sdio_oob_irqhandler(void* cookie);
#endif /* BRCMFMAC_SDIO_H */
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/tracepoint.c b/drivers/wlan/third_party/broadcom/brcmfmac/tracepoint.c
index aadeb61..b223c6f 100644
--- a/drivers/wlan/third_party/broadcom/brcmfmac/tracepoint.c
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/tracepoint.c
@@ -21,6 +21,10 @@
#ifndef __CHECKER__
#define CREATE_TRACE_POINTS
#include "debug.h"
+#include <threads.h>
+
+extern thrd_t gl_interrupt_thread, gl_main_thread, gl_worker_thread, gl_watchdog_thread,
+ gl_bus_watchdog_thread, gl_workqueue_runner_thread;
void __brcmf_err(const char* func, const char* fmt, ...) {
char msg[512]; // Same value hard-coded throughout devhost.c
@@ -31,10 +35,30 @@
va_end(args);
if (n_printed < 0) {
snprintf(msg, 512, "(Formatting error from string '%s')", fmt);
- } else if (n_printed > 0 && msg[n_printed - 1] == '\n') {
- msg[--n_printed] = 0;
- }
- zxlogf(INFO, "brcmfmac ERROR(%s): '%s'\n", func, msg);
+ } else if (n_printed > 0 && msg[n_printed - 1] == '\n') {
+ msg[--n_printed] = 0;
+ }
+ char namebuf[64];
+ char* name;
+ thrd_t thread = thrd_current();
+ if (thread == gl_interrupt_thread) {
+ name = "intr";
+ } else if (thread == gl_worker_thread) {
+ name = "work";
+ } else if (thread == gl_watchdog_thread) {
+ name = "wdog";
+ } else if (thread == gl_workqueue_runner_thread) {
+ name = "wrun";
+ } else if (thread == gl_bus_watchdog_thread) {
+ name = "bwdg";
+ } else if (thread == gl_main_thread) {
+ name = "main";
+ } else {
+ sprintf(namebuf, "%p", thread);
+ name = namebuf;
+ }
+
+ zxlogf(INFO, "brcmfmac %s ERROR(%s): '%s'\n", name, func, msg);
}
#endif
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/workqueue.c b/drivers/wlan/third_party/broadcom/brcmfmac/workqueue.c
index be97144..d927136 100644
--- a/drivers/wlan/third_party/broadcom/brcmfmac/workqueue.c
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/workqueue.c
@@ -151,14 +151,15 @@
brcmf_dbg(TEMP, "Work to be canceled not found");
}
}
-
+thrd_t gl_workqueue_runner_thread;
static void* workqueue_runner(void* arg) {
struct workqueue_struct* workqueue = (struct workqueue_struct*) arg;
+ gl_workqueue_runner_thread = thrd_current();
while(1) {
sync_completion_wait(&workqueue->work_ready, ZX_TIME_INFINITE);
sync_completion_reset(&workqueue->work_ready);
- brcmf_dbg(TEMP, "Got work!");
+ //brcmf_dbg(TEMP, "Got work!");
struct work_struct* work;
list_node_t* item;
mtx_lock(&workqueue->lock);