On Mon, Jan 31, 2022 at 6:08 PM Hector Martin <marcan@xxxxxxxxx> wrote: > > 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. Reviewed-by: Andy Shevchenko <andy.shevchenko@xxxxxxxxx> > Fixes: 9e37f045d5e7 ("brcmfmac: Adding PCIe bus layer support.") > Reviewed-by: Linus Walleij <linus.walleij@xxxxxxxxxx> > Reviewed-by: Arend van Spriel <arend.vanspriel@xxxxxxxxxxxx> > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Hector Martin <marcan@xxxxxxxxx> > --- > .../wireless/broadcom/brcm80211/brcmfmac/pcie.c | 16 +++++++++++++--- > 1 file changed, 13 insertions(+), 3 deletions(-) > > diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c > index c25f48db1f60..3ff4997e1c97 100644 > --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c > +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c > @@ -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; > -- > 2.33.0 > -- With Best Regards, Andy Shevchenko