From 8d3830efca09c2431e03bd60a9b9583fea33370f Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 15 Jun 2016 11:46:55 +0200 Subject: [PATCH 1/5] usb-storage: qcow2 encryption support is finally gone, zap dead code Signed-off-by: Gerd Hoffmann Message-id: 1465984019-28963-2-git-send-email-kraxel@redhat.com --- hw/usb/dev-storage.c | 34 ---------------------------------- 1 file changed, 34 deletions(-) diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index 9fd00dfffc..bbd6f4fc5f 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -556,21 +556,6 @@ static void usb_msd_handle_data(USBDevice *dev, USBPacket *p) } } -static void usb_msd_password_cb(void *opaque, int err) -{ - MSDState *s = opaque; - Error *local_err = NULL; - - if (!err) { - usb_device_attach(&s->dev, &local_err); - } - - if (local_err) { - error_report_err(local_err); - qdev_unplug(&s->dev.qdev, NULL); - } -} - static void *usb_msd_load_request(QEMUFile *f, SCSIRequest *req) { MSDState *s = DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent); @@ -616,25 +601,6 @@ static void usb_msd_realize_storage(USBDevice *dev, Error **errp) return; } - if (blk_bs(blk)) { - bdrv_add_key(blk_bs(blk), NULL, &err); - if (err) { - if (monitor_cur_is_qmp()) { - error_propagate(errp, err); - return; - } - error_free(err); - err = NULL; - if (cur_mon) { - monitor_read_bdrv_key_start(cur_mon, blk_bs(blk), - usb_msd_password_cb, s); - s->dev.auto_attach = 0; - } else { - autostart = 0; - } - } - } - blkconf_serial(&s->conf, &dev->serial); blkconf_blocksizes(&s->conf); From eb19d2b9d15bf68d27704e8727772924681644b8 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 15 Jun 2016 11:46:56 +0200 Subject: [PATCH 2/5] usb: make USBDevice->attached bool Signed-off-by: Gerd Hoffmann Reviewed-by: Markus Armbruster Message-id: 1465984019-28963-3-git-send-email-kraxel@redhat.com --- hw/usb/bus.c | 8 ++++---- include/hw/usb.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/hw/usb/bus.c b/hw/usb/bus.c index 16c3461d99..afd70ea599 100644 --- a/hw/usb/bus.c +++ b/hw/usb/bus.c @@ -55,9 +55,9 @@ static int usb_device_post_load(void *opaque, int version_id) USBDevice *dev = opaque; if (dev->state == USB_STATE_NOTATTACHED) { - dev->attached = 0; + dev->attached = false; } else { - dev->attached = 1; + dev->attached = true; } if (dev->setup_index < 0 || dev->setup_len < 0 || @@ -533,7 +533,7 @@ void usb_device_attach(USBDevice *dev, Error **errp) return; } - dev->attached++; + dev->attached = true; usb_attach(port); } @@ -547,7 +547,7 @@ int usb_device_detach(USBDevice *dev) trace_usb_port_detach(bus->busnr, port->path); usb_detach(port); - dev->attached--; + dev->attached = false; return 0; } diff --git a/include/hw/usb.h b/include/hw/usb.h index 163fe0490b..8f3947069e 100644 --- a/include/hw/usb.h +++ b/include/hw/usb.h @@ -235,7 +235,7 @@ struct USBDevice { uint8_t addr; char product_desc[32]; int auto_attach; - int attached; + bool attached; int32_t state; uint8_t setup_buf[8]; From 1e351dc373c96a6df4107db3f780a4c89a791afd Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 15 Jun 2016 11:46:57 +0200 Subject: [PATCH 3/5] usb: Add QOM property "attached". USB devices in attached state are visible to the guest. This patch adds a QOM property for this. Write access is opt-in per device. Some devices manage attached state automatically (usb-host, usb-serial, usb-redir), so we can't enable write access universally but have to do it on a case by case base. So far, no device opts in. Signed-off-by: Gerd Hoffmann Reviewed-by: Markus Armbruster Message-id: 1465984019-28963-4-git-send-email-kraxel@redhat.com [ minor codestyle fix ] Signed-off-by: Gerd Hoffmann --- hw/usb/bus.c | 43 +++++++++++++++++++++++++++++++++++++++++++ include/hw/usb.h | 1 + 2 files changed, 44 insertions(+) diff --git a/hw/usb/bus.c b/hw/usb/bus.c index afd70ea599..c28ccb8a96 100644 --- a/hw/usb/bus.c +++ b/hw/usb/bus.c @@ -736,6 +736,48 @@ USBDevice *usbdevice_create(const char *cmdline) return dev; } +static bool usb_get_attached(Object *obj, Error **errp) +{ + USBDevice *dev = USB_DEVICE(obj); + + return dev->attached; +} + +static void usb_set_attached(Object *obj, bool value, Error **errp) +{ + USBDevice *dev = USB_DEVICE(obj); + Error *err = NULL; + + if (dev->attached == value) { + return; + } + + if (value) { + usb_device_attach(dev, &err); + if (err) { + error_propagate(errp, err); + } + } else { + usb_device_detach(dev); + } +} + +static void usb_device_instance_init(Object *obj) +{ + USBDevice *dev = USB_DEVICE(obj); + USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); + + if (klass->attached_settable) { + object_property_add_bool(obj, "attached", + usb_get_attached, usb_set_attached, + NULL); + } else { + object_property_add_bool(obj, "attached", + usb_get_attached, NULL, + NULL); + } +} + static void usb_device_class_init(ObjectClass *klass, void *data) { DeviceClass *k = DEVICE_CLASS(klass); @@ -749,6 +791,7 @@ static const TypeInfo usb_device_type_info = { .name = TYPE_USB_DEVICE, .parent = TYPE_DEVICE, .instance_size = sizeof(USBDevice), + .instance_init = usb_device_instance_init, .abstract = true, .class_size = sizeof(USBDeviceClass), .class_init = usb_device_class_init, diff --git a/include/hw/usb.h b/include/hw/usb.h index 8f3947069e..847c9dec7f 100644 --- a/include/hw/usb.h +++ b/include/hw/usb.h @@ -347,6 +347,7 @@ typedef struct USBDeviceClass { const char *product_desc; const USBDesc *usb_desc; + bool attached_settable; } USBDeviceClass; typedef struct USBPortOps { From b78ecd0998094a8b7e0f14c4888f3a6b525d14ff Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 15 Jun 2016 11:46:58 +0200 Subject: [PATCH 4/5] usb-bot: hotplug support This patch marks usb-bot as hot-pluggable device, makes attached property settable and turns off auto-attach in case the device was hotplugged. Hot-plugging a usb-bot device with one or more scsi devices can be done this way now: (1) device-add usb-bot,id=foo (2) device-add scsi-{hd,cd},bus=foo.0,lun=0 (2b) optionally add more devices (luns 0 ... 15). (3) qom-set foo.attached = true Signed-off-by: Gerd Hoffmann Reviewed-by: Markus Armbruster Message-id: 1465984019-28963-5-git-send-email-kraxel@redhat.com --- hw/usb/dev-storage.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index bbd6f4fc5f..4d605b8a6a 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -634,9 +634,14 @@ static void usb_msd_realize_storage(USBDevice *dev, Error **errp) static void usb_msd_realize_bot(USBDevice *dev, Error **errp) { MSDState *s = USB_STORAGE_DEV(dev); + DeviceState *d = DEVICE(dev); usb_desc_create_serial(dev); usb_desc_init(dev); + if (d->hotplugged) { + s->dev.auto_attach = 0; + } + scsi_bus_new(&s->bus, sizeof(s->bus), DEVICE(dev), &usb_msd_scsi_info_bot, NULL); usb_msd_handle_reset(dev); @@ -806,10 +811,9 @@ static void usb_msd_instance_init(Object *obj) static void usb_msd_class_initfn_bot(ObjectClass *klass, void *data) { USBDeviceClass *uc = USB_DEVICE_CLASS(klass); - DeviceClass *dc = DEVICE_CLASS(klass); uc->realize = usb_msd_realize_bot; - dc->hotpluggable = false; + uc->attached_settable = true; } static const TypeInfo msd_info = { From 0d4cf3e72aadc40aa866fef7ceb82dfbfdc9ac47 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 15 Jun 2016 11:46:59 +0200 Subject: [PATCH 5/5] usb-uas: hotplug support Make attached property settable and turns off auto-attach in case the device was hotplugged. Hotplugging works simliar to usb-bot now. Signed-off-by: Gerd Hoffmann Reviewed-by: Markus Armbruster Message-id: 1465984019-28963-6-git-send-email-kraxel@redhat.com --- hw/usb/dev-uas.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/hw/usb/dev-uas.c b/hw/usb/dev-uas.c index 0678b1b05b..3a8ff18b1b 100644 --- a/hw/usb/dev-uas.c +++ b/hw/usb/dev-uas.c @@ -900,9 +900,13 @@ static void usb_uas_handle_destroy(USBDevice *dev) static void usb_uas_realize(USBDevice *dev, Error **errp) { UASDevice *uas = USB_UAS(dev); + DeviceState *d = DEVICE(dev); usb_desc_create_serial(dev); usb_desc_init(dev); + if (d->hotplugged) { + uas->dev.auto_attach = 0; + } QTAILQ_INIT(&uas->results); QTAILQ_INIT(&uas->requests); @@ -940,6 +944,7 @@ static void usb_uas_class_initfn(ObjectClass *klass, void *data) uc->handle_control = usb_uas_handle_control; uc->handle_data = usb_uas_handle_data; uc->handle_destroy = usb_uas_handle_destroy; + uc->attached_settable = true; set_bit(DEVICE_CATEGORY_STORAGE, dc->categories); dc->fw_name = "storage"; dc->vmsd = &vmstate_usb_uas;