Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 207905
b: refs/heads/master
c: 74c2107
h: refs/heads/master
i:
  207903: c980b82
v: v3
  • Loading branch information
Alan Cox authored and Greg Kroah-Hartman committed Aug 10, 2010
1 parent 70aaf90 commit 388570f
Show file tree
Hide file tree
Showing 2 changed files with 2 additions and 87 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 24fcc7c8cd0fcabcf37d455abe3501b3196fcf64
refs/heads/master: 74c2107759dc6efaa1b9127014be58a742a1e7ac
87 changes: 1 addition & 86 deletions trunk/drivers/serial/serial_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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.
Expand Down

0 comments on commit 388570f

Please sign in to comment.