On 05/22/2018 08:36 PM, Geert Uytterhoeven wrote: > 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. There are no failures happening in rcar_pcie_enable_msi() after the mapping is created, just memory writes, so no. Did I miss something there ? -- Best regards, Marek Vasut