diff options
Diffstat (limited to 'drivers/tty/amiserial.c')
| -rw-r--r-- | drivers/tty/amiserial.c | 33 | 
1 files changed, 21 insertions, 12 deletions
| diff --git a/drivers/tty/amiserial.c b/drivers/tty/amiserial.c index 18b78ea110ef..ca48ce5a0862 100644 --- a/drivers/tty/amiserial.c +++ b/drivers/tty/amiserial.c @@ -937,15 +937,21 @@ static void rs_unthrottle(struct tty_struct * tty)  static int get_serial_info(struct tty_struct *tty, struct serial_struct *ss)  {  	struct serial_state *state = tty->driver_data; +	unsigned int close_delay, closing_wait;  	tty_lock(tty); +	close_delay = jiffies_to_msecs(state->tport.close_delay) / 10; +	closing_wait = state->tport.closing_wait; +	if (closing_wait != ASYNC_CLOSING_WAIT_NONE) +		closing_wait = jiffies_to_msecs(closing_wait) / 10; +  	ss->line = tty->index;  	ss->port = state->port;  	ss->flags = state->tport.flags;  	ss->xmit_fifo_size = state->xmit_fifo_size;  	ss->baud_base = state->baud_base; -	ss->close_delay = state->tport.close_delay; -	ss->closing_wait = state->tport.closing_wait; +	ss->close_delay = close_delay; +	ss->closing_wait = closing_wait;  	ss->custom_divisor = state->custom_divisor;  	tty_unlock(tty);  	return 0; @@ -957,6 +963,7 @@ static int set_serial_info(struct tty_struct *tty, struct serial_struct *ss)  	struct tty_port *port = &state->tport;  	bool change_spd;  	int 			retval = 0; +	unsigned int close_delay, closing_wait;  	tty_lock(tty);  	change_spd = ((ss->flags ^ port->flags) & ASYNC_SPD_MASK) || @@ -966,10 +973,16 @@ static int set_serial_info(struct tty_struct *tty, struct serial_struct *ss)  		tty_unlock(tty);  		return -EINVAL;  	} -   + +	close_delay = msecs_to_jiffies(ss->close_delay * 10); +	closing_wait = ss->closing_wait; +	if (closing_wait != ASYNC_CLOSING_WAIT_NONE) +		closing_wait = msecs_to_jiffies(closing_wait * 10); +  	if (!serial_isroot()) {  		if ((ss->baud_base != state->baud_base) || -		    (ss->close_delay != port->close_delay) || +		    (close_delay != port->close_delay) || +		    (closing_wait != port->closing_wait) ||  		    (ss->xmit_fifo_size != state->xmit_fifo_size) ||  		    ((ss->flags & ~ASYNC_USR_MASK) !=  		     (port->flags & ~ASYNC_USR_MASK))) { @@ -996,8 +1009,8 @@ static int set_serial_info(struct tty_struct *tty, struct serial_struct *ss)  	port->flags = ((port->flags & ~ASYNC_FLAGS) |  			(ss->flags & ASYNC_FLAGS));  	state->custom_divisor = ss->custom_divisor; -	port->close_delay = ss->close_delay * HZ/100; -	port->closing_wait = ss->closing_wait * HZ/100; +	port->close_delay = close_delay; +	port->closing_wait = closing_wait;  check_and_exit:  	if (tty_port_initialized(port)) { @@ -1622,21 +1635,17 @@ fail_put_tty_driver:  static int __exit amiga_serial_remove(struct platform_device *pdev)  { -	int error;  	struct serial_state *state = platform_get_drvdata(pdev);  	/* printk("Unloading %s: version %s\n", serial_name, serial_version); */ -	error = tty_unregister_driver(serial_driver); -	if (error) -		printk("SERIAL: failed to unregister serial driver (%d)\n", -		       error); +	tty_unregister_driver(serial_driver);  	put_tty_driver(serial_driver);  	tty_port_destroy(&state->tport);  	free_irq(IRQ_AMIGA_TBE, state);  	free_irq(IRQ_AMIGA_RBF, state); -	return error; +	return 0;  }  static struct platform_driver amiga_serial_driver = { | 
