Annotation of sys/arch/hp300/dev/if_le.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: if_le.c,v 1.17 2005/01/15 21:13:08 miod Exp $ */
2: /* $NetBSD: if_le.c,v 1.43 1997/05/05 21:05:32 thorpej Exp $ */
3:
4: /*-
5: * Copyright (c) 1995 Charles M. Hannum. All rights reserved.
6: * Copyright (c) 1992, 1993
7: * The Regents of the University of California. All rights reserved.
8: *
9: * This code is derived from software contributed to Berkeley by
10: * Ralph Campbell and Rick Macklem.
11: *
12: * Redistribution and use in source and binary forms, with or without
13: * modification, are permitted provided that the following conditions
14: * are met:
15: * 1. Redistributions of source code must retain the above copyright
16: * notice, this list of conditions and the following disclaimer.
17: * 2. Redistributions in binary form must reproduce the above copyright
18: * notice, this list of conditions and the following disclaimer in the
19: * documentation and/or other materials provided with the distribution.
20: * 3. Neither the name of the University nor the names of its contributors
21: * may be used to endorse or promote products derived from this software
22: * without specific prior written permission.
23: *
24: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34: * SUCH DAMAGE.
35: *
36: * @(#)if_le.c 8.2 (Berkeley) 11/16/93
37: */
38:
39: #include "bpfilter.h"
40:
41: #include <sys/param.h>
42: #include <sys/systm.h>
43: #include <sys/mbuf.h>
44: #include <sys/syslog.h>
45: #include <sys/socket.h>
46: #include <sys/device.h>
47:
48: #include <net/if.h>
49:
50: #ifdef INET
51: #include <netinet/in.h>
52: #include <netinet/if_ether.h>
53: #endif
54:
55: #include <net/if_media.h>
56:
57: #include <machine/autoconf.h>
58: #include <machine/cpu.h>
59: #include <machine/intr.h>
60:
61: #include <dev/ic/am7990reg.h>
62: #include <dev/ic/am7990var.h>
63:
64: #include <hp300/dev/dioreg.h>
65: #include <hp300/dev/diovar.h>
66: #include <hp300/dev/diodevs.h>
67: #include <hp300/dev/if_lereg.h>
68: #include <hp300/dev/if_levar.h>
69:
70: #ifdef USELEDS
71: #include <hp300/hp300/leds.h>
72: #endif
73:
74: int lematch(struct device *, void *, void *);
75: void leattach(struct device *, struct device *, void *);
76:
77: struct cfattach le_ca = {
78: sizeof(struct le_softc), lematch, leattach
79: };
80:
81: int leintr(void *);
82:
83: /* offsets for: ID, REGS, MEM, NVRAM */
84: int lestd[] = { 0, 0x4000, 0x8000, 0xC008 };
85:
86: hide void lewrcsr(struct am7990_softc *, u_int16_t, u_int16_t);
87: hide u_int16_t lerdcsr(struct am7990_softc *, u_int16_t);
88:
89: hide void
90: lewrcsr(sc, port, val)
91: struct am7990_softc *sc;
92: u_int16_t port, val;
93: {
94: struct lereg0 *ler0 = ((struct le_softc *)sc)->sc_r0;
95: struct lereg1 *ler1 = ((struct le_softc *)sc)->sc_r1;
96:
97: do {
98: ler1->ler1_rap = port;
99: } while ((ler0->ler0_status & LE_ACK) == 0);
100: do {
101: ler1->ler1_rdp = val;
102: } while ((ler0->ler0_status & LE_ACK) == 0);
103: }
104:
105: hide u_int16_t
106: lerdcsr(sc, port)
107: struct am7990_softc *sc;
108: u_int16_t port;
109: {
110: struct lereg0 *ler0 = ((struct le_softc *)sc)->sc_r0;
111: struct lereg1 *ler1 = ((struct le_softc *)sc)->sc_r1;
112: u_int16_t val;
113:
114: do {
115: ler1->ler1_rap = port;
116: } while ((ler0->ler0_status & LE_ACK) == 0);
117: do {
118: val = ler1->ler1_rdp;
119: } while ((ler0->ler0_status & LE_ACK) == 0);
120: return (val);
121: }
122:
123: int
124: lematch(parent, match, aux)
125: struct device *parent;
126: void *match, *aux;
127: {
128: struct dio_attach_args *da = aux;
129:
130: if ((da->da_id == DIO_DEVICE_ID_LAN) ||
131: (da->da_id == DIO_DEVICE_ID_LANREM))
132: return (1);
133: return (0);
134: }
135:
136: /*
137: * Interface exists: make available by filling in network interface
138: * record. System will initialize the interface when it is ready
139: * to accept packets.
140: */
141: void
142: leattach(parent, self, aux)
143: struct device *parent, *self;
144: void *aux;
145: {
146: struct lereg0 *ler0;
147: struct dio_attach_args *da = aux;
148: struct le_softc *lesc = (struct le_softc *)self;
149: caddr_t addr;
150: struct am7990_softc *sc = &lesc->sc_am7990;
151: char *cp;
152: int i, ipl;
153:
154: addr = iomap(dio_scodetopa(da->da_scode), da->da_size);
155: if (addr == 0) {
156: printf("\n%s: can't map LANCE registers\n",
157: sc->sc_dev.dv_xname);
158: return;
159: }
160:
161: ler0 = lesc->sc_r0 = (struct lereg0 *)(lestd[0] + (int)addr);
162: ler0->ler0_id = 0xFF;
163: DELAY(100);
164:
165: ipl = DIO_IPL(addr);
166: printf(" ipl %d", ipl);
167:
168: lesc->sc_r1 = (struct lereg1 *)(lestd[1] + (int)addr);
169: sc->sc_mem = (void *)(lestd[2] + (int)addr);
170: sc->sc_conf3 = LE_C3_BSWP;
171: sc->sc_addr = 0;
172: sc->sc_memsize = 16384;
173:
174: /*
175: * Read the ethernet address off the board, one nibble at a time.
176: */
177: cp = (char *)(lestd[3] + (int)addr);
178: for (i = 0; i < sizeof(sc->sc_arpcom.ac_enaddr); i++) {
179: sc->sc_arpcom.ac_enaddr[i] = (*++cp & 0xF) << 4;
180: cp++;
181: sc->sc_arpcom.ac_enaddr[i] |= *++cp & 0xF;
182: cp++;
183: }
184:
185: sc->sc_copytodesc = am7990_copytobuf_contig;
186: sc->sc_copyfromdesc = am7990_copyfrombuf_contig;
187: sc->sc_copytobuf = am7990_copytobuf_contig;
188: sc->sc_copyfrombuf = am7990_copyfrombuf_contig;
189: sc->sc_zerobuf = am7990_zerobuf_contig;
190:
191: sc->sc_rdcsr = lerdcsr;
192: sc->sc_wrcsr = lewrcsr;
193: sc->sc_hwreset = NULL;
194: sc->sc_hwinit = NULL;
195:
196: am7990_config(sc);
197:
198: /* Establish the interrupt handler. */
199: lesc->sc_isr.isr_func = leintr;
200: lesc->sc_isr.isr_arg = lesc;
201: lesc->sc_isr.isr_ipl = ipl;
202: lesc->sc_isr.isr_priority = IPL_NET;
203: dio_intr_establish(&lesc->sc_isr, self->dv_xname);
204: ler0->ler0_status = LE_IE;
205: }
206:
207: int
208: leintr(arg)
209: void *arg;
210: {
211: struct le_softc *lesc = (struct le_softc *)arg;
212: struct am7990_softc *sc = &lesc->sc_am7990;
213: #ifdef USELEDS
214: u_int16_t isr;
215:
216: isr = lerdcsr(sc, LE_CSR0);
217:
218: if ((isr & LE_C0_INTR) == 0)
219: return (0);
220:
221: if (isr & LE_C0_RINT)
222: ledcontrol(0, 0, LED_LANRCV);
223:
224: if (isr & LE_C0_TINT)
225: ledcontrol(0, 0, LED_LANXMT);
226: #endif /* USELEDS */
227:
228: return am7990_intr(sc);
229: }
CVSweb