mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-10 06:09:23 -04:00
Merge "cnss2: Notify MSM PCIe bus driver when detect link down"
This commit is contained in:
commit
34715bc934
1 changed files with 37 additions and 35 deletions
|
|
@ -911,19 +911,12 @@ void cnss_pci_allow_l1(struct device *dev)
|
|||
}
|
||||
EXPORT_SYMBOL(cnss_pci_allow_l1);
|
||||
|
||||
int cnss_pci_link_down(struct device *dev)
|
||||
static void cnss_pci_handle_linkdown(struct cnss_pci_data *pci_priv)
|
||||
{
|
||||
struct cnss_plat_data *plat_priv = pci_priv->plat_priv;
|
||||
struct pci_dev *pci_dev = pci_priv->pci_dev;
|
||||
unsigned long flags;
|
||||
struct pci_dev *pci_dev = to_pci_dev(dev);
|
||||
struct cnss_pci_data *pci_priv = cnss_get_pci_priv(pci_dev);
|
||||
struct cnss_plat_data *plat_priv;
|
||||
|
||||
if (!pci_priv) {
|
||||
cnss_pr_err("pci_priv is NULL\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
plat_priv = pci_priv->plat_priv;
|
||||
if (test_bit(ENABLE_PCI_LINK_DOWN_PANIC,
|
||||
&plat_priv->ctrl_params.quirks))
|
||||
panic("cnss: PCI link is down\n");
|
||||
|
|
@ -932,17 +925,40 @@ int cnss_pci_link_down(struct device *dev)
|
|||
if (pci_priv->pci_link_down_ind) {
|
||||
cnss_pr_dbg("PCI link down recovery is in progress, ignore\n");
|
||||
spin_unlock_irqrestore(&pci_link_down_lock, flags);
|
||||
return -EINVAL;
|
||||
return;
|
||||
}
|
||||
pci_priv->pci_link_down_ind = true;
|
||||
spin_unlock_irqrestore(&pci_link_down_lock, flags);
|
||||
|
||||
reinit_completion(&pci_priv->wake_event);
|
||||
cnss_pr_err("PCI link down is detected, schedule recovery\n");
|
||||
|
||||
cnss_schedule_recovery(dev, CNSS_REASON_LINK_DOWN);
|
||||
if (pci_dev->device == QCA6174_DEVICE_ID)
|
||||
disable_irq(pci_dev->irq);
|
||||
|
||||
return 0;
|
||||
cnss_fatal_err("PCI link down, schedule recovery\n");
|
||||
cnss_schedule_recovery(&pci_dev->dev, CNSS_REASON_LINK_DOWN);
|
||||
}
|
||||
|
||||
int cnss_pci_link_down(struct device *dev)
|
||||
{
|
||||
struct pci_dev *pci_dev = to_pci_dev(dev);
|
||||
struct cnss_pci_data *pci_priv = cnss_get_pci_priv(pci_dev);
|
||||
int ret;
|
||||
|
||||
if (!pci_priv) {
|
||||
cnss_pr_err("pci_priv is NULL\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
cnss_pr_err("PCI link down is detected by drivers\n");
|
||||
|
||||
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);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(cnss_pci_link_down);
|
||||
|
||||
|
|
@ -2401,10 +2417,8 @@ static bool cnss_pci_is_drv_supported(struct cnss_pci_data *pci_priv)
|
|||
|
||||
static void cnss_pci_event_cb(struct msm_pcie_notify *notify)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct pci_dev *pci_dev;
|
||||
struct cnss_pci_data *pci_priv;
|
||||
struct cnss_plat_data *plat_priv;
|
||||
|
||||
if (!notify)
|
||||
return;
|
||||
|
|
@ -2417,27 +2431,9 @@ static void cnss_pci_event_cb(struct msm_pcie_notify *notify)
|
|||
if (!pci_priv)
|
||||
return;
|
||||
|
||||
plat_priv = pci_priv->plat_priv;
|
||||
switch (notify->event) {
|
||||
case MSM_PCIE_EVENT_LINKDOWN:
|
||||
if (test_bit(ENABLE_PCI_LINK_DOWN_PANIC,
|
||||
&plat_priv->ctrl_params.quirks))
|
||||
panic("cnss: PCI link is down\n");
|
||||
|
||||
spin_lock_irqsave(&pci_link_down_lock, flags);
|
||||
if (pci_priv->pci_link_down_ind) {
|
||||
cnss_pr_dbg("PCI link down recovery is in progress, ignore\n");
|
||||
spin_unlock_irqrestore(&pci_link_down_lock, flags);
|
||||
return;
|
||||
}
|
||||
pci_priv->pci_link_down_ind = true;
|
||||
spin_unlock_irqrestore(&pci_link_down_lock, flags);
|
||||
|
||||
reinit_completion(&pci_priv->wake_event);
|
||||
cnss_fatal_err("PCI link down, schedule recovery\n");
|
||||
if (pci_dev->device == QCA6174_DEVICE_ID)
|
||||
disable_irq(pci_dev->irq);
|
||||
cnss_schedule_recovery(&pci_dev->dev, CNSS_REASON_LINK_DOWN);
|
||||
cnss_pci_handle_linkdown(pci_priv);
|
||||
break;
|
||||
case MSM_PCIE_EVENT_WAKEUP:
|
||||
complete(&pci_priv->wake_event);
|
||||
|
|
@ -4301,12 +4297,18 @@ static void cnss_dev_rddm_timeout_hdlr(struct timer_list *t)
|
|||
{
|
||||
struct cnss_pci_data *pci_priv =
|
||||
from_timer(pci_priv, t, dev_rddm_timer);
|
||||
struct mhi_controller *mhi_ctrl = pci_priv->mhi_ctrl;
|
||||
|
||||
if (!pci_priv)
|
||||
return;
|
||||
|
||||
cnss_fatal_err("Timeout waiting for RDDM notification\n");
|
||||
|
||||
if (mhi_get_exec_env(mhi_ctrl) == MHI_EE_PBL)
|
||||
cnss_pr_err("Unable to collect ramdumps due to abrupt reset\n");
|
||||
|
||||
mhi_debug_reg_dump(mhi_ctrl);
|
||||
|
||||
cnss_schedule_recovery(&pci_priv->pci_dev->dev, CNSS_REASON_TIMEOUT);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue