1 /* $NetBSD: if_le.c,v 1.21 1996/05/07 00:35:07 thorpej Exp $ */ 2 3 /*- 4 * Copyright (c) 1995 Charles M. Hannum. All rights reserved. 5 * Copyright (c) 1992, 1993 6 * The Regents of the University of California. All rights reserved. 7 * 8 * This code is derived from software contributed to Berkeley by 9 * Ralph Campbell and Rick Macklem. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. All advertising materials mentioning features or use of this software 20 * must display the following acknowledgement: 21 * This product includes software developed by the University of 22 * California, Berkeley and its contributors. 23 * 4. Neither the name of the University nor the names of its contributors 24 * may be used to endorse or promote products derived from this software 25 * without specific prior written permission. 26 * 27 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 28 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 29 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 30 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 31 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 32 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 33 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 34 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 35 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 36 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 37 * SUCH DAMAGE. 38 * 39 * @(#)if_le.c 8.2 (Berkeley) 11/16/93 40 */ 41 42 #include "bpfilter.h" 43 44 #include <sys/param.h> 45 #include <sys/systm.h> 46 #include <sys/mbuf.h> 47 #include <sys/syslog.h> 48 #include <sys/socket.h> 49 #include <sys/device.h> 50 51 #include <net/if.h> 52 53 #ifdef INET 54 #include <netinet/in.h> 55 #include <netinet/if_ether.h> 56 #endif 57 58 #include <machine/cpu.h> 59 #include <machine/mtpr.h> 60 61 #include <amiga/amiga/device.h> 62 #include <amiga/amiga/isr.h> 63 64 #include <dev/ic/am7990reg.h> 65 #include <dev/ic/am7990var.h> 66 67 #include <amiga/dev/zbusvar.h> 68 #include <amiga/dev/if_levar.h> 69 70 /* offsets for: ID, REGS, MEM */ 71 int lestd[] = { 0, 0x4000, 0x8000 }; 72 73 int le_zbus_match __P((struct device *, void *, void *)); 74 void le_zbus_attach __P((struct device *, struct device *, void *)); 75 76 struct cfattach le_zbus_ca = { 77 sizeof(struct le_softc), le_zbus_match, le_zbus_attach 78 }; 79 80 hide void lewrcsr __P((struct am7990_softc *, u_int16_t, u_int16_t)); 81 hide u_int16_t lerdcsr __P((struct am7990_softc *, u_int16_t)); 82 83 hide void 84 lewrcsr(sc, port, val) 85 struct am7990_softc *sc; 86 u_int16_t port, val; 87 { 88 struct lereg1 *ler1 = ((struct le_softc *)sc)->sc_r1; 89 90 ler1->ler1_rap = port; 91 ler1->ler1_rdp = val; 92 } 93 94 hide u_int16_t 95 lerdcsr(sc, port) 96 struct am7990_softc *sc; 97 u_int16_t port; 98 { 99 struct lereg1 *ler1 = ((struct le_softc *)sc)->sc_r1; 100 u_int16_t val; 101 102 ler1->ler1_rap = port; 103 val = ler1->ler1_rdp; 104 return (val); 105 } 106 107 int 108 le_zbus_match(parent, match, aux) 109 struct device *parent; 110 void *match, *aux; 111 { 112 struct zbus_args *zap = aux; 113 114 /* Commodore ethernet card */ 115 if (zap->manid == 514 && zap->prodid == 112) 116 return (1); 117 118 /* Ameristar ethernet card */ 119 if (zap->manid == 1053 && zap->prodid == 1) 120 return (1); 121 122 return (0); 123 } 124 125 void 126 le_zbus_attach(parent, self, aux) 127 struct device *parent, *self; 128 void *aux; 129 { 130 struct le_softc *lesc = (struct le_softc *)self; 131 struct am7990_softc *sc = &lesc->sc_am7990; 132 struct zbus_args *zap = aux; 133 u_long ser; 134 135 lesc->sc_r1 = (struct lereg1 *)(lestd[1] + (int)zap->va); 136 sc->sc_mem = (void *)(lestd[2] + (int)zap->va); 137 138 sc->sc_copytodesc = am7990_copytobuf_contig; 139 sc->sc_copyfromdesc = am7990_copyfrombuf_contig; 140 sc->sc_copytobuf = am7990_copytobuf_contig; 141 sc->sc_copyfrombuf = am7990_copyfrombuf_contig; 142 sc->sc_zerobuf = am7990_zerobuf_contig; 143 144 sc->sc_rdcsr = lerdcsr; 145 sc->sc_wrcsr = lewrcsr; 146 sc->sc_hwinit = NULL; 147 148 sc->sc_conf3 = LE_C3_BSWP; 149 sc->sc_addr = 0x8000; 150 151 /* 152 * Manufacturer decides the 3 first bytes, i.e. ethernet vendor ID. 153 */ 154 switch (zap->manid) { 155 case 514: 156 /* Commodore */ 157 sc->sc_memsize = 32768; 158 sc->sc_arpcom.ac_enaddr[0] = 0x00; 159 sc->sc_arpcom.ac_enaddr[1] = 0x80; 160 sc->sc_arpcom.ac_enaddr[2] = 0x10; 161 break; 162 163 case 1053: 164 /* Ameristar */ 165 sc->sc_memsize = 32768; 166 sc->sc_arpcom.ac_enaddr[0] = 0x00; 167 sc->sc_arpcom.ac_enaddr[1] = 0x00; 168 sc->sc_arpcom.ac_enaddr[2] = 0x9f; 169 break; 170 171 default: 172 panic("le_zbus_attach: bad manid"); 173 } 174 175 /* 176 * Serial number for board is used as host ID. 177 */ 178 ser = (u_long)zap->serno; 179 sc->sc_arpcom.ac_enaddr[3] = (ser >> 16) & 0xff; 180 sc->sc_arpcom.ac_enaddr[4] = (ser >> 8) & 0xff; 181 sc->sc_arpcom.ac_enaddr[5] = (ser ) & 0xff; 182 183 am7990_config(sc); 184 185 lesc->sc_isr.isr_intr = am7990_intr; 186 lesc->sc_isr.isr_arg = sc; 187 lesc->sc_isr.isr_ipl = 2; 188 add_isr(&lesc->sc_isr); 189 } 190