Now we can move brcmf_attach() until after the firmware has been downloaded
to the device. Make the call just before brcmf_bus_started().

Reviewed-by: Hante Meuleman <hante.meule...@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesbe...@broadcom.com>
Reviewed-by: Franky Lin <franky....@broadcom.com>
Signed-off-by: Arend van Spriel <arend.vanspr...@broadcom.com>
---
 .../wireless/broadcom/brcm80211/brcmfmac/core.c    |  6 ++++
 .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    | 34 +++++++++++-----------
 2 files changed, 23 insertions(+), 17 deletions(-)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c 
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
index 6dd6da7..e553d1a 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
@@ -1190,6 +1190,12 @@ void brcmf_bus_change_state(struct brcmf_bus *bus, enum 
brcmf_bus_state state)
        int ifidx;
 
        brcmf_dbg(TRACE, "%d -> %d\n", bus->state, state);
+
+       if (!drvr) {
+               brcmf_dbg(INFO, "ignoring transition, bus not attached yet\n");
+               return;
+       }
+
        bus->state = state;
 
        if (state == BRCMF_BUS_UP) {
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c 
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
index 9ea525e..0f1e452 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
@@ -4048,9 +4048,6 @@ static void brcmf_sdio_firmware_callback(struct device 
*dev, int err,
        if (err)
                goto fail;
 
-       if (!bus_if->drvr)
-               return;
-
        /* try to download image and nvram to the dongle */
        bus->alp_only = true;
        err = brcmf_sdio_download_firmware(bus, code, nvram, nvram_len);
@@ -4126,11 +4123,28 @@ static void brcmf_sdio_firmware_callback(struct device 
*dev, int err,
 
        sdio_release_host(sdiodev->func1);
 
+       /* Assign bus interface call back */
+       sdiodev->bus_if->dev = sdiodev->dev;
+       sdiodev->bus_if->ops = &brcmf_sdio_bus_ops;
+       sdiodev->bus_if->chip = bus->ci->chip;
+       sdiodev->bus_if->chiprev = bus->ci->chiprev;
+
+       /* Attach to the common layer, reserve hdr space */
+       err = brcmf_attach(sdiodev->dev, sdiodev->settings);
+       if (err != 0) {
+               brcmf_err("brcmf_attach failed\n");
+               goto fail;
+       }
+
+       brcmf_sdio_debugfs_create(bus);
+
        err = brcmf_bus_started(dev);
        if (err != 0) {
                brcmf_err("dongle is not responding\n");
                goto fail;
        }
+
+       /* ready */
        return;
 
 release:
@@ -4199,22 +4213,9 @@ struct brcmf_sdio *brcmf_sdio_probe(struct 
brcmf_sdio_dev *sdiodev)
        bus->dpc_triggered = false;
        bus->dpc_running = false;
 
-       /* Assign bus interface call back */
-       bus->sdiodev->bus_if->dev = bus->sdiodev->dev;
-       bus->sdiodev->bus_if->ops = &brcmf_sdio_bus_ops;
-       bus->sdiodev->bus_if->chip = bus->ci->chip;
-       bus->sdiodev->bus_if->chiprev = bus->ci->chiprev;
-
        /* default sdio bus header length for tx packet */
        bus->tx_hdrlen = SDPCM_HWHDR_LEN + SDPCM_SWHDR_LEN;
 
-       /* Attach to the common layer, reserve hdr space */
-       ret = brcmf_attach(bus->sdiodev->dev, bus->sdiodev->settings);
-       if (ret != 0) {
-               brcmf_err("brcmf_attach failed\n");
-               goto fail;
-       }
-
        /* Query the F2 block size, set roundup accordingly */
        bus->blocksize = bus->sdiodev->func2->cur_blksize;
        bus->roundup = min(max_roundup, bus->blocksize);
@@ -4239,7 +4240,6 @@ struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev 
*sdiodev)
        /* SR state */
        bus->sr_enabled = false;
 
-       brcmf_sdio_debugfs_create(bus);
        brcmf_dbg(INFO, "completed!!\n");
 
        ret = brcmf_fw_map_chip_to_name(bus->ci->chip, bus->ci->chiprev,
-- 
1.9.1

Reply via email to