Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 Jul 2009 12:51:27 +0000 (UTC)
From:      Nathan Whitehorn <nwhitehorn@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r195831 - head/sys/dev/uart
Message-ID:  <200907231251.n6NCpR2J078923@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: nwhitehorn
Date: Thu Jul 23 12:51:27 2009
New Revision: 195831
URL: http://svn.freebsd.org/changeset/base/195831

Log:
  Fix serial console on Apple Xserve G5 by falling back to input-device-1
  if input-device is unavailable. The Xserve G5 defaults to using
  screen/keyboard for output-device/input-device even if these are not
  installed, and then falls back to serial ports at boot time.
  
  Reviewed by:	marcel
  Hardware from:	grehan
  Approved by:	re (kib)

Modified:
  head/sys/dev/uart/uart_cpu_powerpc.c

Modified: head/sys/dev/uart/uart_cpu_powerpc.c
==============================================================================
--- head/sys/dev/uart/uart_cpu_powerpc.c	Thu Jul 23 10:20:12 2009	(r195830)
+++ head/sys/dev/uart/uart_cpu_powerpc.c	Thu Jul 23 12:51:27 2009	(r195831)
@@ -78,6 +78,27 @@ uart_cpu_getdev(int devtype, struct uart
 	return (uart_getenv(devtype, di, class));
 }
 #else
+static int
+ofw_get_uart_console(phandle_t opts, phandle_t *result, const char *inputdev,
+    const char *outputdev)
+{
+	char buf[64];
+	phandle_t input;
+
+	if (OF_getprop(opts, inputdev, buf, sizeof(buf)) == -1)
+		return (ENXIO);
+	input = OF_finddevice(buf);
+	if (input == -1)
+		return (ENXIO);
+	if (OF_getprop(opts, outputdev, buf, sizeof(buf)) == -1)
+		return (ENXIO);
+	if (OF_finddevice(buf) != input)
+		return (ENXIO);
+
+	*result = input;
+	return (0);
+}
+
 int
 uart_cpu_getdev(int devtype, struct uart_devinfo *di)
 {
@@ -94,15 +115,17 @@ uart_cpu_getdev(int devtype, struct uart
 		return (ENXIO);
 	switch (devtype) {
 	case UART_DEV_CONSOLE:
-		if (OF_getprop(opts, "input-device", buf, sizeof(buf)) == -1)
-			return (ENXIO);
-		input = OF_finddevice(buf);
-		if (input == -1)
-			return (ENXIO);
-		if (OF_getprop(opts, "output-device", buf, sizeof(buf)) == -1)
-			return (ENXIO);
-		if (OF_finddevice(buf) != input)
-			return (ENXIO);
+		if (ofw_get_uart_console(opts, &input, "input-device",
+		    "output-device")) {
+			/*
+			 * At least some G5 Xserves require that we
+			 * probe input-device-1 as well
+			 */
+	
+			if (ofw_get_uart_console(opts, &input, "input-device-1",
+			    "output-device-1"))
+				return (ENXIO);
+		}
 		break;
 	case UART_DEV_DBGPORT:
 		if (!getenv_string("hw.uart.dbgport", buf, sizeof(buf)))



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200907231251.n6NCpR2J078923>