usb: Improve -usbdevice error reporting a bit
Most LegacyUSBFactory usbdevice_init() methods realize with qdev_init_nofail(), even though their caller usbdevice_create() can handle failure. Okay if it really can't fail (I didn't check), but somewhat brittle. usb_msd_init() and usb_bt_init() call qdev_init(). The latter additionally reports an error when qdev_init() fails. Realization failure produces multiple error reports: a specific one from qdev_init(), and generic ones from usb_bt_init(), usb_create_simple(), usbdevice_create() and usb_parse(). Remove realization from the usbdevice_init() methods. Realize in usbdevice_create(), and produce exactly one error message there. You still get another one from usb_parse(). Signed-off-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
4806ec9b2c
commit
3bc36a401e
22
hw/usb/bus.c
22
hw/usb/bus.c
@ -651,10 +651,12 @@ USBDevice *usbdevice_create(const char *cmdline)
|
||||
{
|
||||
USBBus *bus = usb_bus_find(-1 /* any */);
|
||||
LegacyUSBFactory *f = NULL;
|
||||
Error *err = NULL;
|
||||
GSList *i;
|
||||
char driver[32];
|
||||
const char *params;
|
||||
int len;
|
||||
USBDevice *dev;
|
||||
|
||||
params = strchr(cmdline,':');
|
||||
if (params) {
|
||||
@ -689,14 +691,28 @@ USBDevice *usbdevice_create(const char *cmdline)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!f->usbdevice_init) {
|
||||
if (f->usbdevice_init) {
|
||||
dev = f->usbdevice_init(bus, params);
|
||||
} else {
|
||||
if (*params) {
|
||||
error_report("usbdevice %s accepts no params", driver);
|
||||
return NULL;
|
||||
}
|
||||
return usb_create_simple(bus, f->name);
|
||||
dev = usb_create(bus, f->name);
|
||||
}
|
||||
return f->usbdevice_init(bus, params);
|
||||
if (!dev) {
|
||||
error_report("Failed to create USB device '%s'", f->name);
|
||||
return NULL;
|
||||
}
|
||||
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)
|
||||
|
@ -536,11 +536,6 @@ static USBDevice *usb_bt_init(USBBus *bus, const char *cmdline)
|
||||
dev = usb_create(bus, name);
|
||||
s = DO_UPCAST(struct USBBtState, dev, dev);
|
||||
s->hci = hci;
|
||||
if (qdev_init(&dev->qdev) < 0) {
|
||||
error_report("Failed to initialize USB device '%s'", name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return dev;
|
||||
}
|
||||
|
||||
|
@ -1406,7 +1406,6 @@ static USBDevice *usb_net_init(USBBus *bus, const char *cmdline)
|
||||
|
||||
dev = usb_create(bus, "usb-net");
|
||||
qdev_set_nic_properties(&dev->qdev, &nd_table[idx]);
|
||||
qdev_init_nofail(&dev->qdev);
|
||||
return dev;
|
||||
}
|
||||
|
||||
|
@ -549,8 +549,6 @@ static USBDevice *usb_serial_init(USBBus *bus, const char *filename)
|
||||
qdev_prop_set_uint16(&dev->qdev, "vendorid", vendorid);
|
||||
if (productid)
|
||||
qdev_prop_set_uint16(&dev->qdev, "productid", productid);
|
||||
qdev_init_nofail(&dev->qdev);
|
||||
|
||||
return dev;
|
||||
}
|
||||
|
||||
@ -565,8 +563,6 @@ static USBDevice *usb_braille_init(USBBus *bus, const char *unused)
|
||||
|
||||
dev = usb_create(bus, "usb-braille");
|
||||
qdev_prop_set_chr(&dev->qdev, "chardev", cdrv);
|
||||
qdev_init_nofail(&dev->qdev);
|
||||
|
||||
return dev;
|
||||
}
|
||||
|
||||
|
@ -711,9 +711,6 @@ static USBDevice *usb_msd_init(USBBus *bus, const char *filename)
|
||||
object_unparent(OBJECT(dev));
|
||||
return NULL;
|
||||
}
|
||||
if (qdev_init(&dev->qdev) < 0)
|
||||
return NULL;
|
||||
|
||||
return dev;
|
||||
}
|
||||
|
||||
|
@ -128,7 +128,6 @@ USBDevice *usb_host_device_open(USBBus *bus, const char *devname)
|
||||
qdev_prop_set_uint32(&dev->qdev, "hostaddr", filter.addr);
|
||||
qdev_prop_set_uint32(&dev->qdev, "vendorid", filter.vendor_id);
|
||||
qdev_prop_set_uint32(&dev->qdev, "productid", filter.product_id);
|
||||
qdev_init_nofail(&dev->qdev);
|
||||
return dev;
|
||||
|
||||
fail:
|
||||
|
Loading…
Reference in New Issue
Block a user