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; +} +