aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/uart
diff options
context:
space:
mode:
authorMarius Strobl <marius@FreeBSD.org>2005-06-04 21:52:56 +0000
committerMarius Strobl <marius@FreeBSD.org>2005-06-04 21:52:56 +0000
commit852962d3c5fec2c149e0d58edc8345f1148afeff (patch)
treed99c2f1b522113ed1ed7d0d8e6026d7a461c5e44 /sys/dev/uart
parentb7b527edfa9ec0f0672379f7ee8bc8475b73967f (diff)
Notes
Diffstat (limited to 'sys/dev/uart')
-rw-r--r--sys/dev/uart/uart_bus_ebus.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/sys/dev/uart/uart_bus_ebus.c b/sys/dev/uart/uart_bus_ebus.c
index 15e8bcb9899c..16a4411dccda 100644
--- a/sys/dev/uart/uart_bus_ebus.c
+++ b/sys/dev/uart/uart_bus_ebus.c
@@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$");
#include <machine/bus.h>
#include <sys/rman.h>
#include <machine/resource.h>
+#include <machine/ver.h>
#include <dev/uart/uart.h>
#include <dev/uart/uart_bus.h>
@@ -64,6 +65,7 @@ uart_ebus_probe(device_t dev)
{
const char *nm, *cmpt;
struct uart_softc *sc;
+ struct uart_devinfo dummy;
int error;
sc = device_get_softc(dev);
@@ -73,6 +75,24 @@ uart_ebus_probe(device_t dev)
cmpt = ofw_bus_get_compat(dev);
if (!strcmp(nm, "su") || !strcmp(nm, "su_pnp") || (cmpt != NULL &&
(!strcmp(cmpt, "su") || !strcmp(cmpt, "su16550")))) {
+ /*
+ * On AXi and AXmp boards the NS16550 (used to connect
+ * keyboard/mouse) share their IRQ lines with the i8042.
+ * Any IRQ activity (typically during attach) of the
+ * NS16550 used to connect the keyboard when actually the
+ * PS/2 keyboard is selected in OFW causes interaction
+ * with the OBP i8042 driver resulting in a hang and vice
+ * versa. As RS232 keyboards and mice obviously aren't
+ * meant to be used in parallel with PS/2 ones on these
+ * boards don't attach to the NS16550 in case the RS232
+ * keyboard isn't selected in order to prevent such hangs.
+ */
+ if ((!strcmp(sparc64_model, "SUNW,UltraAX-MP") ||
+ !strcmp(sparc64_model, "SUNW,UltraSPARC-IIi-Engine")) &&
+ uart_cpu_getdev(UART_DEV_KEYBOARD, &dummy)) {
+ device_disable(dev);
+ return (ENXIO);
+ }
sc->sc_class = &uart_ns8250_class;
return (uart_bus_probe(dev, 0, 0, 0, 0));
}