From 93cbb8df23d90bf3678d437ae439f8d0d3938a62 Mon Sep 17 00:00:00 2001 From: Mohammed Siddiq Date: Mon, 11 Jan 2021 19:35:25 +0530 Subject: [PATCH] cnss2: WAR to trigger self-recovery for link recover callback Add WAR to trigger self-recovery on receiving event callback MSM_PCIE_EVENT_LINK_RECOVER. Skip call to force assert when mhi resume -ETIMEDOUT. Change-Id: I05d3b2889e1983bab2509c1db2a3e45fdfe484d3 Signed-off-by: Mohammed Siddiq --- drivers/net/wireless/cnss2/pci.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index 08635be66660..6f260da8537b 100644 --- a/drivers/net/wireless/cnss2/pci.c +++ b/drivers/net/wireless/cnss2/pci.c @@ -3023,6 +3023,8 @@ static void cnss_pci_event_cb(struct msm_pcie_notify *notify) struct pci_dev *pci_dev; struct cnss_pci_data *pci_priv; struct device *dev; + struct cnss_plat_data *plat_priv = NULL; + int ret = 0; if (!notify) return; @@ -3037,6 +3039,23 @@ static void cnss_pci_event_cb(struct msm_pcie_notify *notify) dev = &pci_priv->pci_dev->dev; switch (notify->event) { + case MSM_PCIE_EVENT_LINK_RECOVER: + cnss_pr_dbg("PCI link recover callback\n"); + + plat_priv = pci_priv->plat_priv; + if (!plat_priv) { + cnss_pr_err("plat_priv is NULL\n"); + return; + } + + plat_priv->ctrl_params.quirks |= BIT(LINK_DOWN_SELF_RECOVERY); + + ret = msm_pcie_pm_control(MSM_PCIE_HANDLE_LINKDOWN, + pci_dev->bus->number, pci_dev, NULL, + PM_OPTIONS_DEFAULT); + if (ret) + cnss_pci_handle_linkdown(pci_priv); + break; case MSM_PCIE_EVENT_LINKDOWN: cnss_pr_dbg("PCI link down event callback\n"); cnss_pci_handle_linkdown(pci_priv); @@ -3080,8 +3099,9 @@ static int cnss_reg_pci_event(struct cnss_pci_data *pci_priv) struct msm_pcie_register_event *pci_event; pci_event = &pci_priv->msm_pci_event; - pci_event->events = MSM_PCIE_EVENT_LINKDOWN | - MSM_PCIE_EVENT_WAKEUP; + pci_event->events = MSM_PCIE_EVENT_LINK_RECOVER | + MSM_PCIE_EVENT_LINKDOWN | + MSM_PCIE_EVENT_WAKEUP; if (cnss_pci_is_drv_supported(pci_priv)) pci_event->events = pci_event->events |