diff -r 8af26fef898c xen/drivers/char/ns16550.c --- a/xen/drivers/char/ns16550.c Fri Jul 24 12:08:54 2009 +0100 +++ b/xen/drivers/char/ns16550.c Tue Jul 28 16:01:48 2009 +0200 @@ -16,6 +16,7 @@ #include #include #include +#include /* * Configure serial port with a string: @@ -115,8 +116,10 @@ static char ns_read_reg(struct ns16550 * static void ns_write_reg(struct ns16550 *uart, int reg, char c) { - if ( uart->remapped_io_base == NULL ) - return outb(c, uart->io_base + reg); + if ( uart->remapped_io_base == NULL ) { + outb(c, uart->io_base + reg); + return; + } writeb(c, uart->remapped_io_base + reg); } @@ -181,6 +184,7 @@ static void __devinit ns16550_init_preir unsigned int divisor; /* I/O ports are distinguished by their size (16 bits). */ + uart->remapped_io_base = NULL; if ( uart->io_base >= 0x10000 ) uart->remapped_io_base = (char *)ioremap(uart->io_base, 8); @@ -212,10 +216,15 @@ static void __devinit ns16550_init_preir /* Enable and clear the FIFOs. Set a large trigger threshold. */ ns_write_reg(uart, FCR, FCR_ENABLE | FCR_CLRX | FCR_CLTX | FCR_TRG14); + udelay(100); /* Check this really is a 16550+. Otherwise we have no FIFOs. */ - if ( (ns_read_reg(uart, IIR) & 0xc0) == 0xc0 ) - port->tx_fifo_size = 16; + port->tx_fifo_size = 1; + if ( (ns_read_reg(uart, IIR) & 0xc0) == 0xc0 ) { + /* We have a FIFO. Check if we have a *working* FIFO. */ + if ( (ns_read_reg(uart, FCR) & FCR_TRG14) == FCR_TRG14 ) + port->tx_fifo_size = 16; + } } static void __devinit ns16550_init_postirq(struct serial_port *port)