Commit b50255c8 authored by Hector Martin's avatar Hector Martin Committed by Kalle Valo
Browse files

brcmfmac: pcie: Fix crashes due to early IRQs



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: 9e37f045 ("brcmfmac: Adding PCIe bus layer support.")
Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Reviewed-by: default avatarArend van Spriel <arend.vanspriel@broadcom.com>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarHector Martin <marcan@marcan.st>
Reviewed-by: default avatarAndy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20220131160713.245637-7-marcan@marcan.st
parent 9466987f
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -1315,6 +1315,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)
{
@@ -1423,6 +1435,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,
@@ -1795,9 +1808,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;