| From 249719121bc2b841bdfcab5eb21b10d8b871743b Mon Sep 17 00:00:00 2001 |
| From: Sarah Sharp <sarah.a.sharp@linux.intel.com> |
| Date: Thu, 5 Jul 2012 14:09:30 -0700 |
| Subject: USB: Fix LPM disable count mismatch on driver unbind. |
| |
| From: Sarah Sharp <sarah.a.sharp@linux.intel.com> |
| |
| commit 249719121bc2b841bdfcab5eb21b10d8b871743b upstream. |
| |
| When a user runs `echo 0 > bConfigurationValue` for a USB 3.0 device, |
| usb_disable_device() is called. This function disables all drivers, |
| deallocates interfaces, and sets the device configuration value to 0 |
| (unconfigured). |
| |
| With the new scheme to ensure that unconfigured devices have LPM |
| disabled, usb_disable_device() must call usb_unlocked_disable_lpm() once |
| it unconfigures the device. |
| |
| This commit should be backported to kernels as old as 3.5, that contain |
| the commit 8306095fd2c1100e8244c09bf560f97aca5a311d "USB: Disable USB |
| 3.0 LPM in critical sections." |
| |
| Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/usb/core/message.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| --- a/drivers/usb/core/message.c |
| +++ b/drivers/usb/core/message.c |
| @@ -1174,6 +1174,7 @@ void usb_disable_device(struct usb_devic |
| put_device(&dev->actconfig->interface[i]->dev); |
| dev->actconfig->interface[i] = NULL; |
| } |
| + usb_unlocked_disable_lpm(dev); |
| dev->actconfig = NULL; |
| if (dev->state == USB_STATE_CONFIGURED) |
| usb_set_device_state(dev, USB_STATE_ADDRESS); |