From 215bc97c2a227eaf0473a801a9b20f9b218cfbbe Mon Sep 17 00:00:00 2001
Message-Id: <215bc97c2a227eaf0473a801a9b20f9b218cfbbe.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:35 +0200
Subject: [PATCH 5/6] usb: use USBDescriptor for endpoint descriptors.

RH-Author: Gerd Hoffmann <kraxel@redhat.com>
Message-id: <1333110936-22700-6-git-send-email-kraxel@redhat.com>
Patchwork-id: 39041
O-Subject: [RHEL-6.3 qemu-kvm PATCH 5/6] usb: use USBDescriptor for endpoint 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 endpoint descriptor substruct to USBDescriptor,
use it in the descriptor generator code.

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

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>

Conflicts:

	hw/usb-desc.c  [ rhel6 lacks audio endpoint support ]
---
 hw/usb-desc.c |   16 +++++++++-------
 hw/usb-desc.h |    9 +++++++++
 2 files changed, 18 insertions(+), 7 deletions(-)

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

diff --git a/hw/usb-desc.c b/hw/usb-desc.c
index 6a13dfa..d8c9aa3 100644
--- a/hw/usb-desc.c
+++ b/hw/usb-desc.c
@@ -199,18 +199,20 @@ int usb_desc_iface(const USBDescIface *iface, uint8_t *dest, size_t len)
 int usb_desc_endpoint(const USBDescEndpoint *ep, uint8_t *dest, size_t len)
 {
     uint8_t bLength = 0x07;
+    USBDescriptor *d = (void *)dest;
 
     if (len < bLength) {
         return -1;
     }
 
-    dest[0x00] = bLength;
-    dest[0x01] = USB_DT_ENDPOINT;
-    dest[0x02] = ep->bEndpointAddress;
-    dest[0x03] = ep->bmAttributes;
-    dest[0x04] = usb_lo(ep->wMaxPacketSize);
-    dest[0x05] = usb_hi(ep->wMaxPacketSize);
-    dest[0x06] = ep->bInterval;
+    d->bLength                      = bLength;
+    d->bDescriptorType              = USB_DT_ENDPOINT;
+
+    d->u.endpoint.bEndpointAddress  = ep->bEndpointAddress;
+    d->u.endpoint.bmAttributes      = ep->bmAttributes;
+    d->u.endpoint.wMaxPacketSize_lo = usb_lo(ep->wMaxPacketSize);
+    d->u.endpoint.wMaxPacketSize_hi = usb_hi(ep->wMaxPacketSize);
+    d->u.endpoint.bInterval         = ep->bInterval;
 
     return bLength;
 }
diff --git a/hw/usb-desc.h b/hw/usb-desc.h
index 2364605..df53d2c 100644
--- a/hw/usb-desc.h
+++ b/hw/usb-desc.h
@@ -54,6 +54,15 @@ typedef struct USBDescriptor {
             uint8_t           bInterfaceProtocol;
             uint8_t           iInterface;
         } interface;
+        struct {
+            uint8_t           bEndpointAddress;
+            uint8_t           bmAttributes;
+            uint8_t           wMaxPacketSize_lo;
+            uint8_t           wMaxPacketSize_hi;
+            uint8_t           bInterval;
+            uint8_t           bRefresh;        /* only audio ep */
+            uint8_t           bSynchAddress;   /* only audio ep */
+        } endpoint;
     } u;
 } __attribute__((packed)) USBDescriptor;
 
-- 
1.7.7.6

