On Thu, Mar 21, 2002 at 04:37:38PM -0800, Greg KH wrote:
>
> This is the patch for the usbserial.c core. A patch for all of the
> usb-serial drivers will be in the next message.
Here's that patch.
# This is a BitKeeper generated patch for the following project:
# Project Name: greg k-h's linux 2.5 USB kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
# ChangeSet 1.410 -> 1.411
# drivers/usb/serial/visor.c 1.24 -> 1.25
# drivers/usb/serial/keyspan_pda.c 1.14 -> 1.15
# drivers/usb/serial/pl2303.c 1.13 -> 1.14
# drivers/usb/serial/empeg.c 1.17 -> 1.18
# drivers/usb/serial/cyberjack.c 1.16 -> 1.17
# drivers/usb/serial/omninet.c 1.15 -> 1.16
# drivers/usb/serial/kl5kusb105.c 1.9 -> 1.10
# drivers/usb/serial/ftdi_sio.c 1.19 -> 1.20
# drivers/usb/serial/ir-usb.c 1.17 -> 1.18
# drivers/usb/serial/io_edgeport.c 1.19 -> 1.20
# drivers/usb/serial/keyspan.c 1.21 -> 1.22
# drivers/usb/serial/digi_acceleport.c 1.13 -> 1.14
# drivers/usb/serial/belkin_sa.c 1.14 -> 1.15
# drivers/usb/serial/mct_u232.c 1.17 -> 1.18
# drivers/usb/serial/ipaq.c 1.11 -> 1.12
# drivers/usb/serial/whiteheat.c 1.17 -> 1.18
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/03/21 [EMAIL PROTECTED] 1.411
# USB serial drivers
#
# changes due to open_count being handled by the usb-serial core code.
# --------------------------------------------
#
diff -Nru a/drivers/usb/serial/belkin_sa.c b/drivers/usb/serial/belkin_sa.c
--- a/drivers/usb/serial/belkin_sa.c Thu Mar 21 16:22:18 2002
+++ b/drivers/usb/serial/belkin_sa.c Thu Mar 21 16:22:18 2002
@@ -191,9 +191,6 @@
/* stop reads and writes on all ports */
for (i=0; i < serial->num_ports; ++i) {
- while (serial->port[i].open_count > 0) {
- belkin_sa_close (&serial->port[i], NULL);
- }
/* My special items, the standard routines free my urbs */
if (serial->port[i].private)
kfree(serial->port[i].private);
@@ -207,26 +204,22 @@
dbg(__FUNCTION__" port %d", port->number);
- ++port->open_count;
-
- if (port->open_count == 1) {
- /*Start reading from the device*/
- /* TODO: Look at possibility of submitting mulitple URBs to device to
- * enhance buffering. Win trace shows 16 initial read URBs.
- */
- port->read_urb->dev = port->serial->dev;
- retval = usb_submit_urb(port->read_urb, GFP_KERNEL);
- if (retval) {
- err("usb_submit_urb(read bulk) failed");
- goto exit;
- }
-
- port->interrupt_in_urb->dev = port->serial->dev;
- retval = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
- if (retval)
- err(" usb_submit_urb(read int) failed");
+ /*Start reading from the device*/
+ /* TODO: Look at possibility of submitting mulitple URBs to device to
+ * enhance buffering. Win trace shows 16 initial read URBs.
+ */
+ port->read_urb->dev = port->serial->dev;
+ retval = usb_submit_urb(port->read_urb, GFP_KERNEL);
+ if (retval) {
+ err("usb_submit_urb(read bulk) failed");
+ goto exit;
}
-
+
+ port->interrupt_in_urb->dev = port->serial->dev;
+ retval = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
+ if (retval)
+ err(" usb_submit_urb(read int) failed");
+
exit:
return retval;
} /* belkin_sa_open */
@@ -245,16 +238,11 @@
dbg(__FUNCTION__" port %d", port->number);
- --port->open_count;
-
- if (port->open_count <= 0) {
- if (serial->dev) {
- /* shutdown our bulk reads and writes */
- usb_unlink_urb (port->write_urb);
- usb_unlink_urb (port->read_urb);
- usb_unlink_urb (port->interrupt_in_urb);
- }
- port->open_count = 0;
+ if (serial->dev) {
+ /* shutdown our bulk reads and writes */
+ usb_unlink_urb (port->write_urb);
+ usb_unlink_urb (port->read_urb);
+ usb_unlink_urb (port->interrupt_in_urb);
}
} /* belkin_sa_close */
diff -Nru a/drivers/usb/serial/cyberjack.c b/drivers/usb/serial/cyberjack.c
--- a/drivers/usb/serial/cyberjack.c Thu Mar 21 16:22:18 2002
+++ b/drivers/usb/serial/cyberjack.c Thu Mar 21 16:22:18 2002
@@ -130,11 +130,7 @@
dbg (__FUNCTION__);
- /* stop reads and writes on all ports */
for (i=0; i < serial->num_ports; ++i) {
- while (serial->port[i].open_count > 0) {
- cyberjack_close (&serial->port[i], NULL);
- }
/* My special items, the standard routines free my urbs */
if (serial->port[i].private)
kfree(serial->port[i].private);
@@ -151,31 +147,27 @@
dbg(__FUNCTION__ " - port %d", port->number);
- ++port->open_count;
-
- if (port->open_count == 1) {
- /* force low_latency on so that our tty_push actually forces
- * the data through, otherwise it is scheduled, and with high
- * data rates (like with OHCI) data can get lost.
- */
- port->tty->low_latency = 1;
-
- priv = (struct cyberjack_private *)port->private;
- priv->rdtodo = 0;
- priv->wrfilled = 0;
- priv->wrsent = 0;
-
- /* shutdown any bulk reads that might be going on */
- usb_unlink_urb (port->write_urb);
- usb_unlink_urb (port->read_urb);
- usb_unlink_urb (port->interrupt_in_urb);
-
- port->interrupt_in_urb->dev = port->serial->dev;
- result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
- if (result)
- err(" usb_submit_urb(read int) failed");
- dbg(__FUNCTION__ " - usb_submit_urb(int urb)");
- }
+ /* force low_latency on so that our tty_push actually forces
+ * the data through, otherwise it is scheduled, and with high
+ * data rates (like with OHCI) data can get lost.
+ */
+ port->tty->low_latency = 1;
+
+ priv = (struct cyberjack_private *)port->private;
+ priv->rdtodo = 0;
+ priv->wrfilled = 0;
+ priv->wrsent = 0;
+
+ /* shutdown any bulk reads that might be going on */
+ usb_unlink_urb (port->write_urb);
+ usb_unlink_urb (port->read_urb);
+ usb_unlink_urb (port->interrupt_in_urb);
+
+ port->interrupt_in_urb->dev = port->serial->dev;
+ result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
+ if (result)
+ err(" usb_submit_urb(read int) failed");
+ dbg(__FUNCTION__ " - usb_submit_urb(int urb)");
return result;
}
@@ -184,16 +176,11 @@
{
dbg(__FUNCTION__ " - port %d", port->number);
- --port->open_count;
-
- if (port->open_count <= 0) {
- if (port->serial->dev) {
- /* shutdown any bulk reads that might be going on */
- usb_unlink_urb (port->write_urb);
- usb_unlink_urb (port->read_urb);
- usb_unlink_urb (port->interrupt_in_urb);
- }
- port->open_count = 0;
+ if (port->serial->dev) {
+ /* shutdown any bulk reads that might be going on */
+ usb_unlink_urb (port->write_urb);
+ usb_unlink_urb (port->read_urb);
+ usb_unlink_urb (port->interrupt_in_urb);
}
}
diff -Nru a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c
--- a/drivers/usb/serial/digi_acceleport.c Thu Mar 21 16:22:18 2002
+++ b/drivers/usb/serial/digi_acceleport.c Thu Mar 21 16:22:18 2002
@@ -1490,28 +1490,17 @@
return( -EAGAIN );
}
- /* inc module use count before sleeping to wait for closes */
- ++port->open_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) ) {
- --port->open_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->open_count != 1) {
- spin_unlock_irqrestore( &priv->dp_port_lock, flags );
- return( 0 );
- }
-
spin_unlock_irqrestore( &priv->dp_port_lock, flags );
/* read modem signals automatically whenever they change */
@@ -1557,14 +1546,6 @@
/* do cleanup only after final close on this port */
spin_lock_irqsave( &priv->dp_port_lock, flags );
- if( port->open_count > 1 ) {
- --port->open_count;
- spin_unlock_irqrestore( &priv->dp_port_lock, flags );
- return;
- } else if( port->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 );
@@ -1637,7 +1618,6 @@
spin_lock_irqsave( &priv->dp_port_lock, flags );
priv->dp_write_urb_in_use = 0;
priv->dp_in_close = 0;
- --port->open_count;
wake_up_interruptible( &priv->dp_close_wait );
spin_unlock_irqrestore( &priv->dp_port_lock, flags );
@@ -1765,8 +1745,6 @@
{
int i;
- struct digi_port *priv;
- unsigned long flags;
dbg( "digi_shutdown: TOP, in_interrupt()=%d", in_interrupt() );
@@ -1775,16 +1753,6 @@
for( i=0; i<serial->type->num_ports+1; i++ ) {
usb_unlink_urb( serial->port[i].read_urb );
usb_unlink_urb( serial->port[i].write_urb );
- }
-
- /* dec module use count */
- for( i=0; i<serial->type->num_ports; i++ ) {
- priv = serial->port[i].private;
- spin_lock_irqsave( &priv->dp_port_lock, flags );
- while( serial->port[i].open_count > 0 ) {
- --serial->port[i].open_count;
- }
- spin_unlock_irqrestore( &priv->dp_port_lock, flags );
}
/* free the private data structures for all ports */
diff -Nru a/drivers/usb/serial/empeg.c b/drivers/usb/serial/empeg.c
--- a/drivers/usb/serial/empeg.c Thu Mar 21 16:22:18 2002
+++ b/drivers/usb/serial/empeg.c Thu Mar 21 16:22:18 2002
@@ -157,35 +157,29 @@
dbg(__FUNCTION__ " - port %d", port->number);
- ++port->open_count;
+ /* Force default termio settings */
+ empeg_set_termios (port, NULL) ;
- if (port->open_count == 1) {
+ bytes_in = 0;
+ bytes_out = 0;
- /* Force default termio settings */
- empeg_set_termios (port, NULL) ;
-
- bytes_in = 0;
- bytes_out = 0;
-
- /* Start reading from the device */
- FILL_BULK_URB(
- port->read_urb,
- serial->dev,
- usb_rcvbulkpipe(serial->dev,
- port->bulk_in_endpointAddress),
- port->read_urb->transfer_buffer,
- port->read_urb->transfer_buffer_length,
- empeg_read_bulk_callback,
- port);
-
- port->read_urb->transfer_flags |= USB_QUEUE_BULK;
+ /* Start reading from the device */
+ FILL_BULK_URB(
+ port->read_urb,
+ serial->dev,
+ usb_rcvbulkpipe(serial->dev,
+ port->bulk_in_endpointAddress),
+ port->read_urb->transfer_buffer,
+ port->read_urb->transfer_buffer_length,
+ empeg_read_bulk_callback,
+ port);
- result = usb_submit_urb(port->read_urb, GFP_KERNEL);
+ port->read_urb->transfer_flags |= USB_QUEUE_BULK;
- if (result)
- err(__FUNCTION__ " - failed submitting read urb, error %d",
result);
+ result = usb_submit_urb(port->read_urb, GFP_KERNEL);
- }
+ if (result)
+ err(__FUNCTION__ " - failed submitting read urb, error %d", result);
return result;
}
@@ -204,16 +198,10 @@
if (!serial)
return;
- --port->open_count;
-
- if (port->open_count <= 0) {
- if (serial->dev) {
- /* shutdown our bulk read */
- usb_unlink_urb (port->read_urb);
- }
- port->open_count = 0;
+ if (serial->dev) {
+ /* shutdown our bulk read */
+ usb_unlink_urb (port->read_urb);
}
-
/* Uncomment the following line if you want to see some statistics in your
syslog */
/* info ("Bytes In = %d Bytes Out = %d", bytes_in, bytes_out); */
}
@@ -491,17 +479,7 @@
static void empeg_shutdown (struct usb_serial *serial)
{
- int i;
-
dbg (__FUNCTION__);
-
- /* stop reads and writes on all ports */
- for (i=0; i < serial->num_ports; ++i) {
- while (serial->port[i].open_count > 0) {
- empeg_close (&serial->port[i], NULL);
- }
- }
-
}
diff -Nru a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
--- a/drivers/usb/serial/ftdi_sio.c Thu Mar 21 16:22:18 2002
+++ b/drivers/usb/serial/ftdi_sio.c Thu Mar 21 16:22:18 2002
@@ -294,14 +294,8 @@
static void ftdi_sio_shutdown (struct usb_serial *serial)
{
-
dbg (__FUNCTION__);
-
- /* stop reads and writes on all ports */
- while (serial->port[0].open_count > 0) {
- ftdi_sio_close (&serial->port[0], NULL);
- }
if (serial->port[0].private){
kfree(serial->port[0].private);
serial->port[0].private = NULL;
@@ -319,45 +313,41 @@
dbg(__FUNCTION__);
- ++port->open_count;
-
- if (port->open_count == 1){
- /* This will push the characters through immediately rather
- than queue a task to deliver them */
- port->tty->low_latency = 1;
-
- /* No error checking for this (will get errors later anyway) */
- /* See ftdi_sio.h for description of what is reset */
- usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
- FTDI_SIO_RESET_REQUEST, FTDI_SIO_RESET_REQUEST_TYPE,
- FTDI_SIO_RESET_SIO,
- 0, buf, 0, WDR_TIMEOUT);
-
- /* Setup termios defaults. According to tty_io.c the
- settings are driver specific */
- port->tty->termios->c_cflag =
- B9600 | CS8 | CREAD | HUPCL | CLOCAL;
-
- /* ftdi_sio_set_termios will send usb control messages */
- ftdi_sio_set_termios(port, &tmp_termios);
-
- /* Turn on RTS and DTR since we are not flow controlling by default */
- if (set_dtr(serial->dev, usb_sndctrlpipe(serial->dev, 0),HIGH) < 0) {
- err(__FUNCTION__ " Error from DTR HIGH urb");
- }
- if (set_rts(serial->dev, usb_sndctrlpipe(serial->dev, 0),HIGH) < 0){
- err(__FUNCTION__ " Error from RTS HIGH urb");
- }
-
- /* Start reading from the device */
- FILL_BULK_URB(port->read_urb, serial->dev,
- usb_rcvbulkpipe(serial->dev,
port->bulk_in_endpointAddress),
- port->read_urb->transfer_buffer,
port->read_urb->transfer_buffer_length,
- ftdi_sio_read_bulk_callback, port);
- result = usb_submit_urb(port->read_urb, GFP_KERNEL);
- if (result)
- err(__FUNCTION__ " - failed submitting read urb, error %d",
result);
+ /* This will push the characters through immediately rather
+ than queue a task to deliver them */
+ port->tty->low_latency = 1;
+
+ /* No error checking for this (will get errors later anyway) */
+ /* See ftdi_sio.h for description of what is reset */
+ usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
+ FTDI_SIO_RESET_REQUEST, FTDI_SIO_RESET_REQUEST_TYPE,
+ FTDI_SIO_RESET_SIO,
+ 0, buf, 0, WDR_TIMEOUT);
+
+ /* Setup termios defaults. According to tty_io.c the
+ settings are driver specific */
+ port->tty->termios->c_cflag =
+ B9600 | CS8 | CREAD | HUPCL | CLOCAL;
+
+ /* ftdi_sio_set_termios will send usb control messages */
+ ftdi_sio_set_termios(port, &tmp_termios);
+
+ /* Turn on RTS and DTR since we are not flow controlling by default */
+ if (set_dtr(serial->dev, usb_sndctrlpipe(serial->dev, 0),HIGH) < 0) {
+ err(__FUNCTION__ " Error from DTR HIGH urb");
}
+ if (set_rts(serial->dev, usb_sndctrlpipe(serial->dev, 0),HIGH) < 0){
+ err(__FUNCTION__ " Error from RTS HIGH urb");
+ }
+
+ /* Start reading from the device */
+ FILL_BULK_URB(port->read_urb, serial->dev,
+ usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
+ port->read_urb->transfer_buffer,
+port->read_urb->transfer_buffer_length,
+ ftdi_sio_read_bulk_callback, port);
+ result = usb_submit_urb(port->read_urb, GFP_KERNEL);
+ if (result)
+ err(__FUNCTION__ " - failed submitting read urb, error %d", result);
return result;
} /* ftdi_sio_open */
@@ -371,41 +361,31 @@
dbg( __FUNCTION__);
- --port->open_count;
-
- if (port->open_count <= 0) {
- if (serial->dev) {
- if (c_cflag & HUPCL){
- /* Disable flow control */
- if (usb_control_msg(serial->dev,
- usb_sndctrlpipe(serial->dev, 0),
- FTDI_SIO_SET_FLOW_CTRL_REQUEST,
-
FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
- 0, 0, buf, 0, WDR_TIMEOUT) < 0) {
- err("error from flowcontrol urb");
- }
-
- /* drop DTR */
- if (set_dtr(serial->dev, usb_sndctrlpipe(serial->dev,
0), LOW) < 0){
- err("Error from DTR LOW urb");
- }
- /* drop RTS */
- if (set_rts(serial->dev, usb_sndctrlpipe(serial->dev,
0),LOW) < 0) {
- err("Error from RTS LOW urb");
- }
- } /* Note change no line is hupcl is off */
-
- /* shutdown our bulk reads and writes */
- /* ***CHECK*** behaviour when there is nothing queued */
- usb_unlink_urb (port->write_urb);
- usb_unlink_urb (port->read_urb);
- }
- port->open_count = 0;
- } else {
- /* Send a HUP if necessary */
- if (!(port->tty->termios->c_cflag & CLOCAL)){
- tty_hangup(port->tty);
- }
+ if (serial->dev) {
+ if (c_cflag & HUPCL){
+ /* Disable flow control */
+ if (usb_control_msg(serial->dev,
+ usb_sndctrlpipe(serial->dev, 0),
+ FTDI_SIO_SET_FLOW_CTRL_REQUEST,
+ FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
+ 0, 0, buf, 0, WDR_TIMEOUT) < 0) {
+ err("error from flowcontrol urb");
+ }
+
+ /* drop DTR */
+ if (set_dtr(serial->dev, usb_sndctrlpipe(serial->dev, 0), LOW)
+< 0){
+ err("Error from DTR LOW urb");
+ }
+ /* drop RTS */
+ if (set_rts(serial->dev, usb_sndctrlpipe(serial->dev, 0),LOW)
+< 0) {
+ err("Error from RTS LOW urb");
+ }
+ } /* Note change no line is hupcl is off */
+
+ /* shutdown our bulk reads and writes */
+ /* ***CHECK*** behaviour when there is nothing queued */
+ usb_unlink_urb (port->write_urb);
+ usb_unlink_urb (port->read_urb);
}
} /* ftdi_sio_close */
diff -Nru a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c
--- a/drivers/usb/serial/io_edgeport.c Thu Mar 21 16:22:18 2002
+++ b/drivers/usb/serial/io_edgeport.c Thu Mar 21 16:22:18 2002
@@ -987,124 +987,117 @@
if (edge_port == NULL)
return -ENODEV;
- ++port->open_count;
-
- if (port->open_count == 1) {
- /* force low_latency on so that our tty_push actually forces the data
through,
- otherwise it is scheduled, and with high data rates (like with
OHCI) data
- can get lost. */
- port->tty->low_latency = 1;
+ /* force low_latency on so that our tty_push actually forces the data through,
+ otherwise it is scheduled, and with high data rates (like with OHCI) data
+ can get lost. */
+ port->tty->low_latency = 1;
+
+ /* see if we've set up our endpoint info yet (can't set it up in edge_startup
+ as the structures were not set up at that time.) */
+ serial = port->serial;
+ edge_serial = (struct edgeport_serial *)serial->private;
+ if (edge_serial == NULL) {
+ return -ENODEV;
+ }
+ if (edge_serial->interrupt_in_buffer == NULL) {
+ struct usb_serial_port *port0 = &serial->port[0];
+
+ /* not set up yet, so do it now */
+ edge_serial->interrupt_in_buffer = port0->interrupt_in_buffer;
+ edge_serial->interrupt_in_endpoint =
+port0->interrupt_in_endpointAddress;
+ edge_serial->interrupt_read_urb = port0->interrupt_in_urb;
+ edge_serial->bulk_in_buffer = port0->bulk_in_buffer;
+ edge_serial->bulk_in_endpoint = port0->bulk_in_endpointAddress;
+ edge_serial->read_urb = port0->read_urb;
+ edge_serial->bulk_out_endpoint = port0->bulk_out_endpointAddress;
- /* see if we've set up our endpoint info yet (can't set it up in
edge_startup
- as the structures were not set up at that time.) */
- serial = port->serial;
- edge_serial = (struct edgeport_serial *)serial->private;
- if (edge_serial == NULL) {
- port->open_count = 0;
- return -ENODEV;
- }
- if (edge_serial->interrupt_in_buffer == NULL) {
- struct usb_serial_port *port0 = &serial->port[0];
-
- /* not set up yet, so do it now */
- edge_serial->interrupt_in_buffer = port0->interrupt_in_buffer;
- edge_serial->interrupt_in_endpoint =
port0->interrupt_in_endpointAddress;
- edge_serial->interrupt_read_urb = port0->interrupt_in_urb;
- edge_serial->bulk_in_buffer = port0->bulk_in_buffer;
- edge_serial->bulk_in_endpoint = port0->bulk_in_endpointAddress;
- edge_serial->read_urb = port0->read_urb;
- edge_serial->bulk_out_endpoint =
port0->bulk_out_endpointAddress;
+ /* set up our interrupt urb */
+ FILL_INT_URB(edge_serial->interrupt_read_urb,
+ serial->dev,
+ usb_rcvintpipe(serial->dev,
+ port0->interrupt_in_endpointAddress),
+ port0->interrupt_in_buffer,
+ edge_serial->interrupt_read_urb->transfer_buffer_length,
+ edge_interrupt_callback, edge_serial,
+ edge_serial->interrupt_read_urb->interval);
- /* set up our interrupt urb */
- FILL_INT_URB(edge_serial->interrupt_read_urb,
- serial->dev,
- usb_rcvintpipe(serial->dev,
-
port0->interrupt_in_endpointAddress),
- port0->interrupt_in_buffer,
-
edge_serial->interrupt_read_urb->transfer_buffer_length,
- edge_interrupt_callback, edge_serial,
- edge_serial->interrupt_read_urb->interval);
-
- /* set up our bulk in urb */
- FILL_BULK_URB(edge_serial->read_urb, serial->dev,
- usb_rcvbulkpipe(serial->dev,
port0->bulk_in_endpointAddress),
- port0->bulk_in_buffer,
- edge_serial->read_urb->transfer_buffer_length,
- edge_bulk_in_callback, edge_serial);
-
- /* start interrupt read for this edgeport
- * this interrupt will continue as long as the edgeport is
connected */
- response = usb_submit_urb (edge_serial->interrupt_read_urb,
GFP_KERNEL);
- if (response) {
- err(__FUNCTION__" - Error %d submitting control urb",
response);
- }
+ /* set up our bulk in urb */
+ FILL_BULK_URB(edge_serial->read_urb, serial->dev,
+ usb_rcvbulkpipe(serial->dev,
+port0->bulk_in_endpointAddress),
+ port0->bulk_in_buffer,
+ edge_serial->read_urb->transfer_buffer_length,
+ edge_bulk_in_callback, edge_serial);
+
+ /* start interrupt read for this edgeport
+ * this interrupt will continue as long as the edgeport is connected */
+ response = usb_submit_urb (edge_serial->interrupt_read_urb,
+GFP_KERNEL);
+ if (response) {
+ err(__FUNCTION__" - Error %d submitting control urb",
+response);
}
-
- /* initialize our wait queues */
- init_waitqueue_head(&edge_port->wait_open);
- init_waitqueue_head(&edge_port->wait_chase);
- init_waitqueue_head(&edge_port->delta_msr_wait);
- init_waitqueue_head(&edge_port->wait_command);
-
- /* initialize our icount structure */
- memset (&(edge_port->icount), 0x00, sizeof(edge_port->icount));
-
- /* initialize our port settings */
- edge_port->txCredits = 0; /* Can't send
any data yet */
- edge_port->shadowMCR = MCR_MASTER_IE; /* Must always
set this bit to enable ints! */
- edge_port->chaseResponsePending = FALSE;
+ }
+
+ /* initialize our wait queues */
+ init_waitqueue_head(&edge_port->wait_open);
+ init_waitqueue_head(&edge_port->wait_chase);
+ init_waitqueue_head(&edge_port->delta_msr_wait);
+ init_waitqueue_head(&edge_port->wait_command);
+
+ /* initialize our icount structure */
+ memset (&(edge_port->icount), 0x00, sizeof(edge_port->icount));
+
+ /* initialize our port settings */
+ edge_port->txCredits = 0; /* Can't send any data
+yet */
+ edge_port->shadowMCR = MCR_MASTER_IE; /* Must always set
+this bit to enable ints! */
+ edge_port->chaseResponsePending = FALSE;
+
+ /* send a open port command */
+ edge_port->openPending = TRUE;
+ edge_port->open = FALSE;
+ response = send_iosp_ext_cmd (edge_port, IOSP_CMD_OPEN_PORT, 0);
- /* send a open port command */
- edge_port->openPending = TRUE;
- edge_port->open = FALSE;
- response = send_iosp_ext_cmd (edge_port, IOSP_CMD_OPEN_PORT, 0);
+ if (response < 0) {
+ err(__FUNCTION__" - error sending open port command");
+ edge_port->openPending = FALSE;
+ return -ENODEV;
+ }
- if (response < 0) {
- err(__FUNCTION__" - error sending open port command");
- edge_port->openPending = FALSE;
- port->open_count = 0;
- return -ENODEV;
- }
-
- /* now wait for the port to be completly opened */
- timeout = OPEN_TIMEOUT;
- while (timeout && edge_port->openPending == TRUE) {
- timeout = interruptible_sleep_on_timeout
(&edge_port->wait_open, timeout);
- }
-
- if (edge_port->open == FALSE) {
- /* open timed out */
- dbg(__FUNCTION__" - open timedout");
- edge_port->openPending = FALSE;
- port->open_count = 0;
- return -ENODEV;
- }
-
- /* create the txfifo */
- edge_port->txfifo.head = 0;
- edge_port->txfifo.tail = 0;
- edge_port->txfifo.count = 0;
- edge_port->txfifo.size = edge_port->maxTxCredits;
- edge_port->txfifo.fifo = kmalloc (edge_port->maxTxCredits,
GFP_KERNEL);
-
- if (!edge_port->txfifo.fifo) {
- dbg(__FUNCTION__" - no memory");
- edge_close (port, filp);
- return -ENOMEM;
- }
+ /* now wait for the port to be completly opened */
+ timeout = OPEN_TIMEOUT;
+ while (timeout && edge_port->openPending == TRUE) {
+ timeout = interruptible_sleep_on_timeout (&edge_port->wait_open,
+timeout);
+ }
- /* Allocate a URB for the write */
- edge_port->write_urb = usb_alloc_urb (0, GFP_KERNEL);
+ if (edge_port->open == FALSE) {
+ /* open timed out */
+ dbg(__FUNCTION__" - open timedout");
+ edge_port->openPending = FALSE;
+ return -ENODEV;
+ }
- if (!edge_port->write_urb) {
- dbg(__FUNCTION__" - no memory");
- edge_close (port, filp);
- return -ENOMEM;
- }
+ /* create the txfifo */
+ edge_port->txfifo.head = 0;
+ edge_port->txfifo.tail = 0;
+ edge_port->txfifo.count = 0;
+ edge_port->txfifo.size = edge_port->maxTxCredits;
+ edge_port->txfifo.fifo = kmalloc (edge_port->maxTxCredits, GFP_KERNEL);
+
+ if (!edge_port->txfifo.fifo) {
+ dbg(__FUNCTION__" - no memory");
+ edge_close (port, filp);
+ return -ENOMEM;
+ }
+
+ /* Allocate a URB for the write */
+ edge_port->write_urb = usb_alloc_urb (0, GFP_KERNEL);
- dbg(__FUNCTION__"(%d) - Initialize TX fifo to %d bytes", port->number,
edge_port->maxTxCredits);
+ if (!edge_port->write_urb) {
+ dbg(__FUNCTION__" - no memory");
+ edge_close (port, filp);
+ return -ENOMEM;
}
+ dbg(__FUNCTION__"(%d) - Initialize TX fifo to %d bytes", port->number,
+edge_port->maxTxCredits);
+
dbg(__FUNCTION__" exited");
return 0;
@@ -1234,52 +1227,47 @@
if ((edge_serial == NULL) || (edge_port == NULL))
return;
- --port->open_count;
+ if (serial->dev) {
+ // block until tx is empty
+ block_until_tx_empty(edge_port);
+
+ edge_port->closePending = TRUE;
+
+ /* flush and chase */
+ edge_port->chaseResponsePending = TRUE;
+
+ dbg(__FUNCTION__" - Sending IOSP_CMD_CHASE_PORT");
+ status = send_iosp_ext_cmd (edge_port, IOSP_CMD_CHASE_PORT, 0);
+ if (status == 0) {
+ // block until chase finished
+ block_until_chase_response(edge_port);
+ } else {
+ edge_port->chaseResponsePending = FALSE;
+ }
- if (port->open_count <= 0) {
- if (serial->dev) {
- // block until tx is empty
- block_until_tx_empty(edge_port);
-
- edge_port->closePending = TRUE;
-
- /* flush and chase */
- edge_port->chaseResponsePending = TRUE;
-
- dbg(__FUNCTION__" - Sending IOSP_CMD_CHASE_PORT");
- status = send_iosp_ext_cmd (edge_port, IOSP_CMD_CHASE_PORT, 0);
- if (status == 0) {
- // block until chase finished
- block_until_chase_response(edge_port);
- } else {
- edge_port->chaseResponsePending = FALSE;
- }
+ /* close the port */
+ dbg(__FUNCTION__" - Sending IOSP_CMD_CLOSE_PORT");
+ send_iosp_ext_cmd (edge_port, IOSP_CMD_CLOSE_PORT, 0);
- /* close the port */
- dbg(__FUNCTION__" - Sending IOSP_CMD_CLOSE_PORT");
- send_iosp_ext_cmd (edge_port, IOSP_CMD_CLOSE_PORT, 0);
-
- //port->close = TRUE;
- edge_port->closePending = FALSE;
- edge_port->open = FALSE;
- edge_port->openPending = FALSE;
+ //port->close = TRUE;
+ edge_port->closePending = FALSE;
+ edge_port->open = FALSE;
+ edge_port->openPending = FALSE;
- if (edge_port->write_urb) {
- usb_unlink_urb (edge_port->write_urb);
- }
- }
-
if (edge_port->write_urb) {
- /* if this urb had a transfer buffer already (old transfer)
free it */
- if (edge_port->write_urb->transfer_buffer != NULL) {
- kfree(edge_port->write_urb->transfer_buffer);
- }
- usb_free_urb (edge_port->write_urb);
+ usb_unlink_urb (edge_port->write_urb);
}
- if (edge_port->txfifo.fifo) {
- kfree(edge_port->txfifo.fifo);
+ }
+
+ if (edge_port->write_urb) {
+ /* if this urb had a transfer buffer already (old transfer) free it */
+ if (edge_port->write_urb->transfer_buffer != NULL) {
+ kfree(edge_port->write_urb->transfer_buffer);
}
- port->open_count = 0;
+ usb_free_urb (edge_port->write_urb);
+ }
+ if (edge_port->txfifo.fifo) {
+ kfree(edge_port->txfifo.fifo);
}
dbg(__FUNCTION__" exited");
@@ -3027,9 +3015,6 @@
/* stop reads and writes on all ports */
for (i=0; i < serial->num_ports; ++i) {
- while (serial->port[i].open_count > 0) {
- edge_close (&serial->port[i], NULL);
- }
kfree (serial->port[i].private);
serial->port[i].private = NULL;
}
diff -Nru a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c
--- a/drivers/usb/serial/ipaq.c Thu Mar 21 16:22:18 2002
+++ b/drivers/usb/serial/ipaq.c Thu Mar 21 16:22:18 2002
@@ -123,93 +123,89 @@
dbg(__FUNCTION__ " - port %d", port->number);
- ++port->open_count;
-
- if (port->open_count == 1) {
- bytes_in = 0;
- bytes_out = 0;
- priv = (struct ipaq_private *)kmalloc(sizeof(struct ipaq_private),
GFP_KERNEL);
- if (priv == NULL) {
- err(__FUNCTION__ " - Out of memory");
- return -ENOMEM;
- }
- port->private = (void *)priv;
- priv->active = 0;
- priv->queue_len = 0;
- INIT_LIST_HEAD(&priv->queue);
- INIT_LIST_HEAD(&priv->freelist);
-
- for (i = 0; i < URBDATA_QUEUE_MAX / PACKET_SIZE; i++) {
- pkt = kmalloc(sizeof(struct ipaq_packet), GFP_KERNEL);
- if (pkt == NULL) {
- goto enomem;
- }
- pkt->data = kmalloc(PACKET_SIZE, GFP_KERNEL);
- if (pkt->data == NULL) {
- kfree(pkt);
- goto enomem;
- }
- pkt->len = 0;
- pkt->written = 0;
- INIT_LIST_HEAD(&pkt->list);
- list_add(&pkt->list, &priv->freelist);
- priv->free_len += PACKET_SIZE;
- }
-
- /*
- * Force low latency on. This will immediately push data to the line
- * discipline instead of queueing.
- */
-
- port->tty->low_latency = 1;
- port->tty->raw = 1;
- port->tty->real_raw = 1;
-
- /*
- * Lose the small buffers usbserial provides. Make larger ones.
- */
-
- kfree(port->bulk_in_buffer);
- kfree(port->bulk_out_buffer);
- port->bulk_in_buffer = kmalloc(URBDATA_SIZE, GFP_KERNEL);
- if (port->bulk_in_buffer == NULL) {
+ bytes_in = 0;
+ bytes_out = 0;
+ priv = (struct ipaq_private *)kmalloc(sizeof(struct ipaq_private), GFP_KERNEL);
+ if (priv == NULL) {
+ err(__FUNCTION__ " - Out of memory");
+ return -ENOMEM;
+ }
+ port->private = (void *)priv;
+ priv->active = 0;
+ priv->queue_len = 0;
+ INIT_LIST_HEAD(&priv->queue);
+ INIT_LIST_HEAD(&priv->freelist);
+
+ for (i = 0; i < URBDATA_QUEUE_MAX / PACKET_SIZE; i++) {
+ pkt = kmalloc(sizeof(struct ipaq_packet), GFP_KERNEL);
+ if (pkt == NULL) {
goto enomem;
}
- port->bulk_out_buffer = kmalloc(URBDATA_SIZE, GFP_KERNEL);
- if (port->bulk_out_buffer == NULL) {
- kfree(port->bulk_in_buffer);
+ pkt->data = kmalloc(PACKET_SIZE, GFP_KERNEL);
+ if (pkt->data == NULL) {
+ kfree(pkt);
goto enomem;
}
- port->read_urb->transfer_buffer = port->bulk_in_buffer;
- port->write_urb->transfer_buffer = port->bulk_out_buffer;
- port->read_urb->transfer_buffer_length = URBDATA_SIZE;
- port->bulk_out_size = port->write_urb->transfer_buffer_length =
URBDATA_SIZE;
-
- /* Start reading from the device */
- FILL_BULK_URB(port->read_urb, serial->dev,
- usb_rcvbulkpipe(serial->dev,
port->bulk_in_endpointAddress),
- port->read_urb->transfer_buffer,
port->read_urb->transfer_buffer_length,
- ipaq_read_bulk_callback, port);
- result = usb_submit_urb(port->read_urb, GFP_KERNEL);
- if (result) {
- err(__FUNCTION__ " - failed submitting read urb, error %d",
result);
- }
-
- /*
- * Send out two control messages observed in win98 sniffs. Not sure
what
- * they do.
- */
-
- result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
0x22, 0x21,
- 0x1, 0, NULL, 0, 5 * HZ);
- if (result < 0) {
- err(__FUNCTION__ " - failed doing control urb, error %d",
result);
- }
- result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
0x22, 0x21,
- 0x1, 0, NULL, 0, 5 * HZ);
- if (result < 0) {
- err(__FUNCTION__ " - failed doing control urb, error %d",
result);
- }
+ pkt->len = 0;
+ pkt->written = 0;
+ INIT_LIST_HEAD(&pkt->list);
+ list_add(&pkt->list, &priv->freelist);
+ priv->free_len += PACKET_SIZE;
+ }
+
+ /*
+ * Force low latency on. This will immediately push data to the line
+ * discipline instead of queueing.
+ */
+
+ port->tty->low_latency = 1;
+ port->tty->raw = 1;
+ port->tty->real_raw = 1;
+
+ /*
+ * Lose the small buffers usbserial provides. Make larger ones.
+ */
+
+ kfree(port->bulk_in_buffer);
+ kfree(port->bulk_out_buffer);
+ port->bulk_in_buffer = kmalloc(URBDATA_SIZE, GFP_KERNEL);
+ if (port->bulk_in_buffer == NULL) {
+ goto enomem;
+ }
+ port->bulk_out_buffer = kmalloc(URBDATA_SIZE, GFP_KERNEL);
+ if (port->bulk_out_buffer == NULL) {
+ kfree(port->bulk_in_buffer);
+ goto enomem;
+ }
+ port->read_urb->transfer_buffer = port->bulk_in_buffer;
+ port->write_urb->transfer_buffer = port->bulk_out_buffer;
+ port->read_urb->transfer_buffer_length = URBDATA_SIZE;
+ port->bulk_out_size = port->write_urb->transfer_buffer_length = URBDATA_SIZE;
+
+ /* Start reading from the device */
+ FILL_BULK_URB(port->read_urb, serial->dev,
+ usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
+ port->read_urb->transfer_buffer,
+port->read_urb->transfer_buffer_length,
+ ipaq_read_bulk_callback, port);
+ result = usb_submit_urb(port->read_urb, GFP_KERNEL);
+ if (result) {
+ err(__FUNCTION__ " - failed submitting read urb, error %d", result);
+ }
+
+ /*
+ * Send out two control messages observed in win98 sniffs. Not sure what
+ * they do.
+ */
+
+ result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), 0x22,
+0x21,
+ 0x1, 0, NULL, 0, 5 * HZ);
+ if (result < 0) {
+ err(__FUNCTION__ " - failed doing control urb, error %d", result);
+ }
+ result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), 0x22,
+0x21,
+ 0x1, 0, NULL, 0, 5 * HZ);
+ if (result < 0) {
+ err(__FUNCTION__ " - failed doing control urb, error %d", result);
}
return result;
@@ -237,22 +233,16 @@
if (!serial)
return;
- --port->open_count;
+ /*
+ * shut down bulk read and write
+ */
- if (port->open_count <= 0) {
-
- /*
- * shut down bulk read and write
- */
-
- usb_unlink_urb(port->write_urb);
- usb_unlink_urb(port->read_urb);
- ipaq_destroy_lists(port);
- kfree(priv);
- port->private = NULL;
- port->open_count = 0;
+ usb_unlink_urb(port->write_urb);
+ usb_unlink_urb(port->read_urb);
+ ipaq_destroy_lists(port);
+ kfree(priv);
+ port->private = NULL;
- }
/* Uncomment the following line if you want to see some statistics in your
syslog */
/* info ("Bytes In = %d Bytes Out = %d", bytes_in, bytes_out); */
}
@@ -507,16 +497,7 @@
static void ipaq_shutdown(struct usb_serial *serial)
{
- int i;
-
dbg (__FUNCTION__);
-
- /* stop reads and writes on all ports */
- for (i=0; i < serial->num_ports; ++i) {
- while (serial->port[i].open_count > 0) {
- ipaq_close(&serial->port[i], NULL);
- }
- }
}
static int __init ipaq_init(void)
diff -Nru a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c
--- a/drivers/usb/serial/ir-usb.c Thu Mar 21 16:22:18 2002
+++ b/drivers/usb/serial/ir-usb.c Thu Mar 21 16:22:18 2002
@@ -283,45 +283,42 @@
dbg("%s - port %d", __FUNCTION__, port->number);
- ++port->open_count;
-
- if (port->open_count == 1) {
- if (buffer_size) {
- /* override the default buffer sizes */
- buffer = kmalloc (buffer_size, GFP_KERNEL);
- if (!buffer) {
- err ("%s - out of memory.", __FUNCTION__);
- return -ENOMEM;
- }
- kfree (port->read_urb->transfer_buffer);
- port->read_urb->transfer_buffer = buffer;
- port->read_urb->transfer_buffer_length = buffer_size;
-
- buffer = kmalloc (buffer_size, GFP_KERNEL);
- if (!buffer) {
- err ("%s - out of memory.", __FUNCTION__);
- return -ENOMEM;
- }
- kfree (port->write_urb->transfer_buffer);
- port->write_urb->transfer_buffer = buffer;
- port->write_urb->transfer_buffer_length = buffer_size;
- port->bulk_out_size = buffer_size;
+ if (buffer_size) {
+ /* override the default buffer sizes */
+ buffer = kmalloc (buffer_size, GFP_KERNEL);
+ if (!buffer) {
+ err ("%s - out of memory.", __FUNCTION__);
+ return -ENOMEM;
}
-
- /* Start reading from the device */
- usb_fill_bulk_urb (
- port->read_urb,
- serial->dev,
- usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
- port->read_urb->transfer_buffer,
- port->read_urb->transfer_buffer_length,
- ir_read_bulk_callback,
- port);
- port->read_urb->transfer_flags = USB_QUEUE_BULK;
- result = usb_submit_urb(port->read_urb, GFP_KERNEL);
- if (result)
- err("%s - failed submitting read urb, error %d", __FUNCTION__,
result);
+ kfree (port->read_urb->transfer_buffer);
+ port->read_urb->transfer_buffer = buffer;
+ port->read_urb->transfer_buffer_length = buffer_size;
+
+ buffer = kmalloc (buffer_size, GFP_KERNEL);
+ if (!buffer) {
+ err ("%s - out of memory.", __FUNCTION__);
+ return -ENOMEM;
+ }
+ kfree (port->write_urb->transfer_buffer);
+ port->write_urb->transfer_buffer = buffer;
+ port->write_urb->transfer_buffer_length = buffer_size;
+ port->bulk_out_size = buffer_size;
}
+
+ /* Start reading from the device */
+ usb_fill_bulk_urb (
+ port->read_urb,
+ serial->dev,
+ usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
+ port->read_urb->transfer_buffer,
+ port->read_urb->transfer_buffer_length,
+ ir_read_bulk_callback,
+ port);
+ port->read_urb->transfer_flags = USB_QUEUE_BULK;
+ result = usb_submit_urb(port->read_urb, GFP_KERNEL);
+ if (result)
+ err("%s - failed submitting read urb, error %d", __FUNCTION__, result);
+
return result;
}
@@ -338,15 +335,9 @@
if (!serial)
return;
- --port->open_count;
-
- if (port->open_count <= 0) {
- if (serial->dev) {
- /* shutdown our bulk read */
- usb_unlink_urb (port->read_urb);
- }
- port->open_count = 0;
-
+ if (serial->dev) {
+ /* shutdown our bulk read */
+ usb_unlink_urb (port->read_urb);
}
}
diff -Nru a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c
--- a/drivers/usb/serial/keyspan.c Thu Mar 21 16:22:18 2002
+++ b/drivers/usb/serial/keyspan.c Thu Mar 21 16:22:18 2002
@@ -852,7 +852,7 @@
struct keyspan_serial_private *s_priv;
struct usb_serial *serial = port->serial;
const struct keyspan_device_details *d_details;
- int i, already_active, err;
+ int i, err;
struct urb *urb;
s_priv = (struct keyspan_serial_private *)(serial->private);
@@ -861,12 +861,6 @@
dbg("keyspan_open called for port%d.\n", port->number);
- already_active = port->open_count;
- ++port->open_count;
-
- if (already_active)
- return 0;
-
p_priv = (struct keyspan_port_private *)(port->private);
/* Set some sane defaults */
@@ -924,19 +918,16 @@
p_priv->out_flip = 0;
p_priv->in_flip = 0;
- if (--port->open_count <= 0) {
- if (serial->dev) {
- /* Stop reading/writing urbs */
- stop_urb(p_priv->inack_urb);
- stop_urb(p_priv->outcont_urb);
- for (i = 0; i < 2; i++) {
- stop_urb(p_priv->in_urbs[i]);
- stop_urb(p_priv->out_urbs[i]);
- }
+ if (serial->dev) {
+ /* Stop reading/writing urbs */
+ stop_urb(p_priv->inack_urb);
+ stop_urb(p_priv->outcont_urb);
+ for (i = 0; i < 2; i++) {
+ stop_urb(p_priv->in_urbs[i]);
+ stop_urb(p_priv->out_urbs[i]);
}
- port->open_count = 0;
- port->tty = 0;
}
+ port->tty = 0;
}
@@ -1762,9 +1753,6 @@
/* Now free per port private data */
for (i = 0; i < serial->num_ports; i++) {
port = &serial->port[i];
- while (port->open_count > 0) {
- --port->open_count;
- }
kfree(port->private);
}
}
diff -Nru a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c
--- a/drivers/usb/serial/keyspan_pda.c Thu Mar 21 16:22:18 2002
+++ b/drivers/usb/serial/keyspan_pda.c Thu Mar 21 16:22:18 2002
@@ -662,52 +662,45 @@
int rc = 0;
struct keyspan_pda_private *priv;
- ++port->open_count;
-
- if (port->open_count == 1) {
- /* find out how much room is in the Tx ring */
- rc = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
- 6, /* write_room */
- USB_TYPE_VENDOR | USB_RECIP_INTERFACE
- | USB_DIR_IN,
- 0, /* value */
- 0, /* index */
- &room,
- 1,
- 2*HZ);
- if (rc < 0) {
- dbg(__FUNCTION__" - roomquery failed");
- goto error;
- }
- if (rc == 0) {
- dbg(__FUNCTION__" - roomquery returned 0 bytes");
- rc = -EIO;
- goto error;
- }
- priv = (struct keyspan_pda_private *)(port->private);
- priv->tx_room = room;
- priv->tx_throttled = room ? 0 : 1;
-
- /* the normal serial device seems to always turn on DTR and RTS here,
- so do the same */
- if (port->tty->termios->c_cflag & CBAUD)
- keyspan_pda_set_modem_info(serial, (1<<7) | (1<<2) );
- else
- keyspan_pda_set_modem_info(serial, 0);
-
- /*Start reading from the device*/
- port->interrupt_in_urb->dev = serial->dev;
- rc = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
- if (rc) {
- dbg(__FUNCTION__" - usb_submit_urb(read int) failed");
- goto error;
- }
-
+ /* find out how much room is in the Tx ring */
+ rc = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
+ 6, /* write_room */
+ USB_TYPE_VENDOR | USB_RECIP_INTERFACE
+ | USB_DIR_IN,
+ 0, /* value */
+ 0, /* index */
+ &room,
+ 1,
+ 2*HZ);
+ if (rc < 0) {
+ dbg(__FUNCTION__" - roomquery failed");
+ goto error;
+ }
+ if (rc == 0) {
+ dbg(__FUNCTION__" - roomquery returned 0 bytes");
+ rc = -EIO;
+ goto error;
+ }
+ priv = (struct keyspan_pda_private *)(port->private);
+ priv->tx_room = room;
+ priv->tx_throttled = room ? 0 : 1;
+
+ /* the normal serial device seems to always turn on DTR and RTS here,
+ so do the same */
+ if (port->tty->termios->c_cflag & CBAUD)
+ keyspan_pda_set_modem_info(serial, (1<<7) | (1<<2) );
+ else
+ keyspan_pda_set_modem_info(serial, 0);
+
+ /*Start reading from the device*/
+ port->interrupt_in_urb->dev = serial->dev;
+ rc = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
+ if (rc) {
+ dbg(__FUNCTION__" - usb_submit_urb(read int) failed");
+ goto error;
}
- return rc;
error:
- --port->open_count;
return rc;
}
@@ -716,19 +709,14 @@
{
struct usb_serial *serial = port->serial;
- --port->open_count;
+ if (serial->dev) {
+ /* the normal serial device seems to always shut off DTR and RTS now */
+ if (port->tty->termios->c_cflag & HUPCL)
+ keyspan_pda_set_modem_info(serial, 0);
- if (port->open_count <= 0) {
- if (serial->dev) {
- /* the normal serial device seems to always shut off DTR and
RTS now */
- if (port->tty->termios->c_cflag & HUPCL)
- keyspan_pda_set_modem_info(serial, 0);
-
- /* shutdown our bulk reads and writes */
- usb_unlink_urb (port->write_urb);
- usb_unlink_urb (port->interrupt_in_urb);
- }
- port->open_count = 0;
+ /* shutdown our bulk reads and writes */
+ usb_unlink_urb (port->write_urb);
+ usb_unlink_urb (port->interrupt_in_urb);
}
}
@@ -805,9 +793,6 @@
{
dbg (__FUNCTION__);
- while (serial->port[0].open_count > 0) {
- keyspan_pda_close (&serial->port[0], NULL);
- }
kfree(serial->port[0].private);
}
diff -Nru a/drivers/usb/serial/kl5kusb105.c b/drivers/usb/serial/kl5kusb105.c
--- a/drivers/usb/serial/kl5kusb105.c Thu Mar 21 16:22:18 2002
+++ b/drivers/usb/serial/kl5kusb105.c Thu Mar 21 16:22:18 2002
@@ -317,9 +317,6 @@
struct klsi_105_private *priv =
(struct klsi_105_private*) serial->port[i].private;
unsigned long flags;
- while (serial->port[i].open_count > 0) {
- klsi_105_close (&serial->port[i], NULL);
- }
if (priv) {
/* kill our write urb pool */
@@ -355,85 +352,80 @@
struct usb_serial *serial = port->serial;
struct klsi_105_private *priv = (struct klsi_105_private *)port->private;
int retval = 0;
+ int rc;
+ int i;
+ unsigned long line_state;
dbg(__FUNCTION__" port %d", port->number);
- ++port->open_count;
-
- if (port->open_count == 1) {
- int rc;
- int i;
- unsigned long line_state;
-
- /* force low_latency on so that our tty_push actually forces
- * the data through
- * port->tty->low_latency = 1; */
-
- /* Do a defined restart:
- * Set up sane default baud rate and send the 'READ_ON'
- * vendor command.
- * FIXME: set modem line control (how?)
- * Then read the modem line control and store values in
- * priv->line_state.
- */
- priv->cfg.pktlen = 5;
- priv->cfg.baudrate = kl5kusb105a_sio_b9600;
- priv->cfg.databits = kl5kusb105a_dtb_8;
- priv->cfg.unknown1 = 0;
- priv->cfg.unknown2 = 1;
- klsi_105_chg_port_settings(serial, &(priv->cfg));
-
- /* set up termios structure */
- priv->termios.c_iflag = port->tty->termios->c_iflag;
- priv->termios.c_oflag = port->tty->termios->c_oflag;
- priv->termios.c_cflag = port->tty->termios->c_cflag;
- priv->termios.c_lflag = port->tty->termios->c_lflag;
- for (i=0; i<NCCS; i++)
- priv->termios.c_cc[i] = port->tty->termios->c_cc[i];
-
-
- /* READ_ON and urb submission */
- FILL_BULK_URB(port->read_urb, serial->dev,
- usb_rcvbulkpipe(serial->dev,
- port->bulk_in_endpointAddress),
- port->read_urb->transfer_buffer,
- port->read_urb->transfer_buffer_length,
- klsi_105_read_bulk_callback,
- port);
- port->read_urb->transfer_flags |= USB_QUEUE_BULK;
-
- rc = usb_submit_urb(port->read_urb, GFP_KERNEL);
- if (rc) {
- err(__FUNCTION__
- " - failed submitting read urb, error %d", rc);
- retval = rc;
- goto exit;
- }
-
- rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev,0),
- KL5KUSB105A_SIO_CONFIGURE,
- USB_TYPE_VENDOR|USB_DIR_OUT|USB_RECIP_INTERFACE,
- KL5KUSB105A_SIO_CONFIGURE_READ_ON,
- 0, /* index */
- NULL,
- 0,
- KLSI_TIMEOUT);
- if (rc < 0) {
- err("Enabling read failed (error = %d)", rc);
- retval = rc;
- } else
- dbg(__FUNCTION__ " - enabled reading");
-
- rc = klsi_105_get_line_state(serial, &line_state);
- if (rc >= 0) {
- priv->line_state = line_state;
- dbg(__FUNCTION__
- " - read line state 0x%lx", line_state);
- retval = 0;
- } else
- retval = rc;
+ /* force low_latency on so that our tty_push actually forces
+ * the data through
+ * port->tty->low_latency = 1; */
+
+ /* Do a defined restart:
+ * Set up sane default baud rate and send the 'READ_ON'
+ * vendor command.
+ * FIXME: set modem line control (how?)
+ * Then read the modem line control and store values in
+ * priv->line_state.
+ */
+ priv->cfg.pktlen = 5;
+ priv->cfg.baudrate = kl5kusb105a_sio_b9600;
+ priv->cfg.databits = kl5kusb105a_dtb_8;
+ priv->cfg.unknown1 = 0;
+ priv->cfg.unknown2 = 1;
+ klsi_105_chg_port_settings(serial, &(priv->cfg));
+
+ /* set up termios structure */
+ priv->termios.c_iflag = port->tty->termios->c_iflag;
+ priv->termios.c_oflag = port->tty->termios->c_oflag;
+ priv->termios.c_cflag = port->tty->termios->c_cflag;
+ priv->termios.c_lflag = port->tty->termios->c_lflag;
+ for (i=0; i<NCCS; i++)
+ priv->termios.c_cc[i] = port->tty->termios->c_cc[i];
+
+
+ /* READ_ON and urb submission */
+ FILL_BULK_URB(port->read_urb, serial->dev,
+ usb_rcvbulkpipe(serial->dev,
+ port->bulk_in_endpointAddress),
+ port->read_urb->transfer_buffer,
+ port->read_urb->transfer_buffer_length,
+ klsi_105_read_bulk_callback,
+ port);
+ port->read_urb->transfer_flags |= USB_QUEUE_BULK;
+
+ rc = usb_submit_urb(port->read_urb, GFP_KERNEL);
+ if (rc) {
+ err(__FUNCTION__
+ " - failed submitting read urb, error %d", rc);
+ retval = rc;
+ goto exit;
}
+ rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev,0),
+ KL5KUSB105A_SIO_CONFIGURE,
+ USB_TYPE_VENDOR|USB_DIR_OUT|USB_RECIP_INTERFACE,
+ KL5KUSB105A_SIO_CONFIGURE_READ_ON,
+ 0, /* index */
+ NULL,
+ 0,
+ KLSI_TIMEOUT);
+ if (rc < 0) {
+ err("Enabling read failed (error = %d)", rc);
+ retval = rc;
+ } else
+ dbg(__FUNCTION__ " - enabled reading");
+
+ rc = klsi_105_get_line_state(serial, &line_state);
+ if (rc >= 0) {
+ priv->line_state = line_state;
+ dbg(__FUNCTION__
+ " - read line state 0x%lx", line_state);
+ retval = 0;
+ } else
+ retval = rc;
+
exit:
return retval;
} /* klsi_105_open */
@@ -444,6 +436,7 @@
struct usb_serial *serial;
struct klsi_105_private *priv
= (struct klsi_105_private *)port->private;
+ int rc;
dbg(__FUNCTION__" port %d", port->number);
serial = get_usb_serial (port, __FUNCTION__);
@@ -451,31 +444,26 @@
if(!serial)
return;
- --port->open_count;
-
- if (port->open_count <= 0) {
- /* send READ_OFF */
- int rc = usb_control_msg(serial->dev,
- usb_sndctrlpipe(serial->dev, 0),
- KL5KUSB105A_SIO_CONFIGURE,
- USB_TYPE_VENDOR | USB_DIR_OUT,
- KL5KUSB105A_SIO_CONFIGURE_READ_OFF,
- 0, /* index */
- NULL, 0,
- KLSI_TIMEOUT);
- if (rc < 0)
- err("Disabling read failed (error = %d)", rc);
-
- /* shutdown our bulk reads and writes */
- usb_unlink_urb (port->write_urb);
- usb_unlink_urb (port->read_urb);
- /* unlink our write pool */
- /* FIXME */
- /* wgg - do I need this? I think so. */
- usb_unlink_urb (port->interrupt_in_urb);
- port->open_count = 0;
- info("kl5kusb105 port stats: %ld bytes in, %ld bytes out",
priv->bytes_in, priv->bytes_out);
- }
+ /* send READ_OFF */
+ rc = usb_control_msg (serial->dev,
+ usb_sndctrlpipe(serial->dev, 0),
+ KL5KUSB105A_SIO_CONFIGURE,
+ USB_TYPE_VENDOR | USB_DIR_OUT,
+ KL5KUSB105A_SIO_CONFIGURE_READ_OFF,
+ 0, /* index */
+ NULL, 0,
+ KLSI_TIMEOUT);
+ if (rc < 0)
+ err("Disabling read failed (error = %d)", rc);
+
+ /* shutdown our bulk reads and writes */
+ usb_unlink_urb (port->write_urb);
+ usb_unlink_urb (port->read_urb);
+ /* unlink our write pool */
+ /* FIXME */
+ /* wgg - do I need this? I think so. */
+ usb_unlink_urb (port->interrupt_in_urb);
+ info("kl5kusb105 port stats: %ld bytes in, %ld bytes out", priv->bytes_in,
+priv->bytes_out);
} /* klsi_105_close */
diff -Nru a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c
--- a/drivers/usb/serial/mct_u232.c Thu Mar 21 16:22:18 2002
+++ b/drivers/usb/serial/mct_u232.c Thu Mar 21 16:22:18 2002
@@ -324,9 +324,6 @@
/* stop reads and writes on all ports */
for (i=0; i < serial->num_ports; ++i) {
- while (serial->port[i].open_count > 0) {
- mct_u232_close (&serial->port[i], NULL);
- }
/* My special items, the standard routines free my urbs */
if (serial->port[i].private)
kfree(serial->port[i].private);
@@ -341,60 +338,55 @@
dbg(__FUNCTION__" port %d", port->number);
- ++port->open_count;
-
- if (port->open_count == 1) {
- /* Compensate for a hardware bug: although the Sitecom U232-P25
- * device reports a maximum output packet size of 32 bytes,
- * it seems to be able to accept only 16 bytes (and that's what
- * SniffUSB says too...)
- */
- if (serial->dev->descriptor.idProduct == MCT_U232_SITECOM_PID)
- port->bulk_out_size = 16;
-
- /* Do a defined restart: the normal serial device seems to
- * always turn on DTR and RTS here, so do the same. I'm not
- * sure if this is really necessary. But it should not harm
- * either.
- */
- if (port->tty->termios->c_cflag & CBAUD)
- priv->control_state = TIOCM_DTR | TIOCM_RTS;
- else
- priv->control_state = 0;
- mct_u232_set_modem_ctrl(serial, priv->control_state);
-
- priv->last_lcr = (MCT_U232_DATA_BITS_8 |
- MCT_U232_PARITY_NONE |
- MCT_U232_STOP_BITS_1);
- mct_u232_set_line_ctrl(serial, priv->last_lcr);
-
- /* Read modem status and update control state */
- mct_u232_get_modem_stat(serial, &priv->last_msr);
- mct_u232_msr_to_state(&priv->control_state, priv->last_msr);
-
- {
- /* Puh, that's dirty */
- struct usb_serial_port *rport;
- rport = &serial->port[1];
- rport->tty = port->tty;
- rport->private = port->private;
- port->read_urb = rport->interrupt_in_urb;
- }
-
- port->read_urb->dev = port->serial->dev;
- retval = usb_submit_urb(port->read_urb, GFP_KERNEL);
- if (retval) {
- err("usb_submit_urb(read bulk) failed");
- goto exit;
- }
-
- port->interrupt_in_urb->dev = port->serial->dev;
- retval = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
- if (retval)
- err(" usb_submit_urb(read int) failed");
+ /* Compensate for a hardware bug: although the Sitecom U232-P25
+ * device reports a maximum output packet size of 32 bytes,
+ * it seems to be able to accept only 16 bytes (and that's what
+ * SniffUSB says too...)
+ */
+ if (serial->dev->descriptor.idProduct == MCT_U232_SITECOM_PID)
+ port->bulk_out_size = 16;
+
+ /* Do a defined restart: the normal serial device seems to
+ * always turn on DTR and RTS here, so do the same. I'm not
+ * sure if this is really necessary. But it should not harm
+ * either.
+ */
+ if (port->tty->termios->c_cflag & CBAUD)
+ priv->control_state = TIOCM_DTR | TIOCM_RTS;
+ else
+ priv->control_state = 0;
+ mct_u232_set_modem_ctrl(serial, priv->control_state);
+
+ priv->last_lcr = (MCT_U232_DATA_BITS_8 |
+ MCT_U232_PARITY_NONE |
+ MCT_U232_STOP_BITS_1);
+ mct_u232_set_line_ctrl(serial, priv->last_lcr);
+
+ /* Read modem status and update control state */
+ mct_u232_get_modem_stat(serial, &priv->last_msr);
+ mct_u232_msr_to_state(&priv->control_state, priv->last_msr);
+
+ {
+ /* Puh, that's dirty */
+ struct usb_serial_port *rport;
+ rport = &serial->port[1];
+ rport->tty = port->tty;
+ rport->private = port->private;
+ port->read_urb = rport->interrupt_in_urb;
+ }
+ port->read_urb->dev = port->serial->dev;
+ retval = usb_submit_urb(port->read_urb, GFP_KERNEL);
+ if (retval) {
+ err("usb_submit_urb(read bulk) failed");
+ goto exit;
}
+ port->interrupt_in_urb->dev = port->serial->dev;
+ retval = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
+ if (retval)
+ err(" usb_submit_urb(read int) failed");
+
exit:
return 0;
} /* mct_u232_open */
@@ -404,16 +396,11 @@
{
dbg(__FUNCTION__" port %d", port->number);
- --port->open_count;
-
- if (port->open_count <= 0) {
- if (port->serial->dev) {
- /* shutdown our urbs */
- usb_unlink_urb (port->write_urb);
- usb_unlink_urb (port->read_urb);
- usb_unlink_urb (port->interrupt_in_urb);
- }
- port->open_count = 0;
+ if (port->serial->dev) {
+ /* shutdown our urbs */
+ usb_unlink_urb (port->write_urb);
+ usb_unlink_urb (port->read_urb);
+ usb_unlink_urb (port->interrupt_in_urb);
}
} /* mct_u232_close */
diff -Nru a/drivers/usb/serial/omninet.c b/drivers/usb/serial/omninet.c
--- a/drivers/usb/serial/omninet.c Thu Mar 21 16:22:18 2002
+++ b/drivers/usb/serial/omninet.c Thu Mar 21 16:22:18 2002
@@ -157,29 +157,24 @@
if (!serial)
return -ENODEV;
- ++port->open_count;
-
- if (port->open_count == 1) {
- od = kmalloc( sizeof(struct omninet_data), GFP_KERNEL );
- if( !od ) {
- err(__FUNCTION__"- kmalloc(%Zd) failed.", sizeof(struct
omninet_data));
- port->open_count = 0;
- return -ENOMEM;
- }
+ od = kmalloc( sizeof(struct omninet_data), GFP_KERNEL );
+ if( !od ) {
+ err(__FUNCTION__"- kmalloc(%Zd) failed.", sizeof(struct omninet_data));
+ return -ENOMEM;
+ }
- port->private = od;
- wport = &serial->port[1];
- wport->tty = port->tty;
+ port->private = od;
+ wport = &serial->port[1];
+ wport->tty = port->tty;
- /* Start reading from the device */
- FILL_BULK_URB(port->read_urb, serial->dev,
- usb_rcvbulkpipe(serial->dev,
port->bulk_in_endpointAddress),
- port->read_urb->transfer_buffer,
port->read_urb->transfer_buffer_length,
- omninet_read_bulk_callback, port);
- result = usb_submit_urb(port->read_urb, GFP_KERNEL);
- if (result)
- err(__FUNCTION__ " - failed submitting read urb, error %d",
result);
- }
+ /* Start reading from the device */
+ FILL_BULK_URB(port->read_urb, serial->dev,
+ usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
+ port->read_urb->transfer_buffer,
+port->read_urb->transfer_buffer_length,
+ omninet_read_bulk_callback, port);
+ result = usb_submit_urb(port->read_urb, GFP_KERNEL);
+ if (result)
+ err(__FUNCTION__ " - failed submitting read urb, error %d", result);
return result;
}
@@ -199,20 +194,15 @@
if (!serial)
return;
- --port->open_count;
-
- if (port->open_count <= 0) {
- if (serial->dev) {
- wport = &serial->port[1];
- usb_unlink_urb (wport->write_urb);
- usb_unlink_urb (port->read_urb);
- }
-
- port->open_count = 0;
- od = (struct omninet_data *)port->private;
- if (od)
- kfree(od);
+ if (serial->dev) {
+ wport = &serial->port[1];
+ usb_unlink_urb (wport->write_urb);
+ usb_unlink_urb (port->read_urb);
}
+
+ od = (struct omninet_data *)port->private;
+ if (od)
+ kfree(od);
}
@@ -377,10 +367,6 @@
static void omninet_shutdown (struct usb_serial *serial)
{
dbg (__FUNCTION__);
-
- while (serial->port[0].open_count > 0) {
- omninet_close (&serial->port[0], NULL);
- }
}
diff -Nru a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
--- a/drivers/usb/serial/pl2303.c Thu Mar 21 16:22:18 2002
+++ b/drivers/usb/serial/pl2303.c Thu Mar 21 16:22:18 2002
@@ -367,56 +367,52 @@
dbg (__FUNCTION__ " - port %d", port->number);
- ++port->open_count;
-
- if (port->open_count == 1) {
-#define FISH(a,b,c,d)
\
- result=usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev,0),
\
- b, a, c, d, buf, 1, 100);
\
- dbg("0x%x:0x%x:0x%x:0x%x %d - %x",a,b,c,d,result,buf[0]);
-
-#define SOUP(a,b,c,d)
\
- result=usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev,0),
\
- b, a, c, d, NULL, 0, 100);
\
- dbg("0x%x:0x%x:0x%x:0x%x %d",a,b,c,d,result);
-
- FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
- SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0x0404, 0);
- FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
- FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8383, 0);
- FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
- SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0x0404, 1);
- FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
- FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8383, 0);
- SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0, 1);
- SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 1, 0xc0);
- SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 2, 4);
-
- /* Setup termios */
- *(port->tty->termios) = tty_std_termios;
- port->tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
-
- pl2303_set_termios (port, &tmp_termios);
-
- //FIXME: need to assert RTS and DTR if CRTSCTS off
-
- dbg (__FUNCTION__ " - submitting read urb");
- port->read_urb->dev = serial->dev;
- result = usb_submit_urb (port->read_urb, GFP_KERNEL);
- if (result) {
- err(__FUNCTION__ " - failed submitting read urb, error %d",
result);
- pl2303_close (port, NULL);
- return -EPROTO;
- }
+#define FISH(a,b,c,d) \
+ result=usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev,0), \
+ b, a, c, d, buf, 1, 100); \
+ dbg("0x%x:0x%x:0x%x:0x%x %d - %x",a,b,c,d,result,buf[0]);
+
+#define SOUP(a,b,c,d) \
+ result=usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev,0), \
+ b, a, c, d, NULL, 0, 100); \
+ dbg("0x%x:0x%x:0x%x:0x%x %d",a,b,c,d,result);
+
+ FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
+ SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0x0404, 0);
+ FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
+ FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8383, 0);
+ FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
+ SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0x0404, 1);
+ FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
+ FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8383, 0);
+ SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0, 1);
+ SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 1, 0xc0);
+ SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 2, 4);
+
+ /* Setup termios */
+ *(port->tty->termios) = tty_std_termios;
+ port->tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
+
+ pl2303_set_termios (port, &tmp_termios);
+
+ //FIXME: need to assert RTS and DTR if CRTSCTS off
+
+ dbg (__FUNCTION__ " - submitting read urb");
+ port->read_urb->dev = serial->dev;
+ result = usb_submit_urb (port->read_urb, GFP_KERNEL);
+ if (result) {
+ err(__FUNCTION__ " - failed submitting read urb, error %d", result);
+ pl2303_close (port, NULL);
+ return -EPROTO;
+ }
- dbg (__FUNCTION__ " - submitting interrupt urb");
- port->interrupt_in_urb->dev = serial->dev;
- result = usb_submit_urb (port->interrupt_in_urb, GFP_KERNEL);
- if (result) {
- err(__FUNCTION__ " - failed submitting interrupt urb, error
%d", result);
- pl2303_close (port, NULL);
- return -EPROTO;
- }
+ dbg (__FUNCTION__ " - submitting interrupt urb");
+ port->interrupt_in_urb->dev = serial->dev;
+ result = usb_submit_urb (port->interrupt_in_urb, GFP_KERNEL);
+ if (result) {
+ err(__FUNCTION__ " - failed submitting interrupt urb, error %d",
+result);
+ pl2303_close (port, NULL);
+ return -EPROTO;
}
return 0;
}
@@ -437,39 +433,35 @@
dbg (__FUNCTION__ " - port %d", port->number);
- --port->open_count;
- if (port->open_count <= 0) {
- if (serial->dev) {
- c_cflag = port->tty->termios->c_cflag;
- if (c_cflag & HUPCL) {
- /* drop DTR and RTS */
- priv = port->private;
- priv->line_control = 0;
- set_control_lines (port->serial->dev,
- priv->line_control);
- }
-
- /* shutdown our urbs */
- dbg (__FUNCTION__ " - shutting down urbs");
- result = usb_unlink_urb (port->write_urb);
- if (result)
- dbg (__FUNCTION__ " - usb_unlink_urb "
- "(write_urb) failed with reason: %d",
- result);
-
- result = usb_unlink_urb (port->read_urb);
- if (result)
- dbg (__FUNCTION__ " - usb_unlink_urb "
- "(read_urb) failed with reason: %d",
- result);
-
- result = usb_unlink_urb (port->interrupt_in_urb);
- if (result)
- dbg (__FUNCTION__ " - usb_unlink_urb "
- "(interrupt_in_urb) failed with reason: %d",
- result);
+ if (serial->dev) {
+ c_cflag = port->tty->termios->c_cflag;
+ if (c_cflag & HUPCL) {
+ /* drop DTR and RTS */
+ priv = port->private;
+ priv->line_control = 0;
+ set_control_lines (port->serial->dev,
+ priv->line_control);
}
- port->open_count = 0;
+
+ /* shutdown our urbs */
+ dbg (__FUNCTION__ " - shutting down urbs");
+ result = usb_unlink_urb (port->write_urb);
+ if (result)
+ dbg (__FUNCTION__ " - usb_unlink_urb "
+ "(write_urb) failed with reason: %d",
+ result);
+
+ result = usb_unlink_urb (port->read_urb);
+ if (result)
+ dbg (__FUNCTION__ " - usb_unlink_urb "
+ "(read_urb) failed with reason: %d",
+ result);
+
+ result = usb_unlink_urb (port->interrupt_in_urb);
+ if (result)
+ dbg (__FUNCTION__ " - usb_unlink_urb "
+ "(interrupt_in_urb) failed with reason: %d",
+ result);
}
}
@@ -577,12 +569,8 @@
dbg (__FUNCTION__);
- /* stop everything on all ports */
for (i = 0; i < serial->num_ports; ++i)
- while (serial->port[i].open_count > 0) {
- pl2303_close (&serial->port[i], NULL);
- kfree (serial->port[i].private);
- }
+ kfree (serial->port[i].private);
}
diff -Nru a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c
--- a/drivers/usb/serial/visor.c Thu Mar 21 16:22:18 2002
+++ b/drivers/usb/serial/visor.c Thu Mar 21 16:22:18 2002
@@ -268,32 +268,31 @@
dbg(__FUNCTION__ " - port %d", port->number);
if (!port->read_urb) {
+ /* this is needed for some brain dead Sony devices */
err ("Device lied about number of ports, please use a lower one.");
return -ENODEV;
}
- ++port->open_count;
+ bytes_in = 0;
+ bytes_out = 0;
+
+ /*
+ * Force low_latency on so that our tty_push actually forces the data
+ * through, otherwise it is scheduled, and with high data rates (like
+ * with OHCI) data can get lost.
+ */
+ port->tty->low_latency = 1;
- if (port->open_count == 1) {
- bytes_in = 0;
- bytes_out = 0;
-
- /* force low_latency on so that our tty_push actually forces the data
through,
- otherwise it is scheduled, and with high data rates (like with
OHCI) data
- can get lost. */
- port->tty->low_latency = 1;
-
- /* Start reading from the device */
- usb_fill_bulk_urb (port->read_urb, serial->dev,
- usb_rcvbulkpipe (serial->dev,
- port->bulk_in_endpointAddress),
- port->read_urb->transfer_buffer,
- port->read_urb->transfer_buffer_length,
- visor_read_bulk_callback, port);
- result = usb_submit_urb(port->read_urb, GFP_KERNEL);
- if (result)
- err(__FUNCTION__ " - failed submitting read urb, error %d",
result);
- }
+ /* Start reading from the device */
+ usb_fill_bulk_urb (port->read_urb, serial->dev,
+ usb_rcvbulkpipe (serial->dev,
+ port->bulk_in_endpointAddress),
+ port->read_urb->transfer_buffer,
+ port->read_urb->transfer_buffer_length,
+ visor_read_bulk_callback, port);
+ result = usb_submit_urb(port->read_urb, GFP_KERNEL);
+ if (result)
+ err(__FUNCTION__ " - failed submitting read urb, error %d", result);
return result;
}
@@ -313,28 +312,23 @@
if (!serial)
return;
- --port->open_count;
-
- if (port->open_count <= 0) {
- if (serial->dev) {
- /* only send a shutdown message if the
- * device is still here */
- transfer_buffer = kmalloc (0x12, GFP_KERNEL);
- if (!transfer_buffer) {
- err(__FUNCTION__ " - kmalloc(%d) failed.", 0x12);
- } else {
- /* send a shutdown message to the device */
- usb_control_msg (serial->dev,
- usb_rcvctrlpipe(serial->dev, 0),
- VISOR_CLOSE_NOTIFICATION, 0xc2,
- 0x0000, 0x0000,
- transfer_buffer, 0x12, 300);
- kfree (transfer_buffer);
- }
- /* shutdown our bulk read */
- usb_unlink_urb (port->read_urb);
+ if (serial->dev) {
+ /* only send a shutdown message if the
+ * device is still here */
+ transfer_buffer = kmalloc (0x12, GFP_KERNEL);
+ if (!transfer_buffer) {
+ err(__FUNCTION__ " - kmalloc(%d) failed.", 0x12);
+ } else {
+ /* send a shutdown message to the device */
+ usb_control_msg (serial->dev,
+ usb_rcvctrlpipe(serial->dev, 0),
+ VISOR_CLOSE_NOTIFICATION, 0xc2,
+ 0x0000, 0x0000,
+ transfer_buffer, 0x12, 300);
+ kfree (transfer_buffer);
}
- port->open_count = 0;
+ /* shutdown our bulk read */
+ usb_unlink_urb (port->read_urb);
}
/* Uncomment the following line if you want to see some statistics in your
syslog */
/* info ("Bytes In = %d Bytes Out = %d", bytes_in, bytes_out); */
@@ -396,7 +390,7 @@
usb_free_urb (urb);
return count;
-}
+}
static int visor_write_room (struct usb_serial_port *port)
@@ -655,15 +649,8 @@
static void visor_shutdown (struct usb_serial *serial)
{
- int i;
-
dbg (__FUNCTION__);
-
- /* stop reads and writes on all ports */
- for (i=0; i < serial->num_ports; ++i)
- serial->port[i].open_count = 0;
}
-
static int visor_ioctl (struct usb_serial_port *port, struct file * file, unsigned
int cmd, unsigned long arg)
{
diff -Nru a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c
--- a/drivers/usb/serial/whiteheat.c Thu Mar 21 16:22:18 2002
+++ b/drivers/usb/serial/whiteheat.c Thu Mar 21 16:22:18 2002
@@ -306,58 +306,49 @@
dbg(__FUNCTION__" - port %d", port->number);
- ++port->open_count;
-
- if (port->open_count == 1) {
- /* set up some stuff for our command port */
- command_port = &port->serial->port[COMMAND_PORT];
- if (command_port->private == NULL) {
- info = (struct whiteheat_private *)kmalloc (sizeof(struct
whiteheat_private), GFP_KERNEL);
- if (info == NULL) {
- err(__FUNCTION__ " - out of memory");
- retval = -ENOMEM;
- goto error_exit;
- }
-
- init_waitqueue_head(&info->wait_command);
- command_port->private = info;
- command_port->write_urb->complete =
command_port_write_callback;
- command_port->read_urb->complete = command_port_read_callback;
- command_port->read_urb->dev = port->serial->dev;
- command_port->tty = port->tty; /* need this to "fake"
our our sanity check macros */
- retval = usb_submit_urb (command_port->read_urb, GFP_KERNEL);
- if (retval) {
- err(__FUNCTION__ " - failed submitting read urb, error
%d", retval);
- goto error_exit;
- }
+ /* set up some stuff for our command port */
+ command_port = &port->serial->port[COMMAND_PORT];
+ if (command_port->private == NULL) {
+ info = (struct whiteheat_private *)kmalloc (sizeof(struct
+whiteheat_private), GFP_KERNEL);
+ if (info == NULL) {
+ err(__FUNCTION__ " - out of memory");
+ retval = -ENOMEM;
+ goto exit;
}
- /* Start reading from the device */
- port->read_urb->dev = port->serial->dev;
- retval = usb_submit_urb(port->read_urb, GFP_KERNEL);
+ init_waitqueue_head(&info->wait_command);
+ command_port->private = info;
+ command_port->write_urb->complete = command_port_write_callback;
+ command_port->read_urb->complete = command_port_read_callback;
+ command_port->read_urb->dev = port->serial->dev;
+ command_port->tty = port->tty; /* need this to "fake" our our
+sanity check macros */
+ retval = usb_submit_urb (command_port->read_urb, GFP_KERNEL);
if (retval) {
err(__FUNCTION__ " - failed submitting read urb, error %d",
retval);
- goto error_exit;
+ goto exit;
}
+ }
- /* send an open port command */
- /* firmware uses 1 based port numbering */
- open_command.port = port->number - port->serial->minor + 1;
- retval = whiteheat_send_cmd (port->serial, WHITEHEAT_OPEN, (__u8
*)&open_command, sizeof(open_command));
- if (retval)
- goto error_exit;
-
- /* Need to do device specific setup here (control lines, baud rate,
etc.) */
- /* FIXME!!! */
+ /* Start reading from the device */
+ port->read_urb->dev = port->serial->dev;
+ retval = usb_submit_urb(port->read_urb, GFP_KERNEL);
+ if (retval) {
+ err(__FUNCTION__ " - failed submitting read urb, error %d", retval);
+ goto exit;
}
- dbg(__FUNCTION__ " - exit");
- return retval;
+ /* send an open port command */
+ /* firmware uses 1 based port numbering */
+ open_command.port = port->number - port->serial->minor + 1;
+ retval = whiteheat_send_cmd (port->serial, WHITEHEAT_OPEN, (__u8
+*)&open_command, sizeof(open_command));
+ if (retval)
+ goto exit;
-error_exit:
- --port->open_count;
+ /* Need to do device specific setup here (control lines, baud rate, etc.) */
+ /* FIXME!!! */
- dbg(__FUNCTION__ " - error_exit");
+exit:
+ dbg(__FUNCTION__ " - exit, retval = %d", retval);
return retval;
}
@@ -368,22 +359,17 @@
dbg(__FUNCTION__ " - port %d", port->number);
- --port->open_count;
+ /* send a close command to the port */
+ /* firmware uses 1 based port numbering */
+ close_command.port = port->number - port->serial->minor + 1;
+ whiteheat_send_cmd (port->serial, WHITEHEAT_CLOSE, (__u8 *)&close_command,
+sizeof(close_command));
- if (port->open_count <= 0) {
- /* send a close command to the port */
- /* firmware uses 1 based port numbering */
- close_command.port = port->number - port->serial->minor + 1;
- whiteheat_send_cmd (port->serial, WHITEHEAT_CLOSE, (__u8
*)&close_command, sizeof(close_command));
+ /* Need to change the control lines here */
+ /* FIXME */
- /* Need to change the control lines here */
- /* FIXME */
-
- /* shutdown our bulk reads and writes */
- usb_unlink_urb (port->write_urb);
- usb_unlink_urb (port->read_urb);
- port->open_count = 0;
- }
+ /* shutdown our bulk reads and writes */
+ usb_unlink_urb (port->write_urb);
+ usb_unlink_urb (port->read_urb);
}
@@ -641,17 +627,9 @@
static void whiteheat_real_shutdown (struct usb_serial *serial)
{
- struct usb_serial_port *command_port;
- int i;
+ struct usb_serial_port *command_port;
dbg(__FUNCTION__);
-
- /* stop reads and writes on all ports */
- for (i=0; i < serial->num_ports; ++i) {
- while (serial->port[i].open_count > 0) {
- whiteheat_close (&serial->port[i], NULL);
- }
- }
/* free up our private data for our command port */
command_port = &serial->port[COMMAND_PORT];
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel