Commit e8da8a95 authored by Jurij Smakov's avatar Jurij Smakov Committed by David S. Miller

[SUNSAB]: Fix serial break handling.

We forget to check the BRK condition in
the interrupt status register when deciding
to call receive_chars() or not, which is where
BRK handling occurs.
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 13063d94
...@@ -143,6 +143,11 @@ receive_chars(struct uart_sunsab_port *up, ...@@ -143,6 +143,11 @@ receive_chars(struct uart_sunsab_port *up,
writeb(SAB82532_CMDR_RMC, &up->regs->w.cmdr); writeb(SAB82532_CMDR_RMC, &up->regs->w.cmdr);
} }
/* Count may be zero for BRK, so we check for it here */
if ((stat->sreg.isr1 & SAB82532_ISR1_BRK) &&
(up->port.line == up->port.cons->index))
saw_console_brk = 1;
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
unsigned char ch = buf[i]; unsigned char ch = buf[i];
...@@ -172,8 +177,6 @@ receive_chars(struct uart_sunsab_port *up, ...@@ -172,8 +177,6 @@ receive_chars(struct uart_sunsab_port *up,
stat->sreg.isr0 &= ~(SAB82532_ISR0_PERR | stat->sreg.isr0 &= ~(SAB82532_ISR0_PERR |
SAB82532_ISR0_FERR); SAB82532_ISR0_FERR);
up->port.icount.brk++; up->port.icount.brk++;
if (up->port.line == up->port.cons->index)
saw_console_brk = 1;
/* /*
* We do the SysRQ and SAK checking * We do the SysRQ and SAK checking
* here because otherwise the break * here because otherwise the break
...@@ -325,8 +328,9 @@ static irqreturn_t sunsab_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -325,8 +328,9 @@ static irqreturn_t sunsab_interrupt(int irq, void *dev_id, struct pt_regs *regs)
tty = NULL; tty = NULL;
if (status.stat) { if (status.stat) {
if (status.sreg.isr0 & (SAB82532_ISR0_TCD | SAB82532_ISR0_TIME | if ((status.sreg.isr0 & (SAB82532_ISR0_TCD | SAB82532_ISR0_TIME |
SAB82532_ISR0_RFO | SAB82532_ISR0_RPF)) SAB82532_ISR0_RFO | SAB82532_ISR0_RPF)) ||
(status.sreg.isr1 & SAB82532_ISR1_BRK))
tty = receive_chars(up, &status, regs); tty = receive_chars(up, &status, regs);
if ((status.sreg.isr0 & SAB82532_ISR0_CDSC) || if ((status.sreg.isr0 & SAB82532_ISR0_CDSC) ||
(status.sreg.isr1 & SAB82532_ISR1_CSC)) (status.sreg.isr1 & SAB82532_ISR1_CSC))
...@@ -352,8 +356,10 @@ static irqreturn_t sunsab_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -352,8 +356,10 @@ static irqreturn_t sunsab_interrupt(int irq, void *dev_id, struct pt_regs *regs)
tty = NULL; tty = NULL;
if (status.stat) { if (status.stat) {
if (status.sreg.isr0 & (SAB82532_ISR0_TCD | SAB82532_ISR0_TIME | if ((status.sreg.isr0 & (SAB82532_ISR0_TCD | SAB82532_ISR0_TIME |
SAB82532_ISR0_RFO | SAB82532_ISR0_RPF)) SAB82532_ISR0_RFO | SAB82532_ISR0_RPF)) ||
(status.sreg.isr1 & SAB82532_ISR1_BRK))
tty = receive_chars(up, &status, regs); tty = receive_chars(up, &status, regs);
if ((status.sreg.isr0 & SAB82532_ISR0_CDSC) || if ((status.sreg.isr0 & SAB82532_ISR0_CDSC) ||
(status.sreg.isr1 & (SAB82532_ISR1_BRK | SAB82532_ISR1_CSC))) (status.sreg.isr1 & (SAB82532_ISR1_BRK | SAB82532_ISR1_CSC)))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment