]> git.proxmox.com Git - qemu.git/commitdiff
qemu/pci: reset device registers on bus reset
authorMichael S. Tsirkin <mst@redhat.com>
Wed, 16 Sep 2009 10:41:09 +0000 (13:41 +0300)
committerAnthony Liguori <aliguori@us.ibm.com>
Mon, 5 Oct 2009 14:32:51 +0000 (09:32 -0500)
Reset BARs and a couple of other registers on bus reset, as per PCI
spec.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
hw/pci.c

index 2dd72139d312df6ebf59303def0abbd406d6e15e..e2f88ff75a80dceb5adf1cd151c76b6f6bdd588a 100644 (file)
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -92,7 +92,20 @@ static inline int pci_bar(int reg)
 
 static void pci_device_reset(PCIDevice *dev)
 {
+    int r;
+
     memset(dev->irq_state, 0, sizeof dev->irq_state);
+    dev->config[PCI_COMMAND] &= ~(PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
+                                  PCI_COMMAND_MASTER);
+    dev->config[PCI_CACHE_LINE_SIZE] = 0x0;
+    dev->config[PCI_INTERRUPT_LINE] = 0x0;
+    for (r = 0; r < PCI_NUM_REGIONS; ++r) {
+        if (!dev->io_regions[r].size) {
+            continue;
+        }
+        pci_set_long(dev->config + pci_bar(r), dev->io_regions[r].type);
+    }
+    pci_update_mappings(dev);
 }
 
 static void pci_bus_reset(void *opaque)