diff --git a/hw/usb/bus.c b/hw/usb/bus.c index b10c290cf4..d1827be101 100644 --- a/hw/usb/bus.c +++ b/hw/usb/bus.c @@ -417,19 +417,47 @@ void usb_release_port(USBDevice *dev) bus->nfree++; } +static void usb_mask_to_str(char *dest, size_t size, + unsigned int speedmask) +{ + static const struct { + unsigned int mask; + const char *name; + } speeds[] = { + { .mask = USB_SPEED_MASK_FULL, .name = "full" }, + { .mask = USB_SPEED_MASK_HIGH, .name = "high" }, + { .mask = USB_SPEED_MASK_SUPER, .name = "super" }, + }; + int i, pos = 0; + + for (i = 0; i < ARRAY_SIZE(speeds); i++) { + if (speeds[i].mask & speedmask) { + pos += snprintf(dest + pos, size - pos, "%s%s", + pos ? "+" : "", + speeds[i].name); + } + } +} + int usb_device_attach(USBDevice *dev) { USBBus *bus = usb_bus_from_device(dev); USBPort *port = dev->port; + char devspeed[32], portspeed[32]; assert(port != NULL); assert(!dev->attached); - trace_usb_port_attach(bus->busnr, port->path); + usb_mask_to_str(devspeed, sizeof(devspeed), dev->speedmask); + usb_mask_to_str(portspeed, sizeof(portspeed), port->speedmask); + trace_usb_port_attach(bus->busnr, port->path, + devspeed, portspeed); if (!(port->speedmask & dev->speedmask)) { - error_report("Warning: speed mismatch trying to attach " - "usb device %s to bus %s", - dev->product_desc, bus->qbus.name); + error_report("Warning: speed mismatch trying to attach" + " usb device \"%s\" (%s speed)" + " to bus \"%s\", port \"%s\" (%s speed)", + dev->product_desc, devspeed, + bus->qbus.name, port->path, portspeed); return -1; } diff --git a/hw/usb/desc.c b/hw/usb/desc.c index b389381326..fce303e9c8 100644 --- a/hw/usb/desc.c +++ b/hw/usb/desc.c @@ -522,8 +522,6 @@ void usb_desc_attach(USBDevice *dev) } else if (desc->full && (dev->port->speedmask & USB_SPEED_MASK_FULL)) { dev->speed = USB_SPEED_FULL; } else { - fprintf(stderr, "usb: port/device speed mismatch for \"%s\"\n", - usb_device_get_product_desc(dev)); return; } usb_desc_setdefaults(dev); diff --git a/trace-events b/trace-events index e587487a3b..ffaa3f472e 100644 --- a/trace-events +++ b/trace-events @@ -277,7 +277,7 @@ usb_packet_state_fault(int bus, const char *port, int ep, void *p, const char *o # hw/usb/bus.c usb_port_claim(int bus, const char *port) "bus %d, port %s" -usb_port_attach(int bus, const char *port) "bus %d, port %s" +usb_port_attach(int bus, const char *port, const char *devspeed, const char *portspeed) "bus %d, port %s, devspeed %s, portspeed %s" usb_port_detach(int bus, const char *port) "bus %d, port %s" usb_port_release(int bus, const char *port) "bus %d, port %s"