summaryrefslogtreecommitdiff
path: root/drivers/usb
diff options
context:
space:
mode:
authorAnshul Jain <anshulj@nvidia.com>2013-06-20 18:49:06 -0700
committerHarshada Kale <hkale@nvidia.com>2013-07-09 00:15:19 -0700
commita86069c9d23df06958e7f109dee8a35ffb5aa05c (patch)
tree4beda54522fdabcc78075e278db5f14ed3658057 /drivers/usb
parent5e6ad8db18b81de2f8d357b1c39443054059cad6 (diff)
misc: issp: Add usb js recovery mechanism
This change recovery the JS uC after USB resume failure by unloading USB, resetting uC from ISSP and then reloading USB Bug 1306389 Change-Id: I086636d4b7b91e3a2874f584fa6efbfd2cae6014 Signed-off-by: Michael Hsu <mhsu@nvidia.com> Signed-off-by: Anshul Jain <anshulj@nvidia.com> (cherry picked from commit e10f9579dbd6e3d37b127995520b9dee036be199) Reviewed-on: http://git-master/r/246314
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/core/hub.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index b1b0fe41e07b..082c3a553739 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -2569,12 +2569,12 @@ static int finish_port_resume(struct usb_device *udev)
retry_reset_resume:
status = usb_reset_and_verify_device(udev);
-/* For testing reset on every resume */
+/* For testing recover issp on every usb resume */
#if 0
if (udev->quirks & USB_QUIRK_RESET_DEVICE_ON_RESUME_FAIL) {
- extern void issp_uc_reset(void);
- dev_err(&udev->dev, "USB_QUIRK_RESET_DEVICE_ON_RESUME_FAIL\n");
- issp_uc_reset();
+ extern void issp_start_recovery_work(void);
+ dev_err(&udev->dev, "USB_QUIRK_RESET_DEVICE_ON_RESUME_FAIL - start recovery work\n");
+ issp_start_recovery_work();
/* device is gone after we reset it */
status = -ENODEV;
}
@@ -2595,10 +2595,10 @@ static int finish_port_resume(struct usb_device *udev)
dev_err(&udev->dev, "retry with reset-resume\n");
if (udev->quirks &
USB_QUIRK_RESET_DEVICE_ON_RESUME_FAIL) {
- extern void issp_uc_reset(void);
+ extern void issp_start_recovery_work(void);
dev_err(&udev->dev,
"USB_QUIRK_RESET_DEVICE_ON_RESUME_FAIL\n");
- issp_uc_reset();
+ issp_start_recovery_work();
/* device is gone after we reset it */
status = -ENODEV;
} else {
@@ -3257,11 +3257,19 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
if (hcd->driver->update_device)
hcd->driver->update_device(hcd, udev);
fail:
- if (retval) {
+ if (retval &&
+ !(udev->quirks & USB_QUIRK_RESET_DEVICE_ON_RESUME_FAIL)) {
hub_port_disable(hub, port1, 0);
update_devnum(udev, devnum); /* for disconnect processing */
}
mutex_unlock(&usb_address0_mutex);
+
+ if (udev->quirks & USB_QUIRK_RESET_DEVICE_ON_RESUME_FAIL) {
+ dev_err(&udev->dev, "Reset device-failure to recover from err\n");
+ extern void issp_start_recovery_work(void);
+ issp_start_recovery_work();
+ retval = 0;
+ }
return retval;
}