diff --git a/cnss2/pci.c b/cnss2/pci.c index 93db7b3f7c..7d7390b7b6 100644 --- a/cnss2/pci.c +++ b/cnss2/pci.c @@ -7045,28 +7045,6 @@ static bool cnss_should_suspend_pwroff(struct pci_dev *pci_dev) } #endif -static void cnss_pci_suspend_pwroff(struct pci_dev *pci_dev) -{ - struct cnss_pci_data *pci_priv = cnss_get_pci_priv(pci_dev); - int rc_num = pci_dev->bus->domain_nr; - struct cnss_plat_data *plat_priv; - int ret = 0; - bool suspend_pwroff = cnss_should_suspend_pwroff(pci_dev); - - plat_priv = cnss_get_plat_priv_by_rc_num(rc_num); - - if (suspend_pwroff) { - ret = cnss_suspend_pci_link(pci_priv); - if (ret) - cnss_pr_err("Failed to suspend PCI link, err = %d\n", - ret); - cnss_power_off_device(plat_priv); - } else { - cnss_pr_dbg("bus suspend and dev power off disabled for device [0x%x]\n", - pci_dev->device); - } -} - #ifdef CONFIG_CNSS2_ENUM_WITH_LOW_SPEED static void cnss_pci_downgrade_rc_speed(struct cnss_plat_data *plat_priv, u32 rc_num) @@ -7093,16 +7071,25 @@ cnss_pci_restore_rc_speed(struct cnss_pci_data *pci_priv) if (ret) cnss_pr_err("Failed to reset max PCIe RC%x link speed to default, err = %d\n", plat_priv->rc_num, ret); - - /* suspend/resume will trigger retain to re-establish link speed */ - ret = cnss_suspend_pci_link(pci_priv); - if (ret) - cnss_pr_err("Failed to suspend PCI link, err = %d\n", ret); - - ret = cnss_resume_pci_link(pci_priv); - cnss_pr_err("Failed to resume PCI link, err = %d\n", ret); } } + +static void +cnss_pci_link_retrain_trigger(struct cnss_pci_data *pci_priv) +{ + int ret; + + /* suspend/resume will trigger retain to re-establish link speed */ + ret = cnss_suspend_pci_link(pci_priv); + if (ret) + cnss_pr_err("Failed to suspend PCI link, err = %d\n", ret); + + ret = cnss_resume_pci_link(pci_priv); + if (ret) + cnss_pr_err("Failed to resume PCI link, err = %d\n", ret); + + cnss_pci_get_link_status(pci_priv); +} #else static void cnss_pci_downgrade_rc_speed(struct cnss_plat_data *plat_priv, u32 rc_num) @@ -7113,8 +7100,36 @@ static void cnss_pci_restore_rc_speed(struct cnss_pci_data *pci_priv) { } + +static void +cnss_pci_link_retrain_trigger(struct cnss_pci_data *pci_priv) +{ +} #endif +static void cnss_pci_suspend_pwroff(struct pci_dev *pci_dev) +{ + struct cnss_pci_data *pci_priv = cnss_get_pci_priv(pci_dev); + int rc_num = pci_dev->bus->domain_nr; + struct cnss_plat_data *plat_priv; + int ret = 0; + bool suspend_pwroff = cnss_should_suspend_pwroff(pci_dev); + + plat_priv = cnss_get_plat_priv_by_rc_num(rc_num); + + if (suspend_pwroff) { + ret = cnss_suspend_pci_link(pci_priv); + if (ret) + cnss_pr_err("Failed to suspend PCI link, err = %d\n", + ret); + cnss_power_off_device(plat_priv); + } else { + cnss_pr_dbg("bus suspend and dev power off disabled for device [0x%x]\n", + pci_dev->device); + cnss_pci_link_retrain_trigger(pci_priv); + } +} + static int cnss_pci_probe(struct pci_dev *pci_dev, const struct pci_device_id *id) {