|
@@ -1299,9 +1299,6 @@ static void restore_cpu_virqs(unsigned int cpu)
|
|
|
evtchn_to_irq[evtchn] = irq;
|
|
|
irq_info[irq] = mk_virq_info(evtchn, virq);
|
|
|
bind_evtchn_to_cpu(evtchn, cpu);
|
|
|
-
|
|
|
- /* Ready for use. */
|
|
|
- unmask_evtchn(evtchn);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1327,10 +1324,6 @@ static void restore_cpu_ipis(unsigned int cpu)
|
|
|
evtchn_to_irq[evtchn] = irq;
|
|
|
irq_info[irq] = mk_ipi_info(evtchn, ipi);
|
|
|
bind_evtchn_to_cpu(evtchn, cpu);
|
|
|
-
|
|
|
- /* Ready for use. */
|
|
|
- unmask_evtchn(evtchn);
|
|
|
-
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1390,6 +1383,7 @@ void xen_poll_irq(int irq)
|
|
|
void xen_irq_resume(void)
|
|
|
{
|
|
|
unsigned int cpu, irq, evtchn;
|
|
|
+ struct irq_desc *desc;
|
|
|
|
|
|
init_evtchn_cpu_bindings();
|
|
|
|
|
@@ -1408,6 +1402,23 @@ void xen_irq_resume(void)
|
|
|
restore_cpu_virqs(cpu);
|
|
|
restore_cpu_ipis(cpu);
|
|
|
}
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Unmask any IRQF_NO_SUSPEND IRQs which are enabled. These
|
|
|
+ * are not handled by the IRQ core.
|
|
|
+ */
|
|
|
+ for_each_irq_desc(irq, desc) {
|
|
|
+ if (!desc->action || !(desc->action->flags & IRQF_NO_SUSPEND))
|
|
|
+ continue;
|
|
|
+ if (desc->status & IRQ_DISABLED)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ evtchn = evtchn_from_irq(irq);
|
|
|
+ if (evtchn == -1)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ unmask_evtchn(evtchn);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static struct irq_chip xen_dynamic_chip __read_mostly = {
|