diff options
| -rw-r--r-- | drivers/usb/core/quirks.c | 6 | ||||
| -rw-r--r-- | drivers/usb/storage/scsiglue.c | 13 | ||||
| -rw-r--r-- | drivers/usb/storage/usb.c | 27 |
3 files changed, 17 insertions, 29 deletions
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c index 7f17d0fd76c0..ebf3dc20110a 100644 --- a/drivers/usb/core/quirks.c +++ b/drivers/usb/core/quirks.c | |||
| @@ -152,4 +152,10 @@ void usb_detect_quirks(struct usb_device *udev) | |||
| 152 | /* do any special quirk handling here if needed */ | 152 | /* do any special quirk handling here if needed */ |
| 153 | if (udev->quirks & USB_QUIRK_NO_AUTOSUSPEND) | 153 | if (udev->quirks & USB_QUIRK_NO_AUTOSUSPEND) |
| 154 | usb_autosuspend_quirk(udev); | 154 | usb_autosuspend_quirk(udev); |
| 155 | |||
| 156 | /* By default, disable autosuspend for all non-hubs */ | ||
| 157 | #ifdef CONFIG_USB_SUSPEND | ||
| 158 | if (udev->descriptor.bDeviceClass != USB_CLASS_HUB) | ||
| 159 | udev->autosuspend_delay = -1; | ||
| 160 | #endif | ||
| 155 | } | 161 | } |
diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c index 47e56079925d..1ba19eaa1970 100644 --- a/drivers/usb/storage/scsiglue.c +++ b/drivers/usb/storage/scsiglue.c | |||
| @@ -285,15 +285,10 @@ static int device_reset(struct scsi_cmnd *srb) | |||
| 285 | 285 | ||
| 286 | US_DEBUGP("%s called\n", __FUNCTION__); | 286 | US_DEBUGP("%s called\n", __FUNCTION__); |
| 287 | 287 | ||
| 288 | result = usb_autopm_get_interface(us->pusb_intf); | 288 | /* lock the device pointers and do the reset */ |
| 289 | if (result == 0) { | 289 | mutex_lock(&(us->dev_mutex)); |
| 290 | 290 | result = us->transport_reset(us); | |
| 291 | /* lock the device pointers and do the reset */ | 291 | mutex_unlock(&us->dev_mutex); |
| 292 | mutex_lock(&(us->dev_mutex)); | ||
| 293 | result = us->transport_reset(us); | ||
| 294 | mutex_unlock(&us->dev_mutex); | ||
| 295 | usb_autopm_put_interface(us->pusb_intf); | ||
| 296 | } | ||
| 297 | 292 | ||
| 298 | return result < 0 ? FAILED : SUCCESS; | 293 | return result < 0 ? FAILED : SUCCESS; |
| 299 | } | 294 | } |
diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index 25e557d4fe6b..59181667066c 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c | |||
| @@ -184,14 +184,16 @@ static int storage_suspend(struct usb_interface *iface, pm_message_t message) | |||
| 184 | { | 184 | { |
| 185 | struct us_data *us = usb_get_intfdata(iface); | 185 | struct us_data *us = usb_get_intfdata(iface); |
| 186 | 186 | ||
| 187 | US_DEBUGP("%s\n", __FUNCTION__); | ||
| 188 | |||
| 189 | /* Wait until no command is running */ | 187 | /* Wait until no command is running */ |
| 190 | mutex_lock(&us->dev_mutex); | 188 | mutex_lock(&us->dev_mutex); |
| 191 | 189 | ||
| 190 | US_DEBUGP("%s\n", __FUNCTION__); | ||
| 192 | if (us->suspend_resume_hook) | 191 | if (us->suspend_resume_hook) |
| 193 | (us->suspend_resume_hook)(us, US_SUSPEND); | 192 | (us->suspend_resume_hook)(us, US_SUSPEND); |
| 194 | 193 | ||
| 194 | /* When runtime PM is working, we'll set a flag to indicate | ||
| 195 | * whether we should autoresume when a SCSI request arrives. */ | ||
| 196 | |||
| 195 | mutex_unlock(&us->dev_mutex); | 197 | mutex_unlock(&us->dev_mutex); |
| 196 | return 0; | 198 | return 0; |
| 197 | } | 199 | } |
| @@ -200,11 +202,13 @@ static int storage_resume(struct usb_interface *iface) | |||
| 200 | { | 202 | { |
| 201 | struct us_data *us = usb_get_intfdata(iface); | 203 | struct us_data *us = usb_get_intfdata(iface); |
| 202 | 204 | ||
| 203 | US_DEBUGP("%s\n", __FUNCTION__); | 205 | mutex_lock(&us->dev_mutex); |
| 204 | 206 | ||
| 207 | US_DEBUGP("%s\n", __FUNCTION__); | ||
| 205 | if (us->suspend_resume_hook) | 208 | if (us->suspend_resume_hook) |
| 206 | (us->suspend_resume_hook)(us, US_RESUME); | 209 | (us->suspend_resume_hook)(us, US_RESUME); |
| 207 | 210 | ||
| 211 | mutex_unlock(&us->dev_mutex); | ||
| 208 | return 0; | 212 | return 0; |
| 209 | } | 213 | } |
| 210 | 214 | ||
| @@ -302,7 +306,6 @@ static int usb_stor_control_thread(void * __us) | |||
| 302 | { | 306 | { |
| 303 | struct us_data *us = (struct us_data *)__us; | 307 | struct us_data *us = (struct us_data *)__us; |
| 304 | struct Scsi_Host *host = us_to_host(us); | 308 | struct Scsi_Host *host = us_to_host(us); |
| 305 | int autopm_rc; | ||
| 306 | 309 | ||
| 307 | for(;;) { | 310 | for(;;) { |
| 308 | US_DEBUGP("*** thread sleeping.\n"); | 311 | US_DEBUGP("*** thread sleeping.\n"); |
| @@ -311,9 +314,6 @@ static int usb_stor_control_thread(void * __us) | |||
| 311 | 314 | ||
| 312 | US_DEBUGP("*** thread awakened.\n"); | 315 | US_DEBUGP("*** thread awakened.\n"); |
| 313 | 316 | ||
| 314 | /* Autoresume the device */ | ||
| 315 | autopm_rc = usb_autopm_get_interface(us->pusb_intf); | ||
| 316 | |||
| 317 | /* lock the device pointers */ | 317 | /* lock the device pointers */ |
| 318 | mutex_lock(&(us->dev_mutex)); | 318 | mutex_lock(&(us->dev_mutex)); |
| 319 | 319 | ||
| @@ -372,12 +372,6 @@ static int usb_stor_control_thread(void * __us) | |||
| 372 | us->srb->result = SAM_STAT_GOOD; | 372 | us->srb->result = SAM_STAT_GOOD; |
| 373 | } | 373 | } |
| 374 | 374 | ||
| 375 | /* Did the autoresume fail? */ | ||
| 376 | else if (autopm_rc < 0) { | ||
| 377 | US_DEBUGP("Could not wake device\n"); | ||
| 378 | us->srb->result = DID_ERROR << 16; | ||
| 379 | } | ||
| 380 | |||
| 381 | /* we've got a command, let's do it! */ | 375 | /* we've got a command, let's do it! */ |
| 382 | else { | 376 | else { |
| 383 | US_DEBUG(usb_stor_show_command(us->srb)); | 377 | US_DEBUG(usb_stor_show_command(us->srb)); |
| @@ -420,10 +414,6 @@ SkipForAbort: | |||
| 420 | 414 | ||
| 421 | /* unlock the device pointers */ | 415 | /* unlock the device pointers */ |
| 422 | mutex_unlock(&us->dev_mutex); | 416 | mutex_unlock(&us->dev_mutex); |
| 423 | |||
| 424 | /* Start an autosuspend */ | ||
| 425 | if (autopm_rc == 0) | ||
| 426 | usb_autopm_put_interface(us->pusb_intf); | ||
| 427 | } /* for (;;) */ | 417 | } /* for (;;) */ |
| 428 | 418 | ||
| 429 | /* Wait until we are told to stop */ | 419 | /* Wait until we are told to stop */ |
| @@ -941,7 +931,6 @@ retry: | |||
| 941 | /* Should we unbind if no devices were detected? */ | 931 | /* Should we unbind if no devices were detected? */ |
| 942 | } | 932 | } |
| 943 | 933 | ||
| 944 | usb_autopm_put_interface(us->pusb_intf); | ||
| 945 | complete_and_exit(&us->scanning_done, 0); | 934 | complete_and_exit(&us->scanning_done, 0); |
| 946 | } | 935 | } |
| 947 | 936 | ||
| @@ -1027,7 +1016,6 @@ static int storage_probe(struct usb_interface *intf, | |||
| 1027 | goto BadDevice; | 1016 | goto BadDevice; |
| 1028 | } | 1017 | } |
| 1029 | 1018 | ||
| 1030 | usb_autopm_get_interface(intf); /* dropped in the scanning thread */ | ||
| 1031 | wake_up_process(th); | 1019 | wake_up_process(th); |
| 1032 | 1020 | ||
| 1033 | return 0; | 1021 | return 0; |
| @@ -1065,7 +1053,6 @@ static struct usb_driver usb_storage_driver = { | |||
| 1065 | .pre_reset = storage_pre_reset, | 1053 | .pre_reset = storage_pre_reset, |
| 1066 | .post_reset = storage_post_reset, | 1054 | .post_reset = storage_post_reset, |
| 1067 | .id_table = storage_usb_ids, | 1055 | .id_table = storage_usb_ids, |
| 1068 | .supports_autosuspend = 1, | ||
| 1069 | }; | 1056 | }; |
| 1070 | 1057 | ||
| 1071 | static int __init usb_stor_init(void) | 1058 | static int __init usb_stor_init(void) |
