diff options
Diffstat (limited to 'drivers/usb/serial/ftdi_sio.c')
| -rw-r--r-- | drivers/usb/serial/ftdi_sio.c | 35 | 
1 files changed, 9 insertions, 26 deletions
| diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index c867592477c9..6f2659e59b2e 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c @@ -1082,8 +1082,7 @@ static int  ftdi_tiocmset(struct tty_struct *tty,  			unsigned int set, unsigned int clear);  static int  ftdi_ioctl(struct tty_struct *tty,  			unsigned int cmd, unsigned long arg); -static int get_serial_info(struct tty_struct *tty, -				struct serial_struct *ss); +static void get_serial_info(struct tty_struct *tty, struct serial_struct *ss);  static int set_serial_info(struct tty_struct *tty,  				struct serial_struct *ss);  static void ftdi_break_ctl(struct tty_struct *tty, int break_state); @@ -1477,8 +1476,7 @@ static int read_latency_timer(struct usb_serial_port *port)  	return 0;  } -static int get_serial_info(struct tty_struct *tty, -				struct serial_struct *ss) +static void get_serial_info(struct tty_struct *tty, struct serial_struct *ss)  {  	struct usb_serial_port *port = tty->driver_data;  	struct ftdi_private *priv = usb_get_serial_port_data(port); @@ -1486,49 +1484,34 @@ static int get_serial_info(struct tty_struct *tty,  	ss->flags = priv->flags;  	ss->baud_base = priv->baud_base;  	ss->custom_divisor = priv->custom_divisor; -	return 0;  } -static int set_serial_info(struct tty_struct *tty, -	struct serial_struct *ss) +static int set_serial_info(struct tty_struct *tty, struct serial_struct *ss)  {  	struct usb_serial_port *port = tty->driver_data;  	struct ftdi_private *priv = usb_get_serial_port_data(port); -	struct ftdi_private old_priv; +	int old_flags, old_divisor;  	mutex_lock(&priv->cfg_lock); -	old_priv = *priv; - -	/* Do error checking and permission checking */  	if (!capable(CAP_SYS_ADMIN)) {  		if ((ss->flags ^ priv->flags) & ~ASYNC_USR_MASK) {  			mutex_unlock(&priv->cfg_lock);  			return -EPERM;  		} -		priv->flags = ((priv->flags & ~ASYNC_USR_MASK) | -			       (ss->flags & ASYNC_USR_MASK)); -		priv->custom_divisor = ss->custom_divisor; -		goto check_and_exit; -	} - -	if (ss->baud_base != priv->baud_base) { -		mutex_unlock(&priv->cfg_lock); -		return -EINVAL;  	} -	/* Make the changes - these are privileged changes! */ +	old_flags = priv->flags; +	old_divisor = priv->custom_divisor; -	priv->flags = ((priv->flags & ~ASYNC_FLAGS) | -					(ss->flags & ASYNC_FLAGS)); +	priv->flags = ss->flags & ASYNC_FLAGS;  	priv->custom_divisor = ss->custom_divisor; -check_and_exit:  	write_latency_timer(port); -	if ((priv->flags ^ old_priv.flags) & ASYNC_SPD_MASK || +	if ((priv->flags ^ old_flags) & ASYNC_SPD_MASK ||  			((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST && -			 priv->custom_divisor != old_priv.custom_divisor)) { +			 priv->custom_divisor != old_divisor)) {  		/* warn about deprecation unless clearing */  		if (priv->flags & ASYNC_SPD_MASK) | 
