Skip to content

Commit c12ca11

Browse files
PCI: keystone: Fix race condition when initializing PHYs
The PCI driver invokes the PHY APIs using the ks_pcie_enable_phy() function. The PHY in this case is the Serdes. It is possible that the PCI instance is configured for two lane operation across two different Serdes instances, using one lane of each Serdes. In such a configuration, if the reference clock for one Serdes is provided by the other Serdes, it results in a race condition. After the Serdes providing the reference clock is initialized by the PCI driver by invoking its PHY APIs, it is not guaranteed that this Serdes remains powered on long enough for the PHY APIs based initialization of the dependent Serdes. In such cases, the PLL of the dependent Serdes fails to lock due to the absence of the reference clock from the former Serdes which has been powered off by the PM Core. Fix this by obtaining reference to the PHYs before invoking the PHY initialization APIs and releasing reference after the initialization is complete. Link: https://lore.kernel.org/linux-pci/[email protected] Fixes: 4922923 ("PCI: keystone: Cleanup PHY handling") Signed-off-by: Siddharth Vadapalli <[email protected]> Signed-off-by: Krzysztof Wilczyński <[email protected]> Acked-by: Ravi Gunasekaran <[email protected]>
1 parent b85ea95 commit c12ca11

File tree

1 file changed

+9
-0
lines changed

1 file changed

+9
-0
lines changed

drivers/pci/controller/dwc/pci-keystone.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1218,7 +1218,16 @@ static int ks_pcie_probe(struct platform_device *pdev)
12181218
goto err_link;
12191219
}
12201220

1221+
/* Obtain references to the PHYs */
1222+
for (i = 0; i < num_lanes; i++)
1223+
phy_pm_runtime_get_sync(ks_pcie->phy[i]);
1224+
12211225
ret = ks_pcie_enable_phy(ks_pcie);
1226+
1227+
/* Release references to the PHYs */
1228+
for (i = 0; i < num_lanes; i++)
1229+
phy_pm_runtime_put_sync(ks_pcie->phy[i]);
1230+
12221231
if (ret) {
12231232
dev_err(dev, "failed to enable phy\n");
12241233
goto err_link;

0 commit comments

Comments
 (0)