diff options
Diffstat (limited to 'sys/dev/isa/if_ie.c')
-rw-r--r-- | sys/dev/isa/if_ie.c | 94 |
1 files changed, 63 insertions, 31 deletions
diff --git a/sys/dev/isa/if_ie.c b/sys/dev/isa/if_ie.c index d224f872fb1..8c2926131c8 100644 --- a/sys/dev/isa/if_ie.c +++ b/sys/dev/isa/if_ie.c @@ -1,5 +1,5 @@ -/* $OpenBSD: if_ie.c,v 1.8 1996/05/05 13:38:46 mickey Exp $ */ -/* $NetBSD: if_ie.c,v 1.47 1996/04/11 22:29:27 cgd Exp $ */ +/* $OpenBSD: if_ie.c,v 1.9 1996/05/07 07:36:59 deraadt Exp $ */ +/* $NetBSD: if_ie.c,v 1.49 1996/04/30 22:21:54 thorpej Exp $ */ /*- * Copyright (c) 1993, 1994, 1995 Charles Hannum. @@ -141,7 +141,8 @@ iomem, and to make 16-pointers, we subtract sc_maddr and and with 0xffff. #include <vm/vm.h> #include <machine/cpu.h> -#include <machine/pio.h> +#include <machine/pio.h> /* XXX convert this driver! */ +#include <machine/bus.h> #include <dev/isa/isareg.h> #include <dev/isa/isavar.h> @@ -228,8 +229,8 @@ struct ie_softc { struct arpcom sc_arpcom; - void (*reset_586)(); - void (*chan_attn)(); + void (*reset_586) __P((struct ie_softc *)); + void (*chan_attn) __P((struct ie_softc *)); enum ie_hardware hard_type; int hard_vers; @@ -295,6 +296,8 @@ void iememinit __P((void *, struct ie_softc *)); static int mc_setup __P((struct ie_softc *, void *)); static void mc_reset __P((struct ie_softc *)); +vm_offset_t kvtop __P((caddr_t)); /* XXX: Should not use this */ + #ifdef IEDEBUG void print_rbd __P((volatile struct ie_recv_buf_desc *)); @@ -302,8 +305,24 @@ int in_ierint = 0; int in_ietint = 0; #endif -int ieprobe __P((struct device *, void *, void *)); -void ieattach __P((struct device *, struct device *, void *)); +int ieprobe __P((struct device *, void *, void *)); +void ieattach __P((struct device *, struct device *, void *)); +int sl_probe __P((struct ie_softc *, struct isa_attach_args *)); +int el_probe __P((struct ie_softc *, struct isa_attach_args *)); +int ee16_probe __P((struct ie_softc *, struct isa_attach_args *)); +int check_ie_present __P((struct ie_softc *, caddr_t, u_int)); + +static __inline void ie_setup_config __P((volatile struct ie_config_cmd *, + int, int)); +static __inline void ie_ack __P((struct ie_softc *, u_int)); +static __inline int ether_equal __P((u_char *, u_char *)); +static __inline int check_eh __P((struct ie_softc *, struct ether_header *, + int *)); +static __inline int ie_buflen __P((struct ie_softc *, int)); +static __inline int ie_packet_len __P((struct ie_softc *)); + +static void chan_attn_timeout __P((void *)); +static void run_tdr __P((struct ie_softc *, struct ie_tdr_cmd *)); struct cfattach ie_ca = { sizeof(struct ie_softc), ieprobe, ieattach @@ -323,7 +342,7 @@ struct cfdriver ie_cd = { * Here are a few useful functions. We could have done these as macros, but * since we have the inline facility, it makes sense to use that instead. */ -static inline void +static __inline void ie_setup_config(cmd, promiscuous, manchester) volatile struct ie_config_cmd *cmd; int promiscuous, manchester; @@ -343,7 +362,7 @@ ie_setup_config(cmd, promiscuous, manchester) cmd->ie_junk = 0xff; } -static inline void +static __inline void ie_ack(sc, mask) struct ie_softc *sc; u_int mask; @@ -446,8 +465,10 @@ el_probe(sc, ia) struct ie_softc *sc; struct isa_attach_args *ia; { + bus_chipset_tag_t bc = ia->ia_bc; + bus_io_handle_t ioh; u_char c; - int i; + int i, rval = 0; u_char signature[] = "*3COM*"; sc->sc_iobase = ia->ia_iobase; @@ -456,28 +477,39 @@ el_probe(sc, ia) sc->reset_586 = el_reset_586; sc->chan_attn = el_chan_attn; - /* Reset and put card in CONFIG state without changing address. */ - elink_reset(); - elink_idseq(ELINK_507_POLY); - elink_idseq(ELINK_507_POLY); + /* + * Map the Etherlink ID port for the probe sequence. + */ + if (bus_io_map(bc, ELINK_ID_PORT, 1, &ioh)) { + printf("3c507 probe: can't map Etherlink ID port\n"); + return 0; + } + + /* + * Reset and put card in CONFIG state without changing address. + * XXX Indirect brokenness here! + */ + elink_reset(bc, ioh, sc->sc_dev.dv_parent->dv_unit); + elink_idseq(bc, ioh, ELINK_507_POLY); + elink_idseq(bc, ioh, ELINK_507_POLY); outb(ELINK_ID_PORT, 0xff); /* Check for 3COM signature before proceeding. */ outb(PORT + IE507_CTRL, inb(PORT + IE507_CTRL) & 0xfc); /* XXX */ for (i = 0; i < 6; i++) if (inb(PORT + i) != signature[i]) - return 0; + goto out; c = inb(PORT + IE507_MADDR); if (c & 0x20) { printf("%s: can't map 3C507 RAM in high memory\n", sc->sc_dev.dv_xname); - return 0; + goto out; } /* Go to RUN state. */ outb(ELINK_ID_PORT, 0x00); - elink_idseq(ELINK_507_POLY); + elink_idseq(bc, ioh, ELINK_507_POLY); outb(ELINK_ID_PORT, 0x00); /* Set bank 2 for version info and read BCD version byte. */ @@ -493,7 +525,7 @@ el_probe(sc, ia) if (ia->ia_irq != i) { printf("%s: irq mismatch; kernel configured %d != board configured %d\n", sc->sc_dev.dv_xname, ia->ia_irq, i); - return 0; + goto out; } } else ia->ia_irq = i; @@ -504,7 +536,7 @@ el_probe(sc, ia) if (ia->ia_maddr != i) { printf("%s: maddr mismatch; kernel configured %x != board configured %x\n", sc->sc_dev.dv_xname, ia->ia_maddr, i); - return 0; + goto out; } } else ia->ia_maddr = i; @@ -520,7 +552,7 @@ el_probe(sc, ia) if (!sc->sc_msize) { printf("%s: can't find shared memory\n", sc->sc_dev.dv_xname); outb(PORT + IE507_CTRL, EL_CTRL_NRST); - return 0; + goto out; } if (!ia->ia_msize) @@ -529,7 +561,7 @@ el_probe(sc, ia) printf("%s: msize mismatch; kernel configured %d != board configured %d\n", sc->sc_dev.dv_xname, ia->ia_msize, sc->sc_msize); outb(PORT + IE507_CTRL, EL_CTRL_NRST); - return 0; + goto out; } slel_get_address(sc); @@ -538,7 +570,11 @@ el_probe(sc, ia) outb(PORT + IE507_ICTRL, 1); ia->ia_iosize = 16; - return 1; + rval = 1; + + out: + bus_io_unmap(bc, ioh, 1); + return rval; } /* Taken almost exactly from Rod's if_ix.c. */ @@ -549,12 +585,9 @@ ee16_probe(sc, ia) struct isa_attach_args *ia; { int i; - int cnt_id; u_short board_id, id_var1, id_var2, checksum = 0; u_short eaddrtemp, irq; u_short pg, adjust, decode, edecode; - u_char lock_bit; - u_char c; u_char bart_config; short irq_translate[] = {0, 0x09, 0x03, 0x04, 0x05, 0x0a, 0x0b, 0}; @@ -982,7 +1015,7 @@ ietint(sc) * Compare two Ether/802 addresses for equality, inlined and unrolled for * speed. I'd love to have an inline assembler version of this... */ -static inline int +static __inline int ether_equal(one, two) u_char *one, *two; { @@ -1005,7 +1038,7 @@ ether_equal(one, two) * only client which will fiddle with IFF_PROMISC is BPF. This is * probably a good assumption, but we do not make it here. (Yet.) */ -static inline int +static __inline int check_eh(sc, eh, to_bpf) struct ie_softc *sc; struct ether_header *eh; @@ -1113,7 +1146,7 @@ check_eh(sc, eh, to_bpf) * IE_RBUF_SIZE is an even power of two. If somehow the act_len exceeds * the size of the buffer, then we are screwed anyway. */ -static inline int +static __inline int ie_buflen(sc, head) struct ie_softc *sc; int head; @@ -1123,7 +1156,7 @@ ie_buflen(sc, head) & (IE_RBUF_SIZE | (IE_RBUF_SIZE - 1))); } -static inline int +static __inline int ie_packet_len(sc) struct ie_softc *sc; { @@ -1782,7 +1815,7 @@ iereset(sc) */ static void chan_attn_timeout(rock) - caddr_t rock; + void *rock; { *(int *)rock = 1; @@ -2009,7 +2042,6 @@ ieinit(sc) { volatile struct ie_sys_ctl_block *scb = sc->scb; void *ptr; - int n; ptr = (void *)ALIGN(scb + 1); |