Skip to content

Commit

Permalink
brcmfmac: pcie: Fix crashes due to early IRQs
Browse files Browse the repository at this point in the history
commit b50255c upstream.

The driver was enabling IRQs before the message processing was
initialized. This could cause IRQs to come in too early and crash the
driver. Instead, move the IRQ enable and hostready to a bus preinit
function, at which point everything is properly initialized.

Fixes: 9e37f04 ("brcmfmac: Adding PCIe bus layer support.")
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
Cc: stable@vger.kernel.org
Signed-off-by: Hector Martin <marcan@marcan.st>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20220131160713.245637-7-marcan@marcan.st
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Hector Martin authored and Greg Kroah-Hartman committed Apr 8, 2022
1 parent 1cbcf93 commit 8897595
Showing 1 changed file with 13 additions and 3 deletions.
16 changes: 13 additions & 3 deletions drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
Original file line number Diff line number Diff line change
Expand Up @@ -1306,6 +1306,18 @@ static void brcmf_pcie_down(struct device *dev)
{
}

static int brcmf_pcie_preinit(struct device *dev)
{
struct brcmf_bus *bus_if = dev_get_drvdata(dev);
struct brcmf_pciedev *buspub = bus_if->bus_priv.pcie;

brcmf_dbg(PCIE, "Enter\n");

brcmf_pcie_intr_enable(buspub->devinfo);
brcmf_pcie_hostready(buspub->devinfo);

return 0;
}

static int brcmf_pcie_tx(struct device *dev, struct sk_buff *skb)
{
Expand Down Expand Up @@ -1414,6 +1426,7 @@ static int brcmf_pcie_reset(struct device *dev)
}

static const struct brcmf_bus_ops brcmf_pcie_bus_ops = {
.preinit = brcmf_pcie_preinit,
.txdata = brcmf_pcie_tx,
.stop = brcmf_pcie_down,
.txctl = brcmf_pcie_tx_ctlpkt,
Expand Down Expand Up @@ -1786,9 +1799,6 @@ static void brcmf_pcie_setup(struct device *dev, int ret,

init_waitqueue_head(&devinfo->mbdata_resp_wait);

brcmf_pcie_intr_enable(devinfo);
brcmf_pcie_hostready(devinfo);

ret = brcmf_attach(&devinfo->pdev->dev);
if (ret)
goto fail;
Expand Down

0 comments on commit 8897595

Please sign in to comment.