aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/xen/xen-pciback/conf_space_capability_msi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/xen/xen-pciback/conf_space_capability_msi.c')
-rw-r--r--drivers/xen/xen-pciback/conf_space_capability_msi.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/xen/xen-pciback/conf_space_capability_msi.c b/drivers/xen/xen-pciback/conf_space_capability_msi.c
index 78f74b1852d4..d0d2255b5da9 100644
--- a/drivers/xen/xen-pciback/conf_space_capability_msi.c
+++ b/drivers/xen/xen-pciback/conf_space_capability_msi.c
@@ -12,6 +12,7 @@
12int pciback_enable_msi(struct pciback_device *pdev, 12int pciback_enable_msi(struct pciback_device *pdev,
13 struct pci_dev *dev, struct xen_pci_op *op) 13 struct pci_dev *dev, struct xen_pci_op *op)
14{ 14{
15 struct pciback_dev_data *dev_data;
15 int otherend = pdev->xdev->otherend_id; 16 int otherend = pdev->xdev->otherend_id;
16 int status; 17 int status;
17 18
@@ -28,21 +29,29 @@ int pciback_enable_msi(struct pciback_device *pdev,
28 * the local domain's IRQ number. */ 29 * the local domain's IRQ number. */
29 30
30 op->value = dev->irq ? xen_pirq_from_irq(dev->irq) : 0; 31 op->value = dev->irq ? xen_pirq_from_irq(dev->irq) : 0;
32 dev_data = pci_get_drvdata(dev);
33 if (dev_data)
34 dev_data->ack_intr = 0;
31 return 0; 35 return 0;
32} 36}
33 37
34int pciback_disable_msi(struct pciback_device *pdev, 38int pciback_disable_msi(struct pciback_device *pdev,
35 struct pci_dev *dev, struct xen_pci_op *op) 39 struct pci_dev *dev, struct xen_pci_op *op)
36{ 40{
41 struct pciback_dev_data *dev_data;
37 pci_disable_msi(dev); 42 pci_disable_msi(dev);
38 43
39 op->value = dev->irq ? xen_pirq_from_irq(dev->irq) : 0; 44 op->value = dev->irq ? xen_pirq_from_irq(dev->irq) : 0;
45 dev_data = pci_get_drvdata(dev);
46 if (dev_data)
47 dev_data->ack_intr = 1;
40 return 0; 48 return 0;
41} 49}
42 50
43int pciback_enable_msix(struct pciback_device *pdev, 51int pciback_enable_msix(struct pciback_device *pdev,
44 struct pci_dev *dev, struct xen_pci_op *op) 52 struct pci_dev *dev, struct xen_pci_op *op)
45{ 53{
54 struct pciback_dev_data *dev_data;
46 int i, result; 55 int i, result;
47 struct msix_entry *entries; 56 struct msix_entry *entries;
48 57
@@ -74,6 +83,9 @@ int pciback_enable_msix(struct pciback_device *pdev,
74 kfree(entries); 83 kfree(entries);
75 84
76 op->value = result; 85 op->value = result;
86 dev_data = pci_get_drvdata(dev);
87 if (dev_data)
88 dev_data->ack_intr = 0;
77 89
78 return result; 90 return result;
79} 91}
@@ -81,6 +93,7 @@ int pciback_enable_msix(struct pciback_device *pdev,
81int pciback_disable_msix(struct pciback_device *pdev, 93int pciback_disable_msix(struct pciback_device *pdev,
82 struct pci_dev *dev, struct xen_pci_op *op) 94 struct pci_dev *dev, struct xen_pci_op *op)
83{ 95{
96 struct pciback_dev_data *dev_data;
84 97
85 pci_disable_msix(dev); 98 pci_disable_msix(dev);
86 99
@@ -89,6 +102,10 @@ int pciback_disable_msix(struct pciback_device *pdev,
89 * an undefined IRQ value of zero. 102 * an undefined IRQ value of zero.
90 */ 103 */
91 op->value = dev->irq ? xen_pirq_from_irq(dev->irq) : 0; 104 op->value = dev->irq ? xen_pirq_from_irq(dev->irq) : 0;
105 dev_data = pci_get_drvdata(dev);
106 if (dev_data)
107 dev_data->ack_intr = 1;
108
92 return 0; 109 return 0;
93} 110}
94 111