usb: make usb_create_simple catch and pass up errors.

Use qdev_init() instead of qdev_init_nofail(), usb device initialization
can fail, most common case being port and device speed mismatch.  Handle
failures correctly and pass up NULL pointers then.

Also fixup usb_create_simple() callers (only one was buggy) to properly
check for NULL pointers before referncing the usb_create_simple() return
value.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
master
Gerd Hoffmann 2011-11-22 12:39:58 +01:00
parent 40897c9c16
commit 2af2a1b8d0
2 changed files with 12 additions and 2 deletions

View File

@ -528,6 +528,9 @@ USBDevice *usb_bt_init(HCIInfo *hci)
if (!hci)
return NULL;
dev = usb_create_simple(NULL /* FIXME */, "usb-bt-dongle");
if (!dev) {
return NULL;
}
s = DO_UPCAST(struct USBBtState, dev, dev);
s->dev.opaque = s;

View File

@ -139,10 +139,17 @@ USBDevice *usb_create(USBBus *bus, const char *name)
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'\n", name);
return NULL;
}
rc = qdev_init(&dev->qdev);
if (rc < 0) {
error_report("Failed to initialize USB device '%s'\n", name);
return NULL;
}
qdev_init_nofail(&dev->qdev);
return dev;
}