[PATCH 4/7] PCI: mediatek-gen3: Disable device if further setup fails
From: Chen-Yu Tsai
Date: Wed Feb 25 2026 - 02:33:18 EST
If further setup fails after the device is powered on and link training
succeeds, we want to place the device back in a quiescence state to
avoid unintended activity and save power. This also helps with power
state tracking and balancing once pwrctrl API is integrated.
Power down the device in the error paths of mtk_pcie_startup_port() and
mtk_pcie_setup().
Signed-off-by: Chen-Yu Tsai <wenst@xxxxxxxxxxxx>
---
drivers/pci/controller/pcie-mediatek-gen3.c | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/drivers/pci/controller/pcie-mediatek-gen3.c b/drivers/pci/controller/pcie-mediatek-gen3.c
index 870d3b3db11d..7459e1c1899d 100644
--- a/drivers/pci/controller/pcie-mediatek-gen3.c
+++ b/drivers/pci/controller/pcie-mediatek-gen3.c
@@ -531,7 +531,7 @@ static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
dev_err(pcie->dev,
"PCIe link down, current LTSSM state: %s (%#x)\n",
ltssm_state, val);
- return err;
+ goto err_power_down_device;
}
mtk_pcie_enable_msi(pcie);
@@ -556,10 +556,14 @@ static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
err = mtk_pcie_set_trans_table(pcie, cpu_addr, pci_addr, size,
type, &table_index);
if (err)
- return err;
+ goto err_power_down_device;
}
return 0;
+
+err_power_down_device:
+ mtk_pcie_device_power_down(pcie);
+ return err;
}
#define MTK_MSI_FLAGS_REQUIRED (MSI_FLAG_USE_DEF_DOM_OPS | \
@@ -1174,15 +1178,17 @@ static int mtk_pcie_setup(struct mtk_gen3_pcie *pcie)
/* Try link up */
err = mtk_pcie_startup_port(pcie);
if (err)
- goto err_setup;
+ goto err_power_down;
err = mtk_pcie_setup_irq(pcie);
if (err)
- goto err_setup;
+ goto err_device_power_off;
return 0;
-err_setup:
+err_device_power_off:
+ mtk_pcie_device_power_down(pcie);
+err_power_down:
mtk_pcie_power_down(pcie);
return err;
--
2.53.0.414.gf7e9f6c205-goog