xref: /freebsd/sys/dev/sbni/if_sbni.c (revision 2f513db72b034fd5ef7f080b11be5c711c15186a)
1 /*-
2  * Copyright (c) 1997-2001 Granch, Ltd. All rights reserved.
3  * Author: Denis I.Timofeev <timofeev@granch.ru>
4  *
5  * Redistributon and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice unmodified, this list of conditions, and the following
10  *    disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  *
27  */
28 
29 #include <sys/cdefs.h>
30 __FBSDID("$FreeBSD$");
31 
32 /*
33  * Device driver for Granch SBNI12 leased line adapters
34  *
35  * Revision 2.0.0  1997/08/06
36  * Initial revision by Alexey Zverev
37  *
38  * Revision 2.0.1 1997/08/11
39  * Additional internal statistics support (tx statistics)
40  *
41  * Revision 2.0.2 1997/11/05
42  * if_bpf bug has been fixed
43  *
44  * Revision 2.0.3 1998/12/20
45  * Memory leakage has been eliminated in
46  * the sbni_st and sbni_timeout routines.
47  *
48  * Revision 3.0 2000/08/10 by Yaroslav Polyakov
49  * Support for PCI cards. 4.1 modification.
50  *
51  * Revision 3.1 2000/09/12
52  * Removed extra #defines around bpf functions
53  *
54  * Revision 4.0 2000/11/23 by Denis Timofeev
55  * Completely redesigned the buffer management
56  *
57  * Revision 4.1 2001/01/21
58  * Support for PCI Dual cards and new SBNI12D-10, -11 Dual/ISA cards
59  *
60  * Written with reference to NE2000 driver developed by David Greenman.
61  */
62 
63 
64 #include <sys/param.h>
65 #include <sys/bus.h>
66 #include <sys/systm.h>
67 #include <sys/socket.h>
68 #include <sys/sockio.h>
69 #include <sys/mbuf.h>
70 #include <sys/kernel.h>
71 #include <sys/priv.h>
72 #include <sys/proc.h>
73 #include <sys/callout.h>
74 #include <sys/syslog.h>
75 #include <sys/random.h>
76 
77 #include <machine/bus.h>
78 #include <sys/rman.h>
79 #include <machine/resource.h>
80 
81 #include <net/if.h>
82 #include <net/if_var.h>
83 #include <net/if_dl.h>
84 #include <net/ethernet.h>
85 #include <net/bpf.h>
86 #include <net/if_types.h>
87 
88 #include <dev/sbni/if_sbnireg.h>
89 #include <dev/sbni/if_sbnivar.h>
90 
91 static void	sbni_init(void *);
92 static void	sbni_init_locked(struct sbni_softc *);
93 static void	sbni_start(struct ifnet *);
94 static void	sbni_start_locked(struct ifnet *);
95 static int	sbni_ioctl(struct ifnet *, u_long, caddr_t);
96 static void	sbni_stop(struct sbni_softc *);
97 static void	handle_channel(struct sbni_softc *);
98 
99 static void	card_start(struct sbni_softc *);
100 static int	recv_frame(struct sbni_softc *);
101 static void	send_frame(struct sbni_softc *);
102 static int	upload_data(struct sbni_softc *, u_int, u_int, u_int, u_int32_t);
103 static int	skip_tail(struct sbni_softc *, u_int, u_int32_t);
104 static void	interpret_ack(struct sbni_softc *, u_int);
105 static void	download_data(struct sbni_softc *, u_int32_t *);
106 static void	prepare_to_send(struct sbni_softc *);
107 static void	drop_xmit_queue(struct sbni_softc *);
108 static int	get_rx_buf(struct sbni_softc *);
109 static void	indicate_pkt(struct sbni_softc *);
110 static void	change_level(struct sbni_softc *);
111 static int	check_fhdr(struct sbni_softc *, u_int *, u_int *,
112 			   u_int *, u_int *, u_int32_t *);
113 static int	append_frame_to_pkt(struct sbni_softc *, u_int, u_int32_t);
114 static void	timeout_change_level(struct sbni_softc *);
115 static void	send_frame_header(struct sbni_softc *, u_int32_t *);
116 static void	set_initial_values(struct sbni_softc *, struct sbni_flags);
117 
118 static u_int32_t	calc_crc32(u_int32_t, caddr_t, u_int);
119 static callout_func_t	sbni_timeout;
120 
121 static __inline u_char	sbni_inb(struct sbni_softc *, enum sbni_reg);
122 static __inline void	sbni_outb(struct sbni_softc *, enum sbni_reg, u_char);
123 static __inline void	sbni_insb(struct sbni_softc *, u_char *, u_int);
124 static __inline void	sbni_outsb(struct sbni_softc *, u_char *, u_int);
125 
126 static u_int32_t crc32tab[];
127 
128 #ifdef SBNI_DUAL_COMPOUND
129 static struct mtx headlist_lock;
130 MTX_SYSINIT(headlist_lock, &headlist_lock, "sbni headlist", MTX_DEF);
131 static struct sbni_softc *sbni_headlist;
132 #endif
133 
134 /* -------------------------------------------------------------------------- */
135 
136 static __inline u_char
137 sbni_inb(struct sbni_softc *sc, enum sbni_reg reg)
138 {
139 	return bus_space_read_1(
140 	    rman_get_bustag(sc->io_res),
141 	    rman_get_bushandle(sc->io_res),
142 	    sc->io_off + reg);
143 }
144 
145 static __inline void
146 sbni_outb(struct sbni_softc *sc, enum sbni_reg reg, u_char value)
147 {
148 	bus_space_write_1(
149 	    rman_get_bustag(sc->io_res),
150 	    rman_get_bushandle(sc->io_res),
151 	    sc->io_off + reg, value);
152 }
153 
154 static __inline void
155 sbni_insb(struct sbni_softc *sc, u_char *to, u_int len)
156 {
157 	bus_space_read_multi_1(
158 	    rman_get_bustag(sc->io_res),
159 	    rman_get_bushandle(sc->io_res),
160 	    sc->io_off + DAT, to, len);
161 }
162 
163 static __inline void
164 sbni_outsb(struct sbni_softc *sc, u_char *from, u_int len)
165 {
166 	bus_space_write_multi_1(
167 	    rman_get_bustag(sc->io_res),
168 	    rman_get_bushandle(sc->io_res),
169 	    sc->io_off + DAT, from, len);
170 }
171 
172 
173 /*
174 	Valid combinations in CSR0 (for probing):
175 
176 	VALID_DECODER	0000,0011,1011,1010
177 
178 				    	; 0   ; -
179 				TR_REQ	; 1   ; +
180 			TR_RDY	    	; 2   ; -
181 			TR_RDY	TR_REQ	; 3   ; +
182 		BU_EMP		    	; 4   ; +
183 		BU_EMP	     	TR_REQ	; 5   ; +
184 		BU_EMP	TR_RDY	    	; 6   ; -
185 		BU_EMP	TR_RDY	TR_REQ	; 7   ; +
186 	RC_RDY 		     		; 8   ; +
187 	RC_RDY			TR_REQ	; 9   ; +
188 	RC_RDY		TR_RDY		; 10  ; -
189 	RC_RDY		TR_RDY	TR_REQ	; 11  ; -
190 	RC_RDY	BU_EMP			; 12  ; -
191 	RC_RDY	BU_EMP		TR_REQ	; 13  ; -
192 	RC_RDY	BU_EMP	TR_RDY		; 14  ; -
193 	RC_RDY	BU_EMP	TR_RDY	TR_REQ	; 15  ; -
194 */
195 
196 #define VALID_DECODER	(2 + 8 + 0x10 + 0x20 + 0x80 + 0x100 + 0x200)
197 
198 
199 int
200 sbni_probe(struct sbni_softc *sc)
201 {
202 	u_char csr0;
203 
204 	csr0 = sbni_inb(sc, CSR0);
205 	if (csr0 != 0xff && csr0 != 0x00) {
206 		csr0 &= ~EN_INT;
207 		if (csr0 & BU_EMP)
208 			csr0 |= EN_INT;
209 
210 		if (VALID_DECODER & (1 << (csr0 >> 4)))
211 			return (0);
212 	}
213 
214 	return (ENXIO);
215 }
216 
217 
218 /*
219  * Install interface into kernel networking data structures
220  */
221 int
222 sbni_attach(struct sbni_softc *sc, int unit, struct sbni_flags flags)
223 {
224 	struct ifnet *ifp;
225 	u_char csr0;
226 
227 	ifp = sc->ifp = if_alloc(IFT_ETHER);
228 	if (ifp == NULL)
229 		return (ENOMEM);
230 	sbni_outb(sc, CSR0, 0);
231 	set_initial_values(sc, flags);
232 
233 	/* Initialize ifnet structure */
234 	ifp->if_softc	= sc;
235 	if_initname(ifp, "sbni", unit);
236 	ifp->if_init	= sbni_init;
237 	ifp->if_start	= sbni_start;
238 	ifp->if_ioctl	= sbni_ioctl;
239 	IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen);
240 
241 	/* report real baud rate */
242 	csr0 = sbni_inb(sc, CSR0);
243 	ifp->if_baudrate =
244 		(csr0 & 0x01 ? 500000 : 2000000) / (1 << flags.rate);
245 
246 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST |
247 	    IFF_NEEDSEPOCH;
248 
249 	mtx_init(&sc->lock, ifp->if_xname, MTX_NETWORK_LOCK, MTX_DEF);
250 	callout_init_mtx(&sc->wch, &sc->lock, 0);
251 	ether_ifattach(ifp, sc->enaddr);
252 	/* device attach does transition from UNCONFIGURED to IDLE state */
253 
254 	if_printf(ifp, "speed %ju, rxl ", (uintmax_t)ifp->if_baudrate);
255 	if (sc->delta_rxl)
256 		printf("auto\n");
257 	else
258 		printf("%d (fixed)\n", sc->cur_rxl_index);
259 	return (0);
260 }
261 
262 void
263 sbni_detach(struct sbni_softc *sc)
264 {
265 
266 	SBNI_LOCK(sc);
267 	sbni_stop(sc);
268 	SBNI_UNLOCK(sc);
269 	callout_drain(&sc->wch);
270 	ether_ifdetach(sc->ifp);
271 	if (sc->irq_handle)
272 		bus_teardown_intr(sc->dev, sc->irq_res, sc->irq_handle);
273 	mtx_destroy(&sc->lock);
274 	if_free(sc->ifp);
275 }
276 
277 void
278 sbni_release_resources(struct sbni_softc *sc)
279 {
280 
281 	if (sc->irq_res)
282 		bus_release_resource(sc->dev, SYS_RES_IRQ, sc->irq_rid,
283 		    sc->irq_res);
284 	if (sc->io_res && sc->io_off == 0)
285 		bus_release_resource(sc->dev, SYS_RES_IOPORT, sc->io_rid,
286 		    sc->io_res);
287 }
288 
289 /* -------------------------------------------------------------------------- */
290 
291 static void
292 sbni_init(void *xsc)
293 {
294 	struct sbni_softc *sc;
295 
296 	sc = (struct sbni_softc *)xsc;
297 	SBNI_LOCK(sc);
298 	sbni_init_locked(sc);
299 	SBNI_UNLOCK(sc);
300 }
301 
302 static void
303 sbni_init_locked(struct sbni_softc *sc)
304 {
305 	struct ifnet *ifp;
306 
307 	ifp = sc->ifp;
308 
309 	/*
310 	 * kludge to avoid multiple initialization when more than once
311 	 * protocols configured
312 	 */
313 	if (ifp->if_drv_flags & IFF_DRV_RUNNING)
314 		return;
315 
316 	card_start(sc);
317 	callout_reset(&sc->wch, hz/SBNI_HZ, sbni_timeout, sc);
318 
319 	ifp->if_drv_flags |= IFF_DRV_RUNNING;
320 	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
321 
322 	/* attempt to start output */
323 	sbni_start_locked(ifp);
324 }
325 
326 static void
327 sbni_start(struct ifnet *ifp)
328 {
329 	struct sbni_softc *sc = ifp->if_softc;
330 
331 	SBNI_LOCK(sc);
332 	sbni_start_locked(ifp);
333 	SBNI_UNLOCK(sc);
334 }
335 
336 static void
337 sbni_start_locked(struct ifnet *ifp)
338 {
339 	struct sbni_softc *sc = ifp->if_softc;
340 
341 	if (sc->tx_frameno == 0)
342 		prepare_to_send(sc);
343 }
344 
345 
346 static void
347 sbni_stop(struct sbni_softc *sc)
348 {
349 	sbni_outb(sc, CSR0, 0);
350 	drop_xmit_queue(sc);
351 
352 	if (sc->rx_buf_p) {
353 		m_freem(sc->rx_buf_p);
354 		sc->rx_buf_p = NULL;
355 	}
356 
357 	callout_stop(&sc->wch);
358 	sc->ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
359 }
360 
361 /* -------------------------------------------------------------------------- */
362 
363 /* interrupt handler */
364 
365 /*
366  * 	SBNI12D-10, -11/ISA boards within "common interrupt" mode could not
367  * be looked as two independent single-channel devices. Every channel seems
368  * as Ethernet interface but interrupt handler must be common. Really, first
369  * channel ("master") driver only registers the handler. In it's struct softc
370  * it has got pointer to "slave" channel's struct softc and handles that's
371  * interrupts too.
372  *	softc of successfully attached ISA SBNI boards is linked to list.
373  * While next board driver is initialized, it scans this list. If one
374  * has found softc with same irq and ioaddr different by 4 then it assumes
375  * this board to be "master".
376  */
377 
378 void
379 sbni_intr(void *arg)
380 {
381 	struct sbni_softc *sc;
382 	int repeat;
383 
384 	sc = (struct sbni_softc *)arg;
385 
386 	do {
387 		repeat = 0;
388 		SBNI_LOCK(sc);
389 		if (sbni_inb(sc, CSR0) & (RC_RDY | TR_RDY)) {
390 			handle_channel(sc);
391 			repeat = 1;
392 		}
393 		SBNI_UNLOCK(sc);
394 		if (sc->slave_sc) {
395 			/* second channel present */
396 			SBNI_LOCK(sc->slave_sc);
397 			if (sbni_inb(sc->slave_sc, CSR0) & (RC_RDY | TR_RDY)) {
398 				handle_channel(sc->slave_sc);
399 				repeat = 1;
400 			}
401 			SBNI_UNLOCK(sc->slave_sc);
402 		}
403 	} while (repeat);
404 }
405 
406 
407 static void
408 handle_channel(struct sbni_softc *sc)
409 {
410 	int req_ans;
411 	u_char csr0;
412 
413 	sbni_outb(sc, CSR0, (sbni_inb(sc, CSR0) & ~EN_INT) | TR_REQ);
414 
415 	sc->timer_ticks = CHANGE_LEVEL_START_TICKS;
416 	for (;;) {
417 		csr0 = sbni_inb(sc, CSR0);
418 		if ((csr0 & (RC_RDY | TR_RDY)) == 0)
419 			break;
420 
421 		req_ans = !(sc->state & FL_PREV_OK);
422 
423 		if (csr0 & RC_RDY)
424 			req_ans = recv_frame(sc);
425 
426 		/*
427 		 * TR_RDY always equals 1 here because we have owned the marker,
428 		 * and we set TR_REQ when disabled interrupts
429 		 */
430 		csr0 = sbni_inb(sc, CSR0);
431 		if ((csr0 & TR_RDY) == 0 || (csr0 & RC_RDY) != 0)
432 			if_printf(sc->ifp, "internal error!\n");
433 
434 		/* if state & FL_NEED_RESEND != 0 then tx_frameno != 0 */
435 		if (req_ans || sc->tx_frameno != 0)
436 			send_frame(sc);
437 		else {
438 			/* send the marker without any data */
439 			sbni_outb(sc, CSR0, sbni_inb(sc, CSR0) & ~TR_REQ);
440 		}
441 	}
442 
443 	sbni_outb(sc, CSR0, sbni_inb(sc, CSR0) | EN_INT);
444 }
445 
446 
447 /*
448  * Routine returns 1 if it need to acknoweledge received frame.
449  * Empty frame received without errors won't be acknoweledged.
450  */
451 
452 static int
453 recv_frame(struct sbni_softc *sc)
454 {
455 	u_int32_t crc;
456 	u_int framelen, frameno, ack;
457 	u_int is_first, frame_ok;
458 
459 	crc = CRC32_INITIAL;
460 	if (check_fhdr(sc, &framelen, &frameno, &ack, &is_first, &crc)) {
461 		frame_ok = framelen > 4 ?
462 		    upload_data(sc, framelen, frameno, is_first, crc) :
463 		    skip_tail(sc, framelen, crc);
464 		if (frame_ok)
465 			interpret_ack(sc, ack);
466 	} else {
467 		framelen = 0;
468 		frame_ok = 0;
469 	}
470 
471 	sbni_outb(sc, CSR0, sbni_inb(sc, CSR0) ^ CT_ZER);
472 	if (frame_ok) {
473 		sc->state |= FL_PREV_OK;
474 		if (framelen > 4)
475 			sc->in_stats.all_rx_number++;
476 	} else {
477 		sc->state &= ~FL_PREV_OK;
478 		change_level(sc);
479 		sc->in_stats.all_rx_number++;
480 		sc->in_stats.bad_rx_number++;
481 	}
482 
483 	return (!frame_ok || framelen > 4);
484 }
485 
486 
487 static void
488 send_frame(struct sbni_softc *sc)
489 {
490 	u_int32_t crc;
491 	u_char csr0;
492 
493 	crc = CRC32_INITIAL;
494 	if (sc->state & FL_NEED_RESEND) {
495 
496 		/* if frame was sended but not ACK'ed - resend it */
497 		if (sc->trans_errors) {
498 			sc->trans_errors--;
499 			if (sc->framelen != 0)
500 				sc->in_stats.resend_tx_number++;
501 		} else {
502 			/* cannot xmit with many attempts */
503 			drop_xmit_queue(sc);
504 			goto do_send;
505 		}
506 	} else
507 		sc->trans_errors = TR_ERROR_COUNT;
508 
509 	send_frame_header(sc, &crc);
510 	sc->state |= FL_NEED_RESEND;
511 	/*
512 	 * FL_NEED_RESEND will be cleared after ACK, but if empty
513 	 * frame sended then in prepare_to_send next frame
514 	 */
515 
516 
517 	if (sc->framelen) {
518 		download_data(sc, &crc);
519 		sc->in_stats.all_tx_number++;
520 		sc->state |= FL_WAIT_ACK;
521 	}
522 
523 	sbni_outsb(sc, (u_char *)&crc, sizeof crc);
524 
525 do_send:
526 	csr0 = sbni_inb(sc, CSR0);
527 	sbni_outb(sc, CSR0, csr0 & ~TR_REQ);
528 
529 	if (sc->tx_frameno) {
530 		/* next frame exists - request to send */
531 		sbni_outb(sc, CSR0, csr0 | TR_REQ);
532 	}
533 }
534 
535 
536 static void
537 download_data(struct sbni_softc *sc, u_int32_t *crc_p)
538 {
539 	struct mbuf *m;
540 	caddr_t	data_p;
541 	u_int data_len, pos, slice;
542 
543 	data_p = NULL;		/* initialized to avoid warn */
544 	pos = 0;
545 
546 	for (m = sc->tx_buf_p;  m != NULL && pos < sc->pktlen;  m = m->m_next) {
547 		if (pos + m->m_len > sc->outpos) {
548 			data_len = m->m_len - (sc->outpos - pos);
549 			data_p = mtod(m, caddr_t) + (sc->outpos - pos);
550 
551 			goto do_copy;
552 		} else
553 			pos += m->m_len;
554 	}
555 
556 	data_len = 0;
557 
558 do_copy:
559 	pos = 0;
560 	do {
561 		if (data_len) {
562 			slice = min(data_len, sc->framelen - pos);
563 			sbni_outsb(sc, data_p, slice);
564 			*crc_p = calc_crc32(*crc_p, data_p, slice);
565 
566 			pos += slice;
567 			if (data_len -= slice)
568 				data_p += slice;
569 			else {
570 				do {
571 					m = m->m_next;
572 				} while (m != NULL && m->m_len == 0);
573 
574 				if (m) {
575 					data_len = m->m_len;
576 					data_p = mtod(m, caddr_t);
577 				}
578 			}
579 		} else {
580 			/* frame too short - zero padding */
581 
582 			pos = sc->framelen - pos;
583 			while (pos--) {
584 				sbni_outb(sc, DAT, 0);
585 				*crc_p = CRC32(0, *crc_p);
586 			}
587 			return;
588 		}
589 	} while (pos < sc->framelen);
590 }
591 
592 
593 static int
594 upload_data(struct sbni_softc *sc, u_int framelen, u_int frameno,
595 	    u_int is_first, u_int32_t crc)
596 {
597 	int frame_ok;
598 
599 	if (is_first) {
600 		sc->wait_frameno = frameno;
601 		sc->inppos = 0;
602 	}
603 
604 	if (sc->wait_frameno == frameno) {
605 
606 		if (sc->inppos + framelen  <=  ETHER_MAX_LEN) {
607 			frame_ok = append_frame_to_pkt(sc, framelen, crc);
608 
609 		/*
610 		 * if CRC is right but framelen incorrect then transmitter
611 		 * error was occurred... drop entire packet
612 		 */
613 		} else if ((frame_ok = skip_tail(sc, framelen, crc)) != 0) {
614 			sc->wait_frameno = 0;
615 			sc->inppos = 0;
616 			if_inc_counter(sc->ifp, IFCOUNTER_IERRORS, 1);
617 			/* now skip all frames until is_first != 0 */
618 		}
619 	} else
620 		frame_ok = skip_tail(sc, framelen, crc);
621 
622 	if (is_first && !frame_ok) {
623 		/*
624 		 * Frame has been violated, but we have stored
625 		 * is_first already... Drop entire packet.
626 		 */
627 		sc->wait_frameno = 0;
628 		if_inc_counter(sc->ifp, IFCOUNTER_IERRORS, 1);
629 	}
630 
631 	return (frame_ok);
632 }
633 
634 
635 static __inline void	send_complete(struct sbni_softc *);
636 
637 static __inline void
638 send_complete(struct sbni_softc *sc)
639 {
640 	m_freem(sc->tx_buf_p);
641 	sc->tx_buf_p = NULL;
642 	if_inc_counter(sc->ifp, IFCOUNTER_OPACKETS, 1);
643 }
644 
645 
646 static void
647 interpret_ack(struct sbni_softc *sc, u_int ack)
648 {
649 	if (ack == FRAME_SENT_OK) {
650 		sc->state &= ~FL_NEED_RESEND;
651 
652 		if (sc->state & FL_WAIT_ACK) {
653 			sc->outpos += sc->framelen;
654 
655 			if (--sc->tx_frameno) {
656 				sc->framelen = min(
657 				    sc->maxframe, sc->pktlen - sc->outpos);
658 			} else {
659 				send_complete(sc);
660 				prepare_to_send(sc);
661 			}
662 		}
663 	}
664 
665 	sc->state &= ~FL_WAIT_ACK;
666 }
667 
668 
669 /*
670  * Glue received frame with previous fragments of packet.
671  * Indicate packet when last frame would be accepted.
672  */
673 
674 static int
675 append_frame_to_pkt(struct sbni_softc *sc, u_int framelen, u_int32_t crc)
676 {
677 	caddr_t p;
678 
679 	if (sc->inppos + framelen > ETHER_MAX_LEN)
680 		return (0);
681 
682 	if (!sc->rx_buf_p && !get_rx_buf(sc))
683 		return (0);
684 
685 	p = sc->rx_buf_p->m_data + sc->inppos;
686 	sbni_insb(sc, p, framelen);
687 	if (calc_crc32(crc, p, framelen) != CRC32_REMAINDER)
688 		return (0);
689 
690 	sc->inppos += framelen - 4;
691 	if (--sc->wait_frameno == 0) {		/* last frame received */
692 		indicate_pkt(sc);
693 		if_inc_counter(sc->ifp, IFCOUNTER_IPACKETS, 1);
694 	}
695 
696 	return (1);
697 }
698 
699 
700 /*
701  * Prepare to start output on adapter. Current priority must be set to splimp
702  * before this routine is called.
703  * Transmitter will be actually activated when marker has been accepted.
704  */
705 
706 static void
707 prepare_to_send(struct sbni_softc *sc)
708 {
709 	struct mbuf *m;
710 	u_int len;
711 
712 	/* sc->tx_buf_p == NULL here! */
713 	if (sc->tx_buf_p)
714 		printf("sbni: memory leak!\n");
715 
716 	sc->outpos = 0;
717 	sc->state &= ~(FL_WAIT_ACK | FL_NEED_RESEND);
718 
719 	for (;;) {
720 		IF_DEQUEUE(&sc->ifp->if_snd, sc->tx_buf_p);
721 		if (!sc->tx_buf_p) {
722 			/* nothing to transmit... */
723 			sc->pktlen     = 0;
724 			sc->tx_frameno = 0;
725 			sc->framelen   = 0;
726 			sc->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
727 			return;
728 		}
729 
730 		for (len = 0, m = sc->tx_buf_p;  m;  m = m->m_next)
731 			len += m->m_len;
732 
733 		if (len != 0)
734 			break;
735 		m_freem(sc->tx_buf_p);
736 	}
737 
738 	if (len < SBNI_MIN_LEN)
739 		len = SBNI_MIN_LEN;
740 
741 	sc->pktlen	= len;
742 	sc->tx_frameno	= howmany(len, sc->maxframe);
743 	sc->framelen	= min(len, sc->maxframe);
744 
745 	sbni_outb(sc, CSR0, sbni_inb(sc, CSR0) | TR_REQ);
746 	sc->ifp->if_drv_flags |= IFF_DRV_OACTIVE;
747 	BPF_MTAP(sc->ifp, sc->tx_buf_p);
748 }
749 
750 
751 static void
752 drop_xmit_queue(struct sbni_softc *sc)
753 {
754 	struct mbuf *m;
755 
756 	if (sc->tx_buf_p) {
757 		m_freem(sc->tx_buf_p);
758 		sc->tx_buf_p = NULL;
759 		if_inc_counter(sc->ifp, IFCOUNTER_OERRORS, 1);
760 	}
761 
762 	for (;;) {
763 		IF_DEQUEUE(&sc->ifp->if_snd, m);
764 		if (m == NULL)
765 			break;
766 		m_freem(m);
767 		if_inc_counter(sc->ifp, IFCOUNTER_OERRORS, 1);
768 	}
769 
770 	sc->tx_frameno	= 0;
771 	sc->framelen	= 0;
772 	sc->outpos	= 0;
773 	sc->state &= ~(FL_WAIT_ACK | FL_NEED_RESEND);
774 	sc->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
775 }
776 
777 
778 static void
779 send_frame_header(struct sbni_softc *sc, u_int32_t *crc_p)
780 {
781 	u_int32_t crc;
782 	u_int len_field;
783 	u_char value;
784 
785 	crc = *crc_p;
786 	len_field = sc->framelen + 6;	/* CRC + frameno + reserved */
787 
788 	if (sc->state & FL_NEED_RESEND)
789 		len_field |= FRAME_RETRY;	/* non-first attempt... */
790 
791 	if (sc->outpos == 0)
792 		len_field |= FRAME_FIRST;
793 
794 	len_field |= (sc->state & FL_PREV_OK) ? FRAME_SENT_OK : FRAME_SENT_BAD;
795 	sbni_outb(sc, DAT, SBNI_SIG);
796 
797 	value = (u_char)len_field;
798 	sbni_outb(sc, DAT, value);
799 	crc = CRC32(value, crc);
800 	value = (u_char)(len_field >> 8);
801 	sbni_outb(sc, DAT, value);
802 	crc = CRC32(value, crc);
803 
804 	sbni_outb(sc, DAT, sc->tx_frameno);
805 	crc = CRC32(sc->tx_frameno, crc);
806 	sbni_outb(sc, DAT, 0);
807 	crc = CRC32(0, crc);
808 	*crc_p = crc;
809 }
810 
811 
812 /*
813  * if frame tail not needed (incorrect number or received twice),
814  * it won't store, but CRC will be calculated
815  */
816 
817 static int
818 skip_tail(struct sbni_softc *sc, u_int tail_len, u_int32_t crc)
819 {
820 	while (tail_len--)
821 		crc = CRC32(sbni_inb(sc, DAT), crc);
822 
823 	return (crc == CRC32_REMAINDER);
824 }
825 
826 
827 static int
828 check_fhdr(struct sbni_softc *sc, u_int *framelen, u_int *frameno,
829 	   u_int *ack, u_int *is_first, u_int32_t *crc_p)
830 {
831 	u_int32_t crc;
832 	u_char value;
833 
834 	crc = *crc_p;
835 	if (sbni_inb(sc, DAT) != SBNI_SIG)
836 		return (0);
837 
838 	value = sbni_inb(sc, DAT);
839 	*framelen = (u_int)value;
840 	crc = CRC32(value, crc);
841 	value = sbni_inb(sc, DAT);
842 	*framelen |= ((u_int)value) << 8;
843 	crc = CRC32(value, crc);
844 
845 	*ack = *framelen & FRAME_ACK_MASK;
846 	*is_first = (*framelen & FRAME_FIRST) != 0;
847 
848 	if ((*framelen &= FRAME_LEN_MASK) < 6 || *framelen > SBNI_MAX_FRAME - 3)
849 		return (0);
850 
851 	value = sbni_inb(sc, DAT);
852 	*frameno = (u_int)value;
853 	crc = CRC32(value, crc);
854 
855 	crc = CRC32(sbni_inb(sc, DAT), crc);		/* reserved byte */
856 	*framelen -= 2;
857 
858 	*crc_p = crc;
859 	return (1);
860 }
861 
862 
863 static int
864 get_rx_buf(struct sbni_softc *sc)
865 {
866 	struct mbuf *m;
867 
868 	MGETHDR(m, M_NOWAIT, MT_DATA);
869 	if (m == NULL) {
870 		if_printf(sc->ifp, "cannot allocate header mbuf\n");
871 		return (0);
872 	}
873 
874 	/*
875 	 * We always put the received packet in a single buffer -
876 	 * either with just an mbuf header or in a cluster attached
877 	 * to the header. The +2 is to compensate for the alignment
878 	 * fixup below.
879 	 */
880 	if (ETHER_MAX_LEN + 2 > MHLEN) {
881 		/* Attach an mbuf cluster */
882 		if (!(MCLGET(m, M_NOWAIT))) {
883 			m_freem(m);
884 			return (0);
885 		}
886 	}
887 	m->m_pkthdr.len = m->m_len = ETHER_MAX_LEN + 2;
888 
889 	/*
890 	 * The +2 is to longword align the start of the real packet.
891 	 * (sizeof ether_header == 14)
892 	 * This is important for NFS.
893 	 */
894 	m_adj(m, 2);
895 	sc->rx_buf_p = m;
896 	return (1);
897 }
898 
899 
900 static void
901 indicate_pkt(struct sbni_softc *sc)
902 {
903 	struct ifnet *ifp = sc->ifp;
904 	struct mbuf *m;
905 
906 	m = sc->rx_buf_p;
907 	m->m_pkthdr.rcvif = ifp;
908 	m->m_pkthdr.len   = m->m_len = sc->inppos;
909 	sc->rx_buf_p = NULL;
910 
911 	SBNI_UNLOCK(sc);
912 	(*ifp->if_input)(ifp, m);
913 	SBNI_LOCK(sc);
914 }
915 
916 /* -------------------------------------------------------------------------- */
917 
918 /*
919  * Routine checks periodically wire activity and regenerates marker if
920  * connect was inactive for a long time.
921  */
922 
923 static void
924 sbni_timeout(void *xsc)
925 {
926 	struct sbni_softc *sc;
927 	u_char csr0;
928 
929 	sc = (struct sbni_softc *)xsc;
930 	SBNI_ASSERT_LOCKED(sc);
931 
932 	csr0 = sbni_inb(sc, CSR0);
933 	if (csr0 & RC_CHK) {
934 
935 		if (sc->timer_ticks) {
936 			if (csr0 & (RC_RDY | BU_EMP))
937 				/* receiving not active */
938 				sc->timer_ticks--;
939 		} else {
940 			sc->in_stats.timeout_number++;
941 			if (sc->delta_rxl)
942 				timeout_change_level(sc);
943 
944 			sbni_outb(sc, CSR1, *(u_char *)&sc->csr1 | PR_RES);
945 			csr0 = sbni_inb(sc, CSR0);
946 		}
947 	}
948 
949 	sbni_outb(sc, CSR0, csr0 | RC_CHK);
950 	callout_reset(&sc->wch, hz/SBNI_HZ, sbni_timeout, sc);
951 }
952 
953 /* -------------------------------------------------------------------------- */
954 
955 static void
956 card_start(struct sbni_softc *sc)
957 {
958 	sc->timer_ticks = CHANGE_LEVEL_START_TICKS;
959 	sc->state &= ~(FL_WAIT_ACK | FL_NEED_RESEND);
960 	sc->state |= FL_PREV_OK;
961 
962 	sc->inppos = 0;
963 	sc->wait_frameno = 0;
964 
965 	sbni_outb(sc, CSR1, *(u_char *)&sc->csr1 | PR_RES);
966 	sbni_outb(sc, CSR0, EN_INT);
967 }
968 
969 /* -------------------------------------------------------------------------- */
970 
971 static u_char rxl_tab[] = {
972 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x08,
973 	0x0a, 0x0c, 0x0f, 0x16, 0x18, 0x1a, 0x1c, 0x1f
974 };
975 
976 #define SIZE_OF_TIMEOUT_RXL_TAB 4
977 static u_char timeout_rxl_tab[] = {
978 	0x03, 0x05, 0x08, 0x0b
979 };
980 
981 static void
982 set_initial_values(struct sbni_softc *sc, struct sbni_flags flags)
983 {
984 	if (flags.fixed_rxl) {
985 		sc->delta_rxl = 0; /* disable receive level autodetection */
986 		sc->cur_rxl_index = flags.rxl;
987 	} else {
988 		sc->delta_rxl = DEF_RXL_DELTA;
989 		sc->cur_rxl_index = DEF_RXL;
990 	}
991 
992 	sc->csr1.rate = flags.fixed_rate ? flags.rate : DEFAULT_RATE;
993 	sc->csr1.rxl  = rxl_tab[sc->cur_rxl_index];
994 	sc->maxframe  = DEFAULT_FRAME_LEN;
995 
996 	/*
997 	 * generate Ethernet address (0x00ff01xxxxxx)
998 	 */
999 	*(u_int16_t *) sc->enaddr = htons(0x00ff);
1000 	if (flags.mac_addr) {
1001 		*(u_int32_t *) (sc->enaddr + 2) =
1002 		    htonl(flags.mac_addr | 0x01000000);
1003 	} else {
1004 		*(u_char *) (sc->enaddr + 2) = 0x01;
1005 		read_random(sc->enaddr + 3, 3);
1006 	}
1007 }
1008 
1009 
1010 #ifdef SBNI_DUAL_COMPOUND
1011 void
1012 sbni_add(struct sbni_softc *sc)
1013 {
1014 
1015 	mtx_lock(&headlist_lock);
1016 	sc->link = sbni_headlist;
1017 	sbni_headlist = sc;
1018 	mtx_unlock(&headlist_lock);
1019 }
1020 
1021 struct sbni_softc *
1022 connect_to_master(struct sbni_softc *sc)
1023 {
1024 	struct sbni_softc *p, *p_prev;
1025 
1026 	mtx_lock(&headlist_lock);
1027 	for (p = sbni_headlist, p_prev = NULL; p; p_prev = p, p = p->link) {
1028 		if (rman_get_start(p->io_res) == rman_get_start(sc->io_res) + 4 ||
1029 		    rman_get_start(p->io_res) == rman_get_start(sc->io_res) - 4) {
1030 			p->slave_sc = sc;
1031 			if (p_prev)
1032 				p_prev->link = p->link;
1033 			else
1034 				sbni_headlist = p->link;
1035 			mtx_unlock(&headlist_lock);
1036 			return p;
1037 		}
1038 	}
1039 	mtx_unlock(&headlist_lock);
1040 
1041 	return (NULL);
1042 }
1043 
1044 #endif	/* SBNI_DUAL_COMPOUND */
1045 
1046 
1047 /* Receive level auto-selection */
1048 
1049 static void
1050 change_level(struct sbni_softc *sc)
1051 {
1052 	if (sc->delta_rxl == 0)		/* do not auto-negotiate RxL */
1053 		return;
1054 
1055 	if (sc->cur_rxl_index == 0)
1056 		sc->delta_rxl = 1;
1057 	else if (sc->cur_rxl_index == 15)
1058 		sc->delta_rxl = -1;
1059 	else if (sc->cur_rxl_rcvd < sc->prev_rxl_rcvd)
1060 		sc->delta_rxl = -sc->delta_rxl;
1061 
1062 	sc->csr1.rxl = rxl_tab[sc->cur_rxl_index += sc->delta_rxl];
1063 	sbni_inb(sc, CSR0);	/* it needed for PCI cards */
1064 	sbni_outb(sc, CSR1, *(u_char *)&sc->csr1);
1065 
1066 	sc->prev_rxl_rcvd = sc->cur_rxl_rcvd;
1067 	sc->cur_rxl_rcvd  = 0;
1068 }
1069 
1070 
1071 static void
1072 timeout_change_level(struct sbni_softc *sc)
1073 {
1074 	sc->cur_rxl_index = timeout_rxl_tab[sc->timeout_rxl];
1075 	if (++sc->timeout_rxl >= 4)
1076 		sc->timeout_rxl = 0;
1077 
1078 	sc->csr1.rxl = rxl_tab[sc->cur_rxl_index];
1079 	sbni_inb(sc, CSR0);
1080 	sbni_outb(sc, CSR1, *(u_char *)&sc->csr1);
1081 
1082 	sc->prev_rxl_rcvd = sc->cur_rxl_rcvd;
1083 	sc->cur_rxl_rcvd  = 0;
1084 }
1085 
1086 /* -------------------------------------------------------------------------- */
1087 
1088 /*
1089  * Process an ioctl request. This code needs some work - it looks
1090  *	pretty ugly.
1091  */
1092 
1093 static int
1094 sbni_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
1095 {
1096 	struct sbni_softc *sc;
1097 	struct ifreq *ifr;
1098 	struct thread *td;
1099 	struct sbni_in_stats *in_stats;
1100 	struct sbni_flags flags;
1101 	int error;
1102 
1103 	sc = ifp->if_softc;
1104 	ifr = (struct ifreq *)data;
1105 	td = curthread;
1106 	error = 0;
1107 
1108 	switch (command) {
1109 	case SIOCSIFFLAGS:
1110 		/*
1111 		 * If the interface is marked up and stopped, then start it.
1112 		 * If it is marked down and running, then stop it.
1113 		 */
1114 		SBNI_LOCK(sc);
1115 		if (ifp->if_flags & IFF_UP) {
1116 			if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
1117 				sbni_init_locked(sc);
1118 		} else {
1119 			if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1120 				sbni_stop(sc);
1121 			}
1122 		}
1123 		SBNI_UNLOCK(sc);
1124 		break;
1125 
1126 	case SIOCADDMULTI:
1127 	case SIOCDELMULTI:
1128 		/*
1129 		 * Multicast list has changed; set the hardware filter
1130 		 * accordingly.
1131 		 */
1132 		error = 0;
1133 		/* if (ifr == NULL)
1134 			error = EAFNOSUPPORT; */
1135 		break;
1136 
1137 		/*
1138 		 * SBNI specific ioctl
1139 		 */
1140 	case SIOCGHWFLAGS:	/* get flags */
1141 		SBNI_LOCK(sc);
1142 		bcopy((caddr_t)IF_LLADDR(sc->ifp)+3, (caddr_t) &flags, 3);
1143 		flags.rxl = sc->cur_rxl_index;
1144 		flags.rate = sc->csr1.rate;
1145 		flags.fixed_rxl = (sc->delta_rxl == 0);
1146 		flags.fixed_rate = 1;
1147 		SBNI_UNLOCK(sc);
1148 		bcopy(&flags, &ifr->ifr_ifru, sizeof(flags));
1149 		break;
1150 
1151 	case SIOCGINSTATS:
1152 		in_stats = malloc(sizeof(struct sbni_in_stats), M_DEVBUF,
1153 		    M_WAITOK);
1154 		SBNI_LOCK(sc);
1155 		bcopy(&sc->in_stats, in_stats, sizeof(struct sbni_in_stats));
1156 		SBNI_UNLOCK(sc);
1157 		error = copyout(in_stats, ifr_data_get_ptr(ifr),
1158 		    sizeof(struct sbni_in_stats));
1159 		free(in_stats, M_DEVBUF);
1160 		break;
1161 
1162 	case SIOCSHWFLAGS:	/* set flags */
1163 		/* root only */
1164 		error = priv_check(td, PRIV_DRIVER);
1165 		if (error)
1166 			break;
1167 		bcopy(&ifr->ifr_ifru, &flags, sizeof(flags));
1168 		SBNI_LOCK(sc);
1169 		if (flags.fixed_rxl) {
1170 			sc->delta_rxl = 0;
1171 			sc->cur_rxl_index = flags.rxl;
1172 		} else {
1173 			sc->delta_rxl = DEF_RXL_DELTA;
1174 			sc->cur_rxl_index = DEF_RXL;
1175 		}
1176 		sc->csr1.rxl = rxl_tab[sc->cur_rxl_index];
1177 		sc->csr1.rate = flags.fixed_rate ? flags.rate : DEFAULT_RATE;
1178 		if (flags.mac_addr)
1179 			bcopy((caddr_t) &flags,
1180 			      (caddr_t) IF_LLADDR(sc->ifp)+3, 3);
1181 
1182 		/* Don't be afraid... */
1183 		sbni_outb(sc, CSR1, *(char*)(&sc->csr1) | PR_RES);
1184 		SBNI_UNLOCK(sc);
1185 		break;
1186 
1187 	case SIOCRINSTATS:
1188 		SBNI_LOCK(sc);
1189 		if (!(error = priv_check(td, PRIV_DRIVER)))	/* root only */
1190 			bzero(&sc->in_stats, sizeof(struct sbni_in_stats));
1191 		SBNI_UNLOCK(sc);
1192 		break;
1193 
1194 	default:
1195 		error = ether_ioctl(ifp, command, data);
1196 		break;
1197 	}
1198 
1199 	return (error);
1200 }
1201 
1202 /* -------------------------------------------------------------------------- */
1203 
1204 static u_int32_t
1205 calc_crc32(u_int32_t crc, caddr_t p, u_int len)
1206 {
1207 	while (len--)
1208 		crc = CRC32(*p++, crc);
1209 
1210 	return (crc);
1211 }
1212 
1213 static u_int32_t crc32tab[] __aligned(8) = {
1214 	0xD202EF8D,  0xA505DF1B,  0x3C0C8EA1,  0x4B0BBE37,
1215 	0xD56F2B94,  0xA2681B02,  0x3B614AB8,  0x4C667A2E,
1216 	0xDCD967BF,  0xABDE5729,  0x32D70693,  0x45D03605,
1217 	0xDBB4A3A6,  0xACB39330,  0x35BAC28A,  0x42BDF21C,
1218 	0xCFB5FFE9,  0xB8B2CF7F,  0x21BB9EC5,  0x56BCAE53,
1219 	0xC8D83BF0,  0xBFDF0B66,  0x26D65ADC,  0x51D16A4A,
1220 	0xC16E77DB,  0xB669474D,  0x2F6016F7,  0x58672661,
1221 	0xC603B3C2,  0xB1048354,  0x280DD2EE,  0x5F0AE278,
1222 	0xE96CCF45,  0x9E6BFFD3,  0x0762AE69,  0x70659EFF,
1223 	0xEE010B5C,  0x99063BCA,  0x000F6A70,  0x77085AE6,
1224 	0xE7B74777,  0x90B077E1,  0x09B9265B,  0x7EBE16CD,
1225 	0xE0DA836E,  0x97DDB3F8,  0x0ED4E242,  0x79D3D2D4,
1226 	0xF4DBDF21,  0x83DCEFB7,  0x1AD5BE0D,  0x6DD28E9B,
1227 	0xF3B61B38,  0x84B12BAE,  0x1DB87A14,  0x6ABF4A82,
1228 	0xFA005713,  0x8D076785,  0x140E363F,  0x630906A9,
1229 	0xFD6D930A,  0x8A6AA39C,  0x1363F226,  0x6464C2B0,
1230 	0xA4DEAE1D,  0xD3D99E8B,  0x4AD0CF31,  0x3DD7FFA7,
1231 	0xA3B36A04,  0xD4B45A92,  0x4DBD0B28,  0x3ABA3BBE,
1232 	0xAA05262F,  0xDD0216B9,  0x440B4703,  0x330C7795,
1233 	0xAD68E236,  0xDA6FD2A0,  0x4366831A,  0x3461B38C,
1234 	0xB969BE79,  0xCE6E8EEF,  0x5767DF55,  0x2060EFC3,
1235 	0xBE047A60,  0xC9034AF6,  0x500A1B4C,  0x270D2BDA,
1236 	0xB7B2364B,  0xC0B506DD,  0x59BC5767,  0x2EBB67F1,
1237 	0xB0DFF252,  0xC7D8C2C4,  0x5ED1937E,  0x29D6A3E8,
1238 	0x9FB08ED5,  0xE8B7BE43,  0x71BEEFF9,  0x06B9DF6F,
1239 	0x98DD4ACC,  0xEFDA7A5A,  0x76D32BE0,  0x01D41B76,
1240 	0x916B06E7,  0xE66C3671,  0x7F6567CB,  0x0862575D,
1241 	0x9606C2FE,  0xE101F268,  0x7808A3D2,  0x0F0F9344,
1242 	0x82079EB1,  0xF500AE27,  0x6C09FF9D,  0x1B0ECF0B,
1243 	0x856A5AA8,  0xF26D6A3E,  0x6B643B84,  0x1C630B12,
1244 	0x8CDC1683,  0xFBDB2615,  0x62D277AF,  0x15D54739,
1245 	0x8BB1D29A,  0xFCB6E20C,  0x65BFB3B6,  0x12B88320,
1246 	0x3FBA6CAD,  0x48BD5C3B,  0xD1B40D81,  0xA6B33D17,
1247 	0x38D7A8B4,  0x4FD09822,  0xD6D9C998,  0xA1DEF90E,
1248 	0x3161E49F,  0x4666D409,  0xDF6F85B3,  0xA868B525,
1249 	0x360C2086,  0x410B1010,  0xD80241AA,  0xAF05713C,
1250 	0x220D7CC9,  0x550A4C5F,  0xCC031DE5,  0xBB042D73,
1251 	0x2560B8D0,  0x52678846,  0xCB6ED9FC,  0xBC69E96A,
1252 	0x2CD6F4FB,  0x5BD1C46D,  0xC2D895D7,  0xB5DFA541,
1253 	0x2BBB30E2,  0x5CBC0074,  0xC5B551CE,  0xB2B26158,
1254 	0x04D44C65,  0x73D37CF3,  0xEADA2D49,  0x9DDD1DDF,
1255 	0x03B9887C,  0x74BEB8EA,  0xEDB7E950,  0x9AB0D9C6,
1256 	0x0A0FC457,  0x7D08F4C1,  0xE401A57B,  0x930695ED,
1257 	0x0D62004E,  0x7A6530D8,  0xE36C6162,  0x946B51F4,
1258 	0x19635C01,  0x6E646C97,  0xF76D3D2D,  0x806A0DBB,
1259 	0x1E0E9818,  0x6909A88E,  0xF000F934,  0x8707C9A2,
1260 	0x17B8D433,  0x60BFE4A5,  0xF9B6B51F,  0x8EB18589,
1261 	0x10D5102A,  0x67D220BC,  0xFEDB7106,  0x89DC4190,
1262 	0x49662D3D,  0x3E611DAB,  0xA7684C11,  0xD06F7C87,
1263 	0x4E0BE924,  0x390CD9B2,  0xA0058808,  0xD702B89E,
1264 	0x47BDA50F,  0x30BA9599,  0xA9B3C423,  0xDEB4F4B5,
1265 	0x40D06116,  0x37D75180,  0xAEDE003A,  0xD9D930AC,
1266 	0x54D13D59,  0x23D60DCF,  0xBADF5C75,  0xCDD86CE3,
1267 	0x53BCF940,  0x24BBC9D6,  0xBDB2986C,  0xCAB5A8FA,
1268 	0x5A0AB56B,  0x2D0D85FD,  0xB404D447,  0xC303E4D1,
1269 	0x5D677172,  0x2A6041E4,  0xB369105E,  0xC46E20C8,
1270 	0x72080DF5,  0x050F3D63,  0x9C066CD9,  0xEB015C4F,
1271 	0x7565C9EC,  0x0262F97A,  0x9B6BA8C0,  0xEC6C9856,
1272 	0x7CD385C7,  0x0BD4B551,  0x92DDE4EB,  0xE5DAD47D,
1273 	0x7BBE41DE,  0x0CB97148,  0x95B020F2,  0xE2B71064,
1274 	0x6FBF1D91,  0x18B82D07,  0x81B17CBD,  0xF6B64C2B,
1275 	0x68D2D988,  0x1FD5E91E,  0x86DCB8A4,  0xF1DB8832,
1276 	0x616495A3,  0x1663A535,  0x8F6AF48F,  0xF86DC419,
1277 	0x660951BA,  0x110E612C,  0x88073096,  0xFF000000
1278 };
1279