On Tue, Jun 22, 2021 at 02:49:12PM +0200, Gerd Hoffmann wrote: > Introduce an usb device flag instead, set it when usb-host looks at the > device descriptors anyway. Also set it for emulated storage devices, > for consistency. Add an inline helper function to check the flag. > > Signed-off-by: Gerd Hoffmann <kra...@redhat.com>
ppc parts Acked-by: David Gibson <da...@gibson.dropbear.id.au> > --- > include/hw/usb.h | 7 ++++++- > hw/ppc/spapr.c | 2 +- > hw/usb/dev-storage-bot.c | 1 + > hw/usb/dev-storage-classic.c | 1 + > hw/usb/dev-uas.c | 1 + > hw/usb/host-libusb.c | 36 +++++++----------------------------- > hw/usb/host-stub.c | 5 ----- > 7 files changed, 17 insertions(+), 36 deletions(-) > > diff --git a/include/hw/usb.h b/include/hw/usb.h > index 436e07b30404..33668dd0a99a 100644 > --- a/include/hw/usb.h > +++ b/include/hw/usb.h > @@ -219,6 +219,7 @@ enum USBDeviceFlags { > USB_DEV_FLAG_IS_HOST, > USB_DEV_FLAG_MSOS_DESC_ENABLE, > USB_DEV_FLAG_MSOS_DESC_IN_USE, > + USB_DEV_FLAG_IS_SCSI_STORAGE, > }; > > /* definition of a USB device */ > @@ -465,7 +466,6 @@ void usb_generic_async_ctrl_complete(USBDevice *s, > USBPacket *p); > > /* usb-linux.c */ > void hmp_info_usbhost(Monitor *mon, const QDict *qdict); > -bool usb_host_dev_is_scsi_storage(USBDevice *usbdev); > > /* usb ports of the VM */ > > @@ -561,6 +561,11 @@ const char *usb_device_get_product_desc(USBDevice *dev); > > const USBDesc *usb_device_get_usb_desc(USBDevice *dev); > > +static inline bool usb_device_is_scsi_storage(USBDevice *dev) > +{ > + return dev->flags & (1 << USB_DEV_FLAG_IS_SCSI_STORAGE); > +} > + > /* quirks.c */ > > /* In bulk endpoints are streaming data sources (iow behave like isoc eps) */ > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c > index 4dd90b75cc52..f83a081af0f1 100644 > --- a/hw/ppc/spapr.c > +++ b/hw/ppc/spapr.c > @@ -3106,7 +3106,7 @@ static char *spapr_get_fw_dev_path(FWPathProvider *p, > BusState *bus, > */ > if (strcmp("usb-host", qdev_fw_name(dev)) == 0) { > USBDevice *usbdev = CAST(USBDevice, dev, TYPE_USB_DEVICE); > - if (usb_host_dev_is_scsi_storage(usbdev)) { > + if (usb_device_is_scsi_storage(usbdev)) { > return g_strdup_printf("storage@%s/disk", usbdev->port->path); > } > } > diff --git a/hw/usb/dev-storage-bot.c b/hw/usb/dev-storage-bot.c > index 6aad026d1133..68ebaca10c66 100644 > --- a/hw/usb/dev-storage-bot.c > +++ b/hw/usb/dev-storage-bot.c > @@ -32,6 +32,7 @@ static void usb_msd_bot_realize(USBDevice *dev, Error > **errp) > > usb_desc_create_serial(dev); > usb_desc_init(dev); > + dev->flags |= (1 << USB_DEV_FLAG_IS_SCSI_STORAGE); > if (d->hotplugged) { > s->dev.auto_attach = 0; > } > diff --git a/hw/usb/dev-storage-classic.c b/hw/usb/dev-storage-classic.c > index 00cb34b22f02..3d017a4e6791 100644 > --- a/hw/usb/dev-storage-classic.c > +++ b/hw/usb/dev-storage-classic.c > @@ -64,6 +64,7 @@ static void usb_msd_storage_realize(USBDevice *dev, Error > **errp) > > usb_desc_create_serial(dev); > usb_desc_init(dev); > + dev->flags |= (1 << USB_DEV_FLAG_IS_SCSI_STORAGE); > scsi_bus_new(&s->bus, sizeof(s->bus), DEVICE(dev), > &usb_msd_scsi_info_storage, NULL); > scsi_dev = scsi_bus_legacy_add_drive(&s->bus, blk, 0, !!s->removable, > diff --git a/hw/usb/dev-uas.c b/hw/usb/dev-uas.c > index d2bd85d3f6bb..263056231c79 100644 > --- a/hw/usb/dev-uas.c > +++ b/hw/usb/dev-uas.c > @@ -926,6 +926,7 @@ static void usb_uas_realize(USBDevice *dev, Error **errp) > QTAILQ_INIT(&uas->requests); > uas->status_bh = qemu_bh_new(usb_uas_send_status_bh, uas); > > + dev->flags |= (1 << USB_DEV_FLAG_IS_SCSI_STORAGE); > scsi_bus_new(&uas->bus, sizeof(uas->bus), DEVICE(dev), > &usb_uas_scsi_info, NULL); > } > diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c > index 2518306f527f..e6d21aa8e1d3 100644 > --- a/hw/usb/host-libusb.c > +++ b/hw/usb/host-libusb.c > @@ -770,6 +770,13 @@ static void usb_host_speed_compat(USBHostDevice *s) > for (i = 0; i < conf->bNumInterfaces; i++) { > for (a = 0; a < conf->interface[i].num_altsetting; a++) { > intf = &conf->interface[i].altsetting[a]; > + > + if (intf->bInterfaceClass == LIBUSB_CLASS_MASS_STORAGE && > + intf->bInterfaceSubClass == 6) { /* SCSI */ > + udev->flags |= (1 << USB_DEV_FLAG_IS_SCSI_STORAGE); > + break; > + } > + > for (e = 0; e < intf->bNumEndpoints; e++) { > endp = &intf->endpoint[e]; > type = endp->bmAttributes & 0x3; > @@ -1893,35 +1900,6 @@ static void usb_host_auto_check(void *unused) > timer_mod(usb_auto_timer, qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + 2000); > } > > -/** > - * Check whether USB host device has a USB mass storage SCSI interface > - */ > -bool usb_host_dev_is_scsi_storage(USBDevice *ud) > -{ > - USBHostDevice *uhd = USB_HOST_DEVICE(ud); > - struct libusb_config_descriptor *conf; > - const struct libusb_interface_descriptor *intf; > - bool is_scsi_storage = false; > - int i; > - > - if (!uhd || libusb_get_active_config_descriptor(uhd->dev, &conf) != 0) { > - return false; > - } > - > - for (i = 0; i < conf->bNumInterfaces; i++) { > - intf = &conf->interface[i].altsetting[ud->altsetting[i]]; > - if (intf->bInterfaceClass == LIBUSB_CLASS_MASS_STORAGE && > - intf->bInterfaceSubClass == 6) { /* 6 means SCSI > */ > - is_scsi_storage = true; > - break; > - } > - } > - > - libusb_free_config_descriptor(conf); > - > - return is_scsi_storage; > -} > - > void hmp_info_usbhost(Monitor *mon, const QDict *qdict) > { > libusb_device **devs = NULL; > diff --git a/hw/usb/host-stub.c b/hw/usb/host-stub.c > index 80809ceba542..bbe69baa390f 100644 > --- a/hw/usb/host-stub.c > +++ b/hw/usb/host-stub.c > @@ -38,8 +38,3 @@ void hmp_info_usbhost(Monitor *mon, const QDict *qdict) > { > monitor_printf(mon, "USB host devices not supported\n"); > } > - > -bool usb_host_dev_is_scsi_storage(USBDevice *ud) > -{ > - return false; > -} -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson
signature.asc
Description: PGP signature