diff options
| author | jdolecek <jdolecek@NetBSD.org> | 2001-03-31 00:26:53 +0000 |
|---|---|---|
| committer | jdolecek <jdolecek@NetBSD.org> | 2001-03-31 00:26:53 +0000 |
| commit | 592dfdc76b6eb3f6c2def35728af6a3d274d63f4 (patch) | |
| tree | 96a45fefc0f227ac2e0cb33d737b61c352e58b96 /sys/dev | |
| parent | d04f4ebff1297850af69ab4e0c875636815f6a5f (diff) | |
Prepare for MCA attachment:
* split off sharable stuff to dev/ic/ate_subr.[ch], move ate(4) device
definition to conf/files
* cosmetic: attach with ate_isa
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/ic/ate_subr.c | 147 | ||||
| -rw-r--r-- | sys/dev/ic/ate_subr.h | 32 | ||||
| -rw-r--r-- | sys/dev/isa/files.isa | 6 | ||||
| -rw-r--r-- | sys/dev/isa/if_ate.c | 109 |
4 files changed, 186 insertions, 108 deletions
diff --git a/sys/dev/ic/ate_subr.c b/sys/dev/ic/ate_subr.c new file mode 100644 index 00000000000..77419730edc --- /dev/null +++ b/sys/dev/ic/ate_subr.c @@ -0,0 +1,147 @@ +/* $NetBSD: ate_subr.c,v 1.1 2001/03/31 00:26:54 jdolecek Exp $ */ + +/* + * All Rights Reserved, Copyright (C) Fujitsu Limited 1995 + * + * This software may be used, modified, copied, distributed, and sold, in + * both source and binary form provided that the above copyright, these + * terms and the following disclaimer are retained. The name of the author + * and/or the contributor may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND THE CONTRIBUTOR ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR THE CONTRIBUTOR BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION. + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Portions copyright (C) 1993, David Greenman. This software may be used, + * modified, copied, distributed, and sold, in both source and binary form + * provided that the above copyright and these terms are retained. Under no + * circumstances is the author responsible for the proper functioning of this + * software, nor does the author assume any responsibility for damages + * incurred with its use. + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/device.h> +#include <sys/socket.h> +#include <sys/syslog.h> + +#include <machine/bus.h> +#include <machine/intr.h> + +#include <dev/ic/mb86960reg.h> +#include <dev/ic/ate_subr.h> + +#include <dev/isa/if_fereg.h> /* XXX */ + +static __inline__ void ate_strobe __P((bus_space_tag_t, bus_space_handle_t)); + +/* + * Routines to read all bytes from the config EEPROM through MB86965A. + * I'm not sure what exactly I'm doing here... I was told just to follow + * the steps, and it worked. Could someone tell me why the following + * code works? (Or, why all similar codes I tried previously doesn't + * work.) FIXME. + */ + +static __inline__ void +ate_strobe (iot, ioh) + bus_space_tag_t iot; + bus_space_handle_t ioh; +{ + + /* + * Output same value twice. To speed-down execution? + */ + bus_space_write_1(iot, ioh, FE_BMPR16, FE_B16_SELECT); + bus_space_write_1(iot, ioh, FE_BMPR16, FE_B16_SELECT); + bus_space_write_1(iot, ioh, FE_BMPR16, FE_B16_SELECT | FE_B16_CLOCK); + bus_space_write_1(iot, ioh, FE_BMPR16, FE_B16_SELECT | FE_B16_CLOCK); + bus_space_write_1(iot, ioh, FE_BMPR16, FE_B16_SELECT); + bus_space_write_1(iot, ioh, FE_BMPR16, FE_B16_SELECT); +} + +void +ate_read_eeprom(iot, ioh, data) + bus_space_tag_t iot; + bus_space_handle_t ioh; + u_char *data; +{ + int n, count; + u_char val, bit; + + /* Read bytes from EEPROM; two bytes per an iteration. */ + for (n = 0; n < FE_EEPROM_SIZE / 2; n++) { + /* Reset the EEPROM interface. */ + bus_space_write_1(iot, ioh, FE_BMPR16, 0x00); + bus_space_write_1(iot, ioh, FE_BMPR17, 0x00); + bus_space_write_1(iot, ioh, FE_BMPR16, FE_B16_SELECT); + + /* Start EEPROM access. */ + bus_space_write_1(iot, ioh, FE_BMPR17, FE_B17_DATA); + ate_strobe(iot, ioh); + + /* Pass the iteration count to the chip. */ + count = 0x80 | n; + for (bit = 0x80; bit != 0x00; bit >>= 1) { + bus_space_write_1(iot, ioh, FE_BMPR17, + (count & bit) ? FE_B17_DATA : 0); + ate_strobe(iot, ioh); + } + bus_space_write_1(iot, ioh, FE_BMPR17, 0x00); + + /* Read a byte. */ + val = 0; + for (bit = 0x80; bit != 0x00; bit >>= 1) { + ate_strobe(iot, ioh); + if (bus_space_read_1(iot, ioh, FE_BMPR17) & + FE_B17_DATA) + val |= bit; + } + *data++ = val; + + /* Read one more byte. */ + val = 0; + for (bit = 0x80; bit != 0x00; bit >>= 1) { + ate_strobe(iot, ioh); + if (bus_space_read_1(iot, ioh, FE_BMPR17) & + FE_B17_DATA) + val |= bit; + } + *data++ = val; + } + + /* Make sure the EEPROM is turned off. */ + bus_space_write_1(iot, ioh, FE_BMPR16, 0); + bus_space_write_1(iot, ioh, FE_BMPR17, 0); + +#if ATE_DEBUG >= 3 + /* Report what we got. */ + data -= FE_EEPROM_SIZE; + log(LOG_INFO, "ate_read_eeprom: EEPROM at %04x:" + " %02x%02x%02x%02x %02x%02x%02x%02x -" + " %02x%02x%02x%02x %02x%02x%02x%02x -" + " %02x%02x%02x%02x %02x%02x%02x%02x -" + " %02x%02x%02x%02x %02x%02x%02x%02x\n", + (int) ioh, /* XXX */ + data[ 0], data[ 1], data[ 2], data[ 3], + data[ 4], data[ 5], data[ 6], data[ 7], + data[ 8], data[ 9], data[10], data[11], + data[12], data[13], data[14], data[15], + data[16], data[17], data[18], data[19], + data[20], data[21], data[22], data[23], + data[24], data[25], data[26], data[27], + data[28], data[29], data[30], data[31]); +#endif +} diff --git a/sys/dev/ic/ate_subr.h b/sys/dev/ic/ate_subr.h new file mode 100644 index 00000000000..3892faf2662 --- /dev/null +++ b/sys/dev/ic/ate_subr.h @@ -0,0 +1,32 @@ +/* $NetBSD: ate_subr.h,v 1.1 2001/03/31 00:26:54 jdolecek Exp $ */ + +/* + * Copyright (c) 2001 The NetBSD Foundation, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Charles M. Hannum. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +void ate_read_eeprom __P((bus_space_tag_t, bus_space_handle_t, u_char *)); diff --git a/sys/dev/isa/files.isa b/sys/dev/isa/files.isa index d800a48f32a..2dace721012 100644 --- a/sys/dev/isa/files.isa +++ b/sys/dev/isa/files.isa @@ -1,4 +1,4 @@ -# $NetBSD: files.isa,v 1.112 2001/03/23 19:41:34 jdolecek Exp $ +# $NetBSD: files.isa,v 1.113 2001/03/31 00:26:54 jdolecek Exp $ # # Config file and device description for machine-independent ISA code. # Included by ports that need it. Requires that the SCSI files be @@ -197,8 +197,8 @@ file dev/isa/if_ntwoc_isa.c ntwoc_isa # Allied Telesis MB8695-based boards # (Allied Telesis AT1700) -device ate: arp, ether, ifnet, mb86960 -attach ate at isa +# device in sys/conf/files +attach ate at isa with ate_isa file dev/isa/if_ate.c ate # Crystal Semiconductor CS8900, CS8920, and CS8920M Ethernet diff --git a/sys/dev/isa/if_ate.c b/sys/dev/isa/if_ate.c index ed75cdde6c1..34392c4246f 100644 --- a/sys/dev/isa/if_ate.c +++ b/sys/dev/isa/if_ate.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_ate.c,v 1.24 2000/05/29 17:37:17 jhawk Exp $ */ +/* $NetBSD: if_ate.c,v 1.25 2001/03/31 00:26:54 jdolecek Exp $ */ /* * All Rights Reserved, Copyright (C) Fujitsu Limited 1995 @@ -46,6 +46,7 @@ #include <dev/ic/mb86960reg.h> #include <dev/ic/mb86960var.h> +#include <dev/ic/ate_subr.h> #include <dev/isa/isavar.h> #include <dev/isa/if_fereg.h> /* XXX */ @@ -60,12 +61,12 @@ struct ate_softc { void *sc_ih; /* interrupt cookie */ }; -struct cfattach ate_ca = { +struct cfattach ate_isa_ca = { sizeof(struct ate_softc), ate_match, ate_attach }; #if NetBSD <= 199712 -struct cfdriver ate_cd = { +struct cfdriver ate_isa_cd = { NULL, "ate", DV_IFNET }; #endif @@ -78,9 +79,6 @@ struct fe_simple_probe_struct { static __inline__ int fe_simple_probe __P((bus_space_tag_t, bus_space_handle_t, struct fe_simple_probe_struct const *)); -static __inline__ void ate_strobe __P((bus_space_tag_t, bus_space_handle_t)); -static void ate_read_eeprom __P((bus_space_tag_t, bus_space_handle_t, - u_char *)); static int ate_find __P((bus_space_tag_t, bus_space_handle_t, int *, int *)); static int ate_detect __P((bus_space_tag_t, bus_space_handle_t, @@ -205,105 +203,6 @@ fe_simple_probe (iot, ioh, sp) } /* - * Routines to read all bytes from the config EEPROM through MB86965A. - * I'm not sure what exactly I'm doing here... I was told just to follow - * the steps, and it worked. Could someone tell me why the following - * code works? (Or, why all similar codes I tried previously doesn't - * work.) FIXME. - */ - -static __inline__ void -ate_strobe (iot, ioh) - bus_space_tag_t iot; - bus_space_handle_t ioh; -{ - - /* - * Output same value twice. To speed-down execution? - */ - bus_space_write_1(iot, ioh, FE_BMPR16, FE_B16_SELECT); - bus_space_write_1(iot, ioh, FE_BMPR16, FE_B16_SELECT); - bus_space_write_1(iot, ioh, FE_BMPR16, FE_B16_SELECT | FE_B16_CLOCK); - bus_space_write_1(iot, ioh, FE_BMPR16, FE_B16_SELECT | FE_B16_CLOCK); - bus_space_write_1(iot, ioh, FE_BMPR16, FE_B16_SELECT); - bus_space_write_1(iot, ioh, FE_BMPR16, FE_B16_SELECT); -} - -static void -ate_read_eeprom(iot, ioh, data) - bus_space_tag_t iot; - bus_space_handle_t ioh; - u_char *data; -{ - int n, count; - u_char val, bit; - - /* Read bytes from EEPROM; two bytes per an iterration. */ - for (n = 0; n < FE_EEPROM_SIZE / 2; n++) { - /* Reset the EEPROM interface. */ - bus_space_write_1(iot, ioh, FE_BMPR16, 0x00); - bus_space_write_1(iot, ioh, FE_BMPR17, 0x00); - bus_space_write_1(iot, ioh, FE_BMPR16, FE_B16_SELECT); - - /* Start EEPROM access. */ - bus_space_write_1(iot, ioh, FE_BMPR17, FE_B17_DATA); - ate_strobe(iot, ioh); - - /* Pass the iterration count to the chip. */ - count = 0x80 | n; - for (bit = 0x80; bit != 0x00; bit >>= 1) { - bus_space_write_1(iot, ioh, FE_BMPR17, - (count & bit) ? FE_B17_DATA : 0); - ate_strobe(iot, ioh); - } - bus_space_write_1(iot, ioh, FE_BMPR17, 0x00); - - /* Read a byte. */ - val = 0; - for (bit = 0x80; bit != 0x00; bit >>= 1) { - ate_strobe(iot, ioh); - if (bus_space_read_1(iot, ioh, FE_BMPR17) & - FE_B17_DATA) - val |= bit; - } - *data++ = val; - - /* Read one more byte. */ - val = 0; - for (bit = 0x80; bit != 0x00; bit >>= 1) { - ate_strobe(iot, ioh); - if (bus_space_read_1(iot, ioh, FE_BMPR17) & - FE_B17_DATA) - val |= bit; - } - *data++ = val; - } - - /* Make sure the EEPROM is turned off. */ - bus_space_write_1(iot, ioh, FE_BMPR16, 0); - bus_space_write_1(iot, ioh, FE_BMPR17, 0); - -#if ATE_DEBUG >= 3 - /* Report what we got. */ - data -= FE_EEPROM_SIZE; - log(LOG_INFO, "ate_read_eeprom: EEPROM at %04x:" - " %02x%02x%02x%02x %02x%02x%02x%02x -" - " %02x%02x%02x%02x %02x%02x%02x%02x -" - " %02x%02x%02x%02x %02x%02x%02x%02x -" - " %02x%02x%02x%02x %02x%02x%02x%02x\n", - (int) ioh, /* XXX */ - data[ 0], data[ 1], data[ 2], data[ 3], - data[ 4], data[ 5], data[ 6], data[ 7], - data[ 8], data[ 9], data[10], data[11], - data[12], data[13], data[14], data[15], - data[16], data[17], data[18], data[19], - data[20], data[21], data[22], data[23], - data[24], data[25], data[26], data[27], - data[28], data[29], data[30], data[31]); -#endif -} - -/* * Hardware (vendor) specific probe routines. */ |
