Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src Improve probe procedure in efa(4). Update man apge to reflec...
details: https://anonhg.NetBSD.org/src/rev/0021b8f5bca1
branches: trunk
changeset: 770713:0021b8f5bca1
user: rkujawa <rkujawa%NetBSD.org@localhost>
date: Sun Oct 30 11:10:42 2011 +0000
description:
Improve probe procedure in efa(4). Update man apge to reflect this.
diffstat:
share/man/man4/man4.amiga/efa.4 | 28 +++++++++--------
sys/arch/amiga/dev/efa.c | 64 +++++++++++++++++++++++++++++++++++++++-
2 files changed, 76 insertions(+), 16 deletions(-)
diffs (154 lines):
diff -r bf1e269573fd -r 0021b8f5bca1 share/man/man4/man4.amiga/efa.4
--- a/share/man/man4/man4.amiga/efa.4 Sun Oct 30 08:50:14 2011 +0000
+++ b/share/man/man4/man4.amiga/efa.4 Sun Oct 30 11:10:42 2011 +0000
@@ -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 @@
.\".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 @@
.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 @@
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 -r bf1e269573fd -r 0021b8f5bca1 sys/arch/amiga/dev/efa.c
--- a/sys/arch/amiga/dev/efa.c Sun Oct 30 08:50:14 2011 +0000
+++ b/sys/arch/amiga/dev/efa.c Sun Oct 30 11:10:42 2011 +0000
@@ -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_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 @@
* 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 @@
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 @@
}
#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;
+}
+
Home |
Main Index |
Thread Index |
Old Index