hd64570.c revision 1.2 1 1.2 mycroft /* $Id: hd64570.c,v 1.2 1998/08/08 23:51:40 mycroft Exp $ */
2 1.1 explorer
3 1.1 explorer /*
4 1.1 explorer * Copyright (c) 1998 Vixie Enterprises
5 1.1 explorer * All rights reserved.
6 1.1 explorer *
7 1.1 explorer * Redistribution and use in source and binary forms, with or without
8 1.1 explorer * modification, are permitted provided that the following conditions
9 1.1 explorer * are met:
10 1.1 explorer *
11 1.1 explorer * 1. Redistributions of source code must retain the above copyright
12 1.1 explorer * notice, this list of conditions and the following disclaimer.
13 1.1 explorer * 2. Redistributions in binary form must reproduce the above copyright
14 1.1 explorer * notice, this list of conditions and the following disclaimer in the
15 1.1 explorer * documentation and/or other materials provided with the distribution.
16 1.1 explorer * 3. Neither the name of Vixie Enterprises nor the names
17 1.1 explorer * of its contributors may be used to endorse or promote products derived
18 1.1 explorer * from this software without specific prior written permission.
19 1.1 explorer *
20 1.1 explorer * THIS SOFTWARE IS PROVIDED BY VIXIE ENTERPRISES AND
21 1.1 explorer * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
22 1.1 explorer * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
23 1.1 explorer * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 1.1 explorer * DISCLAIMED. IN NO EVENT SHALL VIXIE ENTERPRISES OR
25 1.1 explorer * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 1.1 explorer * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 1.1 explorer * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
28 1.1 explorer * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
29 1.1 explorer * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30 1.1 explorer * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31 1.1 explorer * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 1.1 explorer * SUCH DAMAGE.
33 1.1 explorer *
34 1.1 explorer * This software has been written for Vixie Enterprises by Michael Graff
35 1.1 explorer * <explorer (at) flame.org>. To learn more about Vixie Enterprises, see
36 1.1 explorer * ``http://www.vix.com''.
37 1.1 explorer */
38 1.1 explorer
39 1.1 explorer /*
40 1.1 explorer * TODO:
41 1.1 explorer *
42 1.1 explorer * o teach the receive logic about errors, and about long frames that
43 1.1 explorer * span more than one input buffer. (Right now, receive/transmit is
44 1.1 explorer * limited to one descriptor's buffer space, which is MTU + 4 bytes.
45 1.1 explorer * This is currently 1504, which is large enough to hold the HDLC
46 1.1 explorer * header and the packet itself. Packets which are too long are
47 1.1 explorer * silently dropped on transmit and silently dropped on receive.
48 1.1 explorer * o write code to handle the msci interrupts, needed only for CD
49 1.1 explorer * and CTS changes.
50 1.1 explorer * o consider switching back to a "queue tx with DMA active" model which
51 1.1 explorer * should help sustain outgoing traffic
52 1.1 explorer * o through clever use of bus_dma*() functions, it should be possible
53 1.1 explorer * to map the mbuf's data area directly into a descriptor transmit
54 1.1 explorer * buffer, removing the need to allocate extra memory. If, however,
55 1.1 explorer * we run out of descriptors for this, we will need to then allocate
56 1.1 explorer * one large mbuf, copy the fragmented chain into it, and put it onto
57 1.1 explorer * a single descriptor.
58 1.1 explorer * o use bus_dmamap_sync() with the right offset and lengths, rather
59 1.1 explorer * than cheating and always sync'ing the whole region.
60 1.1 explorer */
61 1.1 explorer
62 1.1 explorer #include "bpfilter.h"
63 1.1 explorer
64 1.1 explorer #include <sys/param.h>
65 1.1 explorer #include <sys/systm.h>
66 1.1 explorer #include <sys/device.h>
67 1.1 explorer #include <sys/mbuf.h>
68 1.1 explorer #include <sys/socket.h>
69 1.1 explorer #include <sys/sockio.h>
70 1.1 explorer #include <sys/kernel.h>
71 1.1 explorer
72 1.1 explorer #include <net/if.h>
73 1.1 explorer #include <net/if_types.h>
74 1.1 explorer #include <net/netisr.h>
75 1.1 explorer
76 1.1 explorer #include <netinet/in.h>
77 1.1 explorer #include <netinet/in_systm.h>
78 1.1 explorer #include <netinet/in_var.h>
79 1.1 explorer #include <netinet/ip.h>
80 1.1 explorer
81 1.1 explorer #if NBPFILTER > 0
82 1.1 explorer #include <net/bpf.h>
83 1.1 explorer #endif
84 1.1 explorer
85 1.1 explorer #include <machine/cpu.h>
86 1.1 explorer #include <machine/bus.h>
87 1.1 explorer #include <machine/intr.h>
88 1.1 explorer
89 1.1 explorer #include <dev/pci/pcivar.h>
90 1.1 explorer #include <dev/pci/pcireg.h>
91 1.1 explorer #include <dev/pci/pcidevs.h>
92 1.1 explorer
93 1.1 explorer #include <dev/ic/hd64570reg.h>
94 1.1 explorer #include <dev/ic/hd64570var.h>
95 1.1 explorer
96 1.1 explorer #define SCA_DEBUG_RX 0x0001
97 1.1 explorer #define SCA_DEBUG_TX 0x0002
98 1.1 explorer #define SCA_DEBUG_CISCO 0x0004
99 1.1 explorer #define SCA_DEBUG_DMA 0x0008
100 1.1 explorer #define SCA_DEBUG_RXPKT 0x0010
101 1.1 explorer #define SCA_DEBUG_TXPKT 0x0020
102 1.1 explorer #define SCA_DEBUG_INTR 0x0040
103 1.1 explorer
104 1.1 explorer #if 0
105 1.1 explorer #define SCA_DEBUG_LEVEL ( SCA_DEBUG_TX )
106 1.1 explorer #else
107 1.1 explorer #define SCA_DEBUG_LEVEL 0
108 1.1 explorer #endif
109 1.1 explorer
110 1.1 explorer u_int32_t sca_debug = SCA_DEBUG_LEVEL;
111 1.1 explorer
112 1.1 explorer #if SCA_DEBUG_LEVEL > 0
113 1.1 explorer #define SCA_DPRINTF(l, x) do { \
114 1.1 explorer if ((l) & sca_debug) \
115 1.1 explorer printf x;\
116 1.1 explorer } while (0)
117 1.1 explorer #else
118 1.1 explorer #define SCA_DPRINTF(l, x)
119 1.1 explorer #endif
120 1.1 explorer
121 1.1 explorer #define SCA_MTU 1500 /* hard coded */
122 1.1 explorer
123 1.1 explorer /*
124 1.1 explorer * buffers per tx and rx channels, per port, and the size of each.
125 1.1 explorer * Don't use these constants directly, as they are really only hints.
126 1.1 explorer * Use the calculated values stored in struct sca_softc instead.
127 1.1 explorer *
128 1.1 explorer * Each must be at least 2, receive would be better at around 20 or so.
129 1.1 explorer *
130 1.1 explorer * XXX Due to a damned near impossible to track down bug, transmit buffers
131 1.1 explorer * MUST be 2, no more, no less.
132 1.1 explorer */
133 1.1 explorer #ifndef SCA_NtxBUFS
134 1.1 explorer #define SCA_NtxBUFS 2
135 1.1 explorer #endif
136 1.1 explorer #ifndef SCA_NrxBUFS
137 1.1 explorer #define SCA_NrxBUFS 20
138 1.1 explorer #endif
139 1.1 explorer #ifndef SCA_BSIZE
140 1.1 explorer #define SCA_BSIZE (SCA_MTU + 4) /* room for HDLC as well */
141 1.1 explorer #endif
142 1.1 explorer
143 1.1 explorer #if 0
144 1.1 explorer #define SCA_USE_FASTQ /* use a split queue, one for fast traffic */
145 1.1 explorer #endif
146 1.1 explorer
147 1.1 explorer static inline void sca_write_1(struct sca_softc *, u_int, u_int8_t);
148 1.1 explorer static inline void sca_write_2(struct sca_softc *, u_int, u_int16_t);
149 1.1 explorer static inline u_int8_t sca_read_1(struct sca_softc *, u_int);
150 1.1 explorer static inline u_int16_t sca_read_2(struct sca_softc *, u_int);
151 1.1 explorer
152 1.1 explorer static inline void msci_write_1(sca_port_t *, u_int, u_int8_t);
153 1.1 explorer static inline u_int8_t msci_read_1(sca_port_t *, u_int);
154 1.1 explorer
155 1.1 explorer static inline void dmac_write_1(sca_port_t *, u_int, u_int8_t);
156 1.1 explorer static inline void dmac_write_2(sca_port_t *, u_int, u_int16_t);
157 1.1 explorer static inline u_int8_t dmac_read_1(sca_port_t *, u_int);
158 1.1 explorer static inline u_int16_t dmac_read_2(sca_port_t *, u_int);
159 1.1 explorer
160 1.1 explorer static int sca_alloc_dma(struct sca_softc *);
161 1.1 explorer static void sca_setup_dma_memory(struct sca_softc *);
162 1.1 explorer static void sca_msci_init(struct sca_softc *, sca_port_t *);
163 1.1 explorer static void sca_dmac_init(struct sca_softc *, sca_port_t *);
164 1.1 explorer static void sca_dmac_rxinit(sca_port_t *);
165 1.1 explorer
166 1.1 explorer static int sca_dmac_intr(sca_port_t *, u_int8_t);
167 1.1 explorer static int sca_msci_intr(struct sca_softc *, u_int8_t);
168 1.1 explorer
169 1.1 explorer static void sca_get_packets(sca_port_t *);
170 1.1 explorer static void sca_frame_process(sca_port_t *, sca_desc_t *, u_int8_t *);
171 1.1 explorer static int sca_frame_avail(sca_port_t *, int *);
172 1.1 explorer static void sca_frame_skip(sca_port_t *, int);
173 1.1 explorer
174 1.1 explorer static void sca_port_starttx(sca_port_t *);
175 1.1 explorer
176 1.1 explorer static void sca_port_up(sca_port_t *);
177 1.1 explorer static void sca_port_down(sca_port_t *);
178 1.1 explorer
179 1.1 explorer static int sca_output __P((struct ifnet *, struct mbuf *, struct sockaddr *,
180 1.1 explorer struct rtentry *));
181 1.1 explorer static int sca_ioctl __P((struct ifnet *, u_long, caddr_t));
182 1.1 explorer static void sca_start __P((struct ifnet *));
183 1.1 explorer static void sca_watchdog __P((struct ifnet *));
184 1.1 explorer
185 1.1 explorer static struct mbuf *sca_mbuf_alloc(caddr_t, u_int);
186 1.1 explorer
187 1.1 explorer #if SCA_DEBUG_LEVEL > 0
188 1.1 explorer static void sca_frame_print(sca_port_t *, sca_desc_t *, u_int8_t *);
189 1.1 explorer #endif
190 1.1 explorer
191 1.1 explorer static inline void
192 1.1 explorer sca_write_1(struct sca_softc *sc, u_int reg, u_int8_t val)
193 1.1 explorer {
194 1.1 explorer bus_space_write_1(sc->sc_iot, sc->sc_ioh, SCADDR(reg), val);
195 1.1 explorer }
196 1.1 explorer
197 1.1 explorer static inline void
198 1.1 explorer sca_write_2(struct sca_softc *sc, u_int reg, u_int16_t val)
199 1.1 explorer {
200 1.1 explorer bus_space_write_2(sc->sc_iot, sc->sc_ioh, SCADDR(reg), val);
201 1.1 explorer }
202 1.1 explorer
203 1.1 explorer static inline u_int8_t
204 1.1 explorer sca_read_1(struct sca_softc *sc, u_int reg)
205 1.1 explorer {
206 1.1 explorer return bus_space_read_1(sc->sc_iot, sc->sc_ioh, SCADDR(reg));
207 1.1 explorer }
208 1.1 explorer
209 1.1 explorer static inline u_int16_t
210 1.1 explorer sca_read_2(struct sca_softc *sc, u_int reg)
211 1.1 explorer {
212 1.1 explorer return bus_space_read_2(sc->sc_iot, sc->sc_ioh, SCADDR(reg));
213 1.1 explorer }
214 1.1 explorer
215 1.1 explorer static inline void
216 1.1 explorer msci_write_1(sca_port_t *scp, u_int reg, u_int8_t val)
217 1.1 explorer {
218 1.1 explorer sca_write_1(scp->sca, scp->msci_off + reg, val);
219 1.1 explorer }
220 1.1 explorer
221 1.1 explorer static inline u_int8_t
222 1.1 explorer msci_read_1(sca_port_t *scp, u_int reg)
223 1.1 explorer {
224 1.1 explorer return sca_read_1(scp->sca, scp->msci_off + reg);
225 1.1 explorer }
226 1.1 explorer
227 1.1 explorer static inline void
228 1.1 explorer dmac_write_1(sca_port_t *scp, u_int reg, u_int8_t val)
229 1.1 explorer {
230 1.1 explorer sca_write_1(scp->sca, scp->dmac_off + reg, val);
231 1.1 explorer }
232 1.1 explorer
233 1.1 explorer static inline void
234 1.1 explorer dmac_write_2(sca_port_t *scp, u_int reg, u_int16_t val)
235 1.1 explorer {
236 1.1 explorer sca_write_2(scp->sca, scp->dmac_off + reg, val);
237 1.1 explorer }
238 1.1 explorer
239 1.1 explorer static inline u_int8_t
240 1.1 explorer dmac_read_1(sca_port_t *scp, u_int reg)
241 1.1 explorer {
242 1.1 explorer return sca_read_1(scp->sca, scp->dmac_off + reg);
243 1.1 explorer }
244 1.1 explorer
245 1.1 explorer static inline u_int16_t
246 1.1 explorer dmac_read_2(sca_port_t *scp, u_int reg)
247 1.1 explorer {
248 1.1 explorer return sca_read_2(scp->sca, scp->dmac_off + reg);
249 1.1 explorer }
250 1.1 explorer
251 1.1 explorer int
252 1.1 explorer sca_init(struct sca_softc *sc, u_int nports)
253 1.1 explorer {
254 1.1 explorer /*
255 1.1 explorer * Do a little sanity check: check number of ports.
256 1.1 explorer */
257 1.1 explorer if (nports < 1 || nports > 2)
258 1.1 explorer return 1;
259 1.1 explorer
260 1.1 explorer /*
261 1.1 explorer * remember the details
262 1.1 explorer */
263 1.1 explorer sc->sc_numports = nports;
264 1.1 explorer
265 1.1 explorer /*
266 1.1 explorer * allocate the memory and chop it into bits.
267 1.1 explorer */
268 1.1 explorer if (sca_alloc_dma(sc) != 0)
269 1.1 explorer return 1;
270 1.1 explorer sca_setup_dma_memory(sc);
271 1.1 explorer
272 1.1 explorer /*
273 1.1 explorer * disable DMA and MSCI interrupts
274 1.1 explorer */
275 1.1 explorer sca_write_1(sc, SCA_DMER, 0);
276 1.1 explorer sca_write_1(sc, SCA_IER0, 0);
277 1.1 explorer sca_write_1(sc, SCA_IER1, 0);
278 1.1 explorer sca_write_1(sc, SCA_IER2, 0);
279 1.1 explorer
280 1.1 explorer /*
281 1.1 explorer * configure interrupt system
282 1.1 explorer */
283 1.1 explorer sca_write_1(sc, SCA_ITCR, 0); /* use ivr, no int ack */
284 1.1 explorer sca_write_1(sc, SCA_IVR, 0x40);
285 1.1 explorer sca_write_1(sc, SCA_IMVR, 0x40);
286 1.1 explorer
287 1.1 explorer /*
288 1.1 explorer * set wait control register to zero wait states
289 1.1 explorer */
290 1.1 explorer sca_write_1(sc, SCA_PABR0, 0);
291 1.1 explorer sca_write_1(sc, SCA_PABR1, 0);
292 1.1 explorer sca_write_1(sc, SCA_WCRL, 0);
293 1.1 explorer sca_write_1(sc, SCA_WCRM, 0);
294 1.1 explorer sca_write_1(sc, SCA_WCRH, 0);
295 1.1 explorer
296 1.1 explorer /*
297 1.1 explorer * disable DMA and reset status
298 1.1 explorer */
299 1.1 explorer sca_write_1(sc, SCA_PCR, SCA_PCR_PR2);
300 1.1 explorer
301 1.1 explorer /*
302 1.1 explorer * disable transmit DMA for all channels
303 1.1 explorer */
304 1.1 explorer sca_write_1(sc, SCA_DSR0 + SCA_DMAC_OFF_0, 0);
305 1.1 explorer sca_write_1(sc, SCA_DCR0 + SCA_DMAC_OFF_0, SCA_DCR_ABRT);
306 1.1 explorer sca_write_1(sc, SCA_DSR1 + SCA_DMAC_OFF_0, 0);
307 1.1 explorer sca_write_1(sc, SCA_DCR1 + SCA_DMAC_OFF_0, SCA_DCR_ABRT);
308 1.1 explorer sca_write_1(sc, SCA_DSR0 + SCA_DMAC_OFF_1, 0);
309 1.1 explorer sca_write_1(sc, SCA_DCR0 + SCA_DMAC_OFF_1, SCA_DCR_ABRT);
310 1.1 explorer sca_write_1(sc, SCA_DSR1 + SCA_DMAC_OFF_1, 0);
311 1.1 explorer sca_write_1(sc, SCA_DCR1 + SCA_DMAC_OFF_1, SCA_DCR_ABRT);
312 1.1 explorer
313 1.1 explorer /*
314 1.1 explorer * enable DMA based on channel enable flags for each channel
315 1.1 explorer */
316 1.1 explorer sca_write_1(sc, SCA_DMER, SCA_DMER_EN);
317 1.1 explorer
318 1.1 explorer /*
319 1.1 explorer * Should check to see if the chip is responding, but for now
320 1.1 explorer * assume it is.
321 1.1 explorer */
322 1.1 explorer return 0;
323 1.1 explorer }
324 1.1 explorer
325 1.1 explorer /*
326 1.1 explorer * initialize the port and attach it to the networking layer
327 1.1 explorer */
328 1.1 explorer void
329 1.1 explorer sca_port_attach(struct sca_softc *sc, u_int port)
330 1.1 explorer {
331 1.1 explorer sca_port_t *scp = &sc->sc_ports[port];
332 1.1 explorer struct ifnet *ifp;
333 1.1 explorer static u_int ntwo_unit = 0;
334 1.1 explorer
335 1.1 explorer scp->sca = sc; /* point back to the parent */
336 1.1 explorer
337 1.1 explorer scp->sp_port = port;
338 1.1 explorer
339 1.1 explorer if (port == 0) {
340 1.1 explorer scp->msci_off = SCA_MSCI_OFF_0;
341 1.1 explorer scp->dmac_off = SCA_DMAC_OFF_0;
342 1.1 explorer } else {
343 1.1 explorer scp->msci_off = SCA_MSCI_OFF_1;
344 1.1 explorer scp->dmac_off = SCA_DMAC_OFF_1;
345 1.1 explorer }
346 1.1 explorer
347 1.1 explorer sca_msci_init(sc, scp);
348 1.1 explorer sca_dmac_init(sc, scp);
349 1.1 explorer
350 1.1 explorer /*
351 1.1 explorer * attach to the network layer
352 1.1 explorer */
353 1.1 explorer ifp = &scp->sp_if;
354 1.1 explorer sprintf(ifp->if_xname, "ntwo%d", ntwo_unit);
355 1.1 explorer ifp->if_softc = scp;
356 1.1 explorer ifp->if_mtu = SCA_MTU;
357 1.1 explorer ifp->if_flags = IFF_POINTOPOINT | IFF_MULTICAST;
358 1.1 explorer ifp->if_type = IFT_OTHER; /* Should be HDLC, but... */
359 1.1 explorer ifp->if_hdrlen = HDLC_HDRLEN;
360 1.1 explorer ifp->if_ioctl = sca_ioctl;
361 1.1 explorer ifp->if_output = sca_output;
362 1.1 explorer ifp->if_watchdog = sca_watchdog;
363 1.1 explorer ifp->if_snd.ifq_maxlen = IFQ_MAXLEN;
364 1.1 explorer scp->linkq.ifq_maxlen = 5; /* if we exceed this we are hosed already */
365 1.1 explorer #ifdef SCA_USE_FASTQ
366 1.1 explorer scp->fastq.ifq_maxlen = IFQ_MAXLEN;
367 1.1 explorer #endif
368 1.1 explorer if_attach(ifp);
369 1.1 explorer
370 1.1 explorer #if NBPFILTER > 0
371 1.1 explorer bpfattach(&scp->sp_bpf, ifp, DLT_HDLC, HDLC_HDRLEN);
372 1.1 explorer #endif
373 1.1 explorer
374 1.1 explorer if (sc->parent == NULL)
375 1.1 explorer printf("%s: port %d\n", ifp->if_xname, port);
376 1.1 explorer else
377 1.1 explorer printf("%s at %s port %d\n",
378 1.1 explorer ifp->if_xname, sc->parent->dv_xname, port);
379 1.1 explorer
380 1.1 explorer /*
381 1.1 explorer * reset the last seen times on the cisco keepalive protocol
382 1.1 explorer */
383 1.1 explorer scp->cka_lasttx = time.tv_usec;
384 1.1 explorer scp->cka_lastrx = 0;
385 1.1 explorer }
386 1.1 explorer
387 1.1 explorer /*
388 1.1 explorer * initialize the port's MSCI
389 1.1 explorer */
390 1.1 explorer static void
391 1.1 explorer sca_msci_init(struct sca_softc *sc, sca_port_t *scp)
392 1.1 explorer {
393 1.1 explorer msci_write_1(scp, SCA_CMD0, SCA_CMD_RESET);
394 1.1 explorer msci_write_1(scp, SCA_MD00,
395 1.1 explorer ( SCA_MD0_CRC_1
396 1.1 explorer | SCA_MD0_CRC_CCITT
397 1.1 explorer | SCA_MD0_CRC_ENABLE
398 1.1 explorer | SCA_MD0_MODE_HDLC));
399 1.1 explorer msci_write_1(scp, SCA_MD10, SCA_MD1_NOADDRCHK);
400 1.1 explorer msci_write_1(scp, SCA_MD20,
401 1.1 explorer (SCA_MD2_DUPLEX | SCA_MD2_NRZ));
402 1.1 explorer
403 1.1 explorer /*
404 1.1 explorer * reset the port (and lower RTS)
405 1.1 explorer */
406 1.1 explorer msci_write_1(scp, SCA_CMD0, SCA_CMD_RXRESET);
407 1.1 explorer msci_write_1(scp, SCA_CTL0,
408 1.1 explorer (SCA_CTL_IDLPAT | SCA_CTL_UDRNC | SCA_CTL_RTS));
409 1.1 explorer msci_write_1(scp, SCA_CMD0, SCA_CMD_TXRESET);
410 1.1 explorer
411 1.1 explorer /*
412 1.1 explorer * select the RX clock as the TX clock, and set for external
413 1.1 explorer * clock source.
414 1.1 explorer */
415 1.1 explorer msci_write_1(scp, SCA_RXS0, 0);
416 1.1 explorer msci_write_1(scp, SCA_TXS0, 0);
417 1.1 explorer
418 1.1 explorer /*
419 1.1 explorer * XXX don't pay attention to CTS or CD changes right now. I can't
420 1.1 explorer * simulate one, and the transmitter will try to transmit even if
421 1.1 explorer * CD isn't there anyway, so nothing bad SHOULD happen.
422 1.1 explorer */
423 1.1 explorer msci_write_1(scp, SCA_IE00, 0);
424 1.1 explorer msci_write_1(scp, SCA_IE10, 0); /* 0x0c == CD and CTS changes only */
425 1.1 explorer msci_write_1(scp, SCA_IE20, 0);
426 1.1 explorer msci_write_1(scp, SCA_FIE0, 0);
427 1.1 explorer
428 1.1 explorer msci_write_1(scp, SCA_SA00, 0);
429 1.1 explorer msci_write_1(scp, SCA_SA10, 0);
430 1.1 explorer
431 1.1 explorer msci_write_1(scp, SCA_IDL0, 0x7e);
432 1.1 explorer
433 1.1 explorer msci_write_1(scp, SCA_RRC0, 0x0e);
434 1.1 explorer msci_write_1(scp, SCA_TRC00, 0x10);
435 1.1 explorer msci_write_1(scp, SCA_TRC10, 0x1f);
436 1.1 explorer }
437 1.1 explorer
438 1.1 explorer /*
439 1.1 explorer * Take the memory for the port and construct two circular linked lists of
440 1.1 explorer * descriptors (one tx, one rx) and set the pointers in these descriptors
441 1.1 explorer * to point to the buffer space for this port.
442 1.1 explorer */
443 1.1 explorer static void
444 1.1 explorer sca_dmac_init(struct sca_softc *sc, sca_port_t *scp)
445 1.1 explorer {
446 1.1 explorer sca_desc_t *desc;
447 1.1 explorer u_int32_t desc_p;
448 1.1 explorer u_int32_t buf_p;
449 1.1 explorer int i;
450 1.1 explorer
451 1.1 explorer bus_dmamap_sync(sc->sc_dmat, sc->sc_dmam,
452 1.1 explorer 0, sc->sc_allocsize, BUS_DMASYNC_PREWRITE);
453 1.1 explorer
454 1.1 explorer desc = scp->txdesc;
455 1.1 explorer desc_p = scp->txdesc_p;
456 1.1 explorer buf_p = scp->txbuf_p;
457 1.1 explorer scp->txcur = 0;
458 1.1 explorer scp->txinuse = 0;
459 1.1 explorer
460 1.1 explorer for (i = 0 ; i < SCA_NtxBUFS ; i++) {
461 1.1 explorer /*
462 1.1 explorer * desc_p points to the physcial address of the NEXT desc
463 1.1 explorer */
464 1.1 explorer desc_p += sizeof(sca_desc_t);
465 1.1 explorer
466 1.1 explorer desc->cp = desc_p & 0x0000ffff;
467 1.1 explorer desc->bp = buf_p & 0x0000ffff;
468 1.1 explorer desc->bpb = (buf_p & 0x00ff0000) >> 16;
469 1.1 explorer desc->len = SCA_BSIZE;
470 1.1 explorer desc->stat = 0;
471 1.1 explorer
472 1.1 explorer desc++; /* point to the next descriptor */
473 1.1 explorer buf_p += SCA_BSIZE;
474 1.1 explorer }
475 1.1 explorer
476 1.1 explorer /*
477 1.1 explorer * "heal" the circular list by making the last entry point to the
478 1.1 explorer * first.
479 1.1 explorer */
480 1.1 explorer desc--;
481 1.1 explorer desc->cp = scp->txdesc_p & 0x0000ffff;
482 1.1 explorer
483 1.1 explorer /*
484 1.1 explorer * Now, initialize the transmit DMA logic
485 1.1 explorer *
486 1.1 explorer * CPB == chain pointer base address
487 1.1 explorer */
488 1.1 explorer dmac_write_1(scp, SCA_DSR1, 0);
489 1.1 explorer dmac_write_1(scp, SCA_DCR1, SCA_DCR_ABRT);
490 1.1 explorer dmac_write_1(scp, SCA_DMR1, SCA_DMR_TMOD | SCA_DMR_NF);
491 1.1 explorer dmac_write_1(scp, SCA_DIR1,
492 1.1 explorer (SCA_DIR_EOT | SCA_DIR_BOF | SCA_DIR_COF));
493 1.1 explorer dmac_write_1(scp, SCA_CPB1,
494 1.1 explorer (u_int8_t)((scp->txdesc_p & 0x00ff0000) >> 16));
495 1.1 explorer
496 1.1 explorer /*
497 1.1 explorer * now, do the same thing for receive descriptors
498 1.1 explorer */
499 1.1 explorer desc = scp->rxdesc;
500 1.1 explorer desc_p = scp->rxdesc_p;
501 1.1 explorer buf_p = scp->rxbuf_p;
502 1.1 explorer scp->rxstart = 0;
503 1.1 explorer scp->rxend = SCA_NrxBUFS - 1;
504 1.1 explorer
505 1.1 explorer for (i = 0 ; i < SCA_NrxBUFS ; i++) {
506 1.1 explorer /*
507 1.1 explorer * desc_p points to the physcial address of the NEXT desc
508 1.1 explorer */
509 1.1 explorer desc_p += sizeof(sca_desc_t);
510 1.1 explorer
511 1.1 explorer desc->cp = desc_p & 0x0000ffff;
512 1.1 explorer desc->bp = buf_p & 0x0000ffff;
513 1.1 explorer desc->bpb = (buf_p & 0x00ff0000) >> 16;
514 1.1 explorer desc->len = SCA_BSIZE;
515 1.1 explorer desc->stat = 0x00;
516 1.1 explorer
517 1.1 explorer desc++; /* point to the next descriptor */
518 1.1 explorer buf_p += SCA_BSIZE;
519 1.1 explorer }
520 1.1 explorer
521 1.1 explorer /*
522 1.1 explorer * "heal" the circular list by making the last entry point to the
523 1.1 explorer * first.
524 1.1 explorer */
525 1.1 explorer desc--;
526 1.1 explorer desc->cp = scp->rxdesc_p & 0x0000ffff;
527 1.1 explorer
528 1.1 explorer sca_dmac_rxinit(scp);
529 1.1 explorer
530 1.1 explorer bus_dmamap_sync(sc->sc_dmat, sc->sc_dmam,
531 1.1 explorer 0, sc->sc_allocsize, BUS_DMASYNC_POSTWRITE);
532 1.1 explorer }
533 1.1 explorer
534 1.1 explorer /*
535 1.1 explorer * reset and reinitialize the receive DMA logic
536 1.1 explorer */
537 1.1 explorer static void
538 1.1 explorer sca_dmac_rxinit(sca_port_t *scp)
539 1.1 explorer {
540 1.1 explorer /*
541 1.1 explorer * ... and the receive DMA logic ...
542 1.1 explorer */
543 1.1 explorer dmac_write_1(scp, SCA_DSR0, 0); /* disable DMA */
544 1.1 explorer dmac_write_1(scp, SCA_DCR0, SCA_DCR_ABRT);
545 1.1 explorer
546 1.1 explorer dmac_write_1(scp, SCA_DMR0, SCA_DMR_TMOD | SCA_DMR_NF);
547 1.1 explorer dmac_write_2(scp, SCA_BFLL0, SCA_BSIZE);
548 1.1 explorer
549 1.1 explorer /*
550 1.1 explorer * CPB == chain pointer base
551 1.1 explorer * CDA == current descriptor address
552 1.1 explorer * EDA == error descriptor address (overwrite position)
553 1.1 explorer */
554 1.1 explorer dmac_write_1(scp, SCA_CPB0,
555 1.1 explorer (u_int8_t)((scp->rxdesc_p & 0x00ff0000) >> 16));
556 1.1 explorer dmac_write_2(scp, SCA_CDAL0,
557 1.1 explorer (u_int16_t)(scp->rxdesc_p & 0xffff));
558 1.1 explorer dmac_write_2(scp, SCA_EDAL0,
559 1.1 explorer (u_int16_t)(scp->rxdesc_p
560 1.1 explorer + sizeof(sca_desc_t) * SCA_NrxBUFS));
561 1.1 explorer
562 1.1 explorer /*
563 1.1 explorer * enable receiver DMA
564 1.1 explorer */
565 1.1 explorer dmac_write_1(scp, SCA_DIR0,
566 1.1 explorer (SCA_DIR_EOT | SCA_DIR_EOM | SCA_DIR_BOF | SCA_DIR_COF));
567 1.1 explorer dmac_write_1(scp, SCA_DSR0, SCA_DSR_DE);
568 1.1 explorer }
569 1.1 explorer
570 1.1 explorer static int
571 1.1 explorer sca_alloc_dma(struct sca_softc *sc)
572 1.1 explorer {
573 1.1 explorer u_int allocsize;
574 1.1 explorer int err;
575 1.1 explorer int rsegs;
576 1.1 explorer u_int bpp;
577 1.1 explorer
578 1.1 explorer SCA_DPRINTF(SCA_DEBUG_DMA,
579 1.1 explorer ("sizeof sca_desc_t: %d bytes\n", sizeof (sca_desc_t)));
580 1.1 explorer
581 1.1 explorer bpp = sc->sc_numports * (SCA_NtxBUFS + SCA_NrxBUFS);
582 1.1 explorer
583 1.1 explorer allocsize = bpp * (SCA_BSIZE + sizeof (sca_desc_t));
584 1.1 explorer
585 1.1 explorer /*
586 1.1 explorer * sanity checks:
587 1.1 explorer *
588 1.1 explorer * Check the total size of the data buffers, and so on. The total
589 1.1 explorer * DMAable space needs to fit within a single 16M region, and the
590 1.1 explorer * descriptors need to fit within a 64K region.
591 1.1 explorer */
592 1.1 explorer if (allocsize > 16 * 1024 * 1024)
593 1.1 explorer return 1;
594 1.1 explorer if (bpp * sizeof (sca_desc_t) > 64 * 1024)
595 1.1 explorer return 1;
596 1.1 explorer
597 1.1 explorer sc->sc_allocsize = allocsize;
598 1.1 explorer
599 1.1 explorer /*
600 1.1 explorer * Allocate one huge chunk of memory.
601 1.1 explorer */
602 1.1 explorer if (bus_dmamem_alloc(sc->sc_dmat,
603 1.1 explorer allocsize,
604 1.1 explorer SCA_DMA_ALIGNMENT,
605 1.1 explorer SCA_DMA_BOUNDRY,
606 1.1 explorer &sc->sc_seg, 1, &rsegs, BUS_DMA_NOWAIT) != 0) {
607 1.1 explorer printf("Could not allocate DMA memory\n");
608 1.1 explorer return 1;
609 1.1 explorer }
610 1.1 explorer SCA_DPRINTF(SCA_DEBUG_DMA,
611 1.1 explorer ("DMA memory allocated: %d bytes\n", allocsize));
612 1.1 explorer
613 1.1 explorer if (bus_dmamem_map(sc->sc_dmat, &sc->sc_seg, 1, allocsize,
614 1.1 explorer &sc->sc_dma_addr, BUS_DMA_NOWAIT) != 0) {
615 1.1 explorer printf("Could not map DMA memory into kernel space\n");
616 1.1 explorer return 1;
617 1.1 explorer }
618 1.1 explorer SCA_DPRINTF(SCA_DEBUG_DMA, ("DMA memory mapped\n"));
619 1.1 explorer
620 1.1 explorer if (bus_dmamap_create(sc->sc_dmat, allocsize, 2,
621 1.1 explorer allocsize, SCA_DMA_BOUNDRY,
622 1.1 explorer BUS_DMA_NOWAIT, &sc->sc_dmam) != 0) {
623 1.1 explorer printf("Could not create DMA map\n");
624 1.1 explorer return 1;
625 1.1 explorer }
626 1.1 explorer SCA_DPRINTF(SCA_DEBUG_DMA, ("DMA map created\n"));
627 1.1 explorer
628 1.1 explorer err = bus_dmamap_load(sc->sc_dmat, sc->sc_dmam, sc->sc_dma_addr,
629 1.1 explorer allocsize, NULL, BUS_DMA_NOWAIT);
630 1.1 explorer if (err != 0) {
631 1.1 explorer printf("Could not load DMA segment: %d\n", err);
632 1.1 explorer return 1;
633 1.1 explorer }
634 1.1 explorer SCA_DPRINTF(SCA_DEBUG_DMA, ("DMA map loaded\n"));
635 1.1 explorer
636 1.1 explorer return 0;
637 1.1 explorer }
638 1.1 explorer
639 1.1 explorer /*
640 1.1 explorer * Take the memory allocated with sca_alloc_dma() and divide it among the
641 1.1 explorer * two ports.
642 1.1 explorer */
643 1.1 explorer static void
644 1.1 explorer sca_setup_dma_memory(struct sca_softc *sc)
645 1.1 explorer {
646 1.1 explorer sca_port_t *scp0, *scp1;
647 1.1 explorer u_int8_t *vaddr0;
648 1.1 explorer u_int32_t paddr0;
649 1.1 explorer u_long addroff;
650 1.1 explorer
651 1.1 explorer /*
652 1.1 explorer * remember the physical address to 24 bits only, since the upper
653 1.1 explorer * 8 bits is programed into the device at a different layer.
654 1.1 explorer */
655 1.1 explorer paddr0 = (sc->sc_dmam->dm_segs[0].ds_addr & 0x00ffffff);
656 1.1 explorer vaddr0 = sc->sc_dma_addr;
657 1.1 explorer
658 1.1 explorer /*
659 1.1 explorer * if we have only one port it gets the full range. If we have
660 1.1 explorer * two we need to do a little magic to divide things up.
661 1.1 explorer *
662 1.1 explorer * The descriptors will all end up in the front of the area, while
663 1.1 explorer * the remainder of the buffer is used for transmit and receive
664 1.1 explorer * data.
665 1.1 explorer *
666 1.1 explorer * -------------------- start of memory
667 1.1 explorer * tx desc port 0
668 1.1 explorer * rx desc port 0
669 1.1 explorer * tx desc port 1
670 1.1 explorer * rx desc port 1
671 1.1 explorer * tx buffer port 0
672 1.1 explorer * rx buffer port 0
673 1.1 explorer * tx buffer port 1
674 1.1 explorer * rx buffer port 1
675 1.1 explorer * -------------------- end of memory
676 1.1 explorer */
677 1.1 explorer scp0 = &sc->sc_ports[0];
678 1.1 explorer scp1 = &sc->sc_ports[1];
679 1.1 explorer
680 1.1 explorer scp0->txdesc_p = paddr0;
681 1.1 explorer scp0->txdesc = (sca_desc_t *)vaddr0;
682 1.1 explorer addroff = sizeof(sca_desc_t) * SCA_NtxBUFS;
683 1.1 explorer
684 1.1 explorer /*
685 1.1 explorer * point to the range following the tx descriptors, and
686 1.1 explorer * set the rx descriptors there.
687 1.1 explorer */
688 1.1 explorer scp0->rxdesc_p = paddr0 + addroff;
689 1.1 explorer scp0->rxdesc = (sca_desc_t *)(vaddr0 + addroff);
690 1.1 explorer addroff += sizeof(sca_desc_t) * SCA_NrxBUFS;
691 1.1 explorer
692 1.1 explorer if (sc->sc_numports == 2) {
693 1.1 explorer scp1->txdesc_p = paddr0 + addroff;
694 1.1 explorer scp1->txdesc = (sca_desc_t *)(vaddr0 + addroff);
695 1.1 explorer addroff += sizeof(sca_desc_t) * SCA_NtxBUFS;
696 1.1 explorer
697 1.1 explorer scp1->rxdesc_p = paddr0 + addroff;
698 1.1 explorer scp1->rxdesc = (sca_desc_t *)(vaddr0 + addroff);
699 1.1 explorer addroff += sizeof(sca_desc_t) * SCA_NrxBUFS;
700 1.1 explorer }
701 1.1 explorer
702 1.1 explorer /*
703 1.1 explorer * point to the memory following the descriptors, and set the
704 1.1 explorer * transmit buffer there.
705 1.1 explorer */
706 1.1 explorer scp0->txbuf_p = paddr0 + addroff;
707 1.1 explorer scp0->txbuf = vaddr0 + addroff;
708 1.1 explorer addroff += SCA_BSIZE * SCA_NtxBUFS;
709 1.1 explorer
710 1.1 explorer /*
711 1.1 explorer * lastly, skip over the transmit buffer and set up pointers into
712 1.1 explorer * the receive buffer.
713 1.1 explorer */
714 1.1 explorer scp0->rxbuf_p = paddr0 + addroff;
715 1.1 explorer scp0->rxbuf = vaddr0 + addroff;
716 1.1 explorer addroff += SCA_BSIZE * SCA_NrxBUFS;
717 1.1 explorer
718 1.1 explorer if (sc->sc_numports == 2) {
719 1.1 explorer scp1->txbuf_p = paddr0 + addroff;
720 1.1 explorer scp1->txbuf = vaddr0 + addroff;
721 1.1 explorer addroff += SCA_BSIZE * SCA_NtxBUFS;
722 1.1 explorer
723 1.1 explorer scp1->rxbuf_p = paddr0 + addroff;
724 1.1 explorer scp1->rxbuf = vaddr0 + addroff;
725 1.1 explorer addroff += SCA_BSIZE * SCA_NrxBUFS;
726 1.1 explorer }
727 1.1 explorer
728 1.1 explorer /*
729 1.1 explorer * as a consistancy check, addroff should be equal to the allocation
730 1.1 explorer * size.
731 1.1 explorer */
732 1.1 explorer if (sc->sc_allocsize != addroff)
733 1.1 explorer printf("ERROR: sc_allocsize != addroff: %lu != %lu\n",
734 1.1 explorer sc->sc_allocsize, addroff);
735 1.1 explorer }
736 1.1 explorer
737 1.1 explorer /*
738 1.1 explorer * Queue the packet for our start routine to transmit
739 1.1 explorer */
740 1.1 explorer static int
741 1.1 explorer sca_output(ifp, m, dst, rt0)
742 1.1 explorer struct ifnet *ifp;
743 1.1 explorer struct mbuf *m;
744 1.1 explorer struct sockaddr *dst;
745 1.1 explorer struct rtentry *rt0;
746 1.1 explorer {
747 1.1 explorer int error;
748 1.1 explorer int s;
749 1.1 explorer u_int16_t protocol;
750 1.1 explorer hdlc_header_t *hdlc;
751 1.1 explorer struct ifqueue *ifq;
752 1.1 explorer #ifdef SCA_USE_FASTQ
753 1.1 explorer struct ip *ip;
754 1.1 explorer sca_port_t *scp = ifp->if_softc;
755 1.1 explorer int highpri;
756 1.1 explorer #endif
757 1.1 explorer
758 1.1 explorer error = 0;
759 1.1 explorer ifp->if_lastchange = time;
760 1.1 explorer
761 1.1 explorer if ((ifp->if_flags & IFF_UP) != IFF_UP) {
762 1.1 explorer error = ENETDOWN;
763 1.1 explorer goto bad;
764 1.1 explorer }
765 1.1 explorer
766 1.1 explorer if (dst->sa_family != AF_INET) {
767 1.1 explorer error = EAFNOSUPPORT;
768 1.1 explorer goto bad;
769 1.1 explorer }
770 1.1 explorer
771 1.1 explorer #ifdef SCA_USE_FASTQ
772 1.1 explorer highpri = 0;
773 1.1 explorer #endif
774 1.1 explorer
775 1.1 explorer /*
776 1.1 explorer * determine address family, and priority for this packet
777 1.1 explorer */
778 1.1 explorer switch (dst->sa_family) {
779 1.1 explorer case AF_INET:
780 1.1 explorer protocol = HDLC_PROTOCOL_IP;
781 1.1 explorer
782 1.1 explorer #ifdef SCA_USE_FASTQ
783 1.1 explorer ip = mtod(m, struct ip *);
784 1.1 explorer if ((ip->ip_tos & IPTOS_LOWDELAY) == IPTOS_LOWDELAY)
785 1.1 explorer highpri = 1;
786 1.1 explorer #endif
787 1.1 explorer break;
788 1.1 explorer
789 1.1 explorer default:
790 1.1 explorer printf("%s: address family %d unsupported\n",
791 1.1 explorer ifp->if_xname, dst->sa_family);
792 1.1 explorer error = EAFNOSUPPORT;
793 1.1 explorer goto bad;
794 1.1 explorer }
795 1.1 explorer
796 1.1 explorer if (M_LEADINGSPACE(m) < HDLC_HDRLEN) {
797 1.1 explorer m = m_prepend(m, HDLC_HDRLEN, M_DONTWAIT);
798 1.1 explorer if (m == NULL) {
799 1.1 explorer error = ENOBUFS;
800 1.1 explorer goto bad;
801 1.1 explorer }
802 1.1 explorer m->m_len = 0;
803 1.1 explorer } else {
804 1.1 explorer m->m_data -= HDLC_HDRLEN;
805 1.1 explorer }
806 1.1 explorer
807 1.1 explorer hdlc = mtod(m, hdlc_header_t *);
808 1.1 explorer if ((m->m_flags & (M_BCAST | M_MCAST)) != 0)
809 1.1 explorer hdlc->addr = CISCO_MULTICAST;
810 1.1 explorer else
811 1.1 explorer hdlc->addr = CISCO_UNICAST;
812 1.1 explorer hdlc->control = 0;
813 1.1 explorer hdlc->protocol = htons(protocol);
814 1.1 explorer m->m_len += HDLC_HDRLEN;
815 1.1 explorer
816 1.1 explorer /*
817 1.1 explorer * queue the packet. If interactive, use the fast queue.
818 1.1 explorer */
819 1.2 mycroft s = splnet();
820 1.1 explorer #ifdef SCA_USE_FASTQ
821 1.1 explorer ifq = (highpri == 1 ? &scp->fastq : &ifp->if_snd);
822 1.1 explorer #else
823 1.1 explorer ifq = &ifp->if_snd;
824 1.1 explorer #endif
825 1.1 explorer if (IF_QFULL(ifq)) {
826 1.1 explorer IF_DROP(ifq);
827 1.1 explorer ifp->if_oerrors++;
828 1.1 explorer ifp->if_collisions++;
829 1.1 explorer error = ENOBUFS;
830 1.1 explorer splx(s);
831 1.1 explorer goto bad;
832 1.1 explorer }
833 1.1 explorer ifp->if_obytes += m->m_pkthdr.len;
834 1.1 explorer IF_ENQUEUE(ifq, m);
835 1.1 explorer
836 1.1 explorer ifp->if_lastchange = time;
837 1.1 explorer
838 1.1 explorer if (m->m_flags & M_MCAST)
839 1.1 explorer ifp->if_omcasts++;
840 1.1 explorer
841 1.1 explorer sca_start(ifp);
842 1.1 explorer splx(s);
843 1.1 explorer
844 1.1 explorer return (error);
845 1.1 explorer
846 1.1 explorer bad:
847 1.1 explorer if (m)
848 1.1 explorer m_freem(m);
849 1.1 explorer return (error);
850 1.1 explorer }
851 1.1 explorer
852 1.1 explorer static int
853 1.1 explorer sca_ioctl(ifp, cmd, addr)
854 1.1 explorer struct ifnet *ifp;
855 1.1 explorer u_long cmd;
856 1.1 explorer caddr_t addr;
857 1.1 explorer {
858 1.1 explorer struct ifreq *ifr;
859 1.1 explorer struct ifaddr *ifa;
860 1.1 explorer int error;
861 1.1 explorer int s;
862 1.1 explorer
863 1.2 mycroft s = splnet();
864 1.1 explorer
865 1.1 explorer ifr = (struct ifreq *)addr;
866 1.1 explorer ifa = (struct ifaddr *)addr;
867 1.1 explorer error = 0;
868 1.1 explorer
869 1.1 explorer switch (cmd) {
870 1.1 explorer case SIOCSIFADDR:
871 1.1 explorer if (ifa->ifa_addr->sa_family == AF_INET)
872 1.1 explorer sca_port_up(ifp->if_softc);
873 1.1 explorer else
874 1.1 explorer error = EAFNOSUPPORT;
875 1.1 explorer break;
876 1.1 explorer
877 1.1 explorer case SIOCSIFDSTADDR:
878 1.1 explorer if (ifa->ifa_addr->sa_family != AF_INET)
879 1.1 explorer error = EAFNOSUPPORT;
880 1.1 explorer break;
881 1.1 explorer
882 1.1 explorer case SIOCADDMULTI:
883 1.1 explorer case SIOCDELMULTI:
884 1.1 explorer if (ifr == 0) {
885 1.1 explorer error = EAFNOSUPPORT; /* XXX */
886 1.1 explorer break;
887 1.1 explorer }
888 1.1 explorer switch (ifr->ifr_addr.sa_family) {
889 1.1 explorer
890 1.1 explorer #ifdef INET
891 1.1 explorer case AF_INET:
892 1.1 explorer break;
893 1.1 explorer #endif
894 1.1 explorer
895 1.1 explorer default:
896 1.1 explorer error = EAFNOSUPPORT;
897 1.1 explorer break;
898 1.1 explorer }
899 1.1 explorer break;
900 1.1 explorer
901 1.1 explorer case SIOCSIFFLAGS:
902 1.1 explorer if (ifr->ifr_flags & IFF_UP)
903 1.1 explorer sca_port_up(ifp->if_softc);
904 1.1 explorer else
905 1.1 explorer sca_port_down(ifp->if_softc);
906 1.1 explorer
907 1.1 explorer break;
908 1.1 explorer
909 1.1 explorer default:
910 1.1 explorer error = EINVAL;
911 1.1 explorer }
912 1.1 explorer
913 1.1 explorer splx(s);
914 1.1 explorer return error;
915 1.1 explorer }
916 1.1 explorer
917 1.1 explorer /*
918 1.1 explorer * start packet transmission on the interface
919 1.1 explorer *
920 1.2 mycroft * MUST BE CALLED AT splnet()
921 1.1 explorer */
922 1.1 explorer static void
923 1.1 explorer sca_start(ifp)
924 1.1 explorer struct ifnet *ifp;
925 1.1 explorer {
926 1.1 explorer sca_port_t *scp = ifp->if_softc;
927 1.1 explorer struct sca_softc *sc = scp->sca;
928 1.1 explorer struct mbuf *m, *mb_head;
929 1.1 explorer sca_desc_t *desc;
930 1.1 explorer u_int8_t *buf, *obuf;
931 1.1 explorer u_int32_t buf_p;
932 1.1 explorer int trigger_xmit;
933 1.1 explorer
934 1.1 explorer /*
935 1.1 explorer * can't queue when we are full or transmitter is busy
936 1.1 explorer */
937 1.1 explorer if ((scp->txinuse >= (SCA_NtxBUFS - 1))
938 1.1 explorer || ((ifp->if_flags & IFF_OACTIVE) == IFF_OACTIVE))
939 1.1 explorer return;
940 1.1 explorer
941 1.1 explorer bus_dmamap_sync(sc->sc_dmat, sc->sc_dmam,
942 1.1 explorer 0, sc->sc_allocsize,
943 1.1 explorer BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
944 1.1 explorer
945 1.1 explorer trigger_xmit = 0;
946 1.1 explorer
947 1.1 explorer txloop:
948 1.1 explorer IF_DEQUEUE(&scp->linkq, mb_head);
949 1.1 explorer if (mb_head == NULL)
950 1.1 explorer #ifdef SCA_USE_FASTQ
951 1.1 explorer IF_DEQUEUE(&scp->fastq, mb_head);
952 1.1 explorer if (mb_head == NULL)
953 1.1 explorer #endif
954 1.1 explorer IF_DEQUEUE(&ifp->if_snd, mb_head);
955 1.1 explorer if (mb_head == NULL)
956 1.1 explorer goto start_xmit;
957 1.1 explorer
958 1.1 explorer desc = &scp->txdesc[scp->txcur];
959 1.1 explorer if (scp->txinuse != 0) {
960 1.1 explorer desc->stat &= ~SCA_DESC_EOT;
961 1.1 explorer desc = &scp->txdesc[scp->txcur];
962 1.1 explorer }
963 1.1 explorer buf = scp->txbuf + SCA_BSIZE * scp->txcur;
964 1.1 explorer obuf = buf;
965 1.1 explorer buf_p = scp->txbuf_p + SCA_BSIZE * scp->txcur;
966 1.1 explorer
967 1.1 explorer desc->bp = (u_int16_t)(buf_p & 0x0000ffff);
968 1.1 explorer desc->bpb = (u_int8_t)((buf_p & 0x00ff0000) >> 16);
969 1.1 explorer desc->stat = SCA_DESC_EOT | SCA_DESC_EOM; /* end of frame and xfer */
970 1.1 explorer desc->len = 0;
971 1.1 explorer
972 1.1 explorer /*
973 1.1 explorer * Run through the chain, copying data into the descriptor as we
974 1.1 explorer * go. If it won't fit in one transmission block, drop the packet.
975 1.1 explorer * No, this isn't nice, but most of the time it _will_ fit.
976 1.1 explorer */
977 1.1 explorer for (m = mb_head ; m != NULL ; m = m->m_next) {
978 1.1 explorer if (m->m_len != 0) {
979 1.1 explorer desc->len += m->m_len;
980 1.1 explorer if (desc->len > SCA_BSIZE) {
981 1.1 explorer m_freem(mb_head);
982 1.1 explorer goto txloop;
983 1.1 explorer }
984 1.1 explorer bcopy(mtod(m, u_int8_t *), buf, m->m_len);
985 1.1 explorer buf += m->m_len;
986 1.1 explorer }
987 1.1 explorer }
988 1.1 explorer
989 1.1 explorer ifp->if_opackets++;
990 1.1 explorer
991 1.1 explorer #if NBPFILTER > 0
992 1.1 explorer /*
993 1.1 explorer * Pass packet to bpf if there is a listener.
994 1.1 explorer */
995 1.1 explorer if (scp->sp_bpf)
996 1.1 explorer bpf_mtap(scp->sp_bpf, mb_head);
997 1.1 explorer #endif
998 1.1 explorer
999 1.1 explorer m_freem(mb_head);
1000 1.1 explorer
1001 1.1 explorer if (scp->txinuse != 0) {
1002 1.1 explorer scp->txcur++;
1003 1.1 explorer if (scp->txcur == SCA_NtxBUFS)
1004 1.1 explorer scp->txcur = 0;
1005 1.1 explorer }
1006 1.1 explorer scp->txinuse++;
1007 1.1 explorer trigger_xmit = 1;
1008 1.1 explorer
1009 1.1 explorer SCA_DPRINTF(SCA_DEBUG_TX,
1010 1.1 explorer ("TX: inuse %d index %d\n", scp->txinuse, scp->txcur));
1011 1.1 explorer
1012 1.1 explorer if (scp->txinuse < (SCA_NtxBUFS - 1))
1013 1.1 explorer goto txloop;
1014 1.1 explorer
1015 1.1 explorer start_xmit:
1016 1.1 explorer bus_dmamap_sync(sc->sc_dmat, sc->sc_dmam,
1017 1.1 explorer 0, sc->sc_allocsize,
1018 1.1 explorer BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
1019 1.1 explorer
1020 1.1 explorer if (trigger_xmit != 0)
1021 1.1 explorer sca_port_starttx(scp);
1022 1.1 explorer }
1023 1.1 explorer
1024 1.1 explorer static void
1025 1.1 explorer sca_watchdog(ifp)
1026 1.1 explorer struct ifnet *ifp;
1027 1.1 explorer {
1028 1.1 explorer }
1029 1.1 explorer
1030 1.1 explorer int
1031 1.1 explorer sca_hardintr(struct sca_softc *sc)
1032 1.1 explorer {
1033 1.1 explorer u_int8_t isr0, isr1, isr2;
1034 1.1 explorer int ret;
1035 1.1 explorer
1036 1.1 explorer ret = 0; /* non-zero means we processed at least one interrupt */
1037 1.1 explorer
1038 1.1 explorer while (1) {
1039 1.1 explorer /*
1040 1.1 explorer * read SCA interrupts
1041 1.1 explorer */
1042 1.1 explorer isr0 = sca_read_1(sc, SCA_ISR0);
1043 1.1 explorer isr1 = sca_read_1(sc, SCA_ISR1);
1044 1.1 explorer isr2 = sca_read_1(sc, SCA_ISR2);
1045 1.1 explorer
1046 1.1 explorer if (isr0 == 0 && isr1 == 0 && isr2 == 0)
1047 1.1 explorer break;
1048 1.1 explorer
1049 1.1 explorer SCA_DPRINTF(SCA_DEBUG_INTR,
1050 1.1 explorer ("isr0 = %02x, isr1 = %02x, isr2 = %02x\n",
1051 1.1 explorer isr0, isr1, isr2));
1052 1.1 explorer
1053 1.1 explorer /*
1054 1.1 explorer * check DMA interrupt
1055 1.1 explorer */
1056 1.1 explorer if (isr1 & 0x0f)
1057 1.1 explorer ret += sca_dmac_intr(&sc->sc_ports[0],
1058 1.1 explorer isr1 & 0x0f);
1059 1.1 explorer if (isr1 & 0xf0)
1060 1.1 explorer ret += sca_dmac_intr(&sc->sc_ports[1],
1061 1.1 explorer (isr1 & 0xf0) >> 4);
1062 1.1 explorer
1063 1.1 explorer if (isr0)
1064 1.1 explorer ret += sca_msci_intr(sc, isr0);
1065 1.1 explorer
1066 1.1 explorer #if 0 /* We don't GET timer interrupts, we have them disabled (msci IE20) */
1067 1.1 explorer if (isr2)
1068 1.1 explorer ret += sca_timer_intr(sc, isr2);
1069 1.1 explorer #endif
1070 1.1 explorer }
1071 1.1 explorer
1072 1.1 explorer return (ret);
1073 1.1 explorer }
1074 1.1 explorer
1075 1.1 explorer static int
1076 1.1 explorer sca_dmac_intr(sca_port_t *scp, u_int8_t isr)
1077 1.1 explorer {
1078 1.1 explorer u_int8_t dsr;
1079 1.1 explorer int ret;
1080 1.1 explorer
1081 1.1 explorer ret = 0;
1082 1.1 explorer
1083 1.1 explorer /*
1084 1.1 explorer * Check transmit channel
1085 1.1 explorer */
1086 1.1 explorer if (isr & 0x0c) {
1087 1.1 explorer SCA_DPRINTF(SCA_DEBUG_INTR,
1088 1.1 explorer ("TX INTERRUPT port %d\n", scp->sp_port));
1089 1.1 explorer
1090 1.1 explorer dsr = 1;
1091 1.1 explorer while (dsr != 0) {
1092 1.1 explorer ret++;
1093 1.1 explorer /*
1094 1.1 explorer * reset interrupt
1095 1.1 explorer */
1096 1.1 explorer dsr = dmac_read_1(scp, SCA_DSR1);
1097 1.1 explorer dmac_write_1(scp, SCA_DSR1,
1098 1.1 explorer dsr | SCA_DSR_DEWD);
1099 1.1 explorer
1100 1.1 explorer /*
1101 1.1 explorer * filter out the bits we don't care about
1102 1.1 explorer */
1103 1.1 explorer dsr &= ( SCA_DSR_COF | SCA_DSR_BOF | SCA_DSR_EOT);
1104 1.1 explorer if (dsr == 0)
1105 1.1 explorer break;
1106 1.1 explorer
1107 1.1 explorer /*
1108 1.1 explorer * check for counter overflow
1109 1.1 explorer */
1110 1.1 explorer if (dsr & SCA_DSR_COF) {
1111 1.1 explorer printf("%s: TXDMA counter overflow\n",
1112 1.1 explorer scp->sp_if.if_xname);
1113 1.1 explorer
1114 1.1 explorer scp->sp_if.if_flags &= ~IFF_OACTIVE;
1115 1.1 explorer scp->txcur = 0;
1116 1.1 explorer scp->txinuse = 0;
1117 1.1 explorer }
1118 1.1 explorer
1119 1.1 explorer /*
1120 1.1 explorer * check for buffer overflow
1121 1.1 explorer */
1122 1.1 explorer if (dsr & SCA_DSR_BOF) {
1123 1.1 explorer printf("%s: TXDMA buffer overflow, cda 0x%04x, eda 0x%04x, cpb 0x%02x\n",
1124 1.1 explorer scp->sp_if.if_xname,
1125 1.1 explorer dmac_read_2(scp, SCA_CDAL1),
1126 1.1 explorer dmac_read_2(scp, SCA_EDAL1),
1127 1.1 explorer dmac_read_1(scp, SCA_CPB1));
1128 1.1 explorer
1129 1.1 explorer /*
1130 1.1 explorer * Yikes. Arrange for a full
1131 1.1 explorer * transmitter restart.
1132 1.1 explorer */
1133 1.1 explorer scp->sp_if.if_flags &= ~IFF_OACTIVE;
1134 1.1 explorer scp->txcur = 0;
1135 1.1 explorer scp->txinuse = 0;
1136 1.1 explorer }
1137 1.1 explorer
1138 1.1 explorer /*
1139 1.1 explorer * check for end of transfer, which is not
1140 1.1 explorer * an error. It means that all data queued
1141 1.1 explorer * was transmitted, and we mark ourself as
1142 1.1 explorer * not in use and stop the watchdog timer.
1143 1.1 explorer */
1144 1.1 explorer if (dsr & SCA_DSR_EOT) {
1145 1.1 explorer SCA_DPRINTF(SCA_DEBUG_TX,
1146 1.1 explorer ("Transmit completed.\n"));
1147 1.1 explorer
1148 1.1 explorer scp->sp_if.if_flags &= ~IFF_OACTIVE;
1149 1.1 explorer scp->txcur = 0;
1150 1.1 explorer scp->txinuse = 0;
1151 1.1 explorer
1152 1.1 explorer /*
1153 1.1 explorer * check for more packets
1154 1.1 explorer */
1155 1.1 explorer sca_start(&scp->sp_if);
1156 1.1 explorer }
1157 1.1 explorer }
1158 1.1 explorer }
1159 1.1 explorer /*
1160 1.1 explorer * receive channel check
1161 1.1 explorer */
1162 1.1 explorer if (isr & 0x03) {
1163 1.1 explorer SCA_DPRINTF(SCA_DEBUG_INTR,
1164 1.1 explorer ("RX INTERRUPT port %d\n", mch));
1165 1.1 explorer
1166 1.1 explorer dsr = 1;
1167 1.1 explorer while (dsr != 0) {
1168 1.1 explorer ret++;
1169 1.1 explorer
1170 1.1 explorer dsr = dmac_read_1(scp, SCA_DSR0);
1171 1.1 explorer dmac_write_1(scp, SCA_DSR0, dsr | SCA_DSR_DEWD);
1172 1.1 explorer
1173 1.1 explorer /*
1174 1.1 explorer * filter out the bits we don't care about
1175 1.1 explorer */
1176 1.1 explorer dsr &= (SCA_DSR_EOM | SCA_DSR_COF
1177 1.1 explorer | SCA_DSR_BOF | SCA_DSR_EOT);
1178 1.1 explorer if (dsr == 0)
1179 1.1 explorer break;
1180 1.1 explorer
1181 1.1 explorer /*
1182 1.1 explorer * End of frame
1183 1.1 explorer */
1184 1.1 explorer if (dsr & SCA_DSR_EOM) {
1185 1.1 explorer SCA_DPRINTF(SCA_DEBUG_RX, ("Got a frame!\n"));
1186 1.1 explorer
1187 1.1 explorer sca_get_packets(scp);
1188 1.1 explorer }
1189 1.1 explorer
1190 1.1 explorer /*
1191 1.1 explorer * check for counter overflow
1192 1.1 explorer */
1193 1.1 explorer if (dsr & SCA_DSR_COF) {
1194 1.1 explorer printf("%s: RXDMA counter overflow\n",
1195 1.1 explorer scp->sp_if.if_xname);
1196 1.1 explorer
1197 1.1 explorer sca_dmac_rxinit(scp);
1198 1.1 explorer }
1199 1.1 explorer
1200 1.1 explorer /*
1201 1.1 explorer * check for end of transfer, which means we
1202 1.1 explorer * ran out of descriptors to receive into.
1203 1.1 explorer * This means the line is much faster than
1204 1.1 explorer * we can handle.
1205 1.1 explorer */
1206 1.1 explorer if (dsr & (SCA_DSR_BOF | SCA_DSR_EOT)) {
1207 1.1 explorer printf("%s: RXDMA buffer overflow\n",
1208 1.1 explorer scp->sp_if.if_xname);
1209 1.1 explorer
1210 1.1 explorer sca_dmac_rxinit(scp);
1211 1.1 explorer }
1212 1.1 explorer }
1213 1.1 explorer }
1214 1.1 explorer
1215 1.1 explorer return ret;
1216 1.1 explorer }
1217 1.1 explorer
1218 1.1 explorer static int
1219 1.1 explorer sca_msci_intr(struct sca_softc *sc, u_int8_t isr)
1220 1.1 explorer {
1221 1.1 explorer printf("Got msci interrupt XXX\n");
1222 1.1 explorer
1223 1.1 explorer return 0;
1224 1.1 explorer }
1225 1.1 explorer
1226 1.1 explorer static void
1227 1.1 explorer sca_get_packets(sca_port_t *scp)
1228 1.1 explorer {
1229 1.1 explorer int descidx;
1230 1.1 explorer sca_desc_t *desc;
1231 1.1 explorer u_int8_t *buf;
1232 1.1 explorer
1233 1.1 explorer bus_dmamap_sync(scp->sca->sc_dmat, scp->sca->sc_dmam,
1234 1.1 explorer 0, scp->sca->sc_allocsize,
1235 1.1 explorer BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1236 1.1 explorer
1237 1.1 explorer /*
1238 1.1 explorer * Loop while there are packets to receive. After each is processed,
1239 1.1 explorer * call sca_frame_skip() to update the DMA registers to the new
1240 1.1 explorer * state.
1241 1.1 explorer */
1242 1.1 explorer while (sca_frame_avail(scp, &descidx)) {
1243 1.1 explorer desc = &scp->rxdesc[descidx];
1244 1.1 explorer buf = scp->rxbuf + SCA_BSIZE * descidx;
1245 1.1 explorer
1246 1.1 explorer sca_frame_process(scp, desc, buf);
1247 1.1 explorer #if SCA_DEBUG_LEVEL > 0
1248 1.1 explorer if (sca_debug & SCA_DEBUG_RXPKT)
1249 1.1 explorer sca_frame_print(scp, desc, buf);
1250 1.1 explorer #endif
1251 1.1 explorer sca_frame_skip(scp, descidx);
1252 1.1 explorer }
1253 1.1 explorer
1254 1.1 explorer bus_dmamap_sync(scp->sca->sc_dmat, scp->sca->sc_dmam,
1255 1.1 explorer 0, scp->sca->sc_allocsize,
1256 1.1 explorer BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
1257 1.1 explorer }
1258 1.1 explorer
1259 1.1 explorer /*
1260 1.1 explorer * Starting with the first descriptor we wanted to read into, up to but
1261 1.1 explorer * not including the current SCA read descriptor, look for a packet.
1262 1.1 explorer */
1263 1.1 explorer static int
1264 1.1 explorer sca_frame_avail(sca_port_t *scp, int *descindx)
1265 1.1 explorer {
1266 1.1 explorer u_int16_t cda;
1267 1.1 explorer int cdaidx;
1268 1.1 explorer u_int32_t desc_p; /* physical address (lower 16 bits) */
1269 1.1 explorer sca_desc_t *desc;
1270 1.1 explorer u_int8_t rxstat;
1271 1.1 explorer
1272 1.1 explorer /*
1273 1.1 explorer * Read the current descriptor from the SCA.
1274 1.1 explorer */
1275 1.1 explorer cda = dmac_read_2(scp, SCA_CDAL0);
1276 1.1 explorer
1277 1.1 explorer /*
1278 1.1 explorer * calculate the index of the current descriptor
1279 1.1 explorer */
1280 1.1 explorer desc_p = cda - (u_int16_t)(scp->rxdesc_p & 0x0000ffff);
1281 1.1 explorer cdaidx = desc_p / sizeof(sca_desc_t);
1282 1.1 explorer
1283 1.1 explorer if (cdaidx >= SCA_NrxBUFS)
1284 1.1 explorer return 0;
1285 1.1 explorer
1286 1.1 explorer for (;;) {
1287 1.1 explorer /*
1288 1.1 explorer * if the SCA is reading into the first descriptor, we somehow
1289 1.1 explorer * got this interrupt incorrectly. Just return that there are
1290 1.1 explorer * no packets ready.
1291 1.1 explorer */
1292 1.1 explorer if (cdaidx == scp->rxstart)
1293 1.1 explorer return 0;
1294 1.1 explorer
1295 1.1 explorer /*
1296 1.1 explorer * We might have a valid descriptor. Set up a pointer
1297 1.1 explorer * to the kva address for it so we can more easily examine
1298 1.1 explorer * the contents.
1299 1.1 explorer */
1300 1.1 explorer desc = &scp->rxdesc[scp->rxstart];
1301 1.1 explorer
1302 1.1 explorer rxstat = desc->stat;
1303 1.1 explorer
1304 1.1 explorer /*
1305 1.1 explorer * check for errors
1306 1.1 explorer */
1307 1.1 explorer if (rxstat & SCA_DESC_ERRORS)
1308 1.1 explorer goto nextpkt;
1309 1.1 explorer
1310 1.1 explorer /*
1311 1.1 explorer * full packet? Good.
1312 1.1 explorer */
1313 1.1 explorer if (rxstat & SCA_DESC_EOM) {
1314 1.1 explorer *descindx = scp->rxstart;
1315 1.1 explorer return 1;
1316 1.1 explorer }
1317 1.1 explorer
1318 1.1 explorer /*
1319 1.1 explorer * increment the rxstart address, since this frame is
1320 1.1 explorer * somehow damaged. Skip over it in later calls.
1321 1.1 explorer * XXX This breaks multidescriptor receives, so each
1322 1.1 explorer * frame HAS to fit within one descriptor's buffer
1323 1.1 explorer * space now...
1324 1.1 explorer */
1325 1.1 explorer nextpkt:
1326 1.1 explorer scp->rxstart++;
1327 1.1 explorer if (scp->rxstart == SCA_NrxBUFS)
1328 1.1 explorer scp->rxstart = 0;
1329 1.1 explorer }
1330 1.1 explorer
1331 1.1 explorer return 0;
1332 1.1 explorer }
1333 1.1 explorer
1334 1.1 explorer /*
1335 1.1 explorer * Pass the packet up to the kernel if it is a packet we want to pay
1336 1.1 explorer * attention to.
1337 1.1 explorer *
1338 1.2 mycroft * MUST BE CALLED AT splnet()
1339 1.1 explorer */
1340 1.1 explorer static void
1341 1.1 explorer sca_frame_process(sca_port_t *scp, sca_desc_t *desc, u_int8_t *p)
1342 1.1 explorer {
1343 1.1 explorer hdlc_header_t *hdlc;
1344 1.1 explorer cisco_pkt_t *cisco, *ncisco;
1345 1.1 explorer u_int16_t len;
1346 1.1 explorer struct mbuf *m;
1347 1.1 explorer u_int8_t *nbuf;
1348 1.1 explorer u_int32_t t = (time.tv_sec - boottime.tv_sec) * 1000;
1349 1.1 explorer struct ifqueue *ifq;
1350 1.1 explorer
1351 1.1 explorer len = desc->len;
1352 1.1 explorer
1353 1.1 explorer /*
1354 1.1 explorer * skip packets that are too short
1355 1.1 explorer */
1356 1.1 explorer if (len < sizeof(hdlc_header_t))
1357 1.1 explorer return;
1358 1.1 explorer
1359 1.1 explorer #if NBPFILTER > 0
1360 1.1 explorer if (scp->sp_bpf)
1361 1.1 explorer bpf_tap(scp->sp_bpf, p, len);
1362 1.1 explorer #endif
1363 1.1 explorer
1364 1.1 explorer /*
1365 1.1 explorer * read and then strip off the HDLC information
1366 1.1 explorer */
1367 1.1 explorer hdlc = (hdlc_header_t *)p;
1368 1.1 explorer
1369 1.1 explorer scp->sp_if.if_ipackets++;
1370 1.1 explorer scp->sp_if.if_lastchange = time;
1371 1.1 explorer
1372 1.1 explorer switch (ntohs(hdlc->protocol)) {
1373 1.1 explorer case HDLC_PROTOCOL_IP:
1374 1.1 explorer SCA_DPRINTF(SCA_DEBUG_RX, ("Received IP packet\n"));
1375 1.1 explorer
1376 1.1 explorer m = sca_mbuf_alloc(p, len);
1377 1.1 explorer if (m == NULL) {
1378 1.1 explorer scp->sp_if.if_iqdrops++;
1379 1.1 explorer return;
1380 1.1 explorer }
1381 1.1 explorer m->m_pkthdr.rcvif = &scp->sp_if;
1382 1.1 explorer
1383 1.1 explorer if (IF_QFULL(&ipintrq)) {
1384 1.1 explorer IF_DROP(&ipintrq);
1385 1.1 explorer scp->sp_if.if_ierrors++;
1386 1.1 explorer scp->sp_if.if_iqdrops++;
1387 1.1 explorer m_freem(m);
1388 1.1 explorer } else {
1389 1.1 explorer /*
1390 1.1 explorer * strip off the HDLC header and hand off to IP stack
1391 1.1 explorer */
1392 1.1 explorer m->m_pkthdr.len -= HDLC_HDRLEN;
1393 1.1 explorer m->m_data += HDLC_HDRLEN;
1394 1.1 explorer m->m_len -= HDLC_HDRLEN;
1395 1.1 explorer IF_ENQUEUE(&ipintrq, m);
1396 1.1 explorer schednetisr(NETISR_IP);
1397 1.1 explorer }
1398 1.1 explorer
1399 1.1 explorer break;
1400 1.1 explorer
1401 1.1 explorer case CISCO_KEEPALIVE:
1402 1.1 explorer SCA_DPRINTF(SCA_DEBUG_CISCO,
1403 1.1 explorer ("Received CISCO keepalive packet\n"));
1404 1.1 explorer
1405 1.1 explorer if (len < CISCO_PKT_LEN) {
1406 1.1 explorer SCA_DPRINTF(SCA_DEBUG_CISCO,
1407 1.1 explorer ("short CISCO packet %d, wanted %d\n",
1408 1.1 explorer len, CISCO_PKT_LEN));
1409 1.1 explorer return;
1410 1.1 explorer }
1411 1.1 explorer
1412 1.1 explorer /*
1413 1.1 explorer * allocate an mbuf and copy the important bits of data
1414 1.1 explorer * into it.
1415 1.1 explorer */
1416 1.1 explorer m = sca_mbuf_alloc(p, HDLC_HDRLEN + CISCO_PKT_LEN);
1417 1.1 explorer if (m == NULL)
1418 1.1 explorer return;
1419 1.1 explorer
1420 1.1 explorer nbuf = mtod(m, u_int8_t *);
1421 1.1 explorer ncisco = (cisco_pkt_t *)(nbuf + HDLC_HDRLEN);
1422 1.1 explorer m->m_pkthdr.rcvif = &scp->sp_if;
1423 1.1 explorer
1424 1.1 explorer cisco = (cisco_pkt_t *)(p + HDLC_HDRLEN);
1425 1.1 explorer
1426 1.1 explorer switch (ntohl(cisco->type)) {
1427 1.1 explorer case CISCO_ADDR_REQ:
1428 1.1 explorer printf("Got CISCO addr_req, ignoring\n");
1429 1.1 explorer m_freem(m);
1430 1.1 explorer break;
1431 1.1 explorer
1432 1.1 explorer case CISCO_ADDR_REPLY:
1433 1.1 explorer printf("Got CISCO addr_reply, ignoring\n");
1434 1.1 explorer m_freem(m);
1435 1.1 explorer break;
1436 1.1 explorer
1437 1.1 explorer case CISCO_KEEPALIVE_REQ:
1438 1.1 explorer SCA_DPRINTF(SCA_DEBUG_CISCO,
1439 1.1 explorer ("Received KA, mseq %d,"
1440 1.1 explorer " yseq %d, rel 0x%04x, t0"
1441 1.1 explorer " %04x, t1 %04x\n",
1442 1.1 explorer ntohl(cisco->par1), ntohl(cisco->par2),
1443 1.1 explorer ntohs(cisco->rel), ntohs(cisco->time0),
1444 1.1 explorer ntohs(cisco->time1)));
1445 1.1 explorer
1446 1.1 explorer scp->cka_lastrx = ntohl(cisco->par1);
1447 1.1 explorer scp->cka_lasttx++;
1448 1.1 explorer
1449 1.1 explorer /*
1450 1.1 explorer * schedule the transmit right here.
1451 1.1 explorer */
1452 1.1 explorer ncisco->par2 = cisco->par1;
1453 1.1 explorer ncisco->par1 = htonl(scp->cka_lasttx);
1454 1.1 explorer ncisco->time0 = htons((u_int16_t)(t >> 16));
1455 1.1 explorer ncisco->time1 = htons((u_int16_t)(t & 0x0000ffff));
1456 1.1 explorer
1457 1.1 explorer ifq = &scp->linkq;
1458 1.1 explorer if (IF_QFULL(ifq)) {
1459 1.1 explorer IF_DROP(ifq);
1460 1.1 explorer m_freem(m);
1461 1.1 explorer return;
1462 1.1 explorer }
1463 1.1 explorer IF_ENQUEUE(ifq, m);
1464 1.1 explorer
1465 1.1 explorer sca_start(&scp->sp_if);
1466 1.1 explorer
1467 1.1 explorer break;
1468 1.1 explorer
1469 1.1 explorer default:
1470 1.1 explorer m_freem(m);
1471 1.1 explorer SCA_DPRINTF(SCA_DEBUG_CISCO,
1472 1.1 explorer ("Unknown CISCO keepalive protocol 0x%04x\n",
1473 1.1 explorer ntohl(cisco->type)));
1474 1.1 explorer return;
1475 1.1 explorer }
1476 1.1 explorer
1477 1.1 explorer break;
1478 1.1 explorer
1479 1.1 explorer default:
1480 1.1 explorer SCA_DPRINTF(SCA_DEBUG_RX,
1481 1.1 explorer ("Unknown/unexpected ethertype 0x%04x\n",
1482 1.1 explorer ntohs(hdlc->protocol)));
1483 1.1 explorer }
1484 1.1 explorer }
1485 1.1 explorer
1486 1.1 explorer #if SCA_DEBUG_LEVEL > 0
1487 1.1 explorer /*
1488 1.1 explorer * do a hex dump of the packet received into descriptor "desc" with
1489 1.1 explorer * data buffer "p"
1490 1.1 explorer */
1491 1.1 explorer static void
1492 1.1 explorer sca_frame_print(sca_port_t *scp, sca_desc_t *desc, u_int8_t *p)
1493 1.1 explorer {
1494 1.1 explorer int i;
1495 1.1 explorer int nothing_yet = 1;
1496 1.1 explorer
1497 1.1 explorer printf("descriptor va %p: cp 0x%x bpb 0x%0x bp 0x%0x stat 0x%0x len %d\n",
1498 1.1 explorer desc, desc->cp, desc->bpb, desc->bp, desc->stat, desc->len);
1499 1.1 explorer
1500 1.1 explorer for (i = 0 ; i < desc->len ; i++) {
1501 1.1 explorer if (nothing_yet == 1 && *p == 0) {
1502 1.1 explorer p++;
1503 1.1 explorer continue;
1504 1.1 explorer }
1505 1.1 explorer nothing_yet = 0;
1506 1.1 explorer if (i % 16 == 0)
1507 1.1 explorer printf("\n");
1508 1.1 explorer printf("%02x ", *p++);
1509 1.1 explorer }
1510 1.1 explorer
1511 1.1 explorer if (i % 16 != 1)
1512 1.1 explorer printf("\n");
1513 1.1 explorer }
1514 1.1 explorer #endif
1515 1.1 explorer
1516 1.1 explorer /*
1517 1.1 explorer * skip all frames before the descriptor index "indx" -- we do this by
1518 1.1 explorer * moving the rxstart pointer to the index following this one, and
1519 1.1 explorer * setting the end descriptor to this index.
1520 1.1 explorer */
1521 1.1 explorer static void
1522 1.1 explorer sca_frame_skip(sca_port_t *scp, int indx)
1523 1.1 explorer {
1524 1.1 explorer u_int32_t desc_p;
1525 1.1 explorer
1526 1.1 explorer scp->rxstart++;
1527 1.1 explorer if (scp->rxstart == SCA_NrxBUFS)
1528 1.1 explorer scp->rxstart = 0;
1529 1.1 explorer
1530 1.1 explorer desc_p = scp->rxdesc_p * sizeof(sca_desc_t) * indx;
1531 1.1 explorer dmac_write_2(scp, SCA_EDAL0,
1532 1.1 explorer (u_int16_t)(desc_p & 0x0000ffff));
1533 1.1 explorer }
1534 1.1 explorer
1535 1.1 explorer /*
1536 1.1 explorer * set a port to the "up" state
1537 1.1 explorer */
1538 1.1 explorer static void
1539 1.1 explorer sca_port_up(sca_port_t *scp)
1540 1.1 explorer {
1541 1.1 explorer struct sca_softc *sc = scp->sca;
1542 1.1 explorer
1543 1.1 explorer /*
1544 1.1 explorer * reset things
1545 1.1 explorer */
1546 1.1 explorer #if 0
1547 1.1 explorer msci_write_1(scp, SCA_CMD0, SCA_CMD_TXRESET);
1548 1.1 explorer msci_write_1(scp, SCA_CMD0, SCA_CMD_RXRESET);
1549 1.1 explorer #endif
1550 1.1 explorer /*
1551 1.1 explorer * clear in-use flag
1552 1.1 explorer */
1553 1.1 explorer scp->sp_if.if_flags &= ~IFF_OACTIVE;
1554 1.1 explorer
1555 1.1 explorer /*
1556 1.1 explorer * raise DTR
1557 1.1 explorer */
1558 1.1 explorer sc->dtr_callback(sc->dtr_aux, scp->sp_port, 1);
1559 1.1 explorer
1560 1.1 explorer /*
1561 1.1 explorer * raise RTS
1562 1.1 explorer */
1563 1.1 explorer msci_write_1(scp, SCA_CTL0,
1564 1.1 explorer msci_read_1(scp, SCA_CTL0) & ~SCA_CTL_RTS);
1565 1.1 explorer
1566 1.1 explorer /*
1567 1.1 explorer * enable interrupts
1568 1.1 explorer */
1569 1.1 explorer if (scp->sp_port == 0) {
1570 1.1 explorer sca_write_1(sc, SCA_IER0, sca_read_1(sc, SCA_IER0) | 0x0f);
1571 1.1 explorer sca_write_1(sc, SCA_IER1, sca_read_1(sc, SCA_IER1) | 0x0f);
1572 1.1 explorer } else {
1573 1.1 explorer sca_write_1(sc, SCA_IER0, sca_read_1(sc, SCA_IER0) | 0xf0);
1574 1.1 explorer sca_write_1(sc, SCA_IER1, sca_read_1(sc, SCA_IER1) | 0xf0);
1575 1.1 explorer }
1576 1.1 explorer
1577 1.1 explorer /*
1578 1.1 explorer * enable transmit and receive
1579 1.1 explorer */
1580 1.1 explorer msci_write_1(scp, SCA_CMD0, SCA_CMD_TXENABLE);
1581 1.1 explorer msci_write_1(scp, SCA_CMD0, SCA_CMD_RXENABLE);
1582 1.1 explorer
1583 1.1 explorer /*
1584 1.1 explorer * reset internal state
1585 1.1 explorer */
1586 1.1 explorer scp->txinuse = 0;
1587 1.1 explorer scp->txcur = 0;
1588 1.1 explorer scp->cka_lasttx = time.tv_usec;
1589 1.1 explorer scp->cka_lastrx = 0;
1590 1.1 explorer }
1591 1.1 explorer
1592 1.1 explorer /*
1593 1.1 explorer * set a port to the "down" state
1594 1.1 explorer */
1595 1.1 explorer static void
1596 1.1 explorer sca_port_down(sca_port_t *scp)
1597 1.1 explorer {
1598 1.1 explorer struct sca_softc *sc = scp->sca;
1599 1.1 explorer
1600 1.1 explorer /*
1601 1.1 explorer * lower DTR
1602 1.1 explorer */
1603 1.1 explorer sc->dtr_callback(sc->dtr_aux, scp->sp_port, 0);
1604 1.1 explorer
1605 1.1 explorer /*
1606 1.1 explorer * lower RTS
1607 1.1 explorer */
1608 1.1 explorer msci_write_1(scp, SCA_CTL0,
1609 1.1 explorer msci_read_1(scp, SCA_CTL0) | SCA_CTL_RTS);
1610 1.1 explorer
1611 1.1 explorer /*
1612 1.1 explorer * disable interrupts
1613 1.1 explorer */
1614 1.1 explorer if (scp->sp_port == 0) {
1615 1.1 explorer sca_write_1(sc, SCA_IER0, sca_read_1(sc, SCA_IER0) & 0xf0);
1616 1.1 explorer sca_write_1(sc, SCA_IER1, sca_read_1(sc, SCA_IER1) & 0xf0);
1617 1.1 explorer } else {
1618 1.1 explorer sca_write_1(sc, SCA_IER0, sca_read_1(sc, SCA_IER0) & 0x0f);
1619 1.1 explorer sca_write_1(sc, SCA_IER1, sca_read_1(sc, SCA_IER1) & 0x0f);
1620 1.1 explorer }
1621 1.1 explorer
1622 1.1 explorer /*
1623 1.1 explorer * disable transmit and receive
1624 1.1 explorer */
1625 1.1 explorer msci_write_1(scp, SCA_CMD0, SCA_CMD_RXDISABLE);
1626 1.1 explorer msci_write_1(scp, SCA_CMD0, SCA_CMD_TXDISABLE);
1627 1.1 explorer
1628 1.1 explorer /*
1629 1.1 explorer * no, we're not in use anymore
1630 1.1 explorer */
1631 1.1 explorer scp->sp_if.if_flags &= ~IFF_OACTIVE;
1632 1.1 explorer }
1633 1.1 explorer
1634 1.1 explorer /*
1635 1.1 explorer * disable all DMA and interrupts for all ports at once.
1636 1.1 explorer */
1637 1.1 explorer void
1638 1.1 explorer sca_shutdown(struct sca_softc *sca)
1639 1.1 explorer {
1640 1.1 explorer /*
1641 1.1 explorer * disable DMA and interrupts
1642 1.1 explorer */
1643 1.1 explorer sca_write_1(sca, SCA_DMER, 0);
1644 1.1 explorer sca_write_1(sca, SCA_IER0, 0);
1645 1.1 explorer sca_write_1(sca, SCA_IER1, 0);
1646 1.1 explorer }
1647 1.1 explorer
1648 1.1 explorer /*
1649 1.1 explorer * If there are packets to transmit, start the transmit DMA logic.
1650 1.1 explorer */
1651 1.1 explorer static void
1652 1.1 explorer sca_port_starttx(sca_port_t *scp)
1653 1.1 explorer {
1654 1.1 explorer struct sca_softc *sc;
1655 1.1 explorer u_int32_t startdesc_p, enddesc_p;
1656 1.1 explorer int enddesc;
1657 1.1 explorer
1658 1.1 explorer sc = scp->sca;
1659 1.1 explorer
1660 1.1 explorer if (((scp->sp_if.if_flags & IFF_OACTIVE) == IFF_OACTIVE)
1661 1.1 explorer || scp->txinuse == 0)
1662 1.1 explorer return;
1663 1.1 explorer scp->sp_if.if_flags |= IFF_OACTIVE;
1664 1.1 explorer
1665 1.1 explorer /*
1666 1.1 explorer * We have something to do, since we have at least one packet
1667 1.1 explorer * waiting, and we are not already marked as active.
1668 1.1 explorer */
1669 1.1 explorer enddesc = scp->txcur;
1670 1.1 explorer enddesc++;
1671 1.1 explorer if (enddesc == SCA_NtxBUFS)
1672 1.1 explorer enddesc = 0;
1673 1.1 explorer
1674 1.1 explorer startdesc_p = scp->txdesc_p;
1675 1.1 explorer enddesc_p = scp->txdesc_p + sizeof(sca_desc_t) * enddesc;
1676 1.1 explorer
1677 1.1 explorer dmac_write_2(scp, SCA_EDAL1, (u_int16_t)(enddesc_p & 0x0000ffff));
1678 1.1 explorer dmac_write_2(scp, SCA_CDAL1,
1679 1.1 explorer (u_int16_t)(startdesc_p & 0x0000ffff));
1680 1.1 explorer
1681 1.1 explorer /*
1682 1.1 explorer * enable the DMA
1683 1.1 explorer */
1684 1.1 explorer dmac_write_1(scp, SCA_DSR1, SCA_DSR_DE);
1685 1.1 explorer }
1686 1.1 explorer
1687 1.1 explorer /*
1688 1.1 explorer * allocate an mbuf at least long enough to hold "len" bytes.
1689 1.1 explorer * If "p" is non-NULL, copy "len" bytes from it into the new mbuf,
1690 1.1 explorer * otherwise let the caller handle copying the data in.
1691 1.1 explorer */
1692 1.1 explorer static struct mbuf *
1693 1.1 explorer sca_mbuf_alloc(caddr_t p, u_int len)
1694 1.1 explorer {
1695 1.1 explorer struct mbuf *m;
1696 1.1 explorer
1697 1.1 explorer /*
1698 1.1 explorer * allocate an mbuf and copy the important bits of data
1699 1.1 explorer * into it. If the packet won't fit in the header,
1700 1.1 explorer * allocate a cluster for it and store it there.
1701 1.1 explorer */
1702 1.1 explorer MGETHDR(m, M_DONTWAIT, MT_DATA);
1703 1.1 explorer if (m == NULL)
1704 1.1 explorer return NULL;
1705 1.1 explorer if (len > MHLEN) {
1706 1.1 explorer if (len > MCLBYTES) {
1707 1.1 explorer m_freem(m);
1708 1.1 explorer return NULL;
1709 1.1 explorer }
1710 1.1 explorer MCLGET(m, M_DONTWAIT);
1711 1.1 explorer if ((m->m_flags & M_EXT) == 0) {
1712 1.1 explorer m_freem(m);
1713 1.1 explorer return NULL;
1714 1.1 explorer }
1715 1.1 explorer }
1716 1.1 explorer if (p != NULL)
1717 1.1 explorer bcopy(p, mtod(m, caddr_t), len);
1718 1.1 explorer m->m_len = len;
1719 1.1 explorer m->m_pkthdr.len = len;
1720 1.1 explorer
1721 1.1 explorer return (m);
1722 1.1 explorer }
1723