In message: <[EMAIL PROTECTED]>
            Alfred Perlstein <[EMAIL PROTECTED]> writes:
: 
: I'm working on some custom hardware and I'm getting garbled console
: output.
: 
: I noticed that siocntxwait looks like this:
: 
: static void
: siocntxwait(iobase)
:       Port_t  iobase;
: {
:       int     timo;
: 
:       /*
:        * Wait for any pending transmission to finish.  Required to avoid
:        * the UART lockup bug when the speed is changed, and for normal
:        * transmits.
:        */
:       timo = 100000;
:       while ((inb(iobase + com_lsr) & (LSR_TSRE | LSR_TXRDY))
:              != (LSR_TSRE | LSR_TXRDY) && --timo != 0)
:               ;
: }
: 
: Shouldn't there be some sort of DELAY in there?
: 
: My platform has an emulated serial device in hardware, so it
: may be that the loop could run a LOT faster than transmit can
: happen...
: 
: any ideas of what the DELAY should be?

The inb() is assumed to provide a delay of 1us, so this has a timeout
of 100ms.  Even with newer PCI devices that run about 4-5 times
faster, the timeout is still on the order of 20ms, which is adequate
for most modern baudrates (9600 baud takes 1ms, 115200 takes 10us).

Warner
_______________________________________________
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to