diff options
| -rw-r--r-- | arch/x86/pci/xen.c | 4 | ||||
| -rw-r--r-- | drivers/xen/events.c | 36 | ||||
| -rw-r--r-- | include/xen/events.h | 2 |
3 files changed, 10 insertions, 32 deletions
diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c index 15fd981d35f1..ffd8c7a2cdbb 100644 --- a/arch/x86/pci/xen.c +++ b/arch/x86/pci/xen.c | |||
| @@ -106,7 +106,7 @@ static int xen_hvm_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) | |||
| 106 | dev_dbg(&dev->dev, | 106 | dev_dbg(&dev->dev, |
| 107 | "xen: msi already bound to pirq=%d\n", pirq); | 107 | "xen: msi already bound to pirq=%d\n", pirq); |
| 108 | } | 108 | } |
| 109 | irq = xen_bind_pirq_msi_to_irq(dev, msidesc, pirq, | 109 | irq = xen_bind_pirq_msi_to_irq(dev, msidesc, pirq, 0, |
| 110 | (type == PCI_CAP_ID_MSIX) ? | 110 | (type == PCI_CAP_ID_MSIX) ? |
| 111 | "msi-x" : "msi"); | 111 | "msi-x" : "msi"); |
| 112 | if (irq < 0) | 112 | if (irq < 0) |
| @@ -145,7 +145,7 @@ static int xen_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) | |||
| 145 | goto error; | 145 | goto error; |
| 146 | i = 0; | 146 | i = 0; |
| 147 | list_for_each_entry(msidesc, &dev->msi_list, list) { | 147 | list_for_each_entry(msidesc, &dev->msi_list, list) { |
| 148 | irq = xen_bind_pirq_msi_to_irq(dev, msidesc, v[i], | 148 | irq = xen_bind_pirq_msi_to_irq(dev, msidesc, v[i], 0, |
| 149 | (type == PCI_CAP_ID_MSIX) ? | 149 | (type == PCI_CAP_ID_MSIX) ? |
| 150 | "pcifront-msi-x" : | 150 | "pcifront-msi-x" : |
| 151 | "pcifront-msi"); | 151 | "pcifront-msi"); |
diff --git a/drivers/xen/events.c b/drivers/xen/events.c index 77ede77a9ee9..34469489087b 100644 --- a/drivers/xen/events.c +++ b/drivers/xen/events.c | |||
| @@ -662,7 +662,7 @@ int xen_allocate_pirq_msi(struct pci_dev *dev, struct msi_desc *msidesc) | |||
| 662 | } | 662 | } |
| 663 | 663 | ||
| 664 | int xen_bind_pirq_msi_to_irq(struct pci_dev *dev, struct msi_desc *msidesc, | 664 | int xen_bind_pirq_msi_to_irq(struct pci_dev *dev, struct msi_desc *msidesc, |
| 665 | int pirq, const char *name) | 665 | int pirq, int vector, const char *name) |
| 666 | { | 666 | { |
| 667 | int irq, ret; | 667 | int irq, ret; |
| 668 | 668 | ||
| @@ -675,7 +675,7 @@ int xen_bind_pirq_msi_to_irq(struct pci_dev *dev, struct msi_desc *msidesc, | |||
| 675 | set_irq_chip_and_handler_name(irq, &xen_pirq_chip, | 675 | set_irq_chip_and_handler_name(irq, &xen_pirq_chip, |
| 676 | handle_level_irq, name); | 676 | handle_level_irq, name); |
| 677 | 677 | ||
| 678 | irq_info[irq] = mk_pirq_info(0, pirq, 0, 0); | 678 | irq_info[irq] = mk_pirq_info(0, pirq, 0, vector); |
| 679 | pirq_to_irq[pirq] = irq; | 679 | pirq_to_irq[pirq] = irq; |
| 680 | ret = set_irq_msi(irq, msidesc); | 680 | ret = set_irq_msi(irq, msidesc); |
| 681 | if (ret < 0) | 681 | if (ret < 0) |
| @@ -691,7 +691,6 @@ error_irq: | |||
| 691 | 691 | ||
| 692 | int xen_create_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int type) | 692 | int xen_create_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int type) |
| 693 | { | 693 | { |
| 694 | int ret, irq = -1; | ||
| 695 | struct physdev_map_pirq map_irq; | 694 | struct physdev_map_pirq map_irq; |
| 696 | int rc; | 695 | int rc; |
| 697 | int pos; | 696 | int pos; |
| @@ -719,34 +718,13 @@ int xen_create_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int type) | |||
| 719 | rc = HYPERVISOR_physdev_op(PHYSDEVOP_map_pirq, &map_irq); | 718 | rc = HYPERVISOR_physdev_op(PHYSDEVOP_map_pirq, &map_irq); |
| 720 | if (rc) { | 719 | if (rc) { |
| 721 | dev_warn(&dev->dev, "xen map irq failed %d\n", rc); | 720 | dev_warn(&dev->dev, "xen map irq failed %d\n", rc); |
| 722 | goto out; | 721 | return -1; |
| 723 | } | 722 | } |
| 724 | 723 | ||
| 725 | spin_lock(&irq_mapping_update_lock); | 724 | return xen_bind_pirq_msi_to_irq(dev, msidesc, |
| 726 | 725 | map_irq.pirq, map_irq.index, | |
| 727 | irq = xen_allocate_irq_dynamic(); | 726 | (type == PCI_CAP_ID_MSIX) ? |
| 728 | 727 | "msi-x" : "msi"); | |
| 729 | if (irq == -1) | ||
| 730 | goto out; | ||
| 731 | |||
| 732 | irq_info[irq] = mk_pirq_info(0, map_irq.pirq, 0, map_irq.index); | ||
| 733 | pirq_to_irq[map_irq.pirq] = irq; | ||
| 734 | |||
| 735 | set_irq_chip_and_handler_name(irq, &xen_pirq_chip, | ||
| 736 | handle_level_irq, | ||
| 737 | (type == PCI_CAP_ID_MSIX) ? "msi-x":"msi"); | ||
| 738 | |||
| 739 | ret = set_irq_msi(irq, msidesc); | ||
| 740 | if (ret) | ||
| 741 | goto out_irq; | ||
| 742 | |||
| 743 | out: | ||
| 744 | spin_unlock(&irq_mapping_update_lock); | ||
| 745 | return irq; | ||
| 746 | out_irq: | ||
| 747 | spin_unlock(&irq_mapping_update_lock); | ||
| 748 | xen_free_irq(irq); | ||
| 749 | return -1; | ||
| 750 | } | 728 | } |
| 751 | #endif | 729 | #endif |
| 752 | 730 | ||
diff --git a/include/xen/events.h b/include/xen/events.h index 18bf825bac66..45c08a0d580a 100644 --- a/include/xen/events.h +++ b/include/xen/events.h | |||
| @@ -77,7 +77,7 @@ int xen_map_pirq_gsi(unsigned pirq, unsigned gsi, int shareable, char *name); | |||
| 77 | #ifdef CONFIG_PCI_MSI | 77 | #ifdef CONFIG_PCI_MSI |
| 78 | int xen_allocate_pirq_msi(struct pci_dev *dev, struct msi_desc *msidesc); | 78 | int xen_allocate_pirq_msi(struct pci_dev *dev, struct msi_desc *msidesc); |
| 79 | int xen_bind_pirq_msi_to_irq(struct pci_dev *dev, struct msi_desc *msidesc, | 79 | int xen_bind_pirq_msi_to_irq(struct pci_dev *dev, struct msi_desc *msidesc, |
| 80 | int pirq, const char *name); | 80 | int pirq, int vector, const char *name); |
| 81 | int xen_create_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int type); | 81 | int xen_create_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int type); |
| 82 | #endif | 82 | #endif |
| 83 | 83 | ||
