All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] xen: more robust serial port driver
@ 2009-07-28 14:07 Christoph Egger
  2009-07-28 14:15 ` Keir Fraser
  0 siblings, 1 reply; 5+ messages in thread
From: Christoph Egger @ 2009-07-28 14:07 UTC (permalink / raw)
  To: xen-devel

[-- Attachment #1: Type: text/plain, Size: 422 bytes --]


Hi!

Attached patch adds a check if the fifo is usable before we
actually use it.

Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>

-- 
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Karl-Hammerschmidt-Str. 34, 85609 Dornach b. Muenchen
Geschaeftsfuehrer: Thomas M. McCoy, Giuliano Meroni
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632

[-- Attachment #2: xen_serial.diff --]
[-- Type: text/x-diff, Size: 1736 bytes --]

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 <xen/serial.h>
 #include <xen/iocap.h>
 #include <asm/io.h>
+#include <xen/delay.h>
 
 /*
  * 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)

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2009-07-28 15:03 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-07-28 14:07 [PATCH] xen: more robust serial port driver Christoph Egger
2009-07-28 14:15 ` Keir Fraser
2009-07-28 14:47   ` Christoph Egger
2009-07-28 14:58     ` Keir Fraser
2009-07-28 15:03       ` Christoph Egger

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.