static void apbuart_rx_chars(struct uart_port *port) { unsigned int status, ch, rsr, flag; unsigned int max_chars = port->fifosize; status = UART_GET_STATUS(port); while (UART_RX_DATA(status) && (max_chars--)) { ch = UART_GET_CHAR(port); flag = TTY_NORMAL; port->icount.rx++; rsr = UART_GET_STATUS(port) | UART_DUMMY_RSR_RX; UART_PUT_STATUS(port, 0); if (rsr & UART_STATUS_ERR) { if (rsr & UART_STATUS_BR) { rsr &= ~(UART_STATUS_FE | UART_STATUS_PE); port->icount.brk++; if (uart_handle_break(port)) goto ignore_char; } else if (rsr & UART_STATUS_PE) { port->icount.parity++; } else if (rsr & UART_STATUS_FE) { port->icount.frame++; } if (rsr & UART_STATUS_OE) port->icount.overrun++; rsr &= port->read_status_mask; if (rsr & UART_STATUS_PE) flag = TTY_PARITY; else if (rsr & UART_STATUS_FE) flag = TTY_FRAME; } if (uart_handle_sysrq_char(port, ch)) goto ignore_char; uart_insert_char(port, rsr, UART_STATUS_OE, ch, flag); ignore_char: status = UART_GET_STATUS(port); } spin_unlock(&port->lock); tty_flip_buffer_push(&port->state->port); spin_lock(&port->lock); }
leonuart_rx_chars(struct uart_port *port) #endif { struct tty_struct *tty = port->info->port.tty; unsigned int status, ch, rsr, flag; unsigned int max_chars = port->fifosize; status = UART_GET_STATUS(port); while (UART_RX_DATA(status) && (max_chars--)) { /* if (tty->flip.count >= TTY_FLIPBUF_SIZE) { tty->flip.work.func((void *)tty); if (tty->flip.count >= TTY_FLIPBUF_SIZE) { printk(KERN_WARNING "TTY_DONT_FLIP set\n"); return; } } */ ch = UART_GET_CHAR(port); flag = TTY_NORMAL; /**tty->flip.char_buf_ptr = ch; *tty->flip.flag_buf_ptr = TTY_NORMAL;*/ port->icount.rx++; /* * Note that the error handling code is * out of the main execution path */ rsr = UART_GET_STATUS(port) | UART_DUMMY_RSR_RX; UART_PUT_STATUS(port, 0); if (rsr & LEON_REG_UART_STATUS_ERR) { if (rsr & LEON_REG_UART_STATUS_BR) { rsr &= ~(LEON_REG_UART_STATUS_FE | LEON_REG_UART_STATUS_PE); port->icount.brk++; if (uart_handle_break(port)) goto ignore_char; } else if (rsr & LEON_REG_UART_STATUS_PE) { port->icount.parity++; } else if (rsr & LEON_REG_UART_STATUS_FE) { port->icount.frame++; } if (rsr & LEON_REG_UART_STATUS_OE) port->icount.overrun++; rsr &= port->read_status_mask; /* if (rsr & LEON_REG_UART_STATUS_PE) *tty->flip.flag_buf_ptr = TTY_PARITY; else if (rsr & LEON_REG_UART_STATUS_FE) *tty->flip.flag_buf_ptr = TTY_FRAME; */ if (rsr & LEON_REG_UART_STATUS_PE) flag = TTY_PARITY; else if (rsr & LEON_REG_UART_STATUS_FE) flag = TTY_FRAME; } if (uart_handle_sysrq_char(port, ch)) goto ignore_char; /* if ((rsr & port->ignore_status_mask) == 0) { tty->flip.flag_buf_ptr++; tty->flip.char_buf_ptr++; tty->flip.count++; } */ if ((rsr & port->ignore_status_mask) == 0) { tty_insert_flip_char(tty, ch, flag); } if ( rsr & LEON_REG_UART_STATUS_OE ) { /* * Overrun is special, since it's reported * immediately, and doesn't affect the current * character */ tty_insert_flip_char(tty, 0, TTY_OVERRUN); } ignore_char: status = UART_GET_STATUS(port); } tty_flip_buffer_push(tty); return; }
leonuart_rx_chars(struct uart_port *port) #endif { struct tty_struct *tty = port->info->tty; unsigned int status, ch, flag, rsr, max_count = 256; status = UART_GET_STATUS(port); while (UART_RX_DATA(status) && max_count--) { //if (tty->flip.count >= TTY_FLIPBUF_SIZE) { // if (tty->low_latency) // tty_flip_buffer_push(tty); /* * If this failed then we will throw away the * bytes but must do so to clear interrupts. */ //} ch = UART_GET_CHAR(port); flag = TTY_NORMAL; port->icount.rx++; /* * Note that the error handling code is * out of the main execution path */ rsr = UART_GET_STATUS(port) | UART_DUMMY_RSR_RX; UART_PUT_STATUS(port, 0); if (rsr & LEON_USTAT_ERROR) { if (rsr & LEON_USTAT_BR) { rsr &= ~(LEON_USTAT_FE | LEON_USTAT_PE); port->icount.brk++; if (uart_handle_break(port)) goto ignore_char; } else if (rsr & LEON_USTAT_PE) { port->icount.parity++; } else if (rsr & LEON_USTAT_FE) { port->icount.frame++; } if (rsr & LEON_USTAT_OV) port->icount.overrun++; rsr &= port->read_status_mask; if (rsr & LEON_USTAT_BR) flag = TTY_BREAK; else if (rsr & LEON_USTAT_PE) flag = TTY_PARITY; else if (rsr & LEON_USTAT_FE) flag = TTY_FRAME; } if (uart_handle_sysrq_char(port, ch)) goto ignore_char; if ((rsr & port->ignore_status_mask) == 0) { tty_insert_flip_char(tty, ch, flag); } if (rsr & LEON_USTAT_OV) { /* * Overrun is special, since it's reported * immediately, and doesn't affect the current * character */ tty_insert_flip_char(tty, 0, TTY_OVERRUN); } ignore_char: status = UART_GET_STATUS(port); } tty_flip_buffer_push(tty); return; }