serial.c fifo overrun problem?

From: Jonathan Larmour (jlarmour@redhat.co.uk)
Date: Wed Mar 29 2000 - 11:13:22 EST


Here's a potential serial problem with 2.2.14. It also still appears to
exist in 2.3.99-pre3.

In drivers/char/serial.c:transmit_chars() there is:

        count = info->xmit_fifo_size;
        do {
                serial_out(info, UART_TX,
info->xmit_buf[info->xmit_tail++]);
                info->xmit_tail = info->xmit_tail & (SERIAL_XMIT_SIZE-1);
                info->state->icount.tx++;
                if (--info->xmit_cnt <= 0)
                        break;
        } while (--count > 0);

However info->xmit_fifo_size is set to 16 for a 16550A, and the FIFO
threshold for speeds of 2400bps and above is 8. And it calls
transmit_chars() when the threshold is reached. This would mean the FIFO
would get overrun if it ever rose above the threshold and there were more
than 8 more chars waiting to be sent.

Is my analysis correct? If so, I would have thought more people would have
noticed :-/. Please CC me on replies, thanks.

Jifl

-- 
Red Hat, 35 Cambridge Place, Cambridge, UK. CB2 1NS  Tel: +44 (1223) 728762
"Plan to be spontaneous tomorrow."  ||  These opinions are all my own fault

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Fri Mar 31 2000 - 21:00:25 EST