| From 3b9fd25f9f61f7387b50f61b81fb1ab7a617d286 Mon Sep 17 00:00:00 2001 |
| From: Jean-Philippe Brucker <jean-philippe@linaro.org> |
| Date: Thu, 26 Dec 2019 10:20:33 +0100 |
| Subject: [PATCH] brcmfmac: sdio: Fix OOB interrupt initialization on brcm43362 |
| |
| commit 8c8e60fb86a90a30721bbd797f58f96b3980dcc1 upstream. |
| |
| Commit 262f2b53f679 ("brcmfmac: call brcmf_attach() just before calling |
| brcmf_bus_started()") changed the initialization order of the brcmfmac |
| SDIO driver. Unfortunately since brcmf_sdiod_intr_register() is now |
| called before the sdiodev->bus_if initialization, it reads the wrong |
| chip ID and fails to initialize the GPIO on brcm43362. Thus the chip |
| cannot send interrupts and fails to probe: |
| |
| [ 12.517023] brcmfmac: brcmf_sdio_bus_rxctl: resumed on timeout |
| [ 12.531214] ieee80211 phy0: brcmf_bus_started: failed: -110 |
| [ 12.536976] ieee80211 phy0: brcmf_attach: dongle is not responding: err=-110 |
| [ 12.566467] brcmfmac: brcmf_sdio_firmware_callback: brcmf_attach failed |
| |
| Initialize the bus interface earlier to ensure that |
| brcmf_sdiod_intr_register() properly sets up the OOB interrupt. |
| |
| BugLink: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=908438 |
| Fixes: 262f2b53f679 ("brcmfmac: call brcmf_attach() just before calling brcmf_bus_started()") |
| Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org> |
| Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com> |
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c |
| index d27ca0db1934..cf6179b00e4c 100644 |
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c |
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c |
| @@ -4237,6 +4237,12 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err, |
| } |
| |
| if (err == 0) { |
| + /* Assign bus interface call back */ |
| + sdiod->bus_if->dev = sdiod->dev; |
| + sdiod->bus_if->ops = &brcmf_sdio_bus_ops; |
| + sdiod->bus_if->chip = bus->ci->chip; |
| + sdiod->bus_if->chiprev = bus->ci->chiprev; |
| + |
| /* Allow full data communication using DPC from now on. */ |
| brcmf_sdiod_change_state(bus->sdiodev, BRCMF_SDIOD_DATA); |
| |
| @@ -4253,12 +4259,6 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err, |
| |
| sdio_release_host(sdiod->func1); |
| |
| - /* Assign bus interface call back */ |
| - sdiod->bus_if->dev = sdiod->dev; |
| - sdiod->bus_if->ops = &brcmf_sdio_bus_ops; |
| - sdiod->bus_if->chip = bus->ci->chip; |
| - sdiod->bus_if->chiprev = bus->ci->chiprev; |
| - |
| /* Attach to the common layer, reserve hdr space */ |
| err = brcmf_attach(sdiod->dev, sdiod->settings); |
| if (err != 0) { |
| -- |
| 2.7.4 |
| |