lkml.org 
[lkml]   [2020]   [Feb]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.5 110/542] brcmfmac: sdio: Fix OOB interrupt initialization on brcm43362
    Date
    From: Jean-Philippe Brucker <jean-philippe@linaro.org>

    [ Upstream commit 8c8e60fb86a90a30721bbd797f58f96b3980dcc1 ]

    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: Sasha Levin <sashal@kernel.org>
    ---
    .../net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 12 ++++++------
    1 file changed, 6 insertions(+), 6 deletions(-)

    diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    index 1dea0178832ea..a935993a3c514 100644
    --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    @@ -4226,6 +4226,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);

    @@ -4242,12 +4248,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;
    -
    err = brcmf_alloc(sdiod->dev, sdiod->settings);
    if (err) {
    brcmf_err("brcmf_alloc failed\n");
    --
    2.20.1
    \
     
     \ /
      Last update: 2020-02-14 16:51    [W:4.021 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site