ext [EMAIL PROTECTED] wrote: > This patch takes hub.c:usb_new_device() and splits it in three parts: > > - The actual actions of adding a new device (quirk detection, > announcement and autoresume tracking) > > - Actual discovery and probing of the configuration and interfaces > (split into __usb_configure_device()) > > - Configuration of the On-the-go parameters (split into > __usb_configure_device_otg()). > > The fundamental reasons for doing this split are clarity (smaller > functions are easier to maintain) and to allow part of the code to be > reused when authorizing devices to connect. > > When a device is authorized connection, we need to run through the > hoops we didn't run when it was connected but not authorized, which is > basically parsing the configurations and probing > them. usb_configure_device() will do that for us. > > Signed-off-by: Inaky Perez-Gonzalez <[EMAIL PROTECTED]> > > --- > drivers/usb/core/hub.c | 140 > +++++++++++++++++++++++++++++++------------------ > 1 file changed, 91 insertions(+), 49 deletions(-) > > Index: linux.hg/drivers/usb/core/hub.c > =================================================================== > --- linux.hg.orig/drivers/usb/core/hub.c 2007-07-18 10:05:25.000000000 > -0700 > +++ linux.hg/drivers/usb/core/hub.c 2007-07-18 10:05:49.000000000 -0700 > @@ -1272,56 +1272,17 @@ > static int __usb_port_suspend(struct usb_device *, int port1); > #endif > > + > /** > - * usb_new_device - perform initial device setup (usbcore-internal) > + * usb_configure_device_otg - FIXME (usbcore-internal) > * @udev: newly addressed device (in ADDRESS state) > * > - * This is called with devices which have been enumerated, but not yet > - * configured. The device descriptor is available, but not descriptors > - * for any device configuration. The caller must have locked either > - * the parent hub (if udev is a normal device) or else the > - * usb_bus_list_lock (if udev is a root hub). The parent's pointer to > - * udev has already been installed, but udev is not yet visible through > - * sysfs or other filesystem code. > - * > - * It will return if the device is configured properly or not. Zero if > - * the interface was registered with the driver core; else a negative > - * errno value. > - * > - * This call is synchronous, and may not be used in an interrupt context. > - * > - * Only the hub driver or root-hub registrar should ever call this. > + * Do configuration for On-The-Go devices > */ > -int usb_new_device(struct usb_device *udev) > +static > +int usb_configure_device_otg(struct usb_device *udev) > { > - int err; > - > - /* Determine quirks */ > - usb_detect_quirks(udev); > - > - err = usb_get_configuration(udev); > - if (err < 0) { > - dev_err(&udev->dev, "can't read configurations, error %d\n", > - err); > - goto fail; > - } > - > - /* read the standard strings and cache them if present */ > - udev->product = usb_cache_string(udev, udev->descriptor.iProduct); > - udev->manufacturer = usb_cache_string(udev, > - udev->descriptor.iManufacturer); > - udev->serial = usb_cache_string(udev, udev->descriptor.iSerialNumber); > - > - /* Tell the world! */ > - dev_dbg(&udev->dev, "new device strings: Mfr=%d, Product=%d, " > - "SerialNumber=%d\n", > - udev->descriptor.iManufacturer, > - udev->descriptor.iProduct, > - udev->descriptor.iSerialNumber); > - show_string(udev, "Product", udev->product); > - show_string(udev, "Manufacturer", udev->manufacturer); > - show_string(udev, "SerialNumber", udev->serial); > - > + int err = 0; > #ifdef CONFIG_USB_OTG > /* > * OTG-aware devices on OTG-capable root hubs may be able to use SRP, > @@ -1382,8 +1343,83 @@ > err = -ENODEV; > goto fail; > } > +fail: > #endif > + return err; > +} > + > + > +/** > + * usb_configure_device - Detect and probe device intfs/otg > (usbcore-internal) > + * @udev: newly addressed device (in ADDRESS state) > + * > + * This is only called by usb_new_device() and usb_authorize_device() > + * and FIXME -- all comments that apply to them apply here wrt to > + * environment. > + * > + * If the device is WUSB and not authorized, we don't attempt to read > + * the string descriptors, as they will be errored out by the device > + * until it has been authorized. > + */ > +static > +int usb_configure_device(struct usb_device *udev) > +{ > + int err; > + > + if (udev->config == NULL) { > + err = usb_get_configuration(udev); > + if (err < 0) { > + dev_err(&udev->dev, "can't read configurations, error > %d\n", > + err); > + goto fail; > + } > + } > + if (udev->wusb == 1 && udev->authorized == 0) { > + udev->product = kstrdup("n/a (unauthorized)", GFP_KERNEL); > + udev->manufacturer = kstrdup("n/a (unauthorized)", GFP_KERNEL); > + udev->serial = kstrdup("n/a (unauthorized)", GFP_KERNEL); > + } > + else { put the "else" at the same line of "}"
> + /* read the standard strings and cache them if present */ > + udev->product = usb_cache_string(udev, > udev->descriptor.iProduct); > + udev->manufacturer = usb_cache_string(udev, > + > udev->descriptor.iManufacturer); > + udev->serial = usb_cache_string(udev, > udev->descriptor.iSerialNumber); > + } > + err = usb_configure_device_otg(udev); > +fail: > + return err; > +} > > + > +/** > + * usb_new_device - perform initial device setup (usbcore-internal) > + * @udev: newly addressed device (in ADDRESS state) > + * > + * This is called with devices which have been enumerated, but not yet > + * configured. The device descriptor is available, but not descriptors > + * for any device configuration. The caller must have locked either > + * the parent hub (if udev is a normal device) or else the > + * usb_bus_list_lock (if udev is a root hub). The parent's pointer to > + * udev has already been installed, but udev is not yet visible through > + * sysfs or other filesystem code. > + * > + * It will return if the device is configured properly or not. Zero if > + * the interface was registered with the driver core; else a negative > + * errno value. > + * > + * This call is synchronous, and may not be used in an interrupt context. > + * > + * Only the hub driver or root-hub registrar should ever call this. > + */ > +int usb_new_device(struct usb_device *udev) > +{ > + int err; > + > + usb_detect_quirks(udev); /* Determine quirks */ > + err = usb_configure_device(udev); /* detect & probe dev/intfs */ > + if (err < 0) > + goto fail; > /* export the usbdev device-node for libusb */ > udev->dev.devt = MKDEV(USB_DEVICE_MAJOR, > (((udev->bus->busnum-1) * 128) + (udev->devnum-1))); > @@ -1397,17 +1433,23 @@ > dev_err(&udev->dev, "can't device_add, error %d\n", err); > goto fail; > } > - > + /* Tell the world! */ > + dev_dbg(&udev->dev, "new device strings: Mfr=%d, Product=%d, " > + "SerialNumber=%d\n", > + udev->descriptor.iManufacturer, > + udev->descriptor.iProduct, > + udev->descriptor.iSerialNumber); > + show_string(udev, "Product", udev->product); > + show_string(udev, "Manufacturer", udev->manufacturer); > + show_string(udev, "SerialNumber", udev->serial); > /* Increment the parent's count of unsuspended children */ > if (udev->parent) > usb_autoresume_device(udev->parent); > - > -exit: > return err; > > fail: > usb_set_device_state(udev, USB_STATE_NOTATTACHED); > - goto exit; > + return err; > } > > static int hub_port_status(struct usb_hub *hub, int port1, > > -- > > Inaky > ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel