ChangeSet 1.1315.8.23, 2003/09/17 17:09:21-07:00, stern@rowland.harvard.edu [PATCH] USB: Changes to core/config.c (4 of 9) Although it's hard to tell from reading the patch, this just moves one section of code to a slightly different spot. Currently the code that skips over the extra class- and vendor-specific configuration-related descriptors is part of the loop that parses interface descriptors. The patch moves it outside, immediately before that loop -- where it belongs. drivers/usb/core/config.c | 83 +++++++++++++++++++++------------------------- 1 files changed, 39 insertions(+), 44 deletions(-) diff -Nru a/drivers/usb/core/config.c b/drivers/usb/core/config.c --- a/drivers/usb/core/config.c Fri Sep 19 17:10:00 2003 +++ b/drivers/usb/core/config.c Fri Sep 19 17:10:00 2003 @@ -251,8 +251,10 @@ int nintf; int i, size; struct usb_interface *interface; - int retval; + int numskipped, len; + char *begin; struct usb_descriptor_header *header; + int retval; memcpy(&config->desc, buffer, USB_DT_CONFIG_SIZE); le16_to_cpus(&config->desc.wTotalLength); @@ -284,55 +286,48 @@ buffer += config->desc.bLength; size -= config->desc.bLength; - for (i = 0; i < nintf; i++) { - int numskipped, len; - char *begin; + /* Skip over any Class Specific or Vendor Specific descriptors */ + begin = buffer; + numskipped = 0; + while (size >= sizeof(struct usb_descriptor_header)) { + header = (struct usb_descriptor_header *)buffer; + + if ((header->bLength > size) || (header->bLength < 2)) { + err("invalid descriptor length of %d", header->bLength); + return -EINVAL; + } - /* Skip over the rest of the Class Specific or Vendor */ - /* Specific descriptors */ - begin = buffer; - numskipped = 0; - while (size >= sizeof(struct usb_descriptor_header)) { - header = (struct usb_descriptor_header *)buffer; - - if ((header->bLength > size) || (header->bLength < 2)) { - err("invalid descriptor length of %d", header->bLength); - return -EINVAL; - } - - /* If we find another "proper" descriptor then we're done */ - if ((header->bDescriptorType == USB_DT_ENDPOINT) || - (header->bDescriptorType == USB_DT_INTERFACE) || - (header->bDescriptorType == USB_DT_CONFIG) || - (header->bDescriptorType == USB_DT_DEVICE)) - break; + /* If we find another "proper" descriptor then we're done */ + if ((header->bDescriptorType == USB_DT_ENDPOINT) || + (header->bDescriptorType == USB_DT_INTERFACE) || + (header->bDescriptorType == USB_DT_CONFIG) || + (header->bDescriptorType == USB_DT_DEVICE)) + break; - dbg("skipping descriptor 0x%X", header->bDescriptorType); - numskipped++; + dbg("skipping descriptor 0x%X", header->bDescriptorType); + numskipped++; - buffer += header->bLength; - size -= header->bLength; - } - if (numskipped) { - dbg("skipped %d class/vendor specific configuration descriptors", numskipped); + buffer += header->bLength; + size -= header->bLength; + } + if (numskipped) { + dbg("skipped %d class/vendor specific configuration descriptors", numskipped); - /* Copy any unknown descriptors into a storage area for */ - /* drivers to later parse */ - len = buffer - begin; - if (config->extralen) { - warn("extra config descriptor"); - } else { - config->extra = kmalloc(len, GFP_KERNEL); - if (!config->extra) { - err("couldn't allocate memory for config extra descriptors"); - return -ENOMEM; - } - - memcpy(config->extra, begin, len); - config->extralen = len; - } + /* Copy any unknown descriptors into a storage area for */ + /* drivers to later parse */ + len = buffer - begin; + config->extra = kmalloc(len, GFP_KERNEL); + if (!config->extra) { + err("couldn't allocate memory for config extra descriptors"); + return -ENOMEM; } + memcpy(config->extra, begin, len); + config->extralen = len; + } + + /* Parse all the interface/altsetting descriptors */ + for (i = 0; i < nintf; i++) { retval = usb_parse_interface(config->interface[i], buffer, size); if (retval < 0) return retval;