diff options
Diffstat (limited to 'drivers/usb/serial/ssu100.c')
| -rw-r--r-- | drivers/usb/serial/ssu100.c | 100 | 
1 files changed, 11 insertions, 89 deletions
diff --git a/drivers/usb/serial/ssu100.c b/drivers/usb/serial/ssu100.c index 4b2a19757b4..5b62dbbdf99 100644 --- a/drivers/usb/serial/ssu100.c +++ b/drivers/usb/serial/ssu100.c @@ -61,7 +61,6 @@ struct ssu100_port_private {  	spinlock_t status_lock;  	u8 shadowLSR;  	u8 shadowMSR; -	struct async_icount icount;  };  static inline int ssu100_control_msg(struct usb_device *dev, @@ -315,11 +314,6 @@ static int ssu100_open(struct tty_struct *tty, struct usb_serial_port *port)  	return usb_serial_generic_open(tty, port);  } -static void ssu100_close(struct usb_serial_port *port) -{ -	usb_serial_generic_close(port); -} -  static int get_serial_info(struct usb_serial_port *port,  			   struct serial_struct __user *retinfo)  { @@ -343,73 +337,6 @@ static int get_serial_info(struct usb_serial_port *port,  	return 0;  } -static int wait_modem_info(struct usb_serial_port *port, unsigned int arg) -{ -	struct ssu100_port_private *priv = usb_get_serial_port_data(port); -	struct async_icount prev, cur; -	unsigned long flags; - -	spin_lock_irqsave(&priv->status_lock, flags); -	prev = priv->icount; -	spin_unlock_irqrestore(&priv->status_lock, flags); - -	while (1) { -		wait_event_interruptible(port->delta_msr_wait, -					 (port->serial->disconnected || -					  (priv->icount.rng != prev.rng) || -					  (priv->icount.dsr != prev.dsr) || -					  (priv->icount.dcd != prev.dcd) || -					  (priv->icount.cts != prev.cts))); - -		if (signal_pending(current)) -			return -ERESTARTSYS; - -		if (port->serial->disconnected) -			return -EIO; - -		spin_lock_irqsave(&priv->status_lock, flags); -		cur = priv->icount; -		spin_unlock_irqrestore(&priv->status_lock, flags); - -		if ((prev.rng == cur.rng) && -		    (prev.dsr == cur.dsr) && -		    (prev.dcd == cur.dcd) && -		    (prev.cts == cur.cts)) -			return -EIO; - -		if ((arg & TIOCM_RNG && (prev.rng != cur.rng)) || -		    (arg & TIOCM_DSR && (prev.dsr != cur.dsr)) || -		    (arg & TIOCM_CD  && (prev.dcd != cur.dcd)) || -		    (arg & TIOCM_CTS && (prev.cts != cur.cts))) -			return 0; -	} -	return 0; -} - -static int ssu100_get_icount(struct tty_struct *tty, -			struct serial_icounter_struct *icount) -{ -	struct usb_serial_port *port = tty->driver_data; -	struct ssu100_port_private *priv = usb_get_serial_port_data(port); -	struct async_icount cnow = priv->icount; - -	icount->cts = cnow.cts; -	icount->dsr = cnow.dsr; -	icount->rng = cnow.rng; -	icount->dcd = cnow.dcd; -	icount->rx = cnow.rx; -	icount->tx = cnow.tx; -	icount->frame = cnow.frame; -	icount->overrun = cnow.overrun; -	icount->parity = cnow.parity; -	icount->brk = cnow.brk; -	icount->buf_overrun = cnow.buf_overrun; - -	return 0; -} - - -  static int ssu100_ioctl(struct tty_struct *tty,  		    unsigned int cmd, unsigned long arg)  { @@ -421,10 +348,6 @@ static int ssu100_ioctl(struct tty_struct *tty,  	case TIOCGSERIAL:  		return get_serial_info(port,  				       (struct serial_struct __user *) arg); - -	case TIOCMIWAIT: -		return wait_modem_info(port, arg); -  	default:  		break;  	} @@ -532,14 +455,14 @@ static void ssu100_update_msr(struct usb_serial_port *port, u8 msr)  	if (msr & UART_MSR_ANY_DELTA) {  		/* update input line counters */  		if (msr & UART_MSR_DCTS) -			priv->icount.cts++; +			port->icount.cts++;  		if (msr & UART_MSR_DDSR) -			priv->icount.dsr++; +			port->icount.dsr++;  		if (msr & UART_MSR_DDCD) -			priv->icount.dcd++; +			port->icount.dcd++;  		if (msr & UART_MSR_TERI) -			priv->icount.rng++; -		wake_up_interruptible(&port->delta_msr_wait); +			port->icount.rng++; +		wake_up_interruptible(&port->port.delta_msr_wait);  	}  } @@ -558,22 +481,22 @@ static void ssu100_update_lsr(struct usb_serial_port *port, u8 lsr,  		/* we always want to update icount, but we only want to  		 * update tty_flag for one case */  		if (lsr & UART_LSR_BI) { -			priv->icount.brk++; +			port->icount.brk++;  			*tty_flag = TTY_BREAK;  			usb_serial_handle_break(port);  		}  		if (lsr & UART_LSR_PE) { -			priv->icount.parity++; +			port->icount.parity++;  			if (*tty_flag == TTY_NORMAL)  				*tty_flag = TTY_PARITY;  		}  		if (lsr & UART_LSR_FE) { -			priv->icount.frame++; +			port->icount.frame++;  			if (*tty_flag == TTY_NORMAL)  				*tty_flag = TTY_FRAME;  		}  		if (lsr & UART_LSR_OE){ -			priv->icount.overrun++; +			port->icount.overrun++;  			if (*tty_flag == TTY_NORMAL)  				*tty_flag = TTY_OVERRUN;  		} @@ -630,7 +553,6 @@ static struct usb_serial_driver ssu100_device = {  	.id_table	     = id_table,  	.num_ports	     = 1,  	.open		     = ssu100_open, -	.close		     = ssu100_close,  	.attach              = ssu100_attach,  	.port_probe          = ssu100_port_probe,  	.port_remove         = ssu100_port_remove, @@ -638,10 +560,10 @@ static struct usb_serial_driver ssu100_device = {  	.process_read_urb    = ssu100_process_read_urb,  	.tiocmget            = ssu100_tiocmget,  	.tiocmset            = ssu100_tiocmset, -	.get_icount	     = ssu100_get_icount, +	.tiocmiwait          = usb_serial_generic_tiocmiwait, +	.get_icount	     = usb_serial_generic_get_icount,  	.ioctl               = ssu100_ioctl,  	.set_termios         = ssu100_set_termios, -	.disconnect          = usb_serial_generic_disconnect,  };  static struct usb_serial_driver * const serial_drivers[] = {  |