aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/serial/usb-serial.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/serial/usb-serial.c')
-rw-r--r--drivers/usb/serial/usb-serial.c20
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);
1083int usb_serial_resume(struct usb_interface *intf) 1090int 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}
1091EXPORT_SYMBOL(usb_serial_resume); 1103EXPORT_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
1228int usb_serial_register(struct usb_serial_driver *driver) 1239int 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)