Loading drivers/serial/sh-sci.c +24 −21 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; } Loading Loading @@ -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); } Loading drivers/serial/sh-sci.h +5 −6 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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 #if defined(CONFIG_CPU_SUBTYPE_SH7705) || \ defined(CONFIG_CPU_SUBTYPE_SH7720) || \ Loading Loading
drivers/serial/sh-sci.c +24 −21 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; } Loading Loading @@ -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); } Loading
drivers/serial/sh-sci.h +5 −6 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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 #if defined(CONFIG_CPU_SUBTYPE_SH7705) || \ defined(CONFIG_CPU_SUBTYPE_SH7720) || \ Loading