Messages in this thread | | | From | Roland Caßebohm <> | Subject | Serial driver hangs | Date | Tue, 28 Sep 2004 17:34:38 +0200 |
| |
Hi,
my platform is uClinux kernel 2.4.24 with an ARM with PCI and a 2 port VSCOM 200I PCI card.
I use the serial driver with very high load. With my application sends and receives on two ports with 921600 baud.
After a while the driver hangs in an endless loop in the interrupt routine. As I can see, the bit TTY_DONT_FLIP in tty->flags is set, so the receive-buffer can't be flipped. In receive_chars() all ports are checked for received bytes, but if the buffer is full and can't be flipped, no byte are read from the UART and the interrupt will never go inactive.
>>>>>>>>>>>> do { if (tty->flip.count >= TTY_FLIPBUF_SIZE) { tty->flip.tqueue.routine((void *) tty); if (tty->flip.count >= TTY_FLIPBUF_SIZE) return; // if TTY_DONT_FLIP is set } ch = serial_inp(info, UART_RX); *tty->flip.char_buf_ptr = ch; icount->rx++; >>>>>>>>>>>>
I have tried just to read all byte left in the FIFO of the UART in that case and throw them away.
>>>>>>>>>>>> if (tty->flip.count >= TTY_FLIPBUF_SIZE) { do { ch = serial_inp(info, UART_RX); icount->overrun++; *status = serial_inp(info, UART_LSR); } while (*status & UART_LSR_DR); return; // if TTY_DONT_FLIP is set } >>>>>>>>>>>>
This is working but would probably not the best way, because there could be enough place in the other flip buffer. Maybe it is possible to disable the receive interrupt of the UART till the receive routine read_chan(), which sets TTY_DONT_FLIP, releases the buffer.
Thanks for any help, Roland -- ___________________________________________________
VS Vision Systems GmbH, Industrial Image Processing Dipl.-Ing. Roland Caßebohm Aspelohe 27A, D-22848 Norderstedt, Germany http://www.visionsystems.de ___________________________________________________ - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |