On Sat, 2006-04-08 at 21:34 +0200, Guennadi Liakhovetski wrote:
> On Fri, 7 Apr 2006, Paul Fulghum wrote:
> It hung exactly as with the previous big one. Don't think it is important,
> I am testing it on a SMP.
OK, this one backs out my usb_console_setup change
that uses the temp tty structure for the device specific open.
Included is:
* improved usb serial_open fix (fix ENODEV)
* improved usb_console_write fix (fix CR after LF)
* your original ftdi patch (fix oops on tty struct == NULL)
--- a/drivers/usb/serial/console.c 2006-03-19 23:53:29.000000000 -0600
+++ b/drivers/usb/serial/console.c 2006-04-08 15:43:15.000000000 -0500
@@ -213,17 +213,38 @@ static void usb_console_write(struct con
if (!port->open_count) {
dbg ("%s - port not opened", __FUNCTION__);
- goto exit;
+ return;
}
- /* pass on to the driver specific version of this function if it is
available */
- if (serial->type->write)
- retval = serial->type->write(port, buf, count);
- else
- retval = usb_serial_generic_write(port, buf, count);
-
-exit:
- dbg("%s - return value (if we had one): %d", __FUNCTION__, retval);
+ while (count) {
+ unsigned int i;
+ unsigned int lf;
+ /* search for LF so we can insert CR if necessary */
+ for (i=0, lf=0 ; i < count ; i++) {
+ if (*(buf + i) == 10) {
+ lf = 1;
+ i++;
+ break;
+ }
+ }
+ /* pass on to the driver specific version of this function if
it is available */
+ if (serial->type->write)
+ retval = serial->type->write(port, buf, i);
+ else
+ retval = usb_serial_generic_write(port, buf, i);
+ dbg("%s - return value : %d", __FUNCTION__, retval);
+ if (lf) {
+ /* append CR after LF */
+ unsigned char cr = 13;
+ if (serial->type->write)
+ retval = serial->type->write(port, &cr, 1);
+ else
+ retval = usb_serial_generic_write(port, &cr, 1);
+ dbg("%s - return value : %d", __FUNCTION__, retval);
+ }
+ buf += i;
+ count -= i;
+ }
}
static struct console usbcons = {
--- a/drivers/usb/serial/usb-serial.c 2006-03-19 23:53:29.000000000 -0600
+++ b/drivers/usb/serial/usb-serial.c 2006-04-08 15:34:11.000000000 -0500
@@ -197,12 +197,12 @@ static int serial_open (struct tty_struc
++port->open_count;
- if (port->open_count == 1) {
+ /* set up our port structure making the tty driver
+ * remember our port object, and us it */
+ tty->driver_data = port;
+ port->tty = tty;
- /* set up our port structure making the tty driver
- * remember our port object, and us it */
- tty->driver_data = port;
- port->tty = tty;
+ if (port->open_count == 1) {
/* lock this module before we call it
* this may fail, which means we must bail out,
--- a/drivers/usb/serial/ftdi_sio.c 2006-03-19 23:53:29.000000000 -0600
+++ b/drivers/usb/serial/ftdi_sio.c 2006-04-08 15:47:21.000000000 -0500
@@ -1264,8 +1264,8 @@ static int ftdi_open (struct usb_serial
dbg("%s", __FUNCTION__);
-
- port->tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
+ if (port->tty)
+ port->tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1
: 0;
/* No error checking for this (will get errors later anyway) */
/* See ftdi_sio.h for description of what is reset */
@@ -1279,7 +1279,8 @@ static int ftdi_open (struct usb_serial
This is same behaviour as serial.c/rs_open() - Kuba */
/* ftdi_set_termios will send usb control messages */
- ftdi_set_termios(port, &tmp_termios);
+ if (port->tty)
+ ftdi_set_termios(port, &tmp_termios);
/* FIXME: Flow control might be enabled, so it should be checked -
we have no control of defaults! */
@@ -1860,7 +1861,7 @@ static void ftdi_set_termios (struct usb
err("%s urb failed to set baudrate", __FUNCTION__);
}
/* Ensure RTS and DTR are raised when baudrate changed from 0 */
- if ((old_termios->c_cflag & CBAUD) == B0) {
+ if (!old_termios || (old_termios->c_cflag & CBAUD) == B0) {
set_mctrl(port, TIOCM_DTR | TIOCM_RTS);
}
}
-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel