Greg: This patch creates a separate subroutine to encapsulate the work required in choosing an initial configuration for a device. In my opinion that reflects a policy decision that should be kept apart from all the other work involved in creating a new device structure. The existing code in usb_new_device() is simply moved into usb_choose_configuration().
Please apply. Alan Stern # This is a BitKeeper generated patch for the following project: # Project Name: greg k-h's linux 2.5 USB kernel tree # This patch format is intended for GNU patch command version 2.5 or higher. # This patch includes the following deltas: # ChangeSet 1.2111 -> 1.2112 # drivers/usb/core/usb.c 1.272 -> 1.273 # # The following is the BitKeeper ChangeSet Log # -------------------------------------------- # 04/05/24 [EMAIL PROTECTED] 1.2112 # Create a separate subroutine for usb_choose_configuration(). # -------------------------------------------- # diff -Nru a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c --- a/drivers/usb/core/usb.c Mon May 24 10:37:01 2004 +++ b/drivers/usb/core/usb.c Mon May 24 10:37:01 2004 @@ -1066,6 +1066,37 @@ kfree(buf); } +static int usb_choose_configuration(struct usb_device *dev) +{ + int c, i; + + c = dev->config[0].desc.bConfigurationValue; + if (dev->descriptor.bNumConfigurations != 1) { + for (i = 0; i < dev->descriptor.bNumConfigurations; i++) { + struct usb_interface_descriptor *desc; + + /* heuristic: Linux is more likely to have class + * drivers, so avoid vendor-specific interfaces. + */ + desc = &dev->config[i].intf_cache[0] + ->altsetting->desc; + if (desc->bInterfaceClass == USB_CLASS_VENDOR_SPEC) + continue; + /* COMM/2/all is CDC ACM, except 0xff is MSFT RNDIS */ + if (desc->bInterfaceClass == USB_CLASS_COMM + && desc->bInterfaceSubClass == 2 + && desc->bInterfaceProtocol == 0xff) + continue; + c = dev->config[i].desc.bConfigurationValue; + break; + } + dev_info(&dev->dev, + "configuration #%d chosen from %d choices\n", + c, dev->descriptor.bNumConfigurations); + } + return c; +} + /* * usb_new_device - perform initial device setup (usbcore-internal) * @dev: newly addressed device (in ADDRESS state) @@ -1087,8 +1118,7 @@ int usb_new_device(struct usb_device *dev) { int err; - int i; - int config; + int c; err = usb_get_configuration(dev); if (err < 0) { @@ -1122,35 +1152,10 @@ * with the driver core, and lets usb device drivers bind to them. * NOTE: should interact with hub power budgeting. */ - config = dev->config[0].desc.bConfigurationValue; - if (dev->descriptor.bNumConfigurations != 1) { - for (i = 0; i < dev->descriptor.bNumConfigurations; i++) { - struct usb_interface_descriptor *desc; - - /* heuristic: Linux is more likely to have class - * drivers, so avoid vendor-specific interfaces. - */ - desc = &dev->config[i].intf_cache[0] - ->altsetting->desc; - if (desc->bInterfaceClass == USB_CLASS_VENDOR_SPEC) - continue; - /* COMM/2/all is CDC ACM, except 0xff is MSFT RNDIS */ - if (desc->bInterfaceClass == USB_CLASS_COMM - && desc->bInterfaceSubClass == 2 - && desc->bInterfaceProtocol == 0xff) - continue; - config = dev->config[i].desc.bConfigurationValue; - break; - } - dev_info(&dev->dev, - "configuration #%d chosen from %d choices\n", - config, - dev->descriptor.bNumConfigurations); - } - err = usb_set_configuration(dev, config); + c = usb_choose_configuration(dev); + err = usb_set_configuration(dev, c); if (err) { - dev_err(&dev->dev, "can't set config #%d, error %d\n", - config, err); + dev_err(&dev->dev, "can't set config #%d, error %d\n", c, err); device_del(&dev->dev); goto fail; } ------------------------------------------------------- This SF.Net email is sponsored by: Oracle 10g Get certified on the hottest thing ever to hit the market... Oracle 10g. Take an Oracle 10g class now, and we'll give you the exam FREE. http://ads.osdn.com/?ad_id=3149&alloc_id=8166&op=click _______________________________________________ [EMAIL PROTECTED] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel