Annotation of sys/dev/ic/rtl80x9.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: rtl80x9.c,v 1.7 2003/06/25 17:35:36 miod Exp $ */
2: /* $NetBSD: rtl80x9.c,v 1.1 1998/10/31 00:44:33 thorpej Exp $ */
3:
4: /*-
5: * Copyright (c) 1998 The NetBSD Foundation, Inc.
6: * All rights reserved.
7: *
8: * This code is derived from software contributed to The NetBSD Foundation
9: * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
10: * NASA Ames Research Center.
11: *
12: * Redistribution and use in source and binary forms, with or without
13: * modification, are permitted provided that the following conditions
14: * are met:
15: * 1. Redistributions of source code must retain the above copyright
16: * notice, this list of conditions and the following disclaimer.
17: * 2. Redistributions in binary form must reproduce the above copyright
18: * notice, this list of conditions and the following disclaimer in the
19: * documentation and/or other materials provided with the distribution.
20: * 3. All advertising materials mentioning features or use of this software
21: * must display the following acknowledgement:
22: * This product includes software developed by the NetBSD
23: * Foundation, Inc. and its contributors.
24: * 4. Neither the name of The NetBSD Foundation nor the names of its
25: * contributors may be used to endorse or promote products derived
26: * from this software without specific prior written permission.
27: *
28: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
29: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
30: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
31: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
32: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
33: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
34: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
35: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
36: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
37: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38: * POSSIBILITY OF SUCH DAMAGE.
39: */
40:
41: #include "bpfilter.h"
42:
43: #include <sys/param.h>
44: #include <sys/systm.h>
45: #include <sys/mbuf.h>
46: #include <sys/syslog.h>
47: #include <sys/socket.h>
48: #include <sys/device.h>
49:
50: #include <net/if.h>
51: #include <net/if_media.h>
52:
53: #ifdef INET
54: #include <netinet/in.h>
55: #include <netinet/if_ether.h>
56: #endif
57:
58: #include <machine/bus.h>
59:
60: #include <dev/ic/dp8390reg.h>
61: #include <dev/ic/dp8390var.h>
62:
63: #include <dev/ic/ne2000reg.h>
64: #include <dev/ic/ne2000var.h>
65:
66: #include <dev/ic/rtl80x9reg.h>
67: #include <dev/ic/rtl80x9var.h>
68:
69: int
70: rtl80x9_mediachange(dsc)
71: struct dp8390_softc *dsc;
72: {
73:
74: /*
75: * Current media is already set up. Just reset the interface
76: * to let the new value take hold. The new media will be
77: * set up in ne_pci_rtl8029_init_card() called via dp8390_init().
78: */
79: dp8390_reset(dsc);
80: return (0);
81: }
82:
83: void
84: rtl80x9_mediastatus(sc, ifmr)
85: struct dp8390_softc *sc;
86: struct ifmediareq *ifmr;
87: {
88: struct ifnet *ifp = &sc->sc_arpcom.ac_if;
89: u_int8_t cr_proto = sc->cr_proto |
90: ((ifp->if_flags & IFF_RUNNING) ? ED_CR_STA : ED_CR_STP);
91:
92: /*
93: * Sigh, can detect which media is being used, but can't
94: * detect if we have link or not.
95: */
96:
97: /* Set NIC to page 3 registers. */
98: NIC_PUT(sc->sc_regt, sc->sc_regh, ED_P0_CR, cr_proto | ED_CR_PAGE_3);
99:
100: if (NIC_GET(sc->sc_regt, sc->sc_regh, NERTL_RTL3_CONFIG0) &
101: RTL3_CONFIG0_BNC)
102: ifmr->ifm_active = IFM_ETHER|IFM_10_2;
103: else {
104: ifmr->ifm_active = IFM_ETHER|IFM_10_T;
105: if (NIC_GET(sc->sc_regt, sc->sc_regh, NERTL_RTL3_CONFIG3) &
106: RTL3_CONFIG3_FUDUP)
107: ifmr->ifm_active |= IFM_FDX;
108: }
109:
110: /* Set NIC to page 0 registers. */
111: NIC_PUT(sc->sc_regt, sc->sc_regh, ED_P0_CR, cr_proto | ED_CR_PAGE_0);
112: }
113:
114: void
115: rtl80x9_init_card(sc)
116: struct dp8390_softc *sc;
117: {
118: struct ifmedia *ifm = &sc->sc_media;
119: struct ifnet *ifp = &sc->sc_arpcom.ac_if;
120: u_int8_t cr_proto = sc->cr_proto |
121: ((ifp->if_flags & IFF_RUNNING) ? ED_CR_STA : ED_CR_STP);
122: u_int8_t reg;
123:
124: /* Set NIC to page 3 registers. */
125: NIC_PUT(sc->sc_regt, sc->sc_regh, ED_P0_CR, cr_proto | ED_CR_PAGE_3);
126:
127: /* write enable config1-3. */
128: NIC_PUT(sc->sc_regt, sc->sc_regh, NERTL_RTL3_EECR,
129: RTL3_EECR_EEM1|RTL3_EECR_EEM0);
130:
131: /* First, set basic media type. */
132: reg = NIC_GET(sc->sc_regt, sc->sc_regh, NERTL_RTL3_CONFIG2);
133: reg &= ~(RTL3_CONFIG2_PL1|RTL3_CONFIG2_PL0);
134: switch (IFM_SUBTYPE(ifm->ifm_cur->ifm_media)) {
135: case IFM_AUTO:
136: /* Nothing to do; both bits clear == auto-detect. */
137: break;
138:
139: case IFM_10_T:
140: /*
141: * According to docs, this should be:
142: * reg |= RTL3_CONFIG2_PL0;
143: * but this doesn't work, so make it the same as AUTO.
144: */
145: break;
146:
147: case IFM_10_2:
148: reg |= RTL3_CONFIG2_PL1|RTL3_CONFIG2_PL0;
149: break;
150: }
151: NIC_PUT(sc->sc_regt, sc->sc_regh, NERTL_RTL3_CONFIG2, reg);
152:
153: /* Now, set duplex mode. */
154: reg = NIC_GET(sc->sc_regt, sc->sc_regh, NERTL_RTL3_CONFIG3);
155: if (ifm->ifm_cur->ifm_media & IFM_FDX)
156: reg |= RTL3_CONFIG3_FUDUP;
157: else
158: reg &= ~RTL3_CONFIG3_FUDUP;
159: NIC_PUT(sc->sc_regt, sc->sc_regh, NERTL_RTL3_CONFIG3, reg);
160:
161: /* write disable config1-3 */
162: NIC_PUT(sc->sc_regt, sc->sc_regh, NERTL_RTL3_EECR, 0);
163:
164: /* Set NIC to page 0 registers. */
165: NIC_PUT(sc->sc_regt, sc->sc_regh, ED_P0_CR, cr_proto | ED_CR_PAGE_0);
166: }
167:
168: void
169: rtl80x9_media_init(sc)
170: struct dp8390_softc *sc;
171: {
172: static int rtl80x9_media[] = {
173: IFM_ETHER|IFM_AUTO,
174: IFM_ETHER|IFM_10_T,
175: IFM_ETHER|IFM_10_T|IFM_FDX,
176: IFM_ETHER|IFM_10_2,
177: };
178: static const int rtl80x9_nmedia =
179: sizeof(rtl80x9_media) / sizeof(rtl80x9_media[0]);
180:
181: int i, defmedia;
182: u_int8_t conf2, conf3;
183:
184: /* Set NIC to page 3 registers. */
185: bus_space_write_1(sc->sc_regt, sc->sc_regh, ED_P0_CR, ED_CR_PAGE_3);
186:
187: conf2 = bus_space_read_1(sc->sc_regt, sc->sc_regh, NERTL_RTL3_CONFIG2);
188: conf3 = bus_space_read_1(sc->sc_regt, sc->sc_regh, NERTL_RTL3_CONFIG3);
189:
190: conf2 &= RTL3_CONFIG2_PL1|RTL3_CONFIG2_PL0;
191:
192: switch (conf2) {
193: case 0:
194: defmedia = IFM_ETHER|IFM_AUTO;
195: break;
196:
197: case RTL3_CONFIG2_PL1|RTL3_CONFIG2_PL0:
198: case RTL3_CONFIG2_PL1: /* XXX rtl docs sys 10base5, but chip cant do */
199: defmedia = IFM_ETHER|IFM_10_2;
200: break;
201:
202: case RTL3_CONFIG2_PL0:
203: if (conf3 & RTL3_CONFIG3_FUDUP)
204: defmedia = IFM_ETHER|IFM_10_T|IFM_FDX;
205: else
206: defmedia = IFM_ETHER|IFM_10_T;
207: break;
208: }
209:
210: /* Set NIC to page 0 registers. */
211: bus_space_write_1(sc->sc_regt, sc->sc_regh, ED_P0_CR, ED_CR_PAGE_0);
212:
213: ifmedia_init(&sc->sc_media, 0, dp8390_mediachange, dp8390_mediastatus);
214: for (i = 0; i < rtl80x9_nmedia; i++)
215: ifmedia_add(&sc->sc_media, rtl80x9_media[i], 0, NULL);
216: ifmedia_set(&sc->sc_media, defmedia);
217: }
CVSweb