# 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.570 -> 1.571 # drivers/usb/serial/io_edgeport.c 1.26 -> 1.27 # # The following is the BitKeeper ChangeSet Log # -------------------------------------------- # 02/03/28 greg@kroah.com 1.571 # USB io_edgeport driver update # # fixes to let io_edgeport work properly as a usb serial console # -------------------------------------------- # diff -Nru a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c --- a/drivers/usb/serial/io_edgeport.c Wed Apr 3 16:39:21 2002 +++ b/drivers/usb/serial/io_edgeport.c Wed Apr 3 16:39:21 2002 @@ -274,7 +274,7 @@ /* * Version Information */ -#define DRIVER_VERSION "v2.2" +#define DRIVER_VERSION "v2.3" #define DRIVER_AUTHOR "Greg Kroah-Hartman and David Iacovelli" #define DRIVER_DESC "Edgeport USB Serial Driver" @@ -811,7 +811,8 @@ dbg(__FUNCTION__" - txcredits for port%d = %d", portNumber, edge_port->txCredits); /* tell the tty driver that something has changed */ - wake_up_interruptible(&edge_port->port->tty->write_wait); + if (edge_port->port->tty) + wake_up_interruptible(&edge_port->port->tty->write_wait); // Since we have more credit, check if more data can be sent send_more_port_data(edge_serial, edge_port); @@ -898,13 +899,15 @@ tty = edge_port->port->tty; - /* let the tty driver wakeup if it has a special write_wakeup function */ - if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && tty->ldisc.write_wakeup) { - (tty->ldisc.write_wakeup)(tty); - } + if (tty) { + /* let the tty driver wakeup if it has a special write_wakeup function */ + if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && tty->ldisc.write_wakeup) { + (tty->ldisc.write_wakeup)(tty); + } - /* tell the tty driver that something has changed */ - wake_up_interruptible(&tty->write_wait); + /* tell the tty driver that something has changed */ + wake_up_interruptible(&tty->write_wait); + } // Release the Write URB edge_port->write_in_progress = FALSE; @@ -953,7 +956,8 @@ tty = edge_port->port->tty; /* tell the tty driver that something has changed */ - wake_up_interruptible(&tty->write_wait); + if (tty) + wake_up_interruptible(&tty->write_wait); /* we have completed the command */ edge_port->commandPending = FALSE; @@ -990,7 +994,8 @@ /* 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->tty) + 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.) */ @@ -1568,6 +1573,10 @@ } tty = port->tty; + if (!tty) { + dbg ("%s - no tty available", __FUNCTION__); + return; + } /* if we are implementing XON/XOFF, send the stop character */ if (I_IXOFF(tty)) { @@ -1613,6 +1622,10 @@ } tty = port->tty; + if (!tty) { + dbg ("%s - no tty available", __FUNCTION__); + return; + } /* if we are implementing XON/XOFF, send the start character */ if (I_IXOFF(tty)) { @@ -1644,15 +1657,14 @@ { struct edgeport_port *edge_port = (struct edgeport_port *)(port->private); struct tty_struct *tty = port->tty; - unsigned int cflag = tty->termios->c_cflag; + unsigned int cflag; - dbg(__FUNCTION__" - clfag %08x %08x iflag %08x %08x", - tty->termios->c_cflag, - old_termios->c_cflag, - RELEVANT_IFLAG(tty->termios->c_iflag), - RELEVANT_IFLAG(old_termios->c_iflag) - ); + if (!port->tty || !port->tty->termios) { + dbg ("%s - no tty or termios", __FUNCTION__); + return; + } + cflag = tty->termios->c_cflag; /* check that they really want us to change something */ if (old_termios) { if ((cflag == old_termios->c_cflag) && @@ -1662,6 +1674,15 @@ } } + dbg("%s - clfag %08x iflag %08x", __FUNCTION__, + tty->termios->c_cflag, + RELEVANT_IFLAG(tty->termios->c_iflag)); + if (old_termios) { + dbg("%s - old clfag %08x old iflag %08x", __FUNCTION__, + old_termios->c_cflag, + RELEVANT_IFLAG(old_termios->c_iflag)); + } + dbg(__FUNCTION__" - port %d", port->number); if (edge_port == NULL) @@ -1709,6 +1730,9 @@ unsigned int result = 0; struct tty_struct *tty = edge_port->port->tty; + if (!tty) + return -ENOIOCTLCMD; + result = tty->read_cnt; dbg(__FUNCTION__"(%d) = %d", edge_port->port->number, result); @@ -2136,7 +2160,8 @@ handle_new_msr (edge_port, byte2); /* send the current line settings to the port so we are in sync with any further termios calls */ - change_port_settings (edge_port, edge_port->port->tty->termios); + if (edge_port->port->tty) + change_port_settings (edge_port, edge_port->port->tty->termios); /* we have completed the open */ edge_port->openPending = FALSE; @@ -2247,7 +2272,7 @@ } /* Place LSR data byte into Rx buffer */ - if (lsrData) { + if (lsrData && edge_port->port->tty) { tty_insert_flip_char(edge_port->port->tty, data, 0); tty_flip_buffer_push(edge_port->port->tty); }