diff mbox

[11/18] virtio: Add "needs_reset" flag to virtio device

Message ID 1429257573-7359-12-git-send-email-famz@redhat.com
State New
Headers show

Commit Message

Fam Zheng April 17, 2015, 7:59 a.m. UTC
Signed-off-by: Fam Zheng <famz@redhat.com>
---
 hw/virtio/virtio.c         | 18 ++++++++++++++++++
 include/hw/virtio/virtio.h |  2 ++
 2 files changed, 20 insertions(+)
diff mbox

Patch

diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index 6dfa181..7ff0dc4 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -623,6 +623,10 @@  void virtio_set_status(VirtIODevice *vdev, uint8_t val)
     VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
     trace_virtio_set_status(vdev, val);
 
+    if (val) {
+        /* Unsetting NEED_RESET bit without reset is ignored. */
+        val |= (vdev->status & VIRTIO_CONFIG_S_NEEDS_RESET);
+    }
     if (k->set_status) {
         k->set_status(vdev, val);
     }
@@ -1384,6 +1388,20 @@  static void virtio_device_realize(DeviceState *dev, Error **errp)
     virtio_bus_device_plugged(vdev);
 }
 
+void virtio_device_set_needs_reset(VirtIODevice *vdev)
+{
+    if (vdev->status & VIRTIO_CONFIG_S_NEEDS_RESET) {
+        return;
+    }
+    vdev->status |= VIRTIO_CONFIG_S_NEEDS_RESET;
+    virtio_notify_config(vdev);
+}
+
+bool virtio_device_needs_reset(VirtIODevice *vdev)
+{
+    return vdev->status & VIRTIO_CONFIG_S_NEEDS_RESET;
+}
+
 static void virtio_device_unrealize(DeviceState *dev, Error **errp)
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h
index 52e2b1c..71d98a3 100644
--- a/include/hw/virtio/virtio.h
+++ b/include/hw/virtio/virtio.h
@@ -131,6 +131,8 @@  VirtQueue *virtio_add_queue(VirtIODevice *vdev, int queue_size,
                             void (*handle_output)(VirtIODevice *,
                                                   VirtQueue *),
                             Error **errp);
+void virtio_device_set_needs_reset(VirtIODevice *vdev);
+bool virtio_device_needs_reset(VirtIODevice *vdev);
 
 void virtio_del_queue(VirtIODevice *vdev, int n, Error **errp);