On Wed, Oct 31, 2012 at 03:54:49PM -0400, Alan Stern wrote:
> +     ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
> +                           USB_REQ_SET_CONFIGURATION, 0, configuration, 0,
> +                           NULL, 0, USB_CTRL_SET_TIMEOUT);
> +     if (ret < 0 && cp) {
> +             /*
> +              * All the old state is gone, so what else can we do?
> +              * The device is probably useless now anyway.
> +              */
> +             for (i = 0; i < nintf; ++i) {
> +                     usb_disable_interface(dev, cp->interface[i], true);

usb_disable_interface() will set the udev->ep_out and udev->ep_in array
entries to NULL.  The bandwidth functions need those arrays to figure
out which entries to disable.

Is there a particular reason why you wanted to call
usb_disable_interface() before calling usb_hcd_alloc_bandwidth()?

And I do agree that this patch is much cleaner than my patch.

Sarah Sharp

> +                     put_device(&cp->interface[i]->dev);
> +                     cp->interface[i] = NULL;
> +             }
> +             cp = NULL;
> +             usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL);
> +     }
> +
> +     dev->actconfig = cp;
> +     mutex_unlock(hcd->bandwidth_mutex);
> +
> +     if (!cp) {
> +             usb_set_device_state(dev, USB_STATE_ADDRESS);
> +
> +             /* Leave LPM disabled while the device is unconfigured. */
> +             usb_autosuspend_device(dev);
> +             return ret;
> +     }
> +     usb_set_device_state(dev, USB_STATE_CONFIGURED);
> +
>       if (cp->string == NULL &&
>                       !(dev->quirks & USB_QUIRK_CONFIG_INTF_STRINGS))
>               cp->string = usb_cache_string(dev, cp->desc.iConfiguration);
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to