Author: thompsa
Date: Thu Mar 11 21:48:10 2010
New Revision: 205033
URL: http://svn.freebsd.org/changeset/base/205033

Log:
  isochronous endpoint descriptors should have two more bytes which are zero by
  default.
  
  Submitted by: Hans Petter Selasky

Modified:
  head/sys/dev/usb/template/usb_template.c

Modified: head/sys/dev/usb/template/usb_template.c
==============================================================================
--- head/sys/dev/usb/template/usb_template.c    Thu Mar 11 21:47:25 2010        
(r205032)
+++ head/sys/dev/usb/template/usb_template.c    Thu Mar 11 21:48:10 2010        
(r205033)
@@ -162,15 +162,23 @@ usb_make_endpoint_desc(struct usb_temp_s
        const void **rd;
        uint16_t old_size;
        uint16_t mps;
-       uint8_t ea = 0;                 /* Endpoint Address */
-       uint8_t et = 0;                 /* Endpiont Type */
+       uint8_t ea;                     /* Endpoint Address */
+       uint8_t et;                     /* Endpiont Type */
 
        /* Reserve memory */
        old_size = temp->size;
-       temp->size += sizeof(*ed);
 
-       /* Scan all Raw Descriptors first */
+       ea = (ted->bEndpointAddress & (UE_ADDR | UE_DIR_IN | UE_DIR_OUT));
+       et = (ted->bmAttributes & UE_XFERTYPE);
+
+       if (et == UE_ISOCHRONOUS) {
+               /* account for extra byte fields */
+               temp->size += sizeof(*ed) + 2;
+       } else {
+               temp->size += sizeof(*ed);
+       }
 
+       /* Scan all Raw Descriptors first */
        rd = ted->ppRawDesc;
        if (rd) {
                while (*rd) {
@@ -192,8 +200,6 @@ usb_make_endpoint_desc(struct usb_temp_s
                /* escape for Zero Max Packet Size */
                mps = 0;
        }
-       ea = (ted->bEndpointAddress & (UE_ADDR | UE_DIR_IN | UE_DIR_OUT));
-       et = (ted->bmAttributes & UE_XFERTYPE);
 
        /*
         * Fill out the real USB endpoint descriptor
@@ -201,7 +207,10 @@ usb_make_endpoint_desc(struct usb_temp_s
         */
        if (temp->buf) {
                ed = USB_ADD_BYTES(temp->buf, old_size);
-               ed->bLength = sizeof(*ed);
+               if (et == UE_ISOCHRONOUS)
+                       ed->bLength = sizeof(*ed) + 2;
+               else
+                       ed->bLength = sizeof(*ed);
                ed->bDescriptorType = UDESC_ENDPOINT;
                ed->bEndpointAddress = ea;
                ed->bmAttributes = ted->bmAttributes;
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to