On the mt7623 platform, if one port enable fail and other port
enable succeed. It will hang on when using pci enum
because the resource was not released correctly.

Signed-off-by: Chuanjia Liu <chuanjia....@mediatek.com>
Tested-by: Frank Wunderlich <fran...@public-files.de>
---
 drivers/pci/pcie_mediatek.c | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/drivers/pci/pcie_mediatek.c b/drivers/pci/pcie_mediatek.c
index ad34f7c597..55b6a40f25 100644
--- a/drivers/pci/pcie_mediatek.c
+++ b/drivers/pci/pcie_mediatek.c
@@ -443,29 +443,36 @@ static void mtk_pcie_enable_port(struct mtk_pcie_port 
*port)
 
        err = clk_enable(&port->sys_ck);
        if (err)
-               goto exit;
+               goto err_sys_clk;
 
        err = reset_assert(&port->reset);
        if (err)
-               goto exit;
+               goto err_reset;
 
        err = reset_deassert(&port->reset);
        if (err)
-               goto exit;
+               goto err_reset;
 
        err = generic_phy_init(&port->phy);
        if (err)
-               goto exit;
+               goto err_phy_init;
 
        err = generic_phy_power_on(&port->phy);
        if (err)
-               goto exit;
+               goto err_phy_on;
 
        if (!mtk_pcie_startup_port(port))
                return;
 
        pr_err("Port%d link down\n", port->slot);
-exit:
+
+       generic_phy_power_off(&port->phy);
+err_phy_on:
+       generic_phy_exit(&port->phy);
+err_phy_init:
+err_reset:
+       clk_disable(&port->sys_ck);
+err_sys_clk:
        mtk_pcie_port_free(port);
 }
 
-- 
2.18.0

Reply via email to