diff options
Diffstat (limited to 'drivers/usb/serial/usb-serial.c')
| -rw-r--r-- | drivers/usb/serial/usb-serial.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index cfcfd5ab06ce..742a5bc44be8 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c | |||
| @@ -204,6 +204,11 @@ static int serial_open (struct tty_struct *tty, struct file *filp) | |||
| 204 | goto bailout_kref_put; | 204 | goto bailout_kref_put; |
| 205 | } | 205 | } |
| 206 | 206 | ||
| 207 | if (port->serial->disconnected) { | ||
| 208 | retval = -ENODEV; | ||
| 209 | goto bailout_kref_put; | ||
| 210 | } | ||
| 211 | |||
| 207 | if (mutex_lock_interruptible(&port->mutex)) { | 212 | if (mutex_lock_interruptible(&port->mutex)) { |
| 208 | retval = -ERESTARTSYS; | 213 | retval = -ERESTARTSYS; |
| 209 | goto bailout_kref_put; | 214 | goto bailout_kref_put; |
| @@ -1067,6 +1072,8 @@ int usb_serial_suspend(struct usb_interface *intf, pm_message_t message) | |||
| 1067 | struct usb_serial_port *port; | 1072 | struct usb_serial_port *port; |
| 1068 | int i, r = 0; | 1073 | int i, r = 0; |
| 1069 | 1074 | ||
| 1075 | serial->suspending = 1; | ||
| 1076 | |||
| 1070 | for (i = 0; i < serial->num_ports; ++i) { | 1077 | for (i = 0; i < serial->num_ports; ++i) { |
| 1071 | port = serial->port[i]; | 1078 | port = serial->port[i]; |
| 1072 | if (port) | 1079 | if (port) |
| @@ -1083,10 +1090,15 @@ EXPORT_SYMBOL(usb_serial_suspend); | |||
| 1083 | int usb_serial_resume(struct usb_interface *intf) | 1090 | int usb_serial_resume(struct usb_interface *intf) |
| 1084 | { | 1091 | { |
| 1085 | struct usb_serial *serial = usb_get_intfdata(intf); | 1092 | struct usb_serial *serial = usb_get_intfdata(intf); |
| 1093 | int rv; | ||
| 1086 | 1094 | ||
| 1095 | serial->suspending = 0; | ||
| 1087 | if (serial->type->resume) | 1096 | if (serial->type->resume) |
| 1088 | return serial->type->resume(serial); | 1097 | rv = serial->type->resume(serial); |
| 1089 | return 0; | 1098 | else |
| 1099 | rv = usb_serial_generic_resume(serial); | ||
| 1100 | |||
| 1101 | return rv; | ||
| 1090 | } | 1102 | } |
| 1091 | EXPORT_SYMBOL(usb_serial_resume); | 1103 | EXPORT_SYMBOL(usb_serial_resume); |
| 1092 | 1104 | ||
| @@ -1222,7 +1234,6 @@ static void fixup_generic(struct usb_serial_driver *device) | |||
| 1222 | set_to_generic_if_null(device, read_bulk_callback); | 1234 | set_to_generic_if_null(device, read_bulk_callback); |
| 1223 | set_to_generic_if_null(device, write_bulk_callback); | 1235 | set_to_generic_if_null(device, write_bulk_callback); |
| 1224 | set_to_generic_if_null(device, shutdown); | 1236 | set_to_generic_if_null(device, shutdown); |
| 1225 | set_to_generic_if_null(device, resume); | ||
| 1226 | } | 1237 | } |
| 1227 | 1238 | ||
| 1228 | int usb_serial_register(struct usb_serial_driver *driver) | 1239 | int usb_serial_register(struct usb_serial_driver *driver) |
| @@ -1230,6 +1241,9 @@ int usb_serial_register(struct usb_serial_driver *driver) | |||
| 1230 | /* must be called with BKL held */ | 1241 | /* must be called with BKL held */ |
| 1231 | int retval; | 1242 | int retval; |
| 1232 | 1243 | ||
| 1244 | if (usb_disabled()) | ||
| 1245 | return -ENODEV; | ||
| 1246 | |||
| 1233 | fixup_generic(driver); | 1247 | fixup_generic(driver); |
| 1234 | 1248 | ||
| 1235 | if (!driver->description) | 1249 | if (!driver->description) |
