diff options
Diffstat (limited to 'drivers/serial/mpc52xx_uart.c')
| -rw-r--r-- | drivers/serial/mpc52xx_uart.c | 46 |
1 files changed, 16 insertions, 30 deletions
diff --git a/drivers/serial/mpc52xx_uart.c b/drivers/serial/mpc52xx_uart.c index 1288d6203e..61dd17d7ba 100644 --- a/drivers/serial/mpc52xx_uart.c +++ b/drivers/serial/mpc52xx_uart.c | |||
| @@ -405,17 +405,13 @@ static inline int | |||
| 405 | mpc52xx_uart_int_rx_chars(struct uart_port *port, struct pt_regs *regs) | 405 | mpc52xx_uart_int_rx_chars(struct uart_port *port, struct pt_regs *regs) |
| 406 | { | 406 | { |
| 407 | struct tty_struct *tty = port->info->tty; | 407 | struct tty_struct *tty = port->info->tty; |
| 408 | unsigned char ch; | 408 | unsigned char ch, flag; |
| 409 | unsigned short status; | 409 | unsigned short status; |
| 410 | 410 | ||
| 411 | /* While we can read, do so ! */ | 411 | /* While we can read, do so ! */ |
| 412 | while ( (status = in_be16(&PSC(port)->mpc52xx_psc_status)) & | 412 | while ( (status = in_be16(&PSC(port)->mpc52xx_psc_status)) & |
| 413 | MPC52xx_PSC_SR_RXRDY) { | 413 | MPC52xx_PSC_SR_RXRDY) { |
| 414 | 414 | ||
| 415 | /* If we are full, just stop reading */ | ||
| 416 | if (tty->flip.count >= TTY_FLIPBUF_SIZE) | ||
| 417 | break; | ||
| 418 | |||
| 419 | /* Get the char */ | 415 | /* Get the char */ |
| 420 | ch = in_8(&PSC(port)->mpc52xx_psc_buffer_8); | 416 | ch = in_8(&PSC(port)->mpc52xx_psc_buffer_8); |
| 421 | 417 | ||
| @@ -428,45 +424,35 @@ mpc52xx_uart_int_rx_chars(struct uart_port *port, struct pt_regs *regs) | |||
| 428 | #endif | 424 | #endif |
| 429 | 425 | ||
| 430 | /* Store it */ | 426 | /* Store it */ |
| 431 | *tty->flip.char_buf_ptr = ch; | 427 | |
| 432 | *tty->flip.flag_buf_ptr = 0; | 428 | flag = TTY_NORMAL; |
| 433 | port->icount.rx++; | 429 | port->icount.rx++; |
| 434 | 430 | ||
| 435 | if ( status & (MPC52xx_PSC_SR_PE | | 431 | if ( status & (MPC52xx_PSC_SR_PE | |
| 436 | MPC52xx_PSC_SR_FE | | 432 | MPC52xx_PSC_SR_FE | |
| 437 | MPC52xx_PSC_SR_RB | | 433 | MPC52xx_PSC_SR_RB) ) { |
| 438 | MPC52xx_PSC_SR_OE) ) { | ||
| 439 | 434 | ||
| 440 | if (status & MPC52xx_PSC_SR_RB) { | 435 | if (status & MPC52xx_PSC_SR_RB) { |
| 441 | *tty->flip.flag_buf_ptr = TTY_BREAK; | 436 | flag = TTY_BREAK; |
| 442 | uart_handle_break(port); | 437 | uart_handle_break(port); |
| 443 | } else if (status & MPC52xx_PSC_SR_PE) | 438 | } else if (status & MPC52xx_PSC_SR_PE) |
| 444 | *tty->flip.flag_buf_ptr = TTY_PARITY; | 439 | flag = TTY_PARITY; |
| 445 | else if (status & MPC52xx_PSC_SR_FE) | 440 | else if (status & MPC52xx_PSC_SR_FE) |
| 446 | *tty->flip.flag_buf_ptr = TTY_FRAME; | 441 | flag = TTY_FRAME; |
| 447 | if (status & MPC52xx_PSC_SR_OE) { | ||
| 448 | /* | ||
| 449 | * Overrun is special, since it's | ||
| 450 | * reported immediately, and doesn't | ||
| 451 | * affect the current character | ||
| 452 | */ | ||
| 453 | if (tty->flip.count < (TTY_FLIPBUF_SIZE-1)) { | ||
| 454 | tty->flip.flag_buf_ptr++; | ||
| 455 | tty->flip.char_buf_ptr++; | ||
| 456 | tty->flip.count++; | ||
| 457 | } | ||
| 458 | *tty->flip.flag_buf_ptr = TTY_OVERRUN; | ||
| 459 | } | ||
| 460 | 442 | ||
| 461 | /* Clear error condition */ | 443 | /* Clear error condition */ |
| 462 | out_8(&PSC(port)->command,MPC52xx_PSC_RST_ERR_STAT); | 444 | out_8(&PSC(port)->command,MPC52xx_PSC_RST_ERR_STAT); |
| 463 | 445 | ||
| 464 | } | 446 | } |
| 465 | 447 | tty_insert_flip_char(tty, ch, flag); | |
| 466 | tty->flip.char_buf_ptr++; | 448 | if (status & MPC52xx_PSC_SR_OE) { |
| 467 | tty->flip.flag_buf_ptr++; | 449 | /* |
| 468 | tty->flip.count++; | 450 | * Overrun is special, since it's |
| 469 | 451 | * reported immediately, and doesn't | |
| 452 | * affect the current character | ||
| 453 | */ | ||
| 454 | tty_insert_flip_char(tty, 0, TTY_OVERRUN); | ||
| 455 | } | ||
| 470 | } | 456 | } |
| 471 | 457 | ||
| 472 | tty_flip_buffer_push(tty); | 458 | tty_flip_buffer_push(tty); |
