[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 1/6] qdev: Make qbus_walk_children() call busfn for
From: |
Isaku Yamahata |
Subject: |
[Qemu-devel] [PATCH 1/6] qdev: Make qbus_walk_children() call busfn for root bus. |
Date: |
Thu, 2 Sep 2010 18:25:04 +0900 |
Make qbus_walk_children() call busfn for root bus.
and it fixes qbus_realize_all().
The current qbus_walk_children() doesn't call busfn for root bus.
It cause qbus_relialize_all() to fail to call realize the system bus.
This patch also refactor qbus_walk_children() a bit.
Another only user of busfn, qbus_find_child_bus(), isn't affected by this.
Signed-off-by: Isaku Yamahata <address@hidden>
---
hw/qdev-core.h | 2 ++
hw/qdev.c | 51 ++++++++++++++++++++++++++++++---------------------
2 files changed, 32 insertions(+), 21 deletions(-)
diff --git a/hw/qdev-core.h b/hw/qdev-core.h
index 5fdee3a..a9b7692 100644
--- a/hw/qdev-core.h
+++ b/hw/qdev-core.h
@@ -186,6 +186,8 @@ BusState *qbus_create(BusInfo *info, DeviceState *parent,
const char *name);
/* Returns > 0 if either devfn or busfn terminate walk, 0 otherwise. */
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);
DeviceState *qbus_find_child_dev(BusState *bus, const char *id);
BusState *qbus_find_child_bus(BusState *bus, const char *id);
diff --git a/hw/qdev.c b/hw/qdev.c
index a981e05..c1ba6b8 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -296,33 +296,42 @@ int qbus_walk_children(BusState *bus, qdev_walkerfn
*devfn,
qbus_walkerfn *busfn, void *opaque)
{
DeviceState *dev;
+ int err;
+
+ if (busfn) {
+ err = busfn(bus, opaque);
+ if (err) {
+ return err;
+ }
+ }
QLIST_FOREACH(dev, &bus->children, sibling) {
- BusState *child;
- int err = 0;
+ err = qdev_walk_children(dev, devfn, busfn, opaque);
+ if (err < 0) {
+ return err;
+ }
+ }
- if (devfn) {
- err = devfn(dev, opaque);
+ return 0;
+}
+
+int qdev_walk_children(DeviceState *dev, qdev_walkerfn *devfn,
+ qbus_walkerfn *busfn, void *opaque)
+{
+ BusState *bus;
+ int err;
+
+ if (devfn) {
+ err = devfn(dev, opaque);
+ if (err) {
+ return err;
}
+ }
- if (err > 0) {
+ QLIST_FOREACH(bus, &dev->child_bus, sibling) {
+ err = qbus_walk_children(bus, devfn, busfn, opaque);
+ if (err < 0) {
return err;
- } else if (err == 0) {
- QLIST_FOREACH(child, &dev->child_bus, sibling) {
- if (busfn) {
- err = busfn(child, opaque);
- if (err > 0) {
- return err;
- }
- }
-
- if (err == 0) {
- err = qbus_walk_children(child, devfn, busfn, opaque);
- if (err > 0) {
- return err;
- }
- }
- }
}
}
--
1.7.1.1
- [Qemu-devel] [PATCH 0/6 v3] introduce qbus reset callback and pci bus reset clean up, Isaku Yamahata, 2010/09/02
- [Qemu-devel] [PATCH 6/6] pci bridge: implement secondary bus reset., Isaku Yamahata, 2010/09/02
- [Qemu-devel] [PATCH 5/6] pci: teach pci devices that have reset callback how to reset common registers., Isaku Yamahata, 2010/09/02
- [Qemu-devel] [PATCH 3/6] qdev: introduce a helper function which triggers reset from a given device., Isaku Yamahata, 2010/09/02
- [Qemu-devel] [PATCH 2/6] qdev: introduce reset call back for qbus level., Isaku Yamahata, 2010/09/02
- [Qemu-devel] [PATCH 4/6] pci: make pci reset use qdev reset frame work., Isaku Yamahata, 2010/09/02
- [Qemu-devel] [PATCH 1/6] qdev: Make qbus_walk_children() call busfn for root bus.,
Isaku Yamahata <=
- [Qemu-devel] Re: [PATCH 0/6 v3] introduce qbus reset callback and pci bus reset clean up, Anthony Liguori, 2010/09/02