qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 3/5] pseries: Correctly use the device model reset h


From: David Gibson
Subject: [Qemu-devel] [PATCH 3/5] pseries: Correctly use the device model reset hooks
Date: Thu, 12 Apr 2012 12:44:13 +1000

Recently we added code to properly clean away VIO CRQs on reset  However,
this directly uses qemu_register, rather than the existing device model
reset callbacks.  This patch cleans this up by adding proper use of the
reset hook to the VIO bus model.  The existing CRQ reset code is converted
to the new method.

Signed-off-by: David Gibson <address@hidden>
---
 hw/spapr_vio.c |   12 ++++++++----
 hw/spapr_vio.h |    1 +
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/hw/spapr_vio.c b/hw/spapr_vio.c
index 1411f84..1e4aab5 100644
--- a/hw/spapr_vio.c
+++ b/hw/spapr_vio.c
@@ -620,13 +620,18 @@ static void rtas_quiesce(sPAPREnvironment *spapr, 
uint32_t token,
     rtas_st(rets, 0, 0);
 }
 
-static void spapr_vio_busdev_reset(void *opaque)
+static void spapr_vio_busdev_reset(DeviceState *qdev)
 {
-    VIOsPAPRDevice *dev = (VIOsPAPRDevice *)opaque;
+    VIOsPAPRDevice *dev = DO_UPCAST(VIOsPAPRDevice, qdev, qdev);
+    VIOsPAPRDeviceClass *pc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
 
     if (dev->crq.qsize) {
         free_crq(dev);
     }
+
+    if (pc->reset) {
+        pc->reset(dev);
+    }
 }
 
 static VIOsPAPRDevice *reg_conflict(VIOsPAPRDevice *dev)
@@ -698,8 +703,6 @@ static int spapr_vio_busdev_init(DeviceState *qdev)
 
     rtce_init(dev);
 
-    qemu_register_reset(spapr_vio_busdev_reset, dev);
-
     return pc->init(dev);
 }
 
@@ -790,6 +793,7 @@ static void vio_spapr_device_class_init(ObjectClass *klass, 
void *data)
 {
     DeviceClass *k = DEVICE_CLASS(klass);
     k->init = spapr_vio_busdev_init;
+    k->reset = spapr_vio_busdev_reset;
     k->bus_info = &spapr_vio_bus_info;
 }
 
diff --git a/hw/spapr_vio.h b/hw/spapr_vio.h
index 2dfe2bd..87816e4 100644
--- a/hw/spapr_vio.h
+++ b/hw/spapr_vio.h
@@ -62,6 +62,7 @@ typedef struct VIOsPAPRDeviceClass {
     const char *dt_name, *dt_type, *dt_compatible;
     target_ulong signal_mask;
     int (*init)(VIOsPAPRDevice *dev);
+    void (*reset)(VIOsPAPRDevice *dev);
     int (*devnode)(VIOsPAPRDevice *dev, void *fdt, int node_off);
 } VIOsPAPRDeviceClass;
 
-- 
1.7.9.5




reply via email to

[Prev in Thread] Current Thread [Next in Thread]