diff mbox

device-assignment: register a reset function

Message ID 1284476671-21012-1-git-send-email-bernhard.kohl@nsn.com (mailing list archive)
State New, archived
Headers show

Commit Message

Bernhard Kohl Sept. 14, 2010, 3:04 p.m. UTC
None
diff mbox

Patch

diff --git a/hw/device-assignment.c b/hw/device-assignment.c
index 87f7418..001aee8 100644
--- a/hw/device-assignment.c
+++ b/hw/device-assignment.c
@@ -1450,6 +1450,17 @@  static void assigned_dev_unregister_msix_mmio(AssignedDevice *dev)
     dev->msix_table_page = NULL;
 }
 
+static void reset_assigned_device(void *opaque)
+{
+    PCIDevice *d = (PCIDevice *)opaque;
+    uint32_t conf;
+
+    /* reset the bus master bit to avoid further DMA transfers */
+    conf = assigned_dev_pci_read_config(d, 0x04, 0x02);
+    conf &= ~0x04;
+    assigned_dev_pci_write_config(d, 0x04, conf, 0x02);
+}
+
 static int assigned_initfn(struct PCIDevice *pci_dev)
 {
     AssignedDevice *dev = DO_UPCAST(AssignedDevice, dev, pci_dev);
@@ -1499,6 +1510,9 @@  static int assigned_initfn(struct PCIDevice *pci_dev)
     if (r < 0)
         goto assigned_out;
 
+    /* register reset function for the device */
+    qemu_register_reset(reset_assigned_device, pci_dev);
+
     /* intercept MSI-X entry page in the MMIO */
     if (dev->cap.available & ASSIGNED_DEVICE_CAP_MSIX)
         if (assigned_dev_register_msix_mmio(dev))