summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorderaadt <deraadt@openbsd.org>2006-06-29 00:01:03 +0000
committerderaadt <deraadt@openbsd.org>2006-06-29 00:01:03 +0000
commit392880e36c027c8ecf19682ec2aa9da5ac42aa06 (patch)
tree203b6614b6fcef17d5a6034a6204ff195008bef5
parentuse quiet mode (-q) by default and add a flag -V for the old "verbose" (diff)
downloadwireguard-openbsd-392880e36c027c8ecf19682ec2aa9da5ac42aa06.tar.xz
wireguard-openbsd-392880e36c027c8ecf19682ec2aa9da5ac42aa06.zip
try prom mapping first, then memory mapping, then io mapping.. this works
on v210 and on netra t1 105, good sign it will work on others. mechanism pointed out by miod, tested by dlg and djm and I
-rw-r--r--sys/arch/sparc64/dev/pcfiic_ebus.c28
1 files changed, 22 insertions, 6 deletions
diff --git a/sys/arch/sparc64/dev/pcfiic_ebus.c b/sys/arch/sparc64/dev/pcfiic_ebus.c
index 750ccb0f481..67b254d6f9b 100644
--- a/sys/arch/sparc64/dev/pcfiic_ebus.c
+++ b/sys/arch/sparc64/dev/pcfiic_ebus.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pcfiic_ebus.c,v 1.5 2006/06/22 08:33:45 deraadt Exp $ */
+/* $OpenBSD: pcfiic_ebus.c,v 1.6 2006/06/29 00:01:03 deraadt Exp $ */
/*
* Copyright (c) 2006 David Gwynne <dlg@openbsd.org>
@@ -83,8 +83,6 @@ pcfiic_ebus_attach(struct device *parent, struct device *self, void *aux)
u_int8_t clock = PCF_CLOCK_12;
int swapregs = 0;
- sc->sc_iot = ea->ea_memtag;
-
if (ea->ea_nregs < 1 || ea->ea_nregs > 2) {
printf(": expected 1 or 2 registers, got %d\n", ea->ea_nregs);
return;
@@ -115,13 +113,31 @@ pcfiic_ebus_attach(struct device *parent, struct device *self, void *aux)
return;
}
- if (ebus_bus_map(sc->sc_iot, 0, EBUS_PADDR_FROM_REG(&ea->ea_regs[0]),
- ea->ea_regs[0].size, 0, 0, &sc->sc_ioh) != 0) {
+ /* Prefer prom mapping, then memory mapping, then io mapping */
+ if (ea->ea_nvaddrs) {
+ if (bus_space_map(ea->ea_memtag, ea->ea_vaddrs[0], 0,
+ BUS_SPACE_MAP_PROMADDRESS, &sc->sc_ioh) != 0)
+ goto fail;
+ sc->sc_iot = ea->ea_memtag;
+ } else if (ebus_bus_map(ea->ea_memtag, 0,
+ EBUS_PADDR_FROM_REG(&ea->ea_regs[0]),
+ ea->ea_regs[0].size, 0, 0, &sc->sc_ioh) == 0) {
+ sc->sc_iot = ea->ea_memtag;
+ } else if (ebus_bus_map(ea->ea_iotag, 0,
+ EBUS_PADDR_FROM_REG(&ea->ea_regs[0]),
+ ea->ea_regs[0].size, 0, 0, &sc->sc_ioh) == 0) {
+ sc->sc_iot = ea->ea_iotag;
+ } else {
+fail:
printf(": can't map register space\n");
- return;
+ return;
}
if (ea->ea_nregs == 2) {
+ /*
+ * Second register only occurs on BBC-based machines,
+ * and is likely not prom mapped
+ */
if (ebus_bus_map(sc->sc_iot, 0, EBUS_PADDR_FROM_REG(&ea->ea_regs[1]),
ea->ea_regs[1].size, 0, 0, &sc->sc_ioh2) != 0) {
printf(": can't map 2nd register space\n");