Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ec639e89 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: pcie: allow recovery via wake IRQ for resume failure"

parents 81a0dde7 ba751078
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ enum msm_pcie_event {
	MSM_PCIE_EVENT_LINKDOWN = 0x1,
	MSM_PCIE_EVENT_LINKUP = 0x2,
	MSM_PCIE_EVENT_WAKEUP = 0x4,
	MSM_PCIE_EVENT_WAKE_RECOVERY = 0x8,
};

enum msm_pcie_trigger {
+28 −4
Original line number Diff line number Diff line
@@ -1828,9 +1828,20 @@ void msm_pcie_fixup_resume(struct pci_dev *dev)

	mutex_lock(&pcie_dev->recovery_lock);
	ret = msm_pcie_pm_resume(dev, NULL, NULL, 0);
	if (ret)
	if (ret) {
		pr_err("PCIe: RC%d got failure in fixup resume:%d.\n",
			pcie_dev->rc_idx, ret);

		if (pcie_dev->event_reg && pcie_dev->event_reg->callback &&
			(pcie_dev->event_reg->events &
				MSM_PCIE_EVENT_WAKE_RECOVERY)) {
			pcie_dev->recovery_pending = true;
			PCIE_DBG(
				"PCIe: wait for wake IRQ to recover the link for RC%d\n",
				pcie_dev->rc_idx);
		}
	}

	mutex_unlock(&pcie_dev->recovery_lock);
}
DECLARE_PCI_FIXUP_RESUME(PCIE_VENDOR_ID_RCP, PCIE_DEVICE_ID_RCP,
@@ -1855,9 +1866,19 @@ void msm_pcie_fixup_resume_early(struct pci_dev *dev)

	mutex_lock(&pcie_dev->recovery_lock);
	ret = msm_pcie_pm_resume(dev, NULL, NULL, 0);
	if (ret)
	if (ret) {
		pr_err("PCIe: RC%d got failure in resume:%d.\n",
			pcie_dev->rc_idx, ret);

		if (pcie_dev->event_reg && pcie_dev->event_reg->callback &&
			(pcie_dev->event_reg->events &
				MSM_PCIE_EVENT_WAKE_RECOVERY)) {
			pcie_dev->recovery_pending = true;
			PCIE_DBG(
				"PCIe: wait for wake IRQ to recover the link for RC%d\n",
				pcie_dev->rc_idx);
		}
	}
	mutex_unlock(&pcie_dev->recovery_lock);
}
DECLARE_PCI_FIXUP_RESUME_EARLY(PCIE_VENDOR_ID_RCP, PCIE_DEVICE_ID_RCP,
@@ -1941,11 +1962,14 @@ int msm_pcie_pm_control(enum msm_pcie_pm_opt pm_opt, u32 busnr, void *user,
		if (!(options & MSM_PCIE_CONFIG_LINKDOWN))
			mutex_lock(&msm_pcie_dev[rc_idx].recovery_lock);
		ret = msm_pcie_pm_resume(dev, user, data, options);
		if (ret)
		if (ret) {
			pr_err("PCIe: RC%d: user failed to resume the link.\n",
				rc_idx);
		else
		} else {
			msm_pcie_dev[rc_idx].user_suspend = false;
			msm_pcie_dev[rc_idx].recovery_pending = false;
		}

		if (!(options & MSM_PCIE_CONFIG_LINKDOWN))
			mutex_unlock(&msm_pcie_dev[rc_idx].recovery_lock);
		break;