isochronous endpoint descriptors should have two more bytes which are zero by

default.

Submitted by:	Hans Petter Selasky
This commit is contained in:
Andrew Thompson 2010-03-11 21:48:10 +00:00
parent 3e4af77774
commit 6a268418dc

View File

@ -162,15 +162,23 @@ usb_make_endpoint_desc(struct usb_temp_setup *temp,
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);
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_setup *temp,
/* 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_setup *temp,
*/
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;