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