usb: Add a speedmask to devices

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>
This commit is contained in:
Hans de Goede 2011-05-27 14:27:18 +02:00 committed by Gerd Hoffmann
parent fa19bf831b
commit ba3f9bfba9
5 changed files with 17 additions and 0 deletions

View File

@ -1271,6 +1271,7 @@ static int ccid_initfn(USBDevice *dev)
s->migration_target_ip = 0; s->migration_target_ip = 0;
s->migration_target_port = 0; s->migration_target_port = 0;
s->dev.speed = USB_SPEED_FULL; s->dev.speed = USB_SPEED_FULL;
s->dev.speedmask = USB_SPEED_MASK_FULL;
s->notify_slot_change = false; s->notify_slot_change = false;
s->powered = true; s->powered = true;
s->pending_answers_num = 0; s->pending_answers_num = 0;

View File

@ -242,7 +242,17 @@ static void usb_desc_setdefaults(USBDevice *dev)
void usb_desc_init(USBDevice *dev) void usb_desc_init(USBDevice *dev)
{ {
const USBDesc *desc = dev->info->usb_desc;
assert(desc != NULL);
dev->speed = USB_SPEED_FULL; 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); usb_desc_setdefaults(dev);
} }

View File

@ -168,7 +168,10 @@ struct USBDevice {
char *port_path; char *port_path;
void *opaque; void *opaque;
/* Actual connected speed */
int speed; int speed;
/* Supported speeds, not in info because it may be variable (hostdevs) */
int speedmask;
uint8_t addr; uint8_t addr;
char product_desc[32]; char product_desc[32];
int auto_attach; int auto_attach;

View File

@ -367,8 +367,10 @@ USBDevice *usb_host_device_open(const char *devname)
if (dev_info.udi_speed == 1) { if (dev_info.udi_speed == 1) {
dev->dev.speed = USB_SPEED_LOW - 1; dev->dev.speed = USB_SPEED_LOW - 1;
dev->dev.speedmask = USB_SPEED_MASK_LOW;
} else { } else {
dev->dev.speed = USB_SPEED_FULL - 1; dev->dev.speed = USB_SPEED_FULL - 1;
dev->dev.speedmask = USB_SPEED_MASK_FULL;
} }
if (strncmp(dev_info.udi_product, "product", 7) != 0) { if (strncmp(dev_info.udi_product, "product", 7) != 0) {

View File

@ -1167,6 +1167,7 @@ static int usb_host_open(USBHostDevice *dev, int bus_num,
} }
} }
dev->dev.speed = speed; dev->dev.speed = speed;
dev->dev.speedmask = (1 << speed);
printf("husb: grabbed usb device %d.%d\n", bus_num, addr); printf("husb: grabbed usb device %d.%d\n", bus_num, addr);