diff options
Diffstat (limited to 'drivers/usb/serial/usb-serial.c')
| -rw-r--r-- | drivers/usb/serial/usb-serial.c | 61 | 
1 files changed, 26 insertions, 35 deletions
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 6091bd5a1f4..02de3110fe9 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c @@ -405,7 +405,7 @@ static int serial_ioctl(struct tty_struct *tty,  	struct usb_serial_port *port = tty->driver_data;  	int retval = -ENOIOCTLCMD; -	dev_dbg(tty->dev, "%s - cmd 0x%.4x\n", __func__, cmd); +	dev_dbg(tty->dev, "%s - cmd 0x%04x\n", __func__, cmd);  	switch (cmd) {  	case TIOCMIWAIT: @@ -868,7 +868,7 @@ static int usb_serial_probe(struct usb_interface *interface,  	max_endpoints = max(max_endpoints, (int)serial->num_ports);  	serial->num_port_pointers = max_endpoints; -	dev_dbg(ddev, "setting up %d port structures for this device", max_endpoints); +	dev_dbg(ddev, "setting up %d port structure(s)\n", max_endpoints);  	for (i = 0; i < max_endpoints; ++i) {  		port = kzalloc(sizeof(struct usb_serial_port), GFP_KERNEL);  		if (!port) @@ -923,9 +923,8 @@ static int usb_serial_probe(struct usb_interface *interface,  		port = serial->port[i];  		if (kfifo_alloc(&port->write_fifo, PAGE_SIZE, GFP_KERNEL))  			goto probe_error; -		buffer_size = serial->type->bulk_out_size; -		if (!buffer_size) -			buffer_size = usb_endpoint_maxp(endpoint); +		buffer_size = max_t(int, serial->type->bulk_out_size, +						usb_endpoint_maxp(endpoint));  		port->bulk_out_size = buffer_size;  		port->bulk_out_endpointAddress = endpoint->bEndpointAddress; @@ -1034,7 +1033,7 @@ static int usb_serial_probe(struct usb_interface *interface,  	for (i = 0; i < num_ports; ++i) {  		port = serial->port[i];  		dev_set_name(&port->dev, "ttyUSB%d", port->minor); -		dev_dbg(ddev, "registering %s", dev_name(&port->dev)); +		dev_dbg(ddev, "registering %s\n", dev_name(&port->dev));  		device_enable_async_suspend(&port->dev);  		retval = device_add(&port->dev); @@ -1061,6 +1060,7 @@ static void usb_serial_disconnect(struct usb_interface *interface)  	struct usb_serial *serial = usb_get_intfdata(interface);  	struct device *dev = &interface->dev;  	struct usb_serial_port *port; +	struct tty_struct *tty;  	usb_serial_console_disconnect(serial); @@ -1071,18 +1071,16 @@ static void usb_serial_disconnect(struct usb_interface *interface)  	for (i = 0; i < serial->num_ports; ++i) {  		port = serial->port[i]; -		if (port) { -			struct tty_struct *tty = tty_port_tty_get(&port->port); -			if (tty) { -				tty_vhangup(tty); -				tty_kref_put(tty); -			} -			usb_serial_port_poison_urbs(port); -			wake_up_interruptible(&port->port.delta_msr_wait); -			cancel_work_sync(&port->work); -			if (device_is_registered(&port->dev)) -				device_del(&port->dev); +		tty = tty_port_tty_get(&port->port); +		if (tty) { +			tty_vhangup(tty); +			tty_kref_put(tty);  		} +		usb_serial_port_poison_urbs(port); +		wake_up_interruptible(&port->port.delta_msr_wait); +		cancel_work_sync(&port->work); +		if (device_is_registered(&port->dev)) +			device_del(&port->dev);  	}  	if (serial->type->disconnect)  		serial->type->disconnect(serial); @@ -1095,7 +1093,6 @@ static void usb_serial_disconnect(struct usb_interface *interface)  int usb_serial_suspend(struct usb_interface *intf, pm_message_t message)  {  	struct usb_serial *serial = usb_get_intfdata(intf); -	struct usb_serial_port *port;  	int i, r = 0;  	serial->suspending = 1; @@ -1113,12 +1110,8 @@ int usb_serial_suspend(struct usb_interface *intf, pm_message_t message)  		}  	} -	for (i = 0; i < serial->num_ports; ++i) { -		port = serial->port[i]; -		if (port) -			usb_serial_port_poison_urbs(port); -	} - +	for (i = 0; i < serial->num_ports; ++i) +		usb_serial_port_poison_urbs(serial->port[i]);  err_out:  	return r;  } @@ -1126,14 +1119,10 @@ EXPORT_SYMBOL(usb_serial_suspend);  static void usb_serial_unpoison_port_urbs(struct usb_serial *serial)  { -	struct usb_serial_port *port;  	int i; -	for (i = 0; i < serial->num_ports; ++i) { -		port = serial->port[i]; -		if (port) -			usb_serial_port_unpoison_urbs(port); -	} +	for (i = 0; i < serial->num_ports; ++i) +		usb_serial_port_unpoison_urbs(serial->port[i]);  }  int usb_serial_resume(struct usb_interface *intf) @@ -1161,9 +1150,9 @@ static int usb_serial_reset_resume(struct usb_interface *intf)  	usb_serial_unpoison_port_urbs(serial);  	serial->suspending = 0; -	if (serial->type->reset_resume) +	if (serial->type->reset_resume) {  		rv = serial->type->reset_resume(serial); -	else { +	} else {  		rv = -EOPNOTSUPP;  		intf->needs_binding = 1;  	} @@ -1338,9 +1327,9 @@ static int usb_serial_register(struct usb_serial_driver *driver)  	if (retval) {  		pr_err("problem %d when registering driver %s\n", retval, driver->description);  		list_del(&driver->driver_list); -	} else +	} else {  		pr_info("USB Serial support registered for %s\n", driver->description); - +	}  	mutex_unlock(&table_lock);  	return retval;  } @@ -1348,10 +1337,12 @@ static int usb_serial_register(struct usb_serial_driver *driver)  static void usb_serial_deregister(struct usb_serial_driver *device)  {  	pr_info("USB Serial deregistering driver %s\n", device->description); +  	mutex_lock(&table_lock);  	list_del(&device->driver_list); -	usb_serial_bus_deregister(device);  	mutex_unlock(&table_lock); + +	usb_serial_bus_deregister(device);  }  /**  | 
