| From stable+bounces-319145-greg=kroah.com@vger.kernel.org Wed Sep 9 13:48:39 2026 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 9 Sep 2026 07:40:43 -0400 |
| Subject: PCI: starfive: Fix resource leaks on error paths in host_init() |
| To: stable@vger.kernel.org |
| Cc: Ali Tariq <alitariq45892@gmail.com>, Manivannan Sadhasivam <mani@kernel.org>, Sasha Levin <sashal@kernel.org> |
| Message-ID: <20260909114043.1916582-2-sashal@kernel.org> |
| |
| From: Ali Tariq <alitariq45892@gmail.com> |
| |
| [ Upstream commit 22877a061f81c5d58041e384b3131684bec636b9 ] |
| |
| starfive_pcie_host_init() acquires the PHY, clocks/resets, and an |
| optional regulator in sequence, but does not correctly unwind these |
| resources when a later step fails. |
| |
| If starfive_pcie_clk_rst_init() fails after the PHY has already been |
| successfully enabled, the function returns directly without disabling |
| the PHY, leaking it and leaving it powered. |
| |
| If regulator_enable() fails for the optional vpcie3v3 regulator, the |
| failure is only logged; the function falls through and returns |
| success, leaving the driver believing the regulator is enabled while |
| continuing to configure PCIe hardware that may be unpowered. This |
| also leaves the clocks and PHY enabled with nothing to clean them up. |
| |
| Disable the PHY on the clk/reset failure path, and disable the |
| clocks/resets and PHY, then return the error, if the regulator fails |
| to enable. |
| |
| Build-tested and boot-tested on StarFive VisionFive 2 v1.2A |
| |
| Fixes: 05a75df4182e ("PCI: starfive: Use regulator APIs to control the 3v3 power supply of PCIe slots") |
| Fixes: 39b91eb40c6a ("PCI: starfive: Add JH7110 PCIe controller") |
| Signed-off-by: Ali Tariq <alitariq45892@gmail.com> |
| Signed-off-by: Manivannan Sadhasivam <mani@kernel.org> |
| Cc: stable@vger.kernel.org |
| Link: https://patch.msgid.link/20260716102053.185276-1-alitariq45892@gmail.com |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/pci/controller/plda/pcie-starfive.c | 13 +++++++++++-- |
| 1 file changed, 11 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/pci/controller/plda/pcie-starfive.c |
| +++ b/drivers/pci/controller/plda/pcie-starfive.c |
| @@ -304,12 +304,14 @@ static int starfive_pcie_host_init(struc |
| |
| ret = starfive_pcie_clk_rst_init(pcie); |
| if (ret) |
| - return ret; |
| + goto err_disable_phy; |
| |
| if (pcie->vpcie3v3) { |
| ret = regulator_enable(pcie->vpcie3v3); |
| - if (ret) |
| + if (ret) { |
| dev_err_probe(dev, ret, "failed to enable vpcie3v3 regulator\n"); |
| + goto err_clk_rst; |
| + } |
| } |
| |
| if (pcie->reset_gpio) |
| @@ -379,6 +381,13 @@ static int starfive_pcie_host_init(struc |
| dev_info(dev, "port link down\n"); |
| |
| return 0; |
| + |
| +err_clk_rst: |
| + starfive_pcie_clk_rst_deinit(pcie); |
| +err_disable_phy: |
| + starfive_pcie_disable_phy(pcie); |
| + |
| + return ret; |
| } |
| |
| static const struct plda_pcie_host_ops sf_host_ops = { |