From 9d34cb0827012388487128b3c306b9c92493dc8d Mon Sep 17 00:00:00 2001
Message-Id: <9d34cb0827012388487128b3c306b9c92493dc8d.1334581530.git.minovotn@redhat.com>
In-Reply-To: <28774cb15d2443e325049ef410956f5635a1484b.1334581530.git.minovotn@redhat.com>
References: <28774cb15d2443e325049ef410956f5635a1484b.1334581530.git.minovotn@redhat.com>
From: Gerd Hoffmann <kraxel@redhat.com>
Date: Fri, 30 Mar 2012 12:35:33 +0200
Subject: [PATCH 3/6] usb: use USBDescriptor for config descriptors.

RH-Author: Gerd Hoffmann <kraxel@redhat.com>
Message-id: <1333110936-22700-4-git-send-email-kraxel@redhat.com>
Patchwork-id: 39042
O-Subject: [RHEL-6.3 qemu-kvm PATCH 3/6] usb: use USBDescriptor for config descriptors.
Bugzilla: 807878
RH-Acked-by: Hans de Goede <hdegoede@redhat.com>
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>

Add config descriptor substruct to USBDescriptor,
use it in the descriptor generator code.

upstream: http://patchwork.ozlabs.org/patch/149399/

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/usb-desc.c |   22 ++++++++++++----------
 hw/usb-desc.h |    9 +++++++++
 2 files changed, 21 insertions(+), 10 deletions(-)

Signed-off-by: Michal Novotny <minovotn@redhat.com>
---
 hw/usb-desc.c |   22 ++++++++++++----------
 hw/usb-desc.h |    9 +++++++++
 2 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/hw/usb-desc.c b/hw/usb-desc.c
index 98ec6a9..deb1903 100644
--- a/hw/usb-desc.c
+++ b/hw/usb-desc.c
@@ -78,22 +78,24 @@ int usb_desc_config(const USBDescConfig *conf, uint8_t *dest, size_t len)
 {
     uint8_t  bLength = 0x09;
     uint16_t wTotalLength = 0;
+    USBDescriptor *d = (void *)dest;
     int i, rc;
 
     if (len < bLength) {
         return -1;
     }
 
-    dest[0x00] = bLength;
-    dest[0x01] = USB_DT_CONFIG;
-    dest[0x04] = conf->bNumInterfaces;
-    dest[0x05] = conf->bConfigurationValue;
-    dest[0x06] = conf->iConfiguration;
-    dest[0x07] = conf->bmAttributes;
-    dest[0x08] = conf->bMaxPower;
+    d->bLength                      = bLength;
+    d->bDescriptorType              = USB_DT_CONFIG;
+
+    d->u.config.bNumInterfaces      = conf->bNumInterfaces;
+    d->u.config.bConfigurationValue = conf->bConfigurationValue;
+    d->u.config.iConfiguration      = conf->iConfiguration;
+    d->u.config.bmAttributes        = conf->bmAttributes;
+    d->u.config.bMaxPower           = conf->bMaxPower;
     wTotalLength += bLength;
 
-    /* handle grouped interfaces if any*/
+    /* handle grouped interfaces if any */
     for (i = 0; i < conf->nif_groups; i++) {
         rc = usb_desc_iface_group(&(conf->if_groups[i]),
                                   dest + wTotalLength,
@@ -113,8 +115,8 @@ int usb_desc_config(const USBDescConfig *conf, uint8_t *dest, size_t len)
         wTotalLength += rc;
     }
 
-    dest[0x02] = usb_lo(wTotalLength);
-    dest[0x03] = usb_hi(wTotalLength);
+    d->u.config.wTotalLength_lo = usb_lo(wTotalLength);
+    d->u.config.wTotalLength_hi = usb_hi(wTotalLength);
     return wTotalLength;
 }
 
diff --git a/hw/usb-desc.h b/hw/usb-desc.h
index 12eee65..2f09101 100644
--- a/hw/usb-desc.h
+++ b/hw/usb-desc.h
@@ -36,6 +36,15 @@ typedef struct USBDescriptor {
             uint8_t           bNumConfigurations;
             uint8_t           bReserved;
         } device_qualifier;
+        struct {
+            uint8_t           wTotalLength_lo;
+            uint8_t           wTotalLength_hi;
+            uint8_t           bNumInterfaces;
+            uint8_t           bConfigurationValue;
+            uint8_t           iConfiguration;
+            uint8_t           bmAttributes;
+            uint8_t           bMaxPower;
+        } config;
     } u;
 } __attribute__((packed)) USBDescriptor;
 
-- 
1.7.7.6

