Message ID | 20220131160713.245637-7-marcan@marcan.st (mailing list archive) |
---|---|
State | Awaiting Upstream |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | misc brcmfmac fixes (M1/T2 series spin-off) | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Not a local patch |
On Mon, Jan 31, 2022 at 6:08 PM Hector Martin <marcan@marcan.st> 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@gmail.com> > Fixes: 9e37f045d5e7 ("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> > --- > .../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 >
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;