Skip to content

Commit

Permalink
TTY: ip22zilog, fix tty_flip_buffer_push call
Browse files Browse the repository at this point in the history
This one was omitted by the "TTY: switch tty_flip_buffer_push" patch
because I did not compile-test mips driver. Now I do.

Signed-off-by: Jiri Slaby <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
Jiri Slaby authored and gregkh committed Jan 16, 2013
1 parent f5836a5 commit 2894500
Showing 1 changed file with 12 additions and 18 deletions.
30 changes: 12 additions & 18 deletions drivers/tty/serial/ip22zilog.c
Original file line number Diff line number Diff line change
Expand Up @@ -248,17 +248,12 @@ static void ip22zilog_maybe_update_regs(struct uart_ip22zilog_port *up,
#define Rx_BRK 0x0100 /* BREAK event software flag. */
#define Rx_SYS 0x0200 /* SysRq event software flag. */

static struct tty_struct *ip22zilog_receive_chars(struct uart_ip22zilog_port *up,
static bool ip22zilog_receive_chars(struct uart_ip22zilog_port *up,
struct zilog_channel *channel)
{
struct tty_struct *tty;
unsigned char ch, flag;
unsigned int r1;

tty = NULL;
if (up->port.state != NULL &&
up->port.state->port.tty != NULL)
tty = up->port.state->port.tty;
bool push = up->port.state != NULL;

for (;;) {
ch = readb(&channel->control);
Expand Down Expand Up @@ -312,10 +307,10 @@ static struct tty_struct *ip22zilog_receive_chars(struct uart_ip22zilog_port *up
if (uart_handle_sysrq_char(&up->port, ch))
continue;

if (tty)
if (push)
uart_insert_char(&up->port, r1, Rx_OVR, ch, flag);
}
return tty;
return push;
}

static void ip22zilog_status_handle(struct uart_ip22zilog_port *up,
Expand Down Expand Up @@ -438,53 +433,52 @@ static irqreturn_t ip22zilog_interrupt(int irq, void *dev_id)
while (up) {
struct zilog_channel *channel
= ZILOG_CHANNEL_FROM_PORT(&up->port);
struct tty_struct *tty;
unsigned char r3;
bool push = false;

spin_lock(&up->port.lock);
r3 = read_zsreg(channel, R3);

/* Channel A */
tty = NULL;
if (r3 & (CHAEXT | CHATxIP | CHARxIP)) {
writeb(RES_H_IUS, &channel->control);
ZSDELAY();
ZS_WSYNC(channel);

if (r3 & CHARxIP)
tty = ip22zilog_receive_chars(up, channel);
push = ip22zilog_receive_chars(up, channel);
if (r3 & CHAEXT)
ip22zilog_status_handle(up, channel);
if (r3 & CHATxIP)
ip22zilog_transmit_chars(up, channel);
}
spin_unlock(&up->port.lock);

if (tty)
tty_flip_buffer_push(tty);
if (push)
tty_flip_buffer_push(&up->port.state->port);

/* Channel B */
up = up->next;
channel = ZILOG_CHANNEL_FROM_PORT(&up->port);
push = false;

spin_lock(&up->port.lock);
tty = NULL;
if (r3 & (CHBEXT | CHBTxIP | CHBRxIP)) {
writeb(RES_H_IUS, &channel->control);
ZSDELAY();
ZS_WSYNC(channel);

if (r3 & CHBRxIP)
tty = ip22zilog_receive_chars(up, channel);
push = ip22zilog_receive_chars(up, channel);
if (r3 & CHBEXT)
ip22zilog_status_handle(up, channel);
if (r3 & CHBTxIP)
ip22zilog_transmit_chars(up, channel);
}
spin_unlock(&up->port.lock);

if (tty)
tty_flip_buffer_push(tty);
if (push)
tty_flip_buffer_push(&up->port.state->port);

up = up->next;
}
Expand Down

0 comments on commit 2894500

Please sign in to comment.