[brcmfmac] Improve SDIO error messages
Add more SDIO error messages, and improve existing ones by including
error codes.
WLAN-1084
TEST: Smoke test using fx-linksys
Change-Id: Id1111001d522d279502b15bc4f6ae846f349e103
diff --git a/src/connectivity/wlan/drivers/third_party/broadcom/brcmfmac/sdio.c b/src/connectivity/wlan/drivers/third_party/broadcom/brcmfmac/sdio.c
index a191b60..be1d246 100644
--- a/src/connectivity/wlan/drivers/third_party/broadcom/brcmfmac/sdio.c
+++ b/src/connectivity/wlan/drivers/third_party/broadcom/brcmfmac/sdio.c
@@ -3598,7 +3598,7 @@
}
#endif // SDIO_PRINTER
-static bool brcmf_sdio_probe_attach(struct brcmf_sdio* bus) {
+static zx_status_t brcmf_sdio_probe_attach(struct brcmf_sdio* bus) {
struct brcmf_sdio_dev* sdiodev;
uint8_t clkctl = 0;
zx_status_t err = ZX_OK;
@@ -3635,7 +3635,7 @@
err = brcmf_chip_attach(sdiodev, &brcmf_sdio_buscore_ops, &bus->ci);
if (err != ZX_OK) {
- brcmf_err("brcmf_chip_attach failed!\n");
+ brcmf_err("brcmf_chip_attach failed: %s\n", zx_status_get_string(err));
bus->ci = NULL;
goto fail;
}
@@ -3643,12 +3643,16 @@
/* Pick up the SDIO core info struct from chip.c */
bus->sdio_core = brcmf_chip_get_core(bus->ci, CHIPSET_SDIO_DEV_CORE);
if (!bus->sdio_core) {
+ brcmf_err("call to brcmf_chip_get_core (SDIO_DEV_CORE) failed\n");
+ err = ZX_ERR_INTERNAL;
goto fail;
}
/* Pick up the CHIPCOMMON core info struct, for bulk IO in bcmsdh.c */
sdiodev->cc_core = brcmf_chip_get_core(bus->ci, CHIPSET_CHIPCOMMON_CORE);
if (!sdiodev->cc_core) {
+ brcmf_err("call to brcmf_chip_get_core (CHIPCOMMON_CORE) failed\n");
+ err = ZX_ERR_INTERNAL;
goto fail;
}
@@ -3656,6 +3660,7 @@
brcmf_get_module_param(&sdiodev->dev, BRCMF_BUSTYPE_SDIO, bus->ci->chip, bus->ci->chiprev);
if (!sdiodev->settings) {
brcmf_err("Failed to get device parameters\n");
+ err = ZX_ERR_INTERNAL;
goto fail;
}
/* platform specific configuration:
@@ -3681,8 +3686,9 @@
}
#endif
- if (brcmf_sdio_kso_init(bus)) {
- brcmf_err("error enabling KSO\n");
+ err = brcmf_sdio_kso_init(bus);
+ if (err != ZX_OK) {
+ brcmf_err("error enabling KSO: %s\n", zx_status_get_string(err));
goto fail;
}
@@ -3696,6 +3702,7 @@
/* Set card control so an SDIO card reset does a WLAN backplane reset */
reg_val = brcmf_sdiod_func0_rb(sdiodev, SDIO_CCCR_BRCM_CARDCTRL, &err);
if (err != ZX_OK) {
+ brcmf_err("func0_rb failed: %s\n", zx_status_get_string(err));
goto fail;
}
@@ -3703,6 +3710,7 @@
brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_BRCM_CARDCTRL, reg_val, &err);
if (err != ZX_OK) {
+ brcmf_err("func0_wb failed: %s\n", zx_status_get_string(err));
goto fail;
}
@@ -3710,6 +3718,7 @@
reg_addr = CORE_CC_REG(brcmf_chip_get_pmu(bus->ci)->base, pmucontrol);
reg_val = brcmf_sdiod_func1_rl(sdiodev, reg_addr, &err);
if (err != ZX_OK) {
+ brcmf_err("func1_rl failed: %s\n", zx_status_get_string(err));
goto fail;
}
@@ -3717,6 +3726,7 @@
brcmf_sdiod_func1_wl(sdiodev, reg_addr, reg_val, &err);
if (err != ZX_OK) {
+ brcmf_err("func1_wl failed: %s\n", zx_status_get_string(err));
goto fail;
}
@@ -3727,7 +3737,9 @@
/* allocate header buffer */
bus->hdrbuf = calloc(1, MAX_HDR_READ + bus->head_align);
if (!bus->hdrbuf) {
- return false;
+ brcmf_err("failed to allocate memory for SDIO hdrbuf\n");
+ // Don't go to 'fail' here because we've already released the host
+ return ZX_ERR_NO_MEMORY;
}
/* Locate an appropriately-aligned portion of hdrbuf */
bus->rxhdr = (uint8_t*)roundup((unsigned long)&bus->hdrbuf[0], bus->head_align);
@@ -3740,12 +3752,13 @@
}
brcmf_dbg(TEMP, "Exit");
- return true;
+ ZX_DEBUG_ASSERT(err == ZX_OK);
+ return err;
fail:
sdio_release_host(sdiodev->func1);
brcmf_dbg(TEMP, "* * FAIL");
- return false;
+ return err;
}
static void* brcmf_sdio_watchdog_thread(void* data) {
@@ -4011,8 +4024,9 @@
bus->brcmf_wq = wq;
/* attempt to attach to the dongle */
- if (!(brcmf_sdio_probe_attach(bus))) {
- brcmf_err("brcmf_sdio_probe_attach failed\n");
+ ret = brcmf_sdio_probe_attach(bus);
+ if (ret != ZX_OK) {
+ brcmf_err("brcmf_sdio_probe_attach failed: %s\n", zx_status_get_string(ret));
goto fail;
}