# This is a BitKeeper generated patch for the following project: # Project Name: Linux kernel tree # This patch format is intended for GNU patch command version 2.5 or higher. # This patch includes the following deltas: # ChangeSet 1.618 -> 1.619 # drivers/usb/serial/digi_acceleport.c 1.13 -> 1.14 # # The following is the BitKeeper ChangeSet Log # -------------------------------------------- # 02/08/29 greg@kroah.com 1.619 # USB: digi_acceleport update due to usbserial core changes. # -------------------------------------------- # diff -Nru a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c --- a/drivers/usb/serial/digi_acceleport.c Thu Aug 29 13:54:52 2002 +++ b/drivers/usb/serial/digi_acceleport.c Thu Aug 29 13:54:52 2002 @@ -14,6 +14,10 @@ * Peter Berger (pberger@brimson.com) * Al Borchers (borchers@steinerpoint.com) * +* (12/03/2001) gkh +* switched to using port->open_count instead of private version. +* Removed port->active +* * (04/08/2001) gb * Identify version on module load. * @@ -231,19 +235,16 @@ #include #include -#include -#include #include -#include #include #include -#include #include #include #include #include #include #include +#include #include #ifdef CONFIG_USB_SERIAL_DEBUG @@ -411,14 +412,14 @@ /* Structures */ -typedef struct digi_serial { +struct digi_serial { spinlock_t ds_serial_lock; struct usb_serial_port *ds_oob_port; /* out-of-band port */ int ds_oob_port_num; /* index of out-of-band port */ int ds_device_started; -} digi_serial_t; +}; -typedef struct digi_port { +struct digi_port { spinlock_t dp_port_lock; int dp_port_num; int dp_out_buf_len; @@ -429,7 +430,6 @@ int dp_write_urb_in_use; unsigned int dp_modem_signals; wait_queue_head_t dp_modem_change_wait; - int dp_open_count; /* inc on open, dec on close */ int dp_transmit_idle; wait_queue_head_t dp_transmit_idle_wait; int dp_throttled; @@ -438,7 +438,7 @@ int dp_in_close; /* close in progress */ wait_queue_head_t dp_close_wait; /* wait queue for close */ struct tq_struct dp_wakeup_task; -} digi_port_t; +}; /* Local Function Declarations */ @@ -498,55 +498,51 @@ /* device info needed for the Digi serial converter */ static struct usb_serial_device_type digi_acceleport_2_device = { - name: "Digi USB", - id_table: id_table_2, - needs_interrupt_in: DONT_CARE, - needs_bulk_in: MUST_HAVE, - needs_bulk_out: MUST_HAVE, - num_interrupt_in: 0, - num_bulk_in: 4, - num_bulk_out: 4, - num_ports: 3, - open: digi_open, - close: digi_close, - write: digi_write, - write_room: digi_write_room, - write_bulk_callback: digi_write_bulk_callback, - read_bulk_callback: digi_read_bulk_callback, - chars_in_buffer: digi_chars_in_buffer, - throttle: digi_rx_throttle, - unthrottle: digi_rx_unthrottle, - ioctl: digi_ioctl, - set_termios: digi_set_termios, - break_ctl: digi_break_ctl, - startup: digi_startup, - shutdown: digi_shutdown, + .owner = THIS_MODULE, + .name = "Digi USB", + .id_table = id_table_2, + .num_interrupt_in = 0, + .num_bulk_in = 4, + .num_bulk_out = 4, + .num_ports = 3, + .open = digi_open, + .close = digi_close, + .write = digi_write, + .write_room = digi_write_room, + .write_bulk_callback = digi_write_bulk_callback, + .read_bulk_callback = digi_read_bulk_callback, + .chars_in_buffer = digi_chars_in_buffer, + .throttle = digi_rx_throttle, + .unthrottle = digi_rx_unthrottle, + .ioctl = digi_ioctl, + .set_termios = digi_set_termios, + .break_ctl = digi_break_ctl, + .startup = digi_startup, + .shutdown = digi_shutdown, }; static struct usb_serial_device_type digi_acceleport_4_device = { - name: "Digi USB", - id_table: id_table_4, - needs_interrupt_in: DONT_CARE, - needs_bulk_in: MUST_HAVE, - needs_bulk_out: MUST_HAVE, - num_interrupt_in: 0, - num_bulk_in: 5, - num_bulk_out: 5, - num_ports: 4, - open: digi_open, - close: digi_close, - write: digi_write, - write_room: digi_write_room, - write_bulk_callback: digi_write_bulk_callback, - read_bulk_callback: digi_read_bulk_callback, - chars_in_buffer: digi_chars_in_buffer, - throttle: digi_rx_throttle, - unthrottle: digi_rx_unthrottle, - ioctl: digi_ioctl, - set_termios: digi_set_termios, - break_ctl: digi_break_ctl, - startup: digi_startup, - shutdown: digi_shutdown, + .owner = THIS_MODULE, + .name = "Digi USB", + .id_table = id_table_4, + .num_interrupt_in = 0, + .num_bulk_in = 5, + .num_bulk_out = 5, + .num_ports = 4, + .open = digi_open, + .close = digi_close, + .write = digi_write, + .write_room = digi_write_room, + .write_bulk_callback = digi_write_bulk_callback, + .read_bulk_callback = digi_read_bulk_callback, + .chars_in_buffer = digi_chars_in_buffer, + .throttle = digi_rx_throttle, + .unthrottle = digi_rx_unthrottle, + .ioctl = digi_ioctl, + .set_termios = digi_set_termios, + .break_ctl = digi_break_ctl, + .startup = digi_startup, + .shutdown = digi_shutdown, }; @@ -600,13 +596,12 @@ { unsigned long flags; - digi_port_t *priv = (digi_port_t *)(port->private); + struct digi_port *priv = (struct digi_port *)(port->private); spin_lock_irqsave( &priv->dp_port_lock, flags ); digi_wakeup_write( port ); spin_unlock_irqrestore( &priv->dp_port_lock, flags ); - MOD_DEC_USE_COUNT; } static void digi_wakeup_write( struct usb_serial_port *port ) @@ -647,8 +642,8 @@ int ret = 0; int len; - struct usb_serial_port *oob_port = (struct usb_serial_port *)((digi_serial_t *)port->serial->private)->ds_oob_port; - digi_port_t *oob_priv = (digi_port_t *)oob_port->private; + struct usb_serial_port *oob_port = (struct usb_serial_port *)((struct digi_serial *)port->serial->private)->ds_oob_port; + struct digi_port *oob_priv = (struct digi_port *)oob_port->private; unsigned long flags = 0; @@ -716,7 +711,7 @@ int ret = 0; int len; - digi_port_t *priv = (digi_port_t *)(port->private); + struct digi_port *priv = (struct digi_port *)(port->private); unsigned char *data = port->write_urb->transfer_buffer; unsigned long flags = 0; @@ -802,9 +797,9 @@ { int ret; - digi_port_t *port_priv = (digi_port_t *)port->private; - struct usb_serial_port *oob_port = (struct usb_serial_port *)((digi_serial_t *)port->serial->private)->ds_oob_port; - digi_port_t *oob_priv = (digi_port_t *)oob_port->private; + struct digi_port *port_priv = (struct digi_port *)port->private; + struct usb_serial_port *oob_port = (struct usb_serial_port *)((struct digi_serial *)port->serial->private)->ds_oob_port; + struct digi_port *oob_priv = (struct digi_port *)oob_port->private; unsigned char *data = oob_port->write_urb->transfer_buffer; unsigned long flags = 0; @@ -881,7 +876,7 @@ int ret; unsigned char buf[2]; - digi_port_t *priv = (digi_port_t *)(port->private); + struct digi_port *priv = (struct digi_port *)(port->private); unsigned long flags = 0; @@ -921,7 +916,7 @@ { unsigned long flags; - digi_port_t *priv = (digi_port_t *)(port->private); + struct digi_port *priv = (struct digi_port *)(port->private); dbg( "digi_rx_throttle: TOP: port=%d", priv->dp_port_num ); @@ -942,7 +937,7 @@ int ret = 0; int len; unsigned long flags; - digi_port_t *priv = (digi_port_t *)(port->private); + struct digi_port *priv = (struct digi_port *)(port->private); struct tty_struct *tty = port->tty; @@ -986,7 +981,7 @@ struct termios *old_termios ) { - digi_port_t *priv = (digi_port_t *)(port->private); + struct digi_port *priv = (struct digi_port *)(port->private); unsigned int iflag = port->tty->termios->c_iflag; unsigned int cflag = port->tty->termios->c_cflag; unsigned int old_iflag = old_termios->c_iflag; @@ -1210,7 +1205,7 @@ unsigned int cmd, unsigned long arg ) { - digi_port_t *priv = (digi_port_t *)(port->private); + struct digi_port *priv = (struct digi_port *)(port->private); unsigned int val; unsigned long flags = 0; @@ -1262,7 +1257,7 @@ { int ret,data_len,new_len; - digi_port_t *priv = (digi_port_t *)(port->private); + struct digi_port *priv = (struct digi_port *)(port->private); unsigned char *data = port->write_urb->transfer_buffer; unsigned char user_buf[64]; /* 64 bytes is max USB bulk packet */ unsigned long flags = 0; @@ -1349,14 +1344,14 @@ struct usb_serial_port *port = (struct usb_serial_port *)urb->context; struct usb_serial *serial; - digi_port_t *priv; + struct digi_port *priv; int ret = 0; dbg( "digi_write_bulk_callback: TOP, urb->status=%d", urb->status ); /* port and serial sanity check */ - if( port == NULL || (priv=(digi_port_t *)(port->private)) == NULL ) { + if( port == NULL || (priv=(struct digi_port *)(port->private)) == NULL ) { err("%s: port or port->private is NULL, status=%d", __FUNCTION__, urb->status ); return; @@ -1369,7 +1364,7 @@ /* handle oob callback */ if( priv->dp_port_num - == ((digi_serial_t *)(serial->private))->ds_oob_port_num ) { + == ((struct digi_serial *)(serial->private))->ds_oob_port_num ) { dbg( "digi_write_bulk_callback: oob callback" ); spin_lock( &priv->dp_port_lock ); priv->dp_write_urb_in_use = 0; @@ -1386,7 +1381,7 @@ /* try to send any buffered data on this port, if it is open */ spin_lock( &priv->dp_port_lock ); priv->dp_write_urb_in_use = 0; - if( priv->dp_open_count && port->write_urb->status != -EINPROGRESS + if( port->open_count && port->write_urb->status != -EINPROGRESS && priv->dp_out_buf_len > 0 ) { *((unsigned char *)(port->write_urb->transfer_buffer)) @@ -1413,9 +1408,7 @@ /* also queue up a wakeup at scheduler time, in case we */ /* lost the race in write_chan(). */ - MOD_INC_USE_COUNT; - if (schedule_task(&priv->dp_wakeup_task) == 0) - MOD_DEC_USE_COUNT; + schedule_task(&priv->dp_wakeup_task); spin_unlock( &priv->dp_port_lock ); @@ -1431,7 +1424,7 @@ { int room; - digi_port_t *priv = (digi_port_t *)(port->private); + struct digi_port *priv = (struct digi_port *)(port->private); unsigned long flags = 0; @@ -1454,7 +1447,7 @@ static int digi_chars_in_buffer( struct usb_serial_port *port ) { - digi_port_t *priv = (digi_port_t *)(port->private); + struct digi_port *priv = (struct digi_port *)(port->private); if( port->write_urb->status == -EINPROGRESS @@ -1475,12 +1468,12 @@ int ret; unsigned char buf[32]; - digi_port_t *priv = (digi_port_t *)(port->private); + struct digi_port *priv = (struct digi_port *)(port->private); struct termios not_termios; unsigned long flags = 0; -dbg( "digi_open: TOP: port=%d, active=%d, open_count=%d", priv->dp_port_num, port->active, priv->dp_open_count ); +dbg( "digi_open: TOP: port=%d, open_count=%d", priv->dp_port_num, port->open_count ); /* be sure the device is started up */ if( digi_startup_device( port->serial ) != 0 ) @@ -1494,32 +1487,17 @@ return( -EAGAIN ); } - /* inc module use count before sleeping to wait for closes */ - ++priv->dp_open_count; - MOD_INC_USE_COUNT; - /* wait for a close in progress to finish */ while( priv->dp_in_close ) { cond_wait_interruptible_timeout_irqrestore( &priv->dp_close_wait, DIGI_RETRY_TIMEOUT, &priv->dp_port_lock, flags ); if( signal_pending(current) ) { - --priv->dp_open_count; - MOD_DEC_USE_COUNT; return( -EINTR ); } spin_lock_irqsave( &priv->dp_port_lock, flags ); } - /* if port is already open, just return */ - /* be sure exactly one open proceeds */ - if( port->active ) { - spin_unlock_irqrestore( &priv->dp_port_lock, flags ); - return( 0 ); - } - - /* first open, mark port as active */ - port->active = 1; spin_unlock_irqrestore( &priv->dp_port_lock, flags ); /* read modem signals automatically whenever they change */ @@ -1556,24 +1534,15 @@ int ret; unsigned char buf[32]; struct tty_struct *tty = port->tty; - digi_port_t *priv = (digi_port_t *)port->private; + struct digi_port *priv = (struct digi_port *)port->private; unsigned long flags = 0; -dbg( "digi_close: TOP: port=%d, active=%d, open_count=%d", priv->dp_port_num, port->active, priv->dp_open_count ); +dbg( "digi_close: TOP: port=%d, open_count=%d", priv->dp_port_num, port->open_count ); /* do cleanup only after final close on this port */ spin_lock_irqsave( &priv->dp_port_lock, flags ); - if( priv->dp_open_count > 1 ) { - --priv->dp_open_count; - MOD_DEC_USE_COUNT; - spin_unlock_irqrestore( &priv->dp_port_lock, flags ); - return; - } else if( priv->dp_open_count <= 0 ) { - spin_unlock_irqrestore( &priv->dp_port_lock, flags ); - return; - } priv->dp_in_close = 1; spin_unlock_irqrestore( &priv->dp_port_lock, flags ); @@ -1644,11 +1613,8 @@ tty->closing = 0; spin_lock_irqsave( &priv->dp_port_lock, flags ); - port->active = 0; priv->dp_write_urb_in_use = 0; priv->dp_in_close = 0; - --priv->dp_open_count; - MOD_DEC_USE_COUNT; wake_up_interruptible( &priv->dp_close_wait ); spin_unlock_irqrestore( &priv->dp_port_lock, flags ); @@ -1667,7 +1633,7 @@ { int i,ret = 0; - digi_serial_t *serial_priv = (digi_serial_t *)serial->private; + struct digi_serial *serial_priv = (struct digi_serial *)serial->private; struct usb_serial_port *port; @@ -1705,8 +1671,8 @@ { int i; - digi_port_t *priv; - digi_serial_t *serial_priv; + struct digi_port *priv; + struct digi_serial *serial_priv; dbg( "digi_startup: TOP" ); @@ -1715,13 +1681,11 @@ /* number of regular ports + 1 for the out-of-band port */ for( i=0; itype->num_ports+1; i++ ) { - serial->port[i].active = 0; - /* allocate port private structure */ priv = serial->port[i].private = - (digi_port_t *)kmalloc( sizeof(digi_port_t), + (struct digi_port *)kmalloc( sizeof(struct digi_port), GFP_KERNEL ); - if( priv == (digi_port_t *)0 ) { + if( priv == (struct digi_port *)0 ) { while( --i >= 0 ) kfree( serial->port[i].private ); return( 1 ); /* error */ @@ -1735,7 +1699,6 @@ priv->dp_write_urb_in_use = 0; priv->dp_modem_signals = 0; init_waitqueue_head( &priv->dp_modem_change_wait ); - priv->dp_open_count = 0; priv->dp_transmit_idle = 0; init_waitqueue_head( &priv->dp_transmit_idle_wait ); priv->dp_throttled = 0; @@ -1755,9 +1718,9 @@ /* allocate serial private structure */ serial_priv = serial->private = - (digi_serial_t *)kmalloc( sizeof(digi_serial_t), + (struct digi_serial *)kmalloc( sizeof(struct digi_serial), GFP_KERNEL ); - if( serial_priv == (digi_serial_t *)0 ) { + if( serial_priv == (struct digi_serial *)0 ) { for( i=0; itype->num_ports+1; i++ ) kfree( serial->port[i].private ); return( 1 ); /* error */ @@ -1778,8 +1741,6 @@ { int i; - digi_port_t *priv; - unsigned long flags; dbg( "digi_shutdown: TOP, in_interrupt()=%d", in_interrupt() ); @@ -1790,17 +1751,6 @@ usb_unlink_urb( serial->port[i].write_urb ); } - /* dec module use count */ - for( i=0; itype->num_ports; i++ ) { - priv = serial->port[i].private; - spin_lock_irqsave( &priv->dp_port_lock, flags ); - while( priv->dp_open_count > 0 ) { - MOD_DEC_USE_COUNT; - --priv->dp_open_count; - } - spin_unlock_irqrestore( &priv->dp_port_lock, flags ); - } - /* free the private data structures for all ports */ /* number of regular ports + 1 for the out-of-band port */ for( i=0; itype->num_ports+1; i++ ) @@ -1814,14 +1764,14 @@ { struct usb_serial_port *port = (struct usb_serial_port *)urb->context; - digi_port_t *priv; + struct digi_port *priv; int ret; dbg( "digi_read_bulk_callback: TOP" ); /* port sanity check, do not resubmit if port is not valid */ - if( port == NULL || (priv=(digi_port_t *)(port->private)) == NULL ) { + if( port == NULL || (priv=(struct digi_port *)(port->private)) == NULL ) { err("%s: port or port->private is NULL, status=%d", __FUNCTION__, urb->status ); return; @@ -1841,7 +1791,7 @@ /* handle oob or inb callback, do not resubmit if error */ if( priv->dp_port_num - == ((digi_serial_t *)(port->serial->private))->ds_oob_port_num ) { + == ((struct digi_serial *)(port->serial->private))->ds_oob_port_num ) { if( digi_read_oob_callback( urb ) != 0 ) return; } else { @@ -1874,7 +1824,7 @@ struct usb_serial_port *port = (struct usb_serial_port *)urb->context; struct tty_struct *tty = port->tty; - digi_port_t *priv = (digi_port_t *)(port->private); + struct digi_port *priv = (struct digi_port *)(port->private); int opcode = ((unsigned char *)urb->transfer_buffer)[0]; int len = ((unsigned char *)urb->transfer_buffer)[1]; int status = ((unsigned char *)urb->transfer_buffer)[2]; @@ -1888,7 +1838,7 @@ /* do not process callbacks on closed ports */ /* but do continue the read chain */ - if( priv->dp_open_count == 0 ) + if( port->open_count == 0 ) return( 0 ); /* short/multiple packet check */ @@ -1986,7 +1936,7 @@ struct usb_serial_port *port = (struct usb_serial_port *)urb->context; struct usb_serial *serial = port->serial; - digi_port_t *priv = (digi_port_t *)(port->private); + struct digi_port *priv = (struct digi_port *)(port->private); int opcode, line, status, val; int i; @@ -2022,7 +1972,7 @@ if( val & DIGI_READ_INPUT_SIGNALS_CTS ) { priv->dp_modem_signals |= TIOCM_CTS; /* port must be open to use tty struct */ - if( priv->dp_open_count + if( port->open_count && port->tty->termios->c_cflag & CRTSCTS ) { port->tty->hw_stopped = 0; digi_wakeup_write( port ); @@ -2030,7 +1980,7 @@ } else { priv->dp_modem_signals &= ~TIOCM_CTS; /* port must be open to use tty struct */ - if( priv->dp_open_count + if( port->open_count && port->tty->termios->c_cflag & CRTSCTS ) { port->tty->hw_stopped = 1; }