serial help ?

M. Warner Losh imp at bsdimp.com
Sun Apr 22 05:44:42 UTC 2007


In message: <20070419211021.GH69188 at elvis.mu.org>
            Alfred Perlstein <alfred at freebsd.org> 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


More information about the freebsd-hackers mailing list