From 6854d5850e1c10e4893d3a913b4afe3ae6f55a32 Mon Sep 17 00:00:00 2001 From: Yue Ma Date: Thu, 13 Aug 2020 14:13:46 -0700 Subject: [PATCH 1/2] cnss2: Trigger recovery when link is down before force RDDM If link is still down before force firmware assert, directly trigger link down recovery instead of forcing RDDM. Change-Id: Ie3e4c97c2ab42a1c426c6048ed839dfdd7f02462 Signed-off-by: Yue Ma --- drivers/net/wireless/cnss2/pci.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index e7c6ba369380..258c8a57567f 100644 --- a/drivers/net/wireless/cnss2/pci.c +++ b/drivers/net/wireless/cnss2/pci.c @@ -366,19 +366,20 @@ int cnss_pci_check_link_status(struct cnss_pci_data *pci_priv) u16 device_id; if (pci_priv->pci_link_state == PCI_LINK_DOWN) { - cnss_pr_dbg("PCIe link is suspended\n"); + cnss_pr_dbg("%ps: PCIe link is suspended\n", (void *)_RET_IP_); return -EACCES; } if (pci_priv->pci_link_down_ind) { - cnss_pr_err("PCIe link is down\n"); + cnss_pr_err("%ps: PCIe link is down\n", (void *)_RET_IP_); return -EIO; } pci_read_config_word(pci_priv->pci_dev, PCI_DEVICE_ID, &device_id); if (device_id != pci_priv->device_id) { - cnss_fatal_err("PCI device ID mismatch, link possibly down, current read ID: 0x%x, record ID: 0x%x\n", - device_id, pci_priv->device_id); + cnss_fatal_err("%ps: PCI device ID mismatch, link possibly down, current read ID: 0x%x, record ID: 0x%x\n", + (void *)_RET_IP_, device_id, + pci_priv->device_id); return -EIO; } @@ -3970,6 +3971,13 @@ int cnss_pci_force_fw_assert_hdlr(struct cnss_pci_data *pci_priv) return -EINVAL; cnss_auto_resume(&pci_priv->pci_dev->dev); + /* If link is still down here, directly trigger link down recovery */ + ret = cnss_pci_check_link_status(pci_priv); + if (ret) { + cnss_pci_link_down(&pci_priv->pci_dev->dev); + return 0; + } + cnss_pci_dump_misc_reg(pci_priv); cnss_pci_dump_shadow_reg(pci_priv); From 915f8f9e3cc938e0ba97a6b3cd7092e9f8af3cb2 Mon Sep 17 00:00:00 2001 From: Yue Ma Date: Fri, 14 Aug 2020 13:45:03 -0700 Subject: [PATCH 2/2] cnss2: Set PCIe link state in proper state during resume pci_link_state is meant to track if CNSS driver suspends/resumes PCIe link by calling PCIe bus suspend/resume APIs. Hence set it in proper state during resume path to reflect accurate state change. Change-Id: I638357e8a48d52796ac604dcea734056eb03ee54 Signed-off-by: Yue Ma --- drivers/net/wireless/cnss2/pci.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index 258c8a57567f..4aa2546b82f4 100644 --- a/drivers/net/wireless/cnss2/pci.c +++ b/drivers/net/wireless/cnss2/pci.c @@ -2590,6 +2590,8 @@ int cnss_pci_resume_bus(struct cnss_pci_data *pci_priv) goto out; } + pci_priv->pci_link_state = PCI_LINK_UP; + if (pci_priv->drv_connected_last) goto skip_enable_pci; @@ -2607,7 +2609,6 @@ int cnss_pci_resume_bus(struct cnss_pci_data *pci_priv) skip_enable_pci: cnss_pci_set_mhi_state(pci_priv, CNSS_MHI_RESUME); - pci_priv->pci_link_state = PCI_LINK_UP; out: return ret; }