USB: fix endpoint-disabling for failed config changes

This patch (as1631) fixes a bug that shows up when a config change
fails
for a device under an xHCI controller.  The controller needs to
be told
to disable the endpoints that have been enabled for the new
config.  The
existing code does this, but before storing the
information about which
endpoints were enabled!  As a result, any
second attempt to install the
new config is doomed to fail because
xhci-hcd will refuse to enable an
endpoint that is already enabled.

The patch optimistically initializes
the new endpoints' device
structures before asking the device to switch
to the new config.  If
the request fails then the endpoint information
is already stored, so
we can use usb_hcd_alloc_bandwidth() to disable
the endpoints with no
trouble.  The rest of the error path is slightly
more complex now; we
have to disable the new interfaces and call
put_device() rather than
simply deallocating them.

Signed-off-by: Alan
Stern <stern@rowland.harvard.edu>
Reported-and-tested-by: Matthias
Schniedermeyer <ms@citd.de>
CC: Sarah Sharp
<sarah.a.sharp@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman
<gregkh@linuxfoundation.org>
[bwh: Backported to 3.2: adjust
context]
Signed-off-by: Ben Hutchings
<ben@decadent.org.uk>
Signed-off-by: Greg Kroah-Hartman
<gregkh@linuxfoundation.org>

Conflicts:

drivers/usb/core/message.c

idea is taken here -
https://github.com/varunchitre15/thunderzap_xl/commit/882f0b78c3fba8f858570d08d2431299f2218a64