diff --git a/cnss2/pci_qcom.c b/cnss2/pci_qcom.c index 937f04a494..a3d009be41 100644 --- a/cnss2/pci_qcom.c +++ b/cnss2/pci_qcom.c @@ -34,9 +34,32 @@ static struct cnss_msi_config msi_config_one_msi = { }; #endif +#define ENUM_RETRY_MAX_TIMES 8 +#define ENUM_RETRY_DELAY_MS 500 + int _cnss_pci_enumerate(struct cnss_plat_data *plat_priv, u32 rc_num) { - return msm_pcie_enumerate(rc_num); + u32 retry = 0; + int ret; + + if (plat_priv->pcie_switch_type == PCIE_SWITCH_NTN3) { + while (retry++ < ENUM_RETRY_MAX_TIMES) { + ret = msm_pcie_enumerate(rc_num); + /* For PCIe switch platform, cnss_probe may called + * before PCIe switch hardware ready, wait for + * msm_pcie_enumerate complete. + */ + if (ret == -EPROBE_DEFER) { + cnss_pr_dbg("PCIe RC%d not ready, retry:%dth\n", + rc_num, retry); + msleep(ENUM_RETRY_DELAY_MS); + } + } + } else { + return msm_pcie_enumerate(rc_num); + } + + return ret; } int cnss_pci_assert_perst(struct cnss_pci_data *pci_priv)