cnss2: Downgrade RC speed to Gen1 for Genoa EP
Some platform PCIe RC impedance can't achieve the target defined in spec. It will result to Genoa card link down. To WA the issue, downgrade RC speed to Gen1 for auto Genoa EP. Because the linkdown issue may happen during enum, and before enumunation we do not know EP device ID, so set init speed to Gen1, and then restore speed to default for others wifi chip. The change does not affect Genoa throughput, because Gen1 speed is enough for Genoa. Change-Id: Iffdbf8b98a82c200faf11edcdd180213366ed6ca CRs-Fixed: 3479848
Cette révision appartient à :

révisé par
Rahul Choudhary

Parent
f4e0145655
révision
5eaf0073cc
52
cnss2/pci.c
52
cnss2/pci.c
@@ -6901,6 +6901,54 @@ static void cnss_pci_suspend_pwroff(struct pci_dev *pci_dev)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CNSS2_ENUM_WITH_LOW_SPEED
|
||||
static void
|
||||
cnss_pci_downgrade_rc_speed(struct cnss_plat_data *plat_priv, u32 rc_num)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = cnss_pci_set_max_link_speed(plat_priv->bus_priv, rc_num,
|
||||
PCI_EXP_LNKSTA_CLS_2_5GB);
|
||||
if (ret)
|
||||
cnss_pr_err("Failed to set max PCIe RC%x link speed to Gen1, err = %d\n",
|
||||
rc_num, ret);
|
||||
}
|
||||
|
||||
static void
|
||||
cnss_pci_restore_rc_speed(struct cnss_pci_data *pci_priv)
|
||||
{
|
||||
int ret;
|
||||
struct cnss_plat_data *plat_priv = pci_priv->plat_priv;
|
||||
|
||||
/* if not Genoa, do not restore rc speed */
|
||||
if (pci_priv->device_id != QCN7605_DEVICE_ID) {
|
||||
/* The request 0 will reset maximum GEN speed to default */
|
||||
ret = cnss_pci_set_max_link_speed(pci_priv, plat_priv->rc_num, 0);
|
||||
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);
|
||||
}
|
||||
}
|
||||
#else
|
||||
static void
|
||||
cnss_pci_downgrade_rc_speed(struct cnss_plat_data *plat_priv, u32 rc_num)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
cnss_pci_restore_rc_speed(struct cnss_pci_data *pci_priv)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
static int cnss_pci_probe(struct pci_dev *pci_dev,
|
||||
const struct pci_device_id *id)
|
||||
{
|
||||
@@ -6936,6 +6984,8 @@ static int cnss_pci_probe(struct pci_dev *pci_dev,
|
||||
if (plat_priv->use_pm_domain)
|
||||
dev->pm_domain = &cnss_pm_domain;
|
||||
|
||||
cnss_pci_restore_rc_speed(pci_priv);
|
||||
|
||||
ret = cnss_pci_get_dev_cfg_node(plat_priv);
|
||||
if (ret) {
|
||||
cnss_pr_err("Failed to get device cfg node, err = %d\n", ret);
|
||||
@@ -7138,6 +7188,8 @@ static int cnss_pci_enumerate(struct cnss_plat_data *plat_priv, u32 rc_num)
|
||||
if (ret && ret != -EPROBE_DEFER)
|
||||
cnss_pr_err("Failed to set max PCIe RC%x link speed to Gen2, err = %d\n",
|
||||
rc_num, ret);
|
||||
} else {
|
||||
cnss_pci_downgrade_rc_speed(plat_priv, rc_num);
|
||||
}
|
||||
|
||||
cnss_pr_dbg("Trying to enumerate with PCIe RC%x\n", rc_num);
|
||||
|
Référencer dans un nouveau ticket
Bloquer un utilisateur