|
@@ -651,10 +651,12 @@ USBDevice *usbdevice_create(const char *cmdline)
|
|
{
|
|
{
|
|
USBBus *bus = usb_bus_find(-1 /* any */);
|
|
USBBus *bus = usb_bus_find(-1 /* any */);
|
|
LegacyUSBFactory *f = NULL;
|
|
LegacyUSBFactory *f = NULL;
|
|
|
|
+ Error *err = NULL;
|
|
GSList *i;
|
|
GSList *i;
|
|
char driver[32];
|
|
char driver[32];
|
|
const char *params;
|
|
const char *params;
|
|
int len;
|
|
int len;
|
|
|
|
+ USBDevice *dev;
|
|
|
|
|
|
params = strchr(cmdline,':');
|
|
params = strchr(cmdline,':');
|
|
if (params) {
|
|
if (params) {
|
|
@@ -689,14 +691,28 @@ USBDevice *usbdevice_create(const char *cmdline)
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
- if (!f->usbdevice_init) {
|
|
|
|
|
|
+ if (f->usbdevice_init) {
|
|
|
|
+ dev = f->usbdevice_init(bus, params);
|
|
|
|
+ } else {
|
|
if (*params) {
|
|
if (*params) {
|
|
error_report("usbdevice %s accepts no params", driver);
|
|
error_report("usbdevice %s accepts no params", driver);
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
- return usb_create_simple(bus, f->name);
|
|
|
|
|
|
+ dev = usb_create(bus, f->name);
|
|
|
|
+ }
|
|
|
|
+ if (!dev) {
|
|
|
|
+ error_report("Failed to create USB device '%s'", f->name);
|
|
|
|
+ return NULL;
|
|
}
|
|
}
|
|
- return f->usbdevice_init(bus, params);
|
|
|
|
|
|
+ object_property_set_bool(OBJECT(dev), true, "realized", &err);
|
|
|
|
+ if (err) {
|
|
|
|
+ error_report("Failed to initialize USB device '%s': %s",
|
|
|
|
+ f->name, error_get_pretty(err));
|
|
|
|
+ error_free(err);
|
|
|
|
+ object_unparent(OBJECT(dev));
|
|
|
|
+ return NULL;
|
|
|
|
+ }
|
|
|
|
+ return dev;
|
|
}
|
|
}
|
|
|
|
|
|
static void usb_device_class_init(ObjectClass *klass, void *data)
|
|
static void usb_device_class_init(ObjectClass *klass, void *data)
|