aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael S. Tsirkin <mst@redhat.com>2010-06-24 00:49:06 -0400
committerRusty Russell <rusty@rustcorp.com.au>2010-06-23 09:19:07 -0400
commitb03214d559471359e2a85ae256686381d0672f29 (patch)
treeb2c5d617304bffc8dd4917ecef251ec109eb3b8b
parent686d363786a53ed28ee875b84ef24e6d5126ef6f (diff)
virtio-pci: disable msi at startup
virtio-pci resets the device at startup by writing to the status register, but this does not clear the pci config space, specifically msi enable status which affects register layout. This breaks things like kdump when they try to use e.g. virtio-blk. Fix by forcing msi off at startup. Since pci.c already has a routine to do this, we export and use it instead of duplicating code. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Tested-by: Vivek Goyal <vgoyal@redhat.com> Acked-by: Jesse Barnes <jbarnes@virtuousgeek.org> Cc: linux-pci@vger.kernel.org Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Cc: stable@kernel.org
-rw-r--r--drivers/pci/pci.c1
-rw-r--r--drivers/virtio/virtio_pci.c3
2 files changed, 4 insertions, 0 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 60f30e7f1c8c..740fb4ea9669 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -2292,6 +2292,7 @@ void pci_msi_off(struct pci_dev *dev)
2292 pci_write_config_word(dev, pos + PCI_MSIX_FLAGS, control); 2292 pci_write_config_word(dev, pos + PCI_MSIX_FLAGS, control);
2293 } 2293 }
2294} 2294}
2295EXPORT_SYMBOL_GPL(pci_msi_off);
2295 2296
2296#ifndef HAVE_ARCH_PCI_SET_DMA_MAX_SEGMENT_SIZE 2297#ifndef HAVE_ARCH_PCI_SET_DMA_MAX_SEGMENT_SIZE
2297int pci_set_dma_max_seg_size(struct pci_dev *dev, unsigned int size) 2298int pci_set_dma_max_seg_size(struct pci_dev *dev, unsigned int size)
diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c
index 95896f387927..ef8d9d558fc7 100644
--- a/drivers/virtio/virtio_pci.c
+++ b/drivers/virtio/virtio_pci.c
@@ -636,6 +636,9 @@ static int __devinit virtio_pci_probe(struct pci_dev *pci_dev,
636 INIT_LIST_HEAD(&vp_dev->virtqueues); 636 INIT_LIST_HEAD(&vp_dev->virtqueues);
637 spin_lock_init(&vp_dev->lock); 637 spin_lock_init(&vp_dev->lock);
638 638
639 /* Disable MSI/MSIX to bring device to a known good state. */
640 pci_msi_off(pci_dev);
641
639 /* enable the device */ 642 /* enable the device */
640 err = pci_enable_device(pci_dev); 643 err = pci_enable_device(pci_dev);
641 if (err) 644 if (err)