Loading drivers/serial/serial_core.c +1 −86 Original line number Diff line number Diff line Loading @@ -1526,91 +1526,6 @@ static void uart_dtr_rts(struct tty_port *port, int onoff) uart_clear_mctrl(uport, TIOCM_DTR | TIOCM_RTS); } /* * Block the open until the port is ready. We must be called with * the per-port semaphore held. */ static int uart_block_til_ready(struct file *filp, struct uart_state *state) { DECLARE_WAITQUEUE(wait, current); struct tty_port *port = &state->port; unsigned long flags; spin_lock_irqsave(&port->lock, flags); if (!tty_hung_up_p(filp)) port->count--; port->blocked_open++; spin_unlock_irqrestore(&port->lock, flags); add_wait_queue(&port->open_wait, &wait); while (1) { set_current_state(TASK_INTERRUPTIBLE); /* * If we have been hung up, tell userspace/restart open. */ if (tty_hung_up_p(filp) || port->tty == NULL) break; /* * If the port has been closed, tell userspace/restart open. */ if (!(port->flags & ASYNC_INITIALIZED)) break; /* * If non-blocking mode is set, or CLOCAL mode is set, * we don't want to wait for the modem status lines to * indicate that the port is ready. * * Also, if the port is not enabled/configured, we want * to allow the open to succeed here. Note that we will * have set TTY_IO_ERROR for a non-existant port. */ if ((filp->f_flags & O_NONBLOCK) || (port->tty->termios->c_cflag & CLOCAL) || (port->tty->flags & (1 << TTY_IO_ERROR))) break; /* * Set DTR to allow modem to know we're waiting. Do * not set RTS here - we want to make sure we catch * the data from the modem. */ if (port->tty->termios->c_cflag & CBAUD) tty_port_raise_dtr_rts(port); /* * and wait for the carrier to indicate that the * modem is ready for us. */ if (tty_port_carrier_raised(port)) break; schedule(); if (signal_pending(current)) break; } set_current_state(TASK_RUNNING); remove_wait_queue(&port->open_wait, &wait); spin_lock_irqsave(&port->lock, flags); if (!tty_hung_up_p(filp)) port->count++; port->blocked_open--; spin_unlock_irqrestore(&port->lock, flags); if (signal_pending(current)) return -ERESTARTSYS; if (!port->tty || tty_hung_up_p(filp)) return -EAGAIN; return 0; } static struct uart_state *uart_get(struct uart_driver *drv, int line) { struct uart_state *state; Loading Loading @@ -1719,7 +1634,7 @@ static int uart_open(struct tty_struct *tty, struct file *filp) */ mutex_unlock(&port->mutex); if (retval == 0) retval = uart_block_til_ready(filp, state); retval = tty_port_block_til_ready(port, tty, filp); /* * If this is the first open to succeed, adjust things to suit. Loading Loading
drivers/serial/serial_core.c +1 −86 Original line number Diff line number Diff line Loading @@ -1526,91 +1526,6 @@ static void uart_dtr_rts(struct tty_port *port, int onoff) uart_clear_mctrl(uport, TIOCM_DTR | TIOCM_RTS); } /* * Block the open until the port is ready. We must be called with * the per-port semaphore held. */ static int uart_block_til_ready(struct file *filp, struct uart_state *state) { DECLARE_WAITQUEUE(wait, current); struct tty_port *port = &state->port; unsigned long flags; spin_lock_irqsave(&port->lock, flags); if (!tty_hung_up_p(filp)) port->count--; port->blocked_open++; spin_unlock_irqrestore(&port->lock, flags); add_wait_queue(&port->open_wait, &wait); while (1) { set_current_state(TASK_INTERRUPTIBLE); /* * If we have been hung up, tell userspace/restart open. */ if (tty_hung_up_p(filp) || port->tty == NULL) break; /* * If the port has been closed, tell userspace/restart open. */ if (!(port->flags & ASYNC_INITIALIZED)) break; /* * If non-blocking mode is set, or CLOCAL mode is set, * we don't want to wait for the modem status lines to * indicate that the port is ready. * * Also, if the port is not enabled/configured, we want * to allow the open to succeed here. Note that we will * have set TTY_IO_ERROR for a non-existant port. */ if ((filp->f_flags & O_NONBLOCK) || (port->tty->termios->c_cflag & CLOCAL) || (port->tty->flags & (1 << TTY_IO_ERROR))) break; /* * Set DTR to allow modem to know we're waiting. Do * not set RTS here - we want to make sure we catch * the data from the modem. */ if (port->tty->termios->c_cflag & CBAUD) tty_port_raise_dtr_rts(port); /* * and wait for the carrier to indicate that the * modem is ready for us. */ if (tty_port_carrier_raised(port)) break; schedule(); if (signal_pending(current)) break; } set_current_state(TASK_RUNNING); remove_wait_queue(&port->open_wait, &wait); spin_lock_irqsave(&port->lock, flags); if (!tty_hung_up_p(filp)) port->count++; port->blocked_open--; spin_unlock_irqrestore(&port->lock, flags); if (signal_pending(current)) return -ERESTARTSYS; if (!port->tty || tty_hung_up_p(filp)) return -EAGAIN; return 0; } static struct uart_state *uart_get(struct uart_driver *drv, int line) { struct uart_state *state; Loading Loading @@ -1719,7 +1634,7 @@ static int uart_open(struct tty_struct *tty, struct file *filp) */ mutex_unlock(&port->mutex); if (retval == 0) retval = uart_block_til_ready(filp, state); retval = tty_port_block_til_ready(port, tty, filp); /* * If this is the first open to succeed, adjust things to suit. Loading