diff options
author | Oliver Neukum <oliver@neukum.org> | 2011-02-11 06:56:40 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-02-17 13:51:13 -0500 |
commit | 5b7c1178eb94f31a0199c3b361722775c54a8db3 (patch) | |
tree | 5e60fbbb251e7314be629679b73fee7b36111cfa /drivers/usb/serial | |
parent | 9a91aedca2f4ef24344b7cd8f56570e620fbe4d5 (diff) |
USB: sierra: error handling in runtime PM
resumption of devices can fail. Errors must be handled.
Signed-off-by: Oliver Neukum <oneukum@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/serial')
-rw-r--r-- | drivers/usb/serial/sierra.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c index 7481ff8a49e4..2436796e117b 100644 --- a/drivers/usb/serial/sierra.c +++ b/drivers/usb/serial/sierra.c | |||
@@ -373,7 +373,10 @@ static int sierra_send_setup(struct usb_serial_port *port) | |||
373 | if (!do_send) | 373 | if (!do_send) |
374 | return 0; | 374 | return 0; |
375 | 375 | ||
376 | usb_autopm_get_interface(serial->interface); | 376 | retval = usb_autopm_get_interface(serial->interface); |
377 | if (retval < 0) | ||
378 | return retval; | ||
379 | |||
377 | retval = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), | 380 | retval = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), |
378 | 0x22, 0x21, val, interface, NULL, 0, USB_CTRL_SET_TIMEOUT); | 381 | 0x22, 0x21, val, interface, NULL, 0, USB_CTRL_SET_TIMEOUT); |
379 | usb_autopm_put_interface(serial->interface); | 382 | usb_autopm_put_interface(serial->interface); |
@@ -808,8 +811,12 @@ static void sierra_close(struct usb_serial_port *port) | |||
808 | mutex_lock(&serial->disc_mutex); | 811 | mutex_lock(&serial->disc_mutex); |
809 | if (!serial->disconnected) { | 812 | if (!serial->disconnected) { |
810 | serial->interface->needs_remote_wakeup = 0; | 813 | serial->interface->needs_remote_wakeup = 0; |
811 | usb_autopm_get_interface(serial->interface); | 814 | /* odd error handling due to pm counters */ |
812 | sierra_send_setup(port); | 815 | if (!usb_autopm_get_interface(serial->interface)) |
816 | sierra_send_setup(port); | ||
817 | else | ||
818 | usb_autopm_get_interface_no_resume(serial->interface); | ||
819 | |||
813 | } | 820 | } |
814 | mutex_unlock(&serial->disc_mutex); | 821 | mutex_unlock(&serial->disc_mutex); |
815 | spin_lock_irq(&intfdata->susp_lock); | 822 | spin_lock_irq(&intfdata->susp_lock); |
@@ -862,7 +869,8 @@ static int sierra_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
862 | /* get rid of everything as in close */ | 869 | /* get rid of everything as in close */ |
863 | sierra_close(port); | 870 | sierra_close(port); |
864 | /* restore balance for autopm */ | 871 | /* restore balance for autopm */ |
865 | usb_autopm_put_interface(serial->interface); | 872 | if (!serial->disconnected) |
873 | usb_autopm_put_interface(serial->interface); | ||
866 | return err; | 874 | return err; |
867 | } | 875 | } |
868 | sierra_send_setup(port); | 876 | sierra_send_setup(port); |