提交 3bc36a40 编写于 作者: M Markus Armbruster 提交者: Gerd Hoffmann

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: NMarkus Armbruster <armbru@redhat.com>
Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
上级 4806ec9b
...@@ -651,10 +651,12 @@ USBDevice *usbdevice_create(const char *cmdline) ...@@ -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) ...@@ -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;
}
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 f->usbdevice_init(bus, params); 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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册