mirror of https://github.com/xemu-project/xemu.git
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 */);
|
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);
|
||||||
}
|
}
|
||||||
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)
|
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);
|
dev = usb_create(bus, name);
|
||||||
s = DO_UPCAST(struct USBBtState, dev, dev);
|
s = DO_UPCAST(struct USBBtState, dev, dev);
|
||||||
s->hci = hci;
|
s->hci = hci;
|
||||||
if (qdev_init(&dev->qdev) < 0) {
|
|
||||||
error_report("Failed to initialize USB device '%s'", name);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return dev;
|
return dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1406,7 +1406,6 @@ static USBDevice *usb_net_init(USBBus *bus, const char *cmdline)
|
||||||
|
|
||||||
dev = usb_create(bus, "usb-net");
|
dev = usb_create(bus, "usb-net");
|
||||||
qdev_set_nic_properties(&dev->qdev, &nd_table[idx]);
|
qdev_set_nic_properties(&dev->qdev, &nd_table[idx]);
|
||||||
qdev_init_nofail(&dev->qdev);
|
|
||||||
return dev;
|
return dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -549,8 +549,6 @@ static USBDevice *usb_serial_init(USBBus *bus, const char *filename)
|
||||||
qdev_prop_set_uint16(&dev->qdev, "vendorid", vendorid);
|
qdev_prop_set_uint16(&dev->qdev, "vendorid", vendorid);
|
||||||
if (productid)
|
if (productid)
|
||||||
qdev_prop_set_uint16(&dev->qdev, "productid", productid);
|
qdev_prop_set_uint16(&dev->qdev, "productid", productid);
|
||||||
qdev_init_nofail(&dev->qdev);
|
|
||||||
|
|
||||||
return dev;
|
return dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -565,8 +563,6 @@ static USBDevice *usb_braille_init(USBBus *bus, const char *unused)
|
||||||
|
|
||||||
dev = usb_create(bus, "usb-braille");
|
dev = usb_create(bus, "usb-braille");
|
||||||
qdev_prop_set_chr(&dev->qdev, "chardev", cdrv);
|
qdev_prop_set_chr(&dev->qdev, "chardev", cdrv);
|
||||||
qdev_init_nofail(&dev->qdev);
|
|
||||||
|
|
||||||
return dev;
|
return dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -711,9 +711,6 @@ static USBDevice *usb_msd_init(USBBus *bus, const char *filename)
|
||||||
object_unparent(OBJECT(dev));
|
object_unparent(OBJECT(dev));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (qdev_init(&dev->qdev) < 0)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return dev;
|
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, "hostaddr", filter.addr);
|
||||||
qdev_prop_set_uint32(&dev->qdev, "vendorid", filter.vendor_id);
|
qdev_prop_set_uint32(&dev->qdev, "vendorid", filter.vendor_id);
|
||||||
qdev_prop_set_uint32(&dev->qdev, "productid", filter.product_id);
|
qdev_prop_set_uint32(&dev->qdev, "productid", filter.product_id);
|
||||||
qdev_init_nofail(&dev->qdev);
|
|
||||||
return dev;
|
return dev;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
|
Loading…
Reference in New Issue