diff options
| author | rkujawa <rkujawa@NetBSD.org> | 2011-10-30 11:10:42 +0000 |
|---|---|---|
| committer | rkujawa <rkujawa@NetBSD.org> | 2011-10-30 11:10:42 +0000 |
| commit | 26e4b1169617536cb159294fbb0732b3f4bb8d69 (patch) | |
| tree | 5f0b62ad6688736d66f2590c1500dccb2dca0bac /sys/arch/amiga/dev | |
| parent | e3e7c0a004666b42bb93a8f8c667baa6ab2d4b06 (diff) | |
Improve probe procedure in efa(4). Update man apge to reflect this.
Diffstat (limited to 'sys/arch/amiga/dev')
| -rw-r--r-- | sys/arch/amiga/dev/efa.c | 64 |
1 files changed, 61 insertions, 3 deletions
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; +} + |
