diff options
Diffstat (limited to 'drivers/pci/msi.c')
-rw-r--r-- | drivers/pci/msi.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index 8c61304cbb37..15af618d36e2 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c | |||
@@ -70,12 +70,10 @@ arch_teardown_msi_irqs(struct pci_dev *dev) | |||
70 | } | 70 | } |
71 | } | 71 | } |
72 | 72 | ||
73 | static void msi_set_enable(struct pci_dev *dev, int enable) | 73 | static void __msi_set_enable(struct pci_dev *dev, int pos, int enable) |
74 | { | 74 | { |
75 | int pos; | ||
76 | u16 control; | 75 | u16 control; |
77 | 76 | ||
78 | pos = pci_find_capability(dev, PCI_CAP_ID_MSI); | ||
79 | if (pos) { | 77 | if (pos) { |
80 | pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &control); | 78 | pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &control); |
81 | control &= ~PCI_MSI_FLAGS_ENABLE; | 79 | control &= ~PCI_MSI_FLAGS_ENABLE; |
@@ -85,6 +83,11 @@ static void msi_set_enable(struct pci_dev *dev, int enable) | |||
85 | } | 83 | } |
86 | } | 84 | } |
87 | 85 | ||
86 | static void msi_set_enable(struct pci_dev *dev, int enable) | ||
87 | { | ||
88 | __msi_set_enable(dev, pci_find_capability(dev, PCI_CAP_ID_MSI), enable); | ||
89 | } | ||
90 | |||
88 | static void msix_set_enable(struct pci_dev *dev, int enable) | 91 | static void msix_set_enable(struct pci_dev *dev, int enable) |
89 | { | 92 | { |
90 | int pos; | 93 | int pos; |
@@ -141,7 +144,8 @@ static void msi_set_mask_bits(unsigned int irq, u32 mask, u32 flag) | |||
141 | mask_bits |= flag & mask; | 144 | mask_bits |= flag & mask; |
142 | pci_write_config_dword(entry->dev, pos, mask_bits); | 145 | pci_write_config_dword(entry->dev, pos, mask_bits); |
143 | } else { | 146 | } else { |
144 | msi_set_enable(entry->dev, !flag); | 147 | __msi_set_enable(entry->dev, entry->msi_attrib.pos, |
148 | !flag); | ||
145 | } | 149 | } |
146 | break; | 150 | break; |
147 | case PCI_CAP_ID_MSIX: | 151 | case PCI_CAP_ID_MSIX: |
@@ -561,9 +565,8 @@ int pci_enable_msi(struct pci_dev* dev) | |||
561 | 565 | ||
562 | /* Check whether driver already requested for MSI-X irqs */ | 566 | /* Check whether driver already requested for MSI-X irqs */ |
563 | if (dev->msix_enabled) { | 567 | if (dev->msix_enabled) { |
564 | printk(KERN_INFO "PCI: %s: Can't enable MSI. " | 568 | dev_info(&dev->dev, "can't enable MSI " |
565 | "Device already has MSI-X enabled\n", | 569 | "(MSI-X already enabled)\n"); |
566 | pci_name(dev)); | ||
567 | return -EINVAL; | 570 | return -EINVAL; |
568 | } | 571 | } |
569 | status = msi_capability_init(dev); | 572 | status = msi_capability_init(dev); |
@@ -686,9 +689,8 @@ int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec) | |||
686 | 689 | ||
687 | /* Check whether driver already requested for MSI irq */ | 690 | /* Check whether driver already requested for MSI irq */ |
688 | if (dev->msi_enabled) { | 691 | if (dev->msi_enabled) { |
689 | printk(KERN_INFO "PCI: %s: Can't enable MSI-X. " | 692 | dev_info(&dev->dev, "can't enable MSI-X " |
690 | "Device already has an MSI irq assigned\n", | 693 | "(MSI IRQ already assigned)\n"); |
691 | pci_name(dev)); | ||
692 | return -EINVAL; | 694 | return -EINVAL; |
693 | } | 695 | } |
694 | status = msix_capability_init(dev, entries, nvec); | 696 | status = msix_capability_init(dev, entries, nvec); |