From patchwork Fri Jan 13 10:18:19 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerd Hoffmann X-Patchwork-Id: 135819 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 8A654B6F68 for ; Fri, 13 Jan 2012 23:18:14 +1100 (EST) Received: from localhost ([::1]:39139 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RlfR3-0004FB-Td for incoming@patchwork.ozlabs.org; Fri, 13 Jan 2012 06:36:41 -0500 Received: from eggs.gnu.org ([140.186.70.92]:52507) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RlfQh-0003ar-N2 for qemu-devel@nongnu.org; Fri, 13 Jan 2012 06:36:26 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RlfQb-0000aO-Ra for qemu-devel@nongnu.org; Fri, 13 Jan 2012 06:36:19 -0500 Received: from mx1.redhat.com ([209.132.183.28]:7742) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RlfQb-0000a3-Fy for qemu-devel@nongnu.org; Fri, 13 Jan 2012 06:36:13 -0500 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q0DBaCEa004418 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 13 Jan 2012 06:36:12 -0500 Received: from rincewind.home.kraxel.org (ovpn-116-67.ams2.redhat.com [10.36.116.67]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q0DBa101017652; Fri, 13 Jan 2012 06:36:07 -0500 Received: by rincewind.home.kraxel.org (Postfix, from userid 500) id 4529140E51; Fri, 13 Jan 2012 11:18:34 +0100 (CET) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Fri, 13 Jan 2012 11:18:19 +0100 Message-Id: <1326449914-8591-3-git-send-email-kraxel@redhat.com> In-Reply-To: <1326449914-8591-1-git-send-email-kraxel@redhat.com> References: <1326449914-8591-1-git-send-email-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.132.183.28 Cc: Gerd Hoffmann Subject: [Qemu-devel] [PATCH 02/17] usb: track configuration and interface count in USBDevice. X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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 --- hw/usb-desc.c | 34 ++++++++++++++++++++++++++-------- hw/usb.h | 3 +++ usb-linux.c | 21 +++++++++------------ 3 files changed, 38 insertions(+), 20 deletions(-) diff --git a/hw/usb-desc.c b/hw/usb-desc.c index ae2d384..b52561a 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; diff --git a/hw/usb.h b/hw/usb.h index c6e1870..1ef53a1 100644 --- a/hw/usb.h +++ b/hw/usb.h @@ -188,6 +188,9 @@ struct USBDevice { QLIST_HEAD(, USBDescString) strings; const USBDescDevice *device; + + int configuration; + int ninterfaces; const USBDescConfig *config; }; diff --git a/usb-linux.c b/usb-linux.c index c68e194..3aaa93b 100644 --- a/usb-linux.c +++ b/usb-linux.c @@ -106,8 +106,6 @@ typedef struct USBHostDevice { uint8_t descr[8192]; int descr_len; - int configuration; - int ninterfaces; int closing; uint32_t iso_urb_count; Notifier exit; @@ -547,8 +545,8 @@ static int usb_host_claim_interfaces(USBHostDevice *dev, int configuration) int ret, i; if (configuration == 0) { /* address state - ignore */ - dev->ninterfaces = 0; - dev->configuration = 0; + dev->dev.ninterfaces = 0; + dev->dev.configuration = 0; return 1; } @@ -606,8 +604,8 @@ static int usb_host_claim_interfaces(USBHostDevice *dev, int configuration) trace_usb_host_claim_interfaces(dev->bus_num, dev->addr, nb_interfaces, configuration); - dev->ninterfaces = nb_interfaces; - dev->configuration = configuration; + dev->dev.ninterfaces = nb_interfaces; + dev->dev.configuration = configuration; return 1; fail: @@ -624,7 +622,7 @@ static int usb_host_release_interfaces(USBHostDevice *s) trace_usb_host_release_interfaces(s->bus_num, s->addr); - for (i = 0; i < s->ninterfaces; i++) { + for (i = 0; i < s->dev.ninterfaces; i++) { ret = ioctl(s->fd, USBDEVFS_RELEASEINTERFACE, &i); if (ret < 0) { perror("USBDEVFS_RELEASEINTERFACE"); @@ -1123,7 +1121,7 @@ static int usb_linux_update_endp_table(USBHostDevice *s) s->ep_out[i].type = INVALID_EP_TYPE; } - if (s->configuration == 0) { + if (s->dev.configuration == 0) { /* not configured yet -- leave all endpoints disabled */ return 0; } @@ -1138,12 +1136,11 @@ static int usb_linux_update_endp_table(USBHostDevice *s) if (descriptors[i + 1] != USB_DT_CONFIG) { fprintf(stderr, "invalid descriptor data\n"); return 1; - } else if (descriptors[i + 5] != s->configuration) { - DPRINTF("not requested configuration %d\n", s->configuration); + } else if (descriptors[i + 5] != s->dev.configuration) { + DPRINTF("not requested configuration %d\n", s->dev.configuration); i += (descriptors[i + 3] << 8) + descriptors[i + 2]; continue; } - i += descriptors[i]; if (descriptors[i + 1] != USB_DT_INTERFACE || @@ -1154,7 +1151,7 @@ static int usb_linux_update_endp_table(USBHostDevice *s) } interface = descriptors[i + 2]; - alt_interface = usb_linux_get_alt_setting(s, s->configuration, + alt_interface = usb_linux_get_alt_setting(s, s->dev.configuration, interface); /* the current interface descriptor is the active interface