]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/i386/isa/elink.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / i386 / isa / elink.c
1 /*-
2  * Copyright (c) 1994 Charles Hannum.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  * 3. All advertising materials mentioning features or use of this software
13  *    must display the following acknowledgement:
14  *      This product includes software developed by Charles Hannum.
15  * 4. The name of the author may not be used to endorse or promote products
16  *    derived from this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 #include <sys/cdefs.h>
31 __FBSDID("$FreeBSD$");
32
33 /*
34  * Common code for dealing with 3COM ethernet cards.
35  */
36
37 #include <sys/param.h>
38 #include <sys/systm.h>
39 #include <sys/kernel.h>
40 #include <sys/module.h>
41
42 #include <machine/cpufunc.h>
43
44 #include <i386/isa/elink.h>
45
46 /*
47  * Issue a `global reset' to all cards.  We have to be careful to do this only
48  * once during autoconfig, to prevent resetting boards that have already been
49  * configured.
50  */
51 void
52 elink_reset()
53 {
54         static int x = 0;
55
56         if (x == 0) {
57                 x = 1;
58                 outb(ELINK_ID_PORT, ELINK_RESET);
59         }
60         outb(ELINK_ID_PORT, 0);
61         outb(ELINK_ID_PORT, 0);
62
63         return;
64 }
65
66 /*
67  * The `ID sequence' is really just snapshots of an 8-bit CRC register as 0
68  * bits are shifted in.  Different board types use different polynomials.
69  */
70 void
71 elink_idseq(u_char p)
72 {
73         register int i;
74         register u_char c;
75
76         c = 0xff;
77         for (i = 255; i; i--) {
78                 outb(ELINK_ID_PORT, c);
79                 if (c & 0x80) {
80                         c <<= 1;
81                         c ^= p;
82                 } else
83                         c <<= 1;
84         }
85 }
86
87 static moduledata_t elink_mod = {
88         "elink",/* module name */
89         NULL,   /* event handler */
90         0       /* extra data */
91 };
92
93 DECLARE_MODULE(elink, elink_mod, SI_SUB_PSEUDO, SI_ORDER_ANY);
94 MODULE_VERSION(elink, 1);