diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2011-08-30 11:11:29 +0200 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2012-01-13 10:25:44 +0100 |
commit | 65360511a2eeab8b671722df6634dd674cc4a5d6 (patch) | |
tree | 4a38c1dd1b525f2700d9458b40c71e83a1728bf9 /hw/usb-desc.c | |
parent | 097db4384860b4363364eb531285296f616d89e5 (diff) |
usb: track configuration and interface count in USBDevice.
Move fields from USBHostDevice to USBDevice.
Add bits to usb-desc.c to fill them for emulated devices too.
Also allow to set configuration 0 (== None) for emulated devices.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Diffstat (limited to 'hw/usb-desc.c')
-rw-r--r-- | hw/usb-desc.c | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/hw/usb-desc.c b/hw/usb-desc.c index ae2d384bb3..b52561adf8 100644 --- a/hw/usb-desc.c +++ b/hw/usb-desc.c @@ -223,6 +223,29 @@ int usb_desc_other(const USBDescOther *desc, uint8_t *dest, size_t len) /* ------------------------------------------------------------------ */ +static int usb_desc_set_config(USBDevice *dev, int value) +{ + int i; + + if (value == 0) { + dev->configuration = 0; + dev->ninterfaces = 0; + dev->config = NULL; + } else { + for (i = 0; i < dev->device->bNumConfigurations; i++) { + if (dev->device->confs[i].bConfigurationValue == value) { + dev->configuration = value; + dev->ninterfaces = dev->device->confs[i].bNumInterfaces; + dev->config = dev->device->confs + i; + } + } + if (i < dev->device->bNumConfigurations) { + return -1; + } + } + return 0; +} + static void usb_desc_setdefaults(USBDevice *dev) { const USBDesc *desc = dev->info->usb_desc; @@ -237,7 +260,7 @@ static void usb_desc_setdefaults(USBDevice *dev) dev->device = desc->high; break; } - dev->config = dev->device->confs; + usb_desc_set_config(dev, 0); } void usb_desc_init(USBDevice *dev) @@ -408,7 +431,7 @@ int usb_desc_handle_control(USBDevice *dev, USBPacket *p, int request, int value, int index, int length, uint8_t *data) { const USBDesc *desc = dev->info->usb_desc; - int i, ret = -1; + int ret = -1; assert(desc != NULL); switch(request) { @@ -427,12 +450,7 @@ int usb_desc_handle_control(USBDevice *dev, USBPacket *p, ret = 1; break; case DeviceOutRequest | USB_REQ_SET_CONFIGURATION: - for (i = 0; i < dev->device->bNumConfigurations; i++) { - if (dev->device->confs[i].bConfigurationValue == value) { - dev->config = dev->device->confs + i; - ret = 0; - } - } + ret = usb_desc_set_config(dev, value); trace_usb_set_config(dev->addr, value, ret); break; |