diff options
-rw-r--r-- | drivers/xen/xen-pciback/pciback_ops.c | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/drivers/xen/xen-pciback/pciback_ops.c b/drivers/xen/xen-pciback/pciback_ops.c index d0696ce31e9b..4ee5fc080483 100644 --- a/drivers/xen/xen-pciback/pciback_ops.c +++ b/drivers/xen/xen-pciback/pciback_ops.c | |||
@@ -185,20 +185,23 @@ static | |||
185 | int xen_pcibk_disable_msi(struct xen_pcibk_device *pdev, | 185 | int xen_pcibk_disable_msi(struct xen_pcibk_device *pdev, |
186 | struct pci_dev *dev, struct xen_pci_op *op) | 186 | struct pci_dev *dev, struct xen_pci_op *op) |
187 | { | 187 | { |
188 | struct xen_pcibk_dev_data *dev_data; | ||
189 | |||
190 | if (unlikely(verbose_request)) | 188 | if (unlikely(verbose_request)) |
191 | printk(KERN_DEBUG DRV_NAME ": %s: disable MSI\n", | 189 | printk(KERN_DEBUG DRV_NAME ": %s: disable MSI\n", |
192 | pci_name(dev)); | 190 | pci_name(dev)); |
193 | pci_disable_msi(dev); | ||
194 | 191 | ||
192 | if (dev->msi_enabled) { | ||
193 | struct xen_pcibk_dev_data *dev_data; | ||
194 | |||
195 | pci_disable_msi(dev); | ||
196 | |||
197 | dev_data = pci_get_drvdata(dev); | ||
198 | if (dev_data) | ||
199 | dev_data->ack_intr = 1; | ||
200 | } | ||
195 | op->value = dev->irq ? xen_pirq_from_irq(dev->irq) : 0; | 201 | op->value = dev->irq ? xen_pirq_from_irq(dev->irq) : 0; |
196 | if (unlikely(verbose_request)) | 202 | if (unlikely(verbose_request)) |
197 | printk(KERN_DEBUG DRV_NAME ": %s: MSI: %d\n", pci_name(dev), | 203 | printk(KERN_DEBUG DRV_NAME ": %s: MSI: %d\n", pci_name(dev), |
198 | op->value); | 204 | op->value); |
199 | dev_data = pci_get_drvdata(dev); | ||
200 | if (dev_data) | ||
201 | dev_data->ack_intr = 1; | ||
202 | return 0; | 205 | return 0; |
203 | } | 206 | } |
204 | 207 | ||
@@ -264,23 +267,27 @@ static | |||
264 | int xen_pcibk_disable_msix(struct xen_pcibk_device *pdev, | 267 | int xen_pcibk_disable_msix(struct xen_pcibk_device *pdev, |
265 | struct pci_dev *dev, struct xen_pci_op *op) | 268 | struct pci_dev *dev, struct xen_pci_op *op) |
266 | { | 269 | { |
267 | struct xen_pcibk_dev_data *dev_data; | ||
268 | if (unlikely(verbose_request)) | 270 | if (unlikely(verbose_request)) |
269 | printk(KERN_DEBUG DRV_NAME ": %s: disable MSI-X\n", | 271 | printk(KERN_DEBUG DRV_NAME ": %s: disable MSI-X\n", |
270 | pci_name(dev)); | 272 | pci_name(dev)); |
271 | pci_disable_msix(dev); | ||
272 | 273 | ||
274 | if (dev->msix_enabled) { | ||
275 | struct xen_pcibk_dev_data *dev_data; | ||
276 | |||
277 | pci_disable_msix(dev); | ||
278 | |||
279 | dev_data = pci_get_drvdata(dev); | ||
280 | if (dev_data) | ||
281 | dev_data->ack_intr = 1; | ||
282 | } | ||
273 | /* | 283 | /* |
274 | * SR-IOV devices (which don't have any legacy IRQ) have | 284 | * SR-IOV devices (which don't have any legacy IRQ) have |
275 | * an undefined IRQ value of zero. | 285 | * an undefined IRQ value of zero. |
276 | */ | 286 | */ |
277 | op->value = dev->irq ? xen_pirq_from_irq(dev->irq) : 0; | 287 | op->value = dev->irq ? xen_pirq_from_irq(dev->irq) : 0; |
278 | if (unlikely(verbose_request)) | 288 | if (unlikely(verbose_request)) |
279 | printk(KERN_DEBUG DRV_NAME ": %s: MSI-X: %d\n", pci_name(dev), | 289 | printk(KERN_DEBUG DRV_NAME ": %s: MSI-X: %d\n", |
280 | op->value); | 290 | pci_name(dev), op->value); |
281 | dev_data = pci_get_drvdata(dev); | ||
282 | if (dev_data) | ||
283 | dev_data->ack_intr = 1; | ||
284 | return 0; | 291 | return 0; |
285 | } | 292 | } |
286 | #endif | 293 | #endif |