From 73330824f4a581ba16926a29cd63056f1cc1b502 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 23 Apr 2003 03:37:29 -0700 Subject: [PATCH] [PATCH] USB: digi_acceleport: add support for new tty tiocmget and tiocmset functions. --- drivers/usb/serial/digi_acceleport.c | 62 +++++++++++++++++----------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c index 8d5db2732654d..48feb4898cf3f 100644 --- a/drivers/usb/serial/digi_acceleport.c +++ b/drivers/usb/serial/digi_acceleport.c @@ -460,6 +460,9 @@ static void digi_set_termios( struct usb_serial_port *port, static void digi_break_ctl( struct usb_serial_port *port, int break_state ); static int digi_ioctl( struct usb_serial_port *port, struct file *file, unsigned int cmd, unsigned long arg ); +static int digi_tiocmget( struct usb_serial_port *port, struct file *file ); +static int digi_tiocmset( struct usb_serial_port *port, struct file *file, + unsigned int set, unsigned int clear ); static int digi_write( struct usb_serial_port *port, int from_user, const unsigned char *buf, int count ); static void digi_write_bulk_callback( struct urb *urb, struct pt_regs *regs ); @@ -526,6 +529,8 @@ static struct usb_serial_device_type digi_acceleport_2_device = { .ioctl = digi_ioctl, .set_termios = digi_set_termios, .break_ctl = digi_break_ctl, + .tiocmget = digi_tiocmget, + .tiocmset = digi_tiocmset, .attach = digi_startup, .shutdown = digi_shutdown, }; @@ -551,6 +556,8 @@ static struct usb_serial_device_type digi_acceleport_4_device = { .ioctl = digi_ioctl, .set_termios = digi_set_termios, .break_ctl = digi_break_ctl, + .tiocmget = digi_tiocmget, + .tiocmset = digi_tiocmset, .attach = digi_startup, .shutdown = digi_shutdown, }; @@ -1211,39 +1218,46 @@ static void digi_break_ctl( struct usb_serial_port *port, int break_state ) } -static int digi_ioctl( struct usb_serial_port *port, struct file *file, - unsigned int cmd, unsigned long arg ) +static int digi_tiocmget( struct usb_serial_port *port, struct file *file ) { + struct digi_port *priv = usb_get_serial_port_data(port); + unsigned int val; + unsigned long flags; + + dbg("%s: TOP: port=%d", __FUNCTION__, priv->dp_port_num); + + spin_lock_irqsave( &priv->dp_port_lock, flags ); + val = priv->dp_modem_signals; + spin_unlock_irqrestore( &priv->dp_port_lock, flags ); + return val; +} + +static int digi_tiocmset( struct usb_serial_port *port, struct file *file, + unsigned int set, unsigned int clear ) +{ struct digi_port *priv = usb_get_serial_port_data(port); unsigned int val; - unsigned long flags = 0; + unsigned long flags; + dbg("%s: TOP: port=%d", __FUNCTION__, priv->dp_port_num); -dbg( "digi_ioctl: TOP: port=%d, cmd=0x%x", priv->dp_port_num, cmd ); + spin_lock_irqsave( &priv->dp_port_lock, flags ); + val = (priv->dp_modem_signals & ~clear) | set; + spin_unlock_irqrestore( &priv->dp_port_lock, flags ); + return digi_set_modem_signals( port, val, 1 ); +} - switch (cmd) { - case TIOCMGET: - spin_lock_irqsave( &priv->dp_port_lock, flags ); - val = priv->dp_modem_signals; - spin_unlock_irqrestore( &priv->dp_port_lock, flags ); - if( copy_to_user((unsigned int *)arg, &val, sizeof(int)) ) - return( -EFAULT ); - return( 0 ); +static int digi_ioctl( struct usb_serial_port *port, struct file *file, + unsigned int cmd, unsigned long arg ) +{ - case TIOCMSET: - case TIOCMBIS: - case TIOCMBIC: - if( copy_from_user(&val, (unsigned int *)arg, sizeof(int)) ) - return( -EFAULT ); - spin_lock_irqsave( &priv->dp_port_lock, flags ); - if( cmd == TIOCMBIS ) - val = priv->dp_modem_signals | val; - else if( cmd == TIOCMBIC ) - val = priv->dp_modem_signals & ~val; - spin_unlock_irqrestore( &priv->dp_port_lock, flags ); - return( digi_set_modem_signals( port, val, 1 ) ); + struct digi_port *priv = usb_get_serial_port_data(port); + +dbg( "digi_ioctl: TOP: port=%d, cmd=0x%x", priv->dp_port_num, cmd ); + + switch (cmd) { case TIOCMIWAIT: /* wait for any of the 4 modem inputs (DCD,RI,DSR,CTS)*/ -- 2.53.0