summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/macppc/dev/adb.c21
-rw-r--r--sys/arch/macppc/dev/pm_direct.c14
2 files changed, 28 insertions, 7 deletions
diff --git a/sys/arch/macppc/dev/adb.c b/sys/arch/macppc/dev/adb.c
index a192399da4b..cfc5bd8ca7b 100644
--- a/sys/arch/macppc/dev/adb.c
+++ b/sys/arch/macppc/dev/adb.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: adb.c,v 1.18 2006/01/18 23:21:17 miod Exp $ */
+/* $OpenBSD: adb.c,v 1.19 2006/03/07 20:00:18 miod Exp $ */
/* $NetBSD: adb.c,v 1.6 1999/08/16 06:28:09 tsubai Exp $ */
/* $NetBSD: adb_direct.c,v 1.14 2000/06/08 22:10:45 tsubai Exp $ */
@@ -249,6 +249,7 @@ int tickle_serial = 0; /* the last packet tickled */
int adb_cuda_serial = 0; /* the current packet */
struct timeout adb_cuda_timeout;
struct timeout adb_softintr_timeout;
+int adbempty = 0; /* nonzero if no adb devices */
volatile u_char *Via1Base;
@@ -1642,9 +1643,25 @@ adbattach(struct device *parent, struct device *self, void *aux)
if (strcmp(ca->ca_name, "via-cuda") == 0)
adbHardware = ADB_HW_CUDA;
- else if (strcmp(ca->ca_name, "via-pmu") == 0)
+ else if (strcmp(ca->ca_name, "via-pmu") == 0) {
adbHardware = ADB_HW_PMU;
+ /*
+ * Bus reset can take a long time if no adb devices are
+ * connected, e.g. on a Mac Mini; so check for an adb
+ * child in the OF tree to speed up pm_adb_op().
+ */
+ adbempty = 1;
+ for (node = OF_child(ca->ca_node); node; node = OF_peer(node)) {
+ if (OF_getprop(node, "name", name, sizeof name) <= 0)
+ continue;
+ if (strcmp(name, "adb") == 0) {
+ adbempty = 0;
+ break;
+ }
+ }
+ }
+
adb_polling = 1;
adb_reinit();
diff --git a/sys/arch/macppc/dev/pm_direct.c b/sys/arch/macppc/dev/pm_direct.c
index d390239adaa..f683585261e 100644
--- a/sys/arch/macppc/dev/pm_direct.c
+++ b/sys/arch/macppc/dev/pm_direct.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pm_direct.c,v 1.19 2006/02/22 07:02:23 miod Exp $ */
+/* $OpenBSD: pm_direct.c,v 1.20 2006/03/07 20:00:18 miod Exp $ */
/* $NetBSD: pm_direct.c,v 1.9 2000/06/08 22:10:46 tsubai Exp $ */
/*
@@ -550,6 +550,7 @@ pm_adb_op(u_char *buffer, void *compRout, void *data, int command)
#endif
PMData pmdata;
struct adbCommand packet;
+ extern int adbempty;
if (adbWaiting == 1)
return 1;
@@ -582,11 +583,14 @@ pm_adb_op(u_char *buffer, void *compRout, void *data, int command)
* - PowerMac10,1
* causes several pmu interrupts with ifr set to PMU_INT_SNDBRT.
* Not processing them prevents us from seeing the adb devices
- * afterwards.
+ * afterwards, so we have to expect it unless we know the adb
+ * bus is empty.
*/
- if (command == PMU_RESET_ADB)
- waitfor = PMU_INT_ADB_AUTO | PMU_INT_ADB | PMU_INT_SNDBRT;
- else
+ if (command == PMU_RESET_ADB) {
+ waitfor = PMU_INT_ADB_AUTO | PMU_INT_ADB;
+ if (adbempty == 0)
+ waitfor |= PMU_INT_SNDBRT;
+ } else
waitfor = PMU_INT_ALL;
pmdata.data[0] = (u_char)(command & 0xff);