They have only one receiver character buffer. This implies that the operating system must read a character from this buffer before the next one arrives from the UART's shift register. For the old IBM PC with DOS this was sufficient. But for UNIX and with baud rates as high as 115200 this is just a bad joke.
UNIX is not a real-time operating system. This means that its kernel isn't optimized for fast interrupt response. With properly designed hardware that buffers data until the OS has time to fetch it this is no problem. But since UNIX for PCs has to work with the standard hardware found in 286/386 systems, serial driver developers have to cope with the NS16450 UARTs which are in there simply to be compatible with IBM PCs, XTs and ATs under DOS.
With this hardware it is impossible to make it work at high baud rates without a major redesign of the USL supplied UNIX kernel. But then it wouldn't be UNIX SYSV any more.
Fortunately, there is a pin-to-pin replacement available from National Semiconductors: the NS16550A.
This device has separate 16 character FIFOs for the receiver and the transmitter. With these FIFOs the interrupt latency of the kernel can be quite high without losing characters. And because with most interrupts several characters are processed at once the CPU is loaded much less.
So, as FAS supports NS16550A UARTs, all you have to do to fix the character loss problem is to either buy a serial card with NS16550A chips on it or replace the UARTs on the card that you already have.
If for some reason you can't get the NS16550A chips you could use the i82510 chips from Intel. Although they are much less efficient they are still better than the NS16450.
There are, however, some conditions under which even the receiver FIFO in the NS16550A UART can't prevent character loss:
Therefore, if you can configure your disk controller, don't use values that will bring the CPU down to its knees. Otherwise, FAS will lose incoming characters during disk I/O.
If your operating system has a low interrupt latency you can define LOW_INT_LAT in the Makefile in order to set the receiver FIFO trigger level from 4 (default) to 8 characters. This cuts the receiver interrupt frequency in half and therefore saves a lot of CPU time. That pays off especially at very high baud rates.
If you set this flag you should do some rigid tests (receiving characters at the highest baud rate while the system is heavily loaded with disk and network I/O) to make sure that there are really no lost characters due to interrupt latency. ISC UNIX 3.0 is known to have a low tty interrupt latency, therefore LOW_INT_LAT is defined in Makefile.ISC3. On the other hand, ISC UNIX 2.x has a rather high interrupt latency and shouldn't have this flag set. For other UNIX flavors you have to find out yourself whether this flag is applicable.
ftp://ftp.fu-berlin.de/pub/unix/driver/fas/fas-2.12.tar.gz