virtio-pci: disable msi at startup
authorMichael S. Tsirkin <mst@redhat.com>
Thu, 24 Jun 2010 04:49:06 +0000 (22:49 -0600)
committerRusty Russell <rusty@rustcorp.com.au>
Wed, 23 Jun 2010 13:19:07 +0000 (22:49 +0930)
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
drivers/pci/pci.c
drivers/virtio/virtio_pci.c

index 60f30e7f1c8c1c81d874204103b58443d63c3416..740fb4ea966952e98f1b131552ee89945bffe75a 100644 (file)
@@ -2292,6 +2292,7 @@ void pci_msi_off(struct pci_dev *dev)
                pci_write_config_word(dev, pos + PCI_MSIX_FLAGS, control);
        }
 }
+EXPORT_SYMBOL_GPL(pci_msi_off);
 
 #ifndef HAVE_ARCH_PCI_SET_DMA_MAX_SEGMENT_SIZE
 int pci_set_dma_max_seg_size(struct pci_dev *dev, unsigned int size)
index 95896f38792765b2c415a2f63a1e4747d947f632..ef8d9d558fc734183dd82a172e49f9ee7a07b8ae 100644 (file)
@@ -636,6 +636,9 @@ static int __devinit virtio_pci_probe(struct pci_dev *pci_dev,
        INIT_LIST_HEAD(&vp_dev->virtqueues);
        spin_lock_init(&vp_dev->lock);
 
+       /* Disable MSI/MSIX to bring device to a known good state. */
+       pci_msi_off(pci_dev);
+
        /* enable the device */
        err = pci_enable_device(pci_dev);
        if (err)