aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--hw/usb-ccid.c1
-rw-r--r--hw/usb-desc.c10
-rw-r--r--hw/usb.h3
-rw-r--r--usb-bsd.c2
-rw-r--r--usb-linux.c1
5 files changed, 17 insertions, 0 deletions
diff --git a/hw/usb-ccid.c b/hw/usb-ccid.c
index 59c643167..30bb4d6e4 100644
--- a/hw/usb-ccid.c
+++ b/hw/usb-ccid.c
@@ -1271,6 +1271,7 @@ static int ccid_initfn(USBDevice *dev)
s->migration_target_ip = 0;
s->migration_target_port = 0;
s->dev.speed = USB_SPEED_FULL;
+ s->dev.speedmask = USB_SPEED_MASK_FULL;
s->notify_slot_change = false;
s->powered = true;
s->pending_answers_num = 0;
diff --git a/hw/usb-desc.c b/hw/usb-desc.c
index e4a4680fe..0b9d35118 100644
--- a/hw/usb-desc.c
+++ b/hw/usb-desc.c
@@ -242,7 +242,17 @@ static void usb_desc_setdefaults(USBDevice *dev)
void usb_desc_init(USBDevice *dev)
{
+ const USBDesc *desc = dev->info->usb_desc;
+
+ assert(desc != NULL);
dev->speed = USB_SPEED_FULL;
+ dev->speedmask = 0;
+ if (desc->full) {
+ dev->speedmask |= USB_SPEED_MASK_FULL;
+ }
+ if (desc->high) {
+ dev->speedmask |= USB_SPEED_MASK_HIGH;
+ }
usb_desc_setdefaults(dev);
}
diff --git a/hw/usb.h b/hw/usb.h
index 06ce05826..a6b311fe2 100644
--- a/hw/usb.h
+++ b/hw/usb.h
@@ -168,7 +168,10 @@ struct USBDevice {
char *port_path;
void *opaque;
+ /* Actual connected speed */
int speed;
+ /* Supported speeds, not in info because it may be variable (hostdevs) */
+ int speedmask;
uint8_t addr;
char product_desc[32];
int auto_attach;
diff --git a/usb-bsd.c b/usb-bsd.c
index c1bcc4a1d..3b97eb491 100644
--- a/usb-bsd.c
+++ b/usb-bsd.c
@@ -367,8 +367,10 @@ USBDevice *usb_host_device_open(const char *devname)
if (dev_info.udi_speed == 1) {
dev->dev.speed = USB_SPEED_LOW - 1;
+ dev->dev.speedmask = USB_SPEED_MASK_LOW;
} else {
dev->dev.speed = USB_SPEED_FULL - 1;
+ dev->dev.speedmask = USB_SPEED_MASK_FULL;
}
if (strncmp(dev_info.udi_product, "product", 7) != 0) {
diff --git a/usb-linux.c b/usb-linux.c
index 9b6f2be0f..4d22c9cc9 100644
--- a/usb-linux.c
+++ b/usb-linux.c
@@ -1167,6 +1167,7 @@ static int usb_host_open(USBHostDevice *dev, int bus_num,
}
}
dev->dev.speed = speed;
+ dev->dev.speedmask = (1 << speed);
printf("husb: grabbed usb device %d.%d\n", bus_num, addr);