static char *usb_get_dev_path(DeviceState *dev);
static char *usb_get_fw_dev_path(DeviceState *qdev);
+static int usb_qdev_exit(DeviceState *qdev);
static struct BusInfo usb_bus_info = {
.name = "USB",
dev->info = info;
dev->auto_attach = 1;
QLIST_INIT(&dev->strings);
+ usb_ep_init(dev);
rc = usb_claim_port(dev);
- if (rc == 0) {
- rc = dev->info->init(dev);
+ if (rc != 0) {
+ return rc;
}
- if (rc == 0 && dev->auto_attach) {
+ rc = dev->info->init(dev);
+ if (rc != 0) {
+ usb_release_port(dev);
+ return rc;
+ }
+ if (dev->auto_attach) {
rc = usb_device_attach(dev);
+ if (rc != 0) {
+ usb_qdev_exit(qdev);
+ return rc;
+ }
}
- return rc;
+ return 0;
}
static int usb_qdev_exit(DeviceState *qdev)
bus = usb_bus_find(-1);
if (!bus)
return NULL;
- error_report("%s: no bus specified, using \"%s\" for \"%s\"\n",
+ error_report("%s: no bus specified, using \"%s\" for \"%s\"",
__FUNCTION__, bus->qbus.name, name);
}
#endif
USBDevice *usb_create_simple(USBBus *bus, const char *name)
{
USBDevice *dev = usb_create(bus, name);
+ int rc;
+
if (!dev) {
- hw_error("Failed to create USB device '%s'\n", name);
+ error_report("Failed to create USB device '%s'", name);
+ return NULL;
+ }
+ rc = qdev_init(&dev->qdev);
+ if (rc < 0) {
+ error_report("Failed to initialize USB device '%s'", name);
+ return NULL;
}
- qdev_init_nofail(&dev->qdev);
return dev;
}
}
}
if (port == NULL) {
- error_report("Error: usb port %s (bus %s) not found (in use?)\n",
+ error_report("Error: usb port %s (bus %s) not found (in use?)",
dev->port_path, bus->qbus.name);
return -1;
}
} else {
- if (bus->nfree == 1 && strcmp(dev->qdev.info->name, "usb-hub") != 0) {
+ if (bus->nfree == 1 && strcmp(object_get_typename(OBJECT(dev)), "usb-hub") != 0) {
/* Create a new hub and chain it on */
usb_create_simple(bus, "usb-hub");
}
if (bus->nfree == 0) {
error_report("Error: tried to attach usb device %s to a bus "
- "with no free ports\n", dev->product_desc);
+ "with no free ports", dev->product_desc);
return -1;
}
port = QTAILQ_FIRST(&bus->free);
if (!(port->speedmask & dev->speedmask)) {
error_report("Warning: speed mismatch trying to attach "
- "usb device %s to bus %s\n",
+ "usb device %s to bus %s",
dev->product_desc, bus->qbus.name);
return -1;
}