Module Name:    src
Committed By:   rkujawa
Date:           Sun Oct 30 11:10:43 UTC 2011

Modified Files:
        src/share/man/man4/man4.amiga: efa.4
        src/sys/arch/amiga/dev: efa.c

Log Message:
Improve probe procedure in efa(4). Update man apge to reflect this.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/share/man/man4/man4.amiga/efa.4
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/amiga/dev/efa.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/share/man/man4/man4.amiga/efa.4
diff -u src/share/man/man4/man4.amiga/efa.4:1.2 src/share/man/man4/man4.amiga/efa.4:1.3
--- src/share/man/man4/man4.amiga/efa.4:1.2	Thu Oct 27 22:56:25 2011
+++ src/share/man/man4/man4.amiga/efa.4	Sun Oct 30 11:10:43 2011
@@ -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 
 .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 
 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.

Index: src/sys/arch/amiga/dev/efa.c
diff -u src/sys/arch/amiga/dev/efa.c:1.3 src/sys/arch/amiga/dev/efa.c:1.4
--- src/sys/arch/amiga/dev/efa.c:1.3	Sat Oct 29 19:25:19 2011
+++ src/sys/arch/amiga/dev/efa.c	Sun Oct 30 11:10:42 2011
@@ -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 ef
 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,
 	 * 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_re
 }
 #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;
+}
+

Reply via email to