Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 339162
b: refs/heads/master
c: 9aba8d5
h: refs/heads/master
v: v3
  • Loading branch information
Russell King committed Nov 4, 2012
1 parent 06f4027 commit 04c6c82
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 5 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: dba05832cbe4f305dfd998fb26d7c685d91fbbd8
refs/heads/master: 9aba8d5b011193c8e01d565c5b585df5b94f1db2
31 changes: 27 additions & 4 deletions trunk/drivers/tty/serial/serial_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -610,27 +610,50 @@ static void uart_send_xchar(struct tty_struct *tty, char ch)
static void uart_throttle(struct tty_struct *tty)
{
struct uart_state *state = tty->driver_data;
struct uart_port *port = state->uart_port;
uint32_t mask = 0;

if (I_IXOFF(tty))
mask |= UPF_SOFT_FLOW;
if (tty->termios.c_cflag & CRTSCTS)
mask |= UPF_HARD_FLOW;

if (port->flags & mask) {
port->ops->throttle(port);
mask &= ~port->flags;
}

if (mask & UPF_SOFT_FLOW)
uart_send_xchar(tty, STOP_CHAR(tty));

if (tty->termios.c_cflag & CRTSCTS)
uart_clear_mctrl(state->uart_port, TIOCM_RTS);
if (mask & UPF_HARD_FLOW)
uart_clear_mctrl(port, TIOCM_RTS);
}

static void uart_unthrottle(struct tty_struct *tty)
{
struct uart_state *state = tty->driver_data;
struct uart_port *port = state->uart_port;
uint32_t mask = 0;

if (I_IXOFF(tty)) {
if (I_IXOFF(tty))
mask |= UPF_SOFT_FLOW;
if (tty->termios.c_cflag & CRTSCTS)
mask |= UPF_HARD_FLOW;

if (port->flags & mask) {
port->ops->unthrottle(port);
mask &= ~port->flags;
}

if (mask & UPF_SOFT_FLOW) {
if (port->x_char)
port->x_char = 0;
else
uart_send_xchar(tty, START_CHAR(tty));
}

if (tty->termios.c_cflag & CRTSCTS)
if (mask & UPF_HARD_FLOW)
uart_set_mctrl(port, TIOCM_RTS);
}

Expand Down
2 changes: 2 additions & 0 deletions trunk/include/linux/serial_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ struct uart_ops {
unsigned int (*get_mctrl)(struct uart_port *);
void (*stop_tx)(struct uart_port *);
void (*start_tx)(struct uart_port *);
void (*throttle)(struct uart_port *);
void (*unthrottle)(struct uart_port *);
void (*send_xchar)(struct uart_port *, char ch);
void (*stop_rx)(struct uart_port *);
void (*enable_ms)(struct uart_port *);
Expand Down

0 comments on commit 04c6c82

Please sign in to comment.