From fd80eb370d6fb7ad4f51f494f31b544544e1cdfd Mon Sep 17 00:00:00 2001
From: Paolo Bonzini <pbonzini@redhat.com>
Date: Wed, 22 Feb 2012 14:11:19 +0100
Subject: [PATCH 003/109] qdev: trigger reset from a given device

RH-Author: Paolo Bonzini <pbonzini@redhat.com>
Message-id: <1329919979-20948-3-git-send-email-pbonzini@redhat.com>
Patchwork-id: 37483
O-Subject: [RHEL 6.3 qemu-kvm PATCH v2 002/102] qdev: trigger reset from a given device
Bugzilla: 782029
RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com>
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
RH-Acked-by: Orit Wasserman <owasserm@redhat.com>

Introduce a helper function which triggers reset from a given device.
Will be used by pci bus emulation.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
(cherry picked from 5af0a04bea1f1704432b7c118c00a466e862bf00)

Conflicts:
	hw/qdev.c
	hw/qdev.h
---
 hw/qdev.c |   14 ++++++++++++++
 hw/qdev.h |    1 +
 2 files changed, 15 insertions(+), 0 deletions(-)

Signed-off-by: Michal Novotny <minovotn@redhat.com>
---
 hw/qdev.c |   14 ++++++++++++++
 hw/qdev.h |    1 +
 2 files changed, 15 insertions(+), 0 deletions(-)

diff --git a/hw/qdev.c b/hw/qdev.c
index 5021041..57ba8ee 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -309,6 +309,20 @@ int qdev_unplug(DeviceState *dev)
     return dev->info->unplug(dev);
 }
 
+static int qdev_reset_one(DeviceState *dev, void *opaque)
+{
+    if (dev->info->reset) {
+        dev->info->reset(dev);
+    }
+
+    return 0;
+}
+
+void qdev_reset_all(DeviceState *dev)
+{
+    qdev_walk_children(dev, qdev_reset_one, NULL, NULL);
+}
+
 /* can be used as ->unplug() callback for the simple cases */
 int qdev_simple_unplug_cb(DeviceState *dev)
 {
diff --git a/hw/qdev.h b/hw/qdev.h
index 294212a..fecaad4 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -195,6 +195,7 @@ int qbus_walk_children(BusState *bus, qdev_walkerfn *devfn,
                        qbus_walkerfn *busfn, void *opaque);
 int qdev_walk_children(DeviceState *dev, qdev_walkerfn *devfn,
                        qbus_walkerfn *busfn, void *opaque);
+void qdev_reset_all(DeviceState *dev);
 void qbus_free(BusState *bus);
 
 #define FROM_QBUS(type, dev) DO_UPCAST(type, qbus, dev)
-- 
1.7.7.6

