cnss2: Trigger pci link to retrain

When feature CNSS2_CONDITIONAL_POWEROFF enabled, wlan chip HST and
HSP will not power off in cnss probe. PCI link will not be triggered
to retrain once CNSS2_ENUM_WITH_LOW_SPEED enabled.

So, add API cnss_pci_link_retrain_trigger() to trigger pci link retrain
when HST and HSP not power off.

Change-Id: I2ba44837a03b09b1ef3cd0c23a780b89ff837740
CRs-Fixed: 3491396
Este commit está contenido en:
Yu Ouyang
2023-07-13 14:26:45 +08:00
cometido por Rahul Choudhary
padre 4561632548
commit 7de707a939

Ver fichero

@@ -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)
{