From d5ea36d92da590272f353c59a4cc75f2f81207f2 Mon Sep 17 00:00:00 2001 From: Manikanta Maddireddy Date: Thu, 12 Jan 2023 11:17:24 +0530 Subject: [PATCH] NVIDIA: SAUCE: PCI: tegra194: Disable interrupt before link status check BugLink: https://bugs.launchpad.net/bugs/2072591 Data abort is observed due to synchronization issue between irq handler and driver shutdown call. Disable interrupt before link status check to avoid this issue. http://nvbugs/3938884 Signed-off-by: Manikanta Maddireddy Reviewed-by: Laxman Dewangan Reviewed-by: Prathamesh Shete Tested-by: Prathamesh Shete Signed-off-by: Laxman Dewangan Acked-by: Jacob Martin Acked-by: Noah Wager Signed-off-by: Noah Wager --- drivers/pci/controller/dwc/pcie-tegra194.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/drivers/pci/controller/dwc/pcie-tegra194.c b/drivers/pci/controller/dwc/pcie-tegra194.c index 8afce86a7133..e8bb45ddbfec 100644 --- a/drivers/pci/controller/dwc/pcie-tegra194.c +++ b/drivers/pci/controller/dwc/pcie-tegra194.c @@ -2962,6 +2962,7 @@ static void tegra_pcie_dw_remove(struct platform_device *pdev) #endif if (pcie->of_data->mode == DW_PCIE_RC_TYPE) { + disable_irq(pcie->prsnt_irq); if (!pcie->link_state) return; @@ -3098,17 +3099,15 @@ static void tegra_pcie_dw_shutdown(struct platform_device *pdev) struct tegra_pcie_dw *pcie = platform_get_drvdata(pdev); if (pcie->of_data->mode == DW_PCIE_RC_TYPE) { - if (!pcie->link_state) - return; - if (!pm_runtime_enabled(pcie->dev)) - return; - debugfs_remove_recursive(pcie->debugfs); disable_irq(pcie->prsnt_irq); disable_irq(pcie->pci.pp.irq); if (IS_ENABLED(CONFIG_PCI_MSI)) disable_irq(pcie->pci.pp.msi_irq[0]); - + if (!pcie->link_state) + return; + if (!pm_runtime_enabled(pcie->dev)) + return; tegra_pcie_dw_pme_turnoff(pcie); tegra_pcie_unconfig_controller(pcie); pm_runtime_put_sync(pcie->dev);