diff options
Diffstat (limited to 'drivers/pci/msi.c')
-rw-r--r-- | drivers/pci/msi.c | 22 |
1 files changed, 5 insertions, 17 deletions
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index f66be868ad21..2f9b1c0d1f96 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c | |||
@@ -77,24 +77,9 @@ static void pci_msi_teardown_msi_irqs(struct pci_dev *dev) | |||
77 | 77 | ||
78 | /* Arch hooks */ | 78 | /* Arch hooks */ |
79 | 79 | ||
80 | struct msi_controller * __weak pcibios_msi_controller(struct pci_dev *dev) | ||
81 | { | ||
82 | return NULL; | ||
83 | } | ||
84 | |||
85 | static struct msi_controller *pci_msi_controller(struct pci_dev *dev) | ||
86 | { | ||
87 | struct msi_controller *msi_ctrl = dev->bus->msi; | ||
88 | |||
89 | if (msi_ctrl) | ||
90 | return msi_ctrl; | ||
91 | |||
92 | return pcibios_msi_controller(dev); | ||
93 | } | ||
94 | |||
95 | int __weak arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc) | 80 | int __weak arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc) |
96 | { | 81 | { |
97 | struct msi_controller *chip = pci_msi_controller(dev); | 82 | struct msi_controller *chip = dev->bus->msi; |
98 | int err; | 83 | int err; |
99 | 84 | ||
100 | if (!chip || !chip->setup_irq) | 85 | if (!chip || !chip->setup_irq) |
@@ -665,6 +650,7 @@ static int msi_capability_init(struct pci_dev *dev, int nvec) | |||
665 | pci_msi_set_enable(dev, 1); | 650 | pci_msi_set_enable(dev, 1); |
666 | dev->msi_enabled = 1; | 651 | dev->msi_enabled = 1; |
667 | 652 | ||
653 | pcibios_free_irq(dev); | ||
668 | dev->irq = entry->irq; | 654 | dev->irq = entry->irq; |
669 | return 0; | 655 | return 0; |
670 | } | 656 | } |
@@ -792,9 +778,9 @@ static int msix_capability_init(struct pci_dev *dev, | |||
792 | /* Set MSI-X enabled bits and unmask the function */ | 778 | /* Set MSI-X enabled bits and unmask the function */ |
793 | pci_intx_for_msi(dev, 0); | 779 | pci_intx_for_msi(dev, 0); |
794 | dev->msix_enabled = 1; | 780 | dev->msix_enabled = 1; |
795 | |||
796 | pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0); | 781 | pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0); |
797 | 782 | ||
783 | pcibios_free_irq(dev); | ||
798 | return 0; | 784 | return 0; |
799 | 785 | ||
800 | out_avail: | 786 | out_avail: |
@@ -909,6 +895,7 @@ void pci_msi_shutdown(struct pci_dev *dev) | |||
909 | 895 | ||
910 | /* Restore dev->irq to its default pin-assertion irq */ | 896 | /* Restore dev->irq to its default pin-assertion irq */ |
911 | dev->irq = desc->msi_attrib.default_irq; | 897 | dev->irq = desc->msi_attrib.default_irq; |
898 | pcibios_alloc_irq(dev); | ||
912 | } | 899 | } |
913 | 900 | ||
914 | void pci_disable_msi(struct pci_dev *dev) | 901 | void pci_disable_msi(struct pci_dev *dev) |
@@ -1009,6 +996,7 @@ void pci_msix_shutdown(struct pci_dev *dev) | |||
1009 | pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0); | 996 | pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0); |
1010 | pci_intx_for_msi(dev, 1); | 997 | pci_intx_for_msi(dev, 1); |
1011 | dev->msix_enabled = 0; | 998 | dev->msix_enabled = 0; |
999 | pcibios_alloc_irq(dev); | ||
1012 | } | 1000 | } |
1013 | 1001 | ||
1014 | void pci_disable_msix(struct pci_dev *dev) | 1002 | void pci_disable_msix(struct pci_dev *dev) |