Patchwork [13/18] usb-linux: fix max_packet_size for highspeed.

login
register
mail settings
Submitter Gerd Hoffmann
Date May 16, 2011, 7:56 p.m.
Message ID <1305575782-31766-14-git-send-email-kraxel@redhat.com>
Download mbox | patch
Permalink /patch/95816/
State New
Headers show

Comments

Gerd Hoffmann - May 16, 2011, 7:56 p.m.
Calculate the max packet size correctly.  Only bits 0..11 specify the size,
bits 11+12 specify the number of (highspeed) microframes the endpoint wants
to use.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 usb-linux.c |   19 +++++++++++++++++--
 1 files changed, 17 insertions(+), 2 deletions(-)

Patch

diff --git a/usb-linux.c b/usb-linux.c
index b95c119..5547b02 100644
--- a/usb-linux.c
+++ b/usb-linux.c
@@ -213,6 +213,22 @@  static int get_iso_buffer_used(USBHostDevice *s, int ep)
     return s->endp_table[ep - 1].iso_buffer_used;
 }
 
+static void set_max_packet_size(USBHostDevice *s, int ep, uint8_t *descriptor)
+{
+    int raw = descriptor[4] + (descriptor[5] << 8);
+    int size, microframes;
+
+    size = raw & 0x7ff;
+    switch ((raw >> 11) & 3) {
+    case 1:  microframes = 2; break;
+    case 2:  microframes = 3; break;
+    default: microframes = 1; break;
+    }
+    DPRINTF("husb: max packet size: 0x%x -> %d x %d\n",
+            raw, microframes, size);
+    s->endp_table[ep - 1].max_packet_size = size * microframes;
+}
+
 static int get_max_packet_size(USBHostDevice *s, int ep)
 {
     return s->endp_table[ep - 1].max_packet_size;
@@ -1008,8 +1024,7 @@  static int usb_linux_update_endp_table(USBHostDevice *s)
                 break;
             case 0x01:
                 type = USBDEVFS_URB_TYPE_ISO;
-                s->endp_table[(devep & 0xf) - 1].max_packet_size =
-                    descriptors[i + 4] + (descriptors[i + 5] << 8);
+                set_max_packet_size(s, (devep & 0xf), descriptors + i);
                 break;
             case 0x02:
                 type = USBDEVFS_URB_TYPE_BULK;