diff options
Diffstat (limited to 'drivers/serial/sa1100.c')
-rw-r--r-- | drivers/serial/sa1100.c | 65 |
1 files changed, 24 insertions, 41 deletions
diff --git a/drivers/serial/sa1100.c b/drivers/serial/sa1100.c index 086065210d1e..157218bc6c6f 100644 --- a/drivers/serial/sa1100.c +++ b/drivers/serial/sa1100.c | |||
@@ -214,56 +214,39 @@ sa1100_rx_chars(struct sa1100_port *sport, struct pt_regs *regs) | |||
214 | * note that the error handling code is | 214 | * note that the error handling code is |
215 | * out of the main execution path | 215 | * out of the main execution path |
216 | */ | 216 | */ |
217 | if (status & UTSR1_TO_SM(UTSR1_PRE | UTSR1_FRE | UTSR1_ROR)) | 217 | if (status & UTSR1_TO_SM(UTSR1_PRE | UTSR1_FRE | UTSR1_ROR)) { |
218 | goto handle_error; | 218 | if (status & UTSR1_TO_SM(UTSR1_PRE)) |
219 | sport->port.icount.parity++; | ||
220 | else if (status & UTSR1_TO_SM(UTSR1_FRE)) | ||
221 | sport->port.icount.frame++; | ||
222 | if (status & UTSR1_TO_SM(UTSR1_ROR)) | ||
223 | sport->port.icount.overrun++; | ||
224 | |||
225 | status &= sport->port.read_status_mask; | ||
226 | |||
227 | if (status & UTSR1_TO_SM(UTSR1_PRE)) | ||
228 | flg = TTY_PARITY; | ||
229 | else if (status & UTSR1_TO_SM(UTSR1_FRE)) | ||
230 | flg = TTY_FRAME; | ||
231 | |||
232 | #ifdef SUPPORT_SYSRQ | ||
233 | sport->port.sysrq = 0; | ||
234 | #endif | ||
235 | } | ||
219 | 236 | ||
220 | if (uart_handle_sysrq_char(&sport->port, ch, regs)) | 237 | if (uart_handle_sysrq_char(&sport->port, ch, regs)) |
221 | goto ignore_char; | 238 | goto ignore_char; |
222 | 239 | ||
223 | error_return: | 240 | if ((status & port->ignore_status_mask & ~UTSR1_TO_SM(UTSR1_ROR)) == 0) |
224 | tty_insert_flip_char(tty, ch, flg); | 241 | tty_insert_flip_char(tty, ch, flg); |
242 | if (status & ~port->ignore_status_mask & UTSR1_TO_SM(UTSR1_ROR)) | ||
243 | tty_insert_flip_char(tty, 0, TTY_OVERRUN); | ||
244 | |||
225 | ignore_char: | 245 | ignore_char: |
226 | status = UTSR1_TO_SM(UART_GET_UTSR1(sport)) | | 246 | status = UTSR1_TO_SM(UART_GET_UTSR1(sport)) | |
227 | UTSR0_TO_SM(UART_GET_UTSR0(sport)); | 247 | UTSR0_TO_SM(UART_GET_UTSR0(sport)); |
228 | } | 248 | } |
229 | out: | ||
230 | tty_flip_buffer_push(tty); | 249 | tty_flip_buffer_push(tty); |
231 | return; | ||
232 | |||
233 | handle_error: | ||
234 | if (status & UTSR1_TO_SM(UTSR1_PRE)) | ||
235 | sport->port.icount.parity++; | ||
236 | else if (status & UTSR1_TO_SM(UTSR1_FRE)) | ||
237 | sport->port.icount.frame++; | ||
238 | if (status & UTSR1_TO_SM(UTSR1_ROR)) | ||
239 | sport->port.icount.overrun++; | ||
240 | |||
241 | if (status & sport->port.ignore_status_mask) { | ||
242 | if (++ignored > 100) | ||
243 | goto out; | ||
244 | goto ignore_char; | ||
245 | } | ||
246 | |||
247 | status &= sport->port.read_status_mask; | ||
248 | |||
249 | if (status & UTSR1_TO_SM(UTSR1_PRE)) | ||
250 | flg = TTY_PARITY; | ||
251 | else if (status & UTSR1_TO_SM(UTSR1_FRE)) | ||
252 | flg = TTY_FRAME; | ||
253 | |||
254 | if (status & UTSR1_TO_SM(UTSR1_ROR)) { | ||
255 | /* | ||
256 | * overrun does *not* affect the character | ||
257 | * we read from the FIFO | ||
258 | */ | ||
259 | tty_insert_flip_char(tty, ch, flg); | ||
260 | ch = 0; | ||
261 | flg = TTY_OVERRUN; | ||
262 | } | ||
263 | #ifdef SUPPORT_SYSRQ | ||
264 | sport->port.sysrq = 0; | ||
265 | #endif | ||
266 | goto error_return; | ||
267 | } | 250 | } |
268 | 251 | ||
269 | static void sa1100_tx_chars(struct sa1100_port *sport) | 252 | static void sa1100_tx_chars(struct sa1100_port *sport) |