diff options
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/msi.c | 20 |
1 files changed, 0 insertions, 20 deletions
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index b945470bef18..0df626cf47d8 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c | |||
@@ -24,7 +24,6 @@ | |||
24 | #include "pci.h" | 24 | #include "pci.h" |
25 | #include "msi.h" | 25 | #include "msi.h" |
26 | 26 | ||
27 | static DEFINE_SPINLOCK(msi_lock); | ||
28 | static struct msi_desc* msi_desc[NR_IRQS] = { [0 ... NR_IRQS-1] = NULL }; | 27 | static struct msi_desc* msi_desc[NR_IRQS] = { [0 ... NR_IRQS-1] = NULL }; |
29 | static struct kmem_cache* msi_cachep; | 28 | static struct kmem_cache* msi_cachep; |
30 | 29 | ||
@@ -196,11 +195,7 @@ static struct msi_desc* alloc_msi_entry(void) | |||
196 | 195 | ||
197 | static void attach_msi_entry(struct msi_desc *entry, int irq) | 196 | static void attach_msi_entry(struct msi_desc *entry, int irq) |
198 | { | 197 | { |
199 | unsigned long flags; | ||
200 | |||
201 | spin_lock_irqsave(&msi_lock, flags); | ||
202 | msi_desc[irq] = entry; | 198 | msi_desc[irq] = entry; |
203 | spin_unlock_irqrestore(&msi_lock, flags); | ||
204 | } | 199 | } |
205 | 200 | ||
206 | static int create_msi_irq(void) | 201 | static int create_msi_irq(void) |
@@ -672,7 +667,6 @@ void pci_disable_msi(struct pci_dev* dev) | |||
672 | struct msi_desc *entry; | 667 | struct msi_desc *entry; |
673 | int pos, default_irq; | 668 | int pos, default_irq; |
674 | u16 control; | 669 | u16 control; |
675 | unsigned long flags; | ||
676 | 670 | ||
677 | if (!pci_msi_enable) | 671 | if (!pci_msi_enable) |
678 | return; | 672 | return; |
@@ -693,21 +687,17 @@ void pci_disable_msi(struct pci_dev* dev) | |||
693 | 687 | ||
694 | disable_msi_mode(dev, pos, PCI_CAP_ID_MSI); | 688 | disable_msi_mode(dev, pos, PCI_CAP_ID_MSI); |
695 | 689 | ||
696 | spin_lock_irqsave(&msi_lock, flags); | ||
697 | entry = msi_desc[dev->first_msi_irq]; | 690 | entry = msi_desc[dev->first_msi_irq]; |
698 | if (!entry || !entry->dev || entry->msi_attrib.type != PCI_CAP_ID_MSI) { | 691 | if (!entry || !entry->dev || entry->msi_attrib.type != PCI_CAP_ID_MSI) { |
699 | spin_unlock_irqrestore(&msi_lock, flags); | ||
700 | return; | 692 | return; |
701 | } | 693 | } |
702 | if (irq_has_action(dev->first_msi_irq)) { | 694 | if (irq_has_action(dev->first_msi_irq)) { |
703 | spin_unlock_irqrestore(&msi_lock, flags); | ||
704 | printk(KERN_WARNING "PCI: %s: pci_disable_msi() called without " | 695 | printk(KERN_WARNING "PCI: %s: pci_disable_msi() called without " |
705 | "free_irq() on MSI irq %d\n", | 696 | "free_irq() on MSI irq %d\n", |
706 | pci_name(dev), dev->first_msi_irq); | 697 | pci_name(dev), dev->first_msi_irq); |
707 | BUG_ON(irq_has_action(dev->first_msi_irq)); | 698 | BUG_ON(irq_has_action(dev->first_msi_irq)); |
708 | } else { | 699 | } else { |
709 | default_irq = entry->msi_attrib.default_irq; | 700 | default_irq = entry->msi_attrib.default_irq; |
710 | spin_unlock_irqrestore(&msi_lock, flags); | ||
711 | msi_free_irq(dev, dev->first_msi_irq); | 701 | msi_free_irq(dev, dev->first_msi_irq); |
712 | 702 | ||
713 | /* Restore dev->irq to its default pin-assertion irq */ | 703 | /* Restore dev->irq to its default pin-assertion irq */ |
@@ -721,14 +711,11 @@ static int msi_free_irq(struct pci_dev* dev, int irq) | |||
721 | struct msi_desc *entry; | 711 | struct msi_desc *entry; |
722 | int head, entry_nr, type; | 712 | int head, entry_nr, type; |
723 | void __iomem *base; | 713 | void __iomem *base; |
724 | unsigned long flags; | ||
725 | 714 | ||
726 | arch_teardown_msi_irq(irq); | 715 | arch_teardown_msi_irq(irq); |
727 | 716 | ||
728 | spin_lock_irqsave(&msi_lock, flags); | ||
729 | entry = msi_desc[irq]; | 717 | entry = msi_desc[irq]; |
730 | if (!entry || entry->dev != dev) { | 718 | if (!entry || entry->dev != dev) { |
731 | spin_unlock_irqrestore(&msi_lock, flags); | ||
732 | return -EINVAL; | 719 | return -EINVAL; |
733 | } | 720 | } |
734 | type = entry->msi_attrib.type; | 721 | type = entry->msi_attrib.type; |
@@ -739,7 +726,6 @@ static int msi_free_irq(struct pci_dev* dev, int irq) | |||
739 | msi_desc[entry->link.tail]->link.head = entry->link.head; | 726 | msi_desc[entry->link.tail]->link.head = entry->link.head; |
740 | entry->dev = NULL; | 727 | entry->dev = NULL; |
741 | msi_desc[irq] = NULL; | 728 | msi_desc[irq] = NULL; |
742 | spin_unlock_irqrestore(&msi_lock, flags); | ||
743 | 729 | ||
744 | destroy_msi_irq(irq); | 730 | destroy_msi_irq(irq); |
745 | 731 | ||
@@ -817,7 +803,6 @@ int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec) | |||
817 | void pci_disable_msix(struct pci_dev* dev) | 803 | void pci_disable_msix(struct pci_dev* dev) |
818 | { | 804 | { |
819 | int irq, head, tail = 0, warning = 0; | 805 | int irq, head, tail = 0, warning = 0; |
820 | unsigned long flags; | ||
821 | int pos; | 806 | int pos; |
822 | u16 control; | 807 | u16 control; |
823 | 808 | ||
@@ -841,9 +826,7 @@ void pci_disable_msix(struct pci_dev* dev) | |||
841 | 826 | ||
842 | irq = head = dev->first_msi_irq; | 827 | irq = head = dev->first_msi_irq; |
843 | while (head != tail) { | 828 | while (head != tail) { |
844 | spin_lock_irqsave(&msi_lock, flags); | ||
845 | tail = msi_desc[irq]->link.tail; | 829 | tail = msi_desc[irq]->link.tail; |
846 | spin_unlock_irqrestore(&msi_lock, flags); | ||
847 | if (irq_has_action(irq)) | 830 | if (irq_has_action(irq)) |
848 | warning = 1; | 831 | warning = 1; |
849 | else if (irq != head) /* Release MSI-X irq */ | 832 | else if (irq != head) /* Release MSI-X irq */ |
@@ -872,7 +855,6 @@ void pci_disable_msix(struct pci_dev* dev) | |||
872 | void msi_remove_pci_irq_vectors(struct pci_dev* dev) | 855 | void msi_remove_pci_irq_vectors(struct pci_dev* dev) |
873 | { | 856 | { |
874 | int pos; | 857 | int pos; |
875 | unsigned long flags; | ||
876 | 858 | ||
877 | if (!pci_msi_enable || !dev) | 859 | if (!pci_msi_enable || !dev) |
878 | return; | 860 | return; |
@@ -894,10 +876,8 @@ void msi_remove_pci_irq_vectors(struct pci_dev* dev) | |||
894 | 876 | ||
895 | irq = head = dev->first_msi_irq; | 877 | irq = head = dev->first_msi_irq; |
896 | while (head != tail) { | 878 | while (head != tail) { |
897 | spin_lock_irqsave(&msi_lock, flags); | ||
898 | tail = msi_desc[irq]->link.tail; | 879 | tail = msi_desc[irq]->link.tail; |
899 | base = msi_desc[irq]->mask_base; | 880 | base = msi_desc[irq]->mask_base; |
900 | spin_unlock_irqrestore(&msi_lock, flags); | ||
901 | if (irq_has_action(irq)) | 881 | if (irq_has_action(irq)) |
902 | warning = 1; | 882 | warning = 1; |
903 | else if (irq != head) /* Release MSI-X irq */ | 883 | else if (irq != head) /* Release MSI-X irq */ |