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

Commit 4ae8c3a8 authored by Hemant Kumar's avatar Hemant Kumar Committed by Gerrit - the friendly Code Review server
Browse files

pci: msm: Handle AER in threaded irq context



AER handling requires finding the source pci device on
the bus which causes the AER. Source pci device is found
using bus, device and function number. Finding pci device
requires sleeping context because bus is walked by holding
semaphore. Hence move AER handling to threaded irq context.

Change-Id: Ia51b91560326be2a85e17ce98315ea39d25641e2
Signed-off-by: default avatarHemant Kumar <hemantk@codeaurora.org>
parent eb6b3094
Loading
Loading
Loading
Loading
+9 −7
Original line number Diff line number Diff line
@@ -5471,6 +5471,7 @@ static irqreturn_t handle_global_irq(int irq, void *data)
	struct msm_pcie_dev_t *dev = data;
	unsigned long irqsave_flags;
	u32 status = 0;
	irqreturn_t ret = IRQ_HANDLED;

	spin_lock_irqsave(&dev->irq_lock, irqsave_flags);

@@ -5478,8 +5479,7 @@ static irqreturn_t handle_global_irq(int irq, void *data)
		PCIE_DBG2(dev,
			"PCIe: RC%d is currently suspending.\n",
			dev->rc_idx);
		spin_unlock_irqrestore(&dev->irq_lock, irqsave_flags);
		return IRQ_HANDLED;
		goto done;
	}

	status = readl_relaxed(dev->parf + PCIE20_PARF_INT_ALL_STATUS) &
@@ -5507,13 +5507,13 @@ static irqreturn_t handle_global_irq(int irq, void *data)
				PCIE_DBG(dev,
					"PCIe: RC%d: AER legacy event.\n",
					dev->rc_idx);
				handle_aer_irq(irq, data);
				ret = IRQ_WAKE_THREAD;
				break;
			case MSM_PCIE_INT_EVT_AER_ERR:
				PCIE_DBG(dev,
					"PCIe: RC%d: AER event.\n",
					dev->rc_idx);
				handle_aer_irq(irq, data);
				ret = IRQ_WAKE_THREAD;
				break;
			default:
				PCIE_DUMP(dev,
@@ -5523,9 +5523,10 @@ static irqreturn_t handle_global_irq(int irq, void *data)
		}
	}

done:
	spin_unlock_irqrestore(&dev->irq_lock, irqsave_flags);

	return IRQ_HANDLED;
	return ret;
}

static int32_t msm_pcie_irq_init(struct msm_pcie_dev_t *dev)
@@ -5544,10 +5545,11 @@ static int32_t msm_pcie_irq_init(struct msm_pcie_dev_t *dev)
	}

	if (dev->irq[MSM_PCIE_INT_GLOBAL_INT].num) {
		rc = devm_request_irq(pdev,
		rc = devm_request_threaded_irq(pdev,
				dev->irq[MSM_PCIE_INT_GLOBAL_INT].num,
				handle_global_irq,
				IRQF_TRIGGER_RISING,
				handle_aer_irq,
				IRQF_TRIGGER_RISING | IRQF_ONESHOT,
				dev->irq[MSM_PCIE_INT_GLOBAL_INT].name,
				dev);
		if (rc) {