aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hw/usb/bus.c35
1 files changed, 13 insertions, 22 deletions
diff --git a/hw/usb/bus.c b/hw/usb/bus.c
index 5c4d316..a81aee2 100644
--- a/hw/usb/bus.c
+++ b/hw/usb/bus.c
@@ -318,35 +318,22 @@ USBDevice *usb_new(const char *name)
return USB_DEVICE(qdev_new(name));
}
-bool usb_realize_and_unref(USBDevice *dev, USBBus *bus, Error **errp)
+static USBDevice *usb_try_new(const char *name)
{
- return qdev_realize_and_unref(&dev->qdev, &bus->qbus, errp);
+ return USB_DEVICE(qdev_try_new(name));
}
-static USBDevice *usb_try_create_simple(USBBus *bus, const char *name,
- Error **errp)
+bool usb_realize_and_unref(USBDevice *dev, USBBus *bus, Error **errp)
{
- Error *err = NULL;
- DeviceState *dev;
-
- dev = qdev_try_new(name);
- if (!dev) {
- error_setg(errp, "Failed to create USB device '%s'", name);
- return NULL;
- }
- qdev_realize_and_unref(dev, &bus->qbus, &err);
- if (err) {
- error_propagate_prepend(errp, err,
- "Failed to initialize USB device '%s': ",
- name);
- return NULL;
- }
- return USB_DEVICE(dev);
+ return qdev_realize_and_unref(&dev->qdev, &bus->qbus, errp);
}
USBDevice *usb_create_simple(USBBus *bus, const char *name)
{
- return usb_try_create_simple(bus, name, &error_abort);
+ USBDevice *dev = usb_new(name);
+
+ usb_realize_and_unref(dev, bus, &error_abort);
+ return dev;
}
static void usb_fill_port(USBPort *port, void *opaque, int index,
@@ -426,6 +413,7 @@ void usb_claim_port(USBDevice *dev, Error **errp)
{
USBBus *bus = usb_bus_from_device(dev);
USBPort *port;
+ USBDevice *hub;
assert(dev->port == NULL);
@@ -443,7 +431,10 @@ void usb_claim_port(USBDevice *dev, Error **errp)
} else {
if (bus->nfree == 1 && strcmp(object_get_typename(OBJECT(dev)), "usb-hub") != 0) {
/* Create a new hub and chain it on */
- usb_try_create_simple(bus, "usb-hub", NULL);
+ hub = usb_try_new("usb-hub");
+ if (hub) {
+ usb_realize_and_unref(hub, bus, NULL);
+ }
}
if (bus->nfree == 0) {
error_setg(errp, "tried to attach usb device %s to a bus "