diff options
Diffstat (limited to 'arch/i386/kernel/io_apic.c')
-rw-r--r-- | arch/i386/kernel/io_apic.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/arch/i386/kernel/io_apic.c b/arch/i386/kernel/io_apic.c index 6a3875f81a0a..5592fa6e1fa1 100644 --- a/arch/i386/kernel/io_apic.c +++ b/arch/i386/kernel/io_apic.c | |||
@@ -2606,25 +2606,32 @@ static struct irq_chip msi_chip = { | |||
2606 | .retrigger = ioapic_retrigger_irq, | 2606 | .retrigger = ioapic_retrigger_irq, |
2607 | }; | 2607 | }; |
2608 | 2608 | ||
2609 | int arch_setup_msi_irq(unsigned int irq, struct pci_dev *dev) | 2609 | int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc) |
2610 | { | 2610 | { |
2611 | struct msi_msg msg; | 2611 | struct msi_msg msg; |
2612 | int ret; | 2612 | int irq, ret; |
2613 | irq = create_irq(); | ||
2614 | if (irq < 0) | ||
2615 | return irq; | ||
2616 | |||
2617 | set_irq_msi(irq, desc); | ||
2613 | ret = msi_compose_msg(dev, irq, &msg); | 2618 | ret = msi_compose_msg(dev, irq, &msg); |
2614 | if (ret < 0) | 2619 | if (ret < 0) { |
2620 | destroy_irq(irq); | ||
2615 | return ret; | 2621 | return ret; |
2622 | } | ||
2616 | 2623 | ||
2617 | write_msi_msg(irq, &msg); | 2624 | write_msi_msg(irq, &msg); |
2618 | 2625 | ||
2619 | set_irq_chip_and_handler_name(irq, &msi_chip, handle_edge_irq, | 2626 | set_irq_chip_and_handler_name(irq, &msi_chip, handle_edge_irq, |
2620 | "edge"); | 2627 | "edge"); |
2621 | 2628 | ||
2622 | return 0; | 2629 | return irq; |
2623 | } | 2630 | } |
2624 | 2631 | ||
2625 | void arch_teardown_msi_irq(unsigned int irq) | 2632 | void arch_teardown_msi_irq(unsigned int irq) |
2626 | { | 2633 | { |
2627 | return; | 2634 | destroy_irq(irq); |
2628 | } | 2635 | } |
2629 | 2636 | ||
2630 | #endif /* CONFIG_PCI_MSI */ | 2637 | #endif /* CONFIG_PCI_MSI */ |