ppc64: allow iSeries to use IRQSTACKS again
Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
This commit is contained in:
Родитель
b709c08328
Коммит
5a7b3ff467
|
@ -103,6 +103,9 @@ static void intReceived(struct XmPciLpEvent *eventParm,
|
||||||
struct pt_regs *regsParm)
|
struct pt_regs *regsParm)
|
||||||
{
|
{
|
||||||
int irq;
|
int irq;
|
||||||
|
#ifdef CONFIG_IRQSTACKS
|
||||||
|
struct thread_info *curtp, *irqtp;
|
||||||
|
#endif
|
||||||
|
|
||||||
++Pci_Interrupt_Count;
|
++Pci_Interrupt_Count;
|
||||||
|
|
||||||
|
@ -110,7 +113,20 @@ static void intReceived(struct XmPciLpEvent *eventParm,
|
||||||
case XmPciLpEvent_SlotInterrupt:
|
case XmPciLpEvent_SlotInterrupt:
|
||||||
irq = eventParm->hvLpEvent.xCorrelationToken;
|
irq = eventParm->hvLpEvent.xCorrelationToken;
|
||||||
/* Dispatch the interrupt handlers for this irq */
|
/* Dispatch the interrupt handlers for this irq */
|
||||||
ppc_irq_dispatch_handler(regsParm, irq);
|
#ifdef CONFIG_IRQSTACKS
|
||||||
|
/* Switch to the irq stack to handle this */
|
||||||
|
curtp = current_thread_info();
|
||||||
|
irqtp = hardirq_ctx[smp_processor_id()];
|
||||||
|
if (curtp != irqtp) {
|
||||||
|
irqtp->task = curtp->task;
|
||||||
|
irqtp->flags = 0;
|
||||||
|
call_ppc_irq_dispatch_handler(regsParm, irq, irqtp);
|
||||||
|
irqtp->task = NULL;
|
||||||
|
if (irqtp->flags)
|
||||||
|
set_bits(irqtp->flags, &curtp->flags);
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
ppc_irq_dispatch_handler(regsParm, irq);
|
||||||
HvCallPci_eoi(eventParm->eventData.slotInterrupt.busNumber,
|
HvCallPci_eoi(eventParm->eventData.slotInterrupt.busNumber,
|
||||||
eventParm->eventData.slotInterrupt.subBusNumber,
|
eventParm->eventData.slotInterrupt.subBusNumber,
|
||||||
eventParm->eventData.slotInterrupt.deviceId);
|
eventParm->eventData.slotInterrupt.deviceId);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче