forked from Minki/linux
serial: sh-sci: Tidy up fifo overrun error handling.
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
parent
762c69e3ca
commit
d830fa4584
@ -625,6 +625,27 @@ static inline int sci_handle_errors(struct uart_port *port)
|
||||
return copied;
|
||||
}
|
||||
|
||||
static inline int sci_handle_fifo_overrun(struct uart_port *port)
|
||||
{
|
||||
struct tty_struct *tty = port->info->port.tty;
|
||||
int copied = 0;
|
||||
|
||||
if (port->type != PORT_SCIF)
|
||||
return 0;
|
||||
|
||||
if ((sci_in(port, SCLSR) & SCIF_ORER) != 0) {
|
||||
sci_out(port, SCLSR, 0);
|
||||
|
||||
tty_insert_flip_char(tty, 0, TTY_OVERRUN);
|
||||
tty_flip_buffer_push(tty);
|
||||
|
||||
dev_notice(port->dev, "overrun error\n");
|
||||
copied++;
|
||||
}
|
||||
|
||||
return copied;
|
||||
}
|
||||
|
||||
static inline int sci_handle_breaks(struct uart_port *port)
|
||||
{
|
||||
int copied = 0;
|
||||
@ -647,20 +668,11 @@ static inline int sci_handle_breaks(struct uart_port *port)
|
||||
dev_dbg(port->dev, "BREAK detected\n");
|
||||
}
|
||||
|
||||
#if defined(SCIF_ORER)
|
||||
/* XXX: Handle SCIF overrun error */
|
||||
if (port->type != PORT_SCI && (sci_in(port, SCLSR) & SCIF_ORER) != 0) {
|
||||
sci_out(port, SCLSR, 0);
|
||||
if (tty_insert_flip_char(tty, 0, TTY_OVERRUN)) {
|
||||
copied++;
|
||||
dev_notice(port->dev, "overrun error\n");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (copied)
|
||||
tty_flip_buffer_push(tty);
|
||||
|
||||
copied += sci_handle_fifo_overrun(port);
|
||||
|
||||
return copied;
|
||||
}
|
||||
|
||||
@ -698,16 +710,7 @@ static irqreturn_t sci_er_interrupt(int irq, void *ptr)
|
||||
sci_out(port, SCxSR, SCxSR_RDxF_CLEAR(port));
|
||||
}
|
||||
} else {
|
||||
#if defined(SCIF_ORER)
|
||||
if ((sci_in(port, SCLSR) & SCIF_ORER) != 0) {
|
||||
struct tty_struct *tty = port->info->port.tty;
|
||||
|
||||
sci_out(port, SCLSR, 0);
|
||||
tty_insert_flip_char(tty, 0, TTY_OVERRUN);
|
||||
tty_flip_buffer_push(tty);
|
||||
dev_notice(port->dev, "overrun error\n");
|
||||
}
|
||||
#endif
|
||||
sci_handle_fifo_overrun(port);
|
||||
sci_rx_interrupt(irq, ptr);
|
||||
}
|
||||
|
||||
|
@ -232,6 +232,10 @@
|
||||
# define SCIF_TXROOM_MAX 16
|
||||
#endif
|
||||
|
||||
#ifndef SCIF_ORER
|
||||
#define SCIF_ORER 0x0000
|
||||
#endif
|
||||
|
||||
#define SCxSR_TEND(port) (((port)->type == PORT_SCI) ? SCI_TEND : SCIF_TEND)
|
||||
#define SCxSR_ERRORS(port) (((port)->type == PORT_SCI) ? SCI_ERRORS : SCIF_ERRORS)
|
||||
#define SCxSR_RDxF(port) (((port)->type == PORT_SCI) ? SCI_RDRF : SCIF_RDF)
|
||||
@ -239,12 +243,7 @@
|
||||
#define SCxSR_FER(port) (((port)->type == PORT_SCI) ? SCI_FER : SCIF_FER)
|
||||
#define SCxSR_PER(port) (((port)->type == PORT_SCI) ? SCI_PER : SCIF_PER)
|
||||
#define SCxSR_BRK(port) (((port)->type == PORT_SCI) ? 0x00 : SCIF_BRK)
|
||||
|
||||
#if defined(CONFIG_CPU_SUBTYPE_SH7705)
|
||||
# define SCxSR_ORER(port) (((port)->type == PORT_SCI) ? SCI_ORER : SCIF_ORER)
|
||||
#else
|
||||
# define SCxSR_ORER(port) (((port)->type == PORT_SCI) ? SCI_ORER : 0x0000)
|
||||
#endif
|
||||
#define SCxSR_ORER(port) (((port)->type == PORT_SCI) ? SCI_ORER : SCIF_ORER)
|
||||
|
||||
#if defined(CONFIG_CPU_SUBTYPE_SH7705) || \
|
||||
defined(CONFIG_CPU_SUBTYPE_SH7720) || \
|
||||
|
Loading…
Reference in New Issue
Block a user