diff options
Diffstat (limited to 'drivers/usb/gadget/u_serial.c')
| -rw-r--r-- | drivers/usb/gadget/u_serial.c | 16 | 
1 files changed, 3 insertions, 13 deletions
diff --git a/drivers/usb/gadget/u_serial.c b/drivers/usb/gadget/u_serial.c index 16bdf77f582..3e8dcb5455e 100644 --- a/drivers/usb/gadget/u_serial.c +++ b/drivers/usb/gadget/u_serial.c @@ -536,17 +536,11 @@ recycle:  		list_move(&req->list, &port->read_pool);  	} -	/* Push from tty to ldisc; this is immediate with low_latency, and -	 * may trigger callbacks to this driver ... so drop the spinlock. +	/* Push from tty to ldisc; without low_latency set this is handled by +	 * a workqueue, so we won't get callbacks and can hold port_lock  	 */  	if (tty && do_push) { -		spin_unlock_irq(&port->port_lock);  		tty_flip_buffer_push(tty); -		wake_up_interruptible(&tty->read_wait); -		spin_lock_irq(&port->port_lock); - -		/* tty may have been closed */ -		tty = port->port_tty;  	} @@ -784,11 +778,6 @@ static int gs_open(struct tty_struct *tty, struct file *file)  	port->open_count = 1;  	port->openclose = false; -	/* low_latency means ldiscs work in tasklet context, without -	 * needing a workqueue schedule ... easier to keep up. -	 */ -	tty->low_latency = 1; -  	/* if connected, start the I/O stream */  	if (port->port_usb) {  		struct gserial	*gser = port->port_usb; @@ -1195,6 +1184,7 @@ void gserial_cleanup(void)  	n_ports = 0;  	tty_unregister_driver(gs_tty_driver); +	put_tty_driver(gs_tty_driver);  	gs_tty_driver = NULL;  	pr_debug("%s: cleaned up ttyGS* support\n", __func__);  |