]> git.proxmox.com Git - qemu.git/commitdiff
usb: Add a speedmask to devices
authorHans de Goede <hdegoede@redhat.com>
Fri, 27 May 2011 12:27:18 +0000 (14:27 +0200)
committerGerd Hoffmann <kraxel@redhat.com>
Thu, 23 Jun 2011 09:28:06 +0000 (11:28 +0200)
This is used to indicate at which speed[s] the device can operate,
so that this can be checked to match the ports capabilities when it gets
attached to a bus.

Note that currently all usb1 emulated device claim to be fullspeed, this
seems to not cause any problems, but still seems wrong, because with real
hardware keyboards, mice and tablets usually are lo-speed, so reporting these
as fullspeed devices seems wrong.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
hw/usb-ccid.c
hw/usb-desc.c
hw/usb.h
usb-bsd.c
usb-linux.c

index 59c643167674041ba118e99b7e0f97cdde596bf8..30bb4d6e411aafd02725d0c7afc45b1ef863b022 100644 (file)
@@ -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;
index e4a4680fee48fd8bda0554f7965694736944efbc..0b9d351189824bd9b1bc5710c81be2bf0ba435ea 100644 (file)
@@ -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);
 }
 
index 06ce05826ad6c781024961b591103119cb04bd76..a6b311fe2cc02380034f2d42ff81884cfd28653d 100644 (file)
--- 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;
index c1bcc4a1daa6e46c462ef86ff16f13c48fa30e86..3b97eb491bfd5933423bf470635095b9ef586b3a 100644 (file)
--- 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) {
index 9b6f2be0f490bf967c0252a075cec881be3b46a0..4d22c9cc9d88eb8c4c4ffd39507aacf569193156 100644 (file)
@@ -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);