summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrkujawa <rkujawa@NetBSD.org>2011-10-30 11:10:42 +0000
committerrkujawa <rkujawa@NetBSD.org>2011-10-30 11:10:42 +0000
commit26e4b1169617536cb159294fbb0732b3f4bb8d69 (patch)
tree5f0b62ad6688736d66f2590c1500dccb2dca0bac
parente3e7c0a004666b42bb93a8f8c667baa6ab2d4b06 (diff)
Improve probe procedure in efa(4). Update man apge to reflect this.
-rw-r--r--share/man/man4/man4.amiga/efa.428
-rw-r--r--sys/arch/amiga/dev/efa.c64
2 files changed, 76 insertions, 16 deletions
diff --git a/share/man/man4/man4.amiga/efa.4 b/share/man/man4/man4.amiga/efa.4
index 4579418adc2..7fba20b0e4d 100644
--- a/share/man/man4/man4.amiga/efa.4
+++ b/share/man/man4/man4.amiga/efa.4
@@ -1,4 +1,4 @@
-.\" $NetBSD: efa.4,v 1.2 2011/10/27 22:56:25 wiz Exp $
+.\" $NetBSD: efa.4,v 1.3 2011/10/30 11:10:43 rkujawa Exp $
.\"
.\" Copyright (c) 2011 The NetBSD Foundation, Inc.
.\" All rights reserved.
@@ -50,10 +50,8 @@ PIO modes 0, 3, 4 and 5 are supported.
.\".Bl -ohang
.\".It Cd options EFA_32BIT_IO
.\"Use 32-bit data port.
-.\".It Cd options EFA_GAYLE_COMPAT
-.\"Drive FastATA in Gayle IDE compatibility mode.
-.\"Use if the driver does not work correctly in native (default) mode.
-.\"Limits operation to PIO0 mode.
+.\".It Cd options EFA_NO_INTR
+.\"Disable hardware interrupt support.
.\".El
.Sh HARDWARE
The
@@ -92,15 +90,21 @@ Code needed to support it is present in driver but does not work correctly.
.Pp
Some of the above devices were also marketed under PowerFlyer and Winner brands.
.Pp
-The
+On board Gayle IDE controller can not be used when FastATA is installed and
+therefore, the
.Nm
-driver can not coexist with
+driver will not coexist with
.Xr wdc 4
driver attached to
-.Xr mainbus 4 ,
-because FastATA 1200 hardware uses portions of the on-board Gayle IDE
-controller.
-These drivers should not be enabled in the same kernel.
+.Xr mainbus 4 .
+Both
+.Nm
+and
+.Xr wdc 4
+can be enabled in the same kernel, but only one will attach (depending on the
+return value of probe function in the
+.Nm
+driver).
.Pp
DMA modes are not supported, this is a hardware limitation.
.Sh BUGS
@@ -109,5 +113,3 @@ Performance is worse than with official AmigaOS driver from ELBOX.
Disks partitioned in split mode, which is specific to official AmigaOS FastATA
driver, are not recognized in
.Nx .
-.Pp
-Improved probe procedure should be written.
diff --git a/sys/arch/amiga/dev/efa.c b/sys/arch/amiga/dev/efa.c
index c4b848dd1e1..8c97144acce 100644
--- a/sys/arch/amiga/dev/efa.c
+++ b/sys/arch/amiga/dev/efa.c
@@ -1,4 +1,4 @@
-/* $NetBSD: efa.c,v 1.3 2011/10/29 19:25:19 rkujawa Exp $ */
+/* $NetBSD: efa.c,v 1.4 2011/10/30 11:10:42 rkujawa Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -83,6 +83,7 @@ static void efa_attach_channel(struct efa_softc *sc, int i);
static void efa_select_regset(struct efa_softc *sc, int chnum,
uint8_t piomode);
static void efa_poll_kthread(void *arg);
+static bool efa_compare_status(void);
#ifdef EFA_DEBUG
static void efa_debug_print_regmapping(struct wdc_regs *wdr_fata);
#endif /* EFA_DEBUG */
@@ -116,9 +117,16 @@ efa_probe(device_t parent, cfdata_t cfp, void *aux)
* can't coexist with wdc_amiga. Match "wdc" on an A1200, because
* FastATA 1200 does not autoconfigure.
*/
- if ( !matchname(aux, "wdc") || !is_a1200() )
+ if (!matchname(aux, "wdc") || !is_a1200())
return(0);
+ if (!efa_compare_status())
+ return(0);
+
+#ifdef EFA_DEBUG
+ aprint_normal("efa_probe succeeded\n");
+#endif /* EFA_DEBUG */
+
return 100;
}
@@ -237,7 +245,7 @@ static void
efa_set_opts(struct efa_softc *sc)
{
#ifdef EFA_32BIT_IO
- sc->sc_32bit_io = true; /* XXX: bus_space_read_multi_stream_4 */
+ sc->sc_32bit_io = true;
#else
sc->sc_32bit_io = false;
#endif /* EFA_32BIT_IO */
@@ -559,3 +567,53 @@ efa_debug_print_regmapping(struct wdc_regs *wdr_fata)
}
#endif /* EFA_DEBUG */
+/* Compare the values of (status) command register in PIO0, PIO3 sets. */
+static bool
+efa_compare_status(void)
+{
+ uint8_t cmd0, cmd3;
+ struct bus_space_tag fata_bst;
+ bus_space_tag_t fata_iot;
+ bus_space_handle_t cmd0_ioh, cmd3_ioh;
+ bool rv;
+
+ rv = false;
+
+ fata_bst.base = (bus_addr_t) ztwomap(FATA1_BASE);
+ fata_bst.absm = &amiga_bus_stride_4swap;
+
+ fata_iot = &fata_bst;
+
+ if (bus_space_map(fata_iot, pio_offsets[0], FATA1_CHAN_SIZE, 0,
+ &cmd0_ioh))
+ return false;
+ if (bus_space_map(fata_iot, pio_offsets[3], FATA1_CHAN_SIZE, 0,
+ &cmd3_ioh))
+ return false;
+
+#ifdef EFA_DEBUG
+ aprint_normal("probing for FastATA at %x, %x: ", (bus_addr_t) cmd0_ioh,
+ (bus_addr_t) cmd3_ioh);
+#endif /* EFA_DEBUG */
+
+ cmd0 = bus_space_read_1(fata_iot, cmd0_ioh, FATA1_PIO0_OFF_COMMAND);
+ cmd3 = bus_space_read_1(fata_iot, cmd3_ioh, FATA1_PION_OFF_COMMAND);
+
+ if (cmd0 == cmd3)
+ rv = true;
+
+ if ( (cmd0 == 0xFF) || (cmd0 == 0x00) ) {
+ /* Assume there's nothing there... */
+ rv = false;
+ }
+
+#ifdef EFA_DEBUG
+ aprint_normal("cmd0 %x, cmd3 %x\n", cmd0, cmd3);
+#endif /* EFA_DEBUG */
+
+ bus_space_unmap(fata_iot, pio_offsets[0], FATA1_CHAN_SIZE);
+ bus_space_unmap(fata_iot, pio_offsets[3], FATA1_CHAN_SIZE);
+
+ return rv;
+}
+