Hi Marek, On Mon, May 21, 2018 at 3:11 PM, Marek Vasut <marek.vasut@xxxxxxxxx> wrote: > If the rcar_pcie_enable() fails and MSIs are enabled, the setup done in > rcar_pcie_enable_msi() is never undone. Add a function to tear down the > MSI setup by disabling the MSI handling in the PCIe block, deallocating > the pages requested for the MSIs and zapping the IRQ mapping. > > Signed-off-by: Marek Vasut <marek.vasut+renesas@xxxxxxxxx> Reported-by: Geert Uytterhoeven <geert+renesas@xxxxxxxxx> Reviewed-by: Geert Uytterhoeven <geert+renesas@xxxxxxxxx> > --- a/drivers/pci/host/pcie-rcar.c > +++ b/drivers/pci/host/pcie-rcar.c > @@ -900,6 +900,28 @@ static int rcar_pcie_enable_msi(struct rcar_pcie *pcie) > return err; > } > > +static void rcar_pcie_teardown_msi(struct rcar_pcie *pcie) > +{ > + struct rcar_msi *msi = &pcie->msi; > + int irq, i; > + > + /* Disable all MSI interrupts */ > + rcar_pci_write_reg(pcie, 0, PCIEMSIIER); > + > + /* Disable address decoding of the MSI interrupt, MSIFE */ > + rcar_pci_write_reg(pcie, 0, PCIEMSIALR); > + > + free_pages(msi->pages, 0); > + > + for (i = 0; i < INT_PCI_MSI_NR; i++) { > + irq = irq_find_mapping(msi->domain, i); > + if (irq > 0) > + irq_dispose_mapping(irq); > + } Note that similar calls to irq_dispose_mapping() should be added to the failure path of rcar_pcie_enable_msi(), too. > + > + irq_domain_remove(msi->domain); > +} Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds