Annotation of sys/dev/ic/elink3.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: elink3.c,v 1.69 2007/01/19 01:33:44 krw Exp $ */
2: /* $NetBSD: elink3.c,v 1.32 1997/05/14 00:22:00 thorpej Exp $ */
3:
4: /*
5: * Copyright (c) 1996, 1997 Jonathan Stone <jonathan@NetBSD.org>
6: * Copyright (c) 1994 Herb Peyerl <hpeyerl@beer.org>
7: * All rights reserved.
8: *
9: * Redistribution and use in source and binary forms, with or without
10: * modification, are permitted provided that the following conditions
11: * are met:
12: * 1. Redistributions of source code must retain the above copyright
13: * notice, this list of conditions and the following disclaimer.
14: * 2. Redistributions in binary form must reproduce the above copyright
15: * notice, this list of conditions and the following disclaimer in the
16: * documentation and/or other materials provided with the distribution.
17: * 3. All advertising materials mentioning features or use of this software
18: * must display the following acknowledgement:
19: * This product includes software developed by Herb Peyerl.
20: * 4. The name of Herb Peyerl may not be used to endorse or promote products
21: * derived from this software without specific prior written permission.
22: *
23: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33: */
34:
35: #include "bpfilter.h"
36:
37: #include <sys/param.h>
38: #include <sys/systm.h>
39: #include <sys/mbuf.h>
40: #include <sys/socket.h>
41: #include <sys/ioctl.h>
42: #include <sys/errno.h>
43: #include <sys/syslog.h>
44: #include <sys/selinfo.h>
45: #include <sys/timeout.h>
46: #include <sys/device.h>
47:
48: #include <net/if.h>
49: #include <net/if_dl.h>
50: #include <net/if_types.h>
51: #include <net/netisr.h>
52: #include <net/if_media.h>
53:
54: #ifdef INET
55: #include <netinet/in.h>
56: #include <netinet/in_systm.h>
57: #include <netinet/in_var.h>
58: #include <netinet/ip.h>
59: #include <netinet/if_ether.h>
60: #endif
61:
62: #if NBPFILTER > 0
63: #include <net/bpf.h>
64: #endif
65:
66: #include <machine/cpu.h>
67: #include <machine/bus.h>
68:
69: #include <dev/mii/mii.h>
70: #include <dev/mii/miivar.h>
71:
72: #include <dev/ic/elink3var.h>
73: #include <dev/ic/elink3reg.h>
74:
75: /*
76: * Structure to map media-present bits in boards to
77: * ifmedia codes and printable media names. Used for table-driven
78: * ifmedia initialization.
79: */
80: struct ep_media {
81: int epm_eeprom_data; /* bitmask for eeprom config */
82: int epm_conn; /* sc->ep_connectors code for medium */
83: char *epm_name; /* name of medium */
84: int epm_ifmedia; /* ifmedia word for medium */
85: int epm_ifdata;
86: };
87:
88: /*
89: * ep_media table for Vortex/Demon/Boomerang:
90: * map from media-present bits in register RESET_OPTIONS+2
91: * to ifmedia "media words" and printable names.
92: *
93: * XXX indexed directly by INTERNAL_CONFIG default_media field,
94: * (i.e., EPMEDIA_ constants) forcing order of entries.
95: * Note that 3 is reserved.
96: */
97: const struct ep_media ep_vortex_media[8] = {
98: { EP_PCI_UTP, EPC_UTP, "utp", IFM_ETHER|IFM_10_T,
99: EPMEDIA_10BASE_T },
100: { EP_PCI_AUI, EPC_AUI, "aui", IFM_ETHER|IFM_10_5,
101: EPMEDIA_AUI },
102: { 0, 0, "reserved", IFM_NONE, EPMEDIA_RESV1 },
103: { EP_PCI_BNC, EPC_BNC, "bnc", IFM_ETHER|IFM_10_2,
104: EPMEDIA_10BASE_2 },
105: { EP_PCI_100BASE_TX, EPC_100TX, "100-TX", IFM_ETHER|IFM_100_TX,
106: EPMEDIA_100BASE_TX },
107: { EP_PCI_100BASE_FX, EPC_100FX, "100-FX", IFM_ETHER|IFM_100_FX,
108: EPMEDIA_100BASE_FX },
109: { EP_PCI_100BASE_MII,EPC_MII, "mii", IFM_ETHER|IFM_100_TX,
110: EPMEDIA_MII },
111: { EP_PCI_100BASE_T4, EPC_100T4, "100-T4", IFM_ETHER|IFM_100_T4,
112: EPMEDIA_100BASE_T4 }
113: };
114:
115: /*
116: * ep_media table for 3c509/3c509b/3c579/3c589:
117: * map from media-present bits in register CNFG_CNTRL
118: * (window 0, offset ?) to ifmedia "media words" and printable names.
119: */
120: struct ep_media ep_isa_media[3] = {
121: { EP_W0_CC_UTP, EPC_UTP, "utp", IFM_ETHER|IFM_10_T, EPMEDIA_10BASE_T },
122: { EP_W0_CC_AUI, EPC_AUI, "aui", IFM_ETHER|IFM_10_5, EPMEDIA_AUI },
123: { EP_W0_CC_BNC, EPC_BNC, "bnc", IFM_ETHER|IFM_10_2, EPMEDIA_10BASE_2 },
124: };
125:
126: /* Map vortex reset_options bits to if_media codes. */
127: const u_int ep_default_to_media[8] = {
128: IFM_ETHER | IFM_10_T,
129: IFM_ETHER | IFM_10_5,
130: 0, /* reserved by 3Com */
131: IFM_ETHER | IFM_10_2,
132: IFM_ETHER | IFM_100_TX,
133: IFM_ETHER | IFM_100_FX,
134: IFM_ETHER | IFM_100_TX, /* XXX really MII: need to talk to PHY */
135: IFM_ETHER | IFM_100_T4,
136: };
137:
138: struct cfdriver ep_cd = {
139: NULL, "ep", DV_IFNET
140: };
141:
142: void ep_vortex_probemedia(struct ep_softc *sc);
143: void ep_isa_probemedia(struct ep_softc *sc);
144:
145: void eptxstat(struct ep_softc *);
146: int epstatus(struct ep_softc *);
147: int epioctl(struct ifnet *, u_long, caddr_t);
148: void epstart(struct ifnet *);
149: void epwatchdog(struct ifnet *);
150: void epreset(struct ep_softc *);
151: void epread(struct ep_softc *);
152: struct mbuf *epget(struct ep_softc *, int);
153: void epmbuffill(void *);
154: void epmbufempty(struct ep_softc *);
155: void epsetfilter(struct ep_softc *);
156: void ep_roadrunner_mii_enable(struct ep_softc *);
157: int epsetmedia(struct ep_softc *, int);
158:
159: /* ifmedia callbacks */
160: int ep_media_change(struct ifnet *);
161: void ep_media_status(struct ifnet *, struct ifmediareq *);
162:
163: /* MII callbacks */
164: int ep_mii_readreg(struct device *, int, int);
165: void ep_mii_writereg(struct device *, int, int, int);
166: void ep_statchg(struct device *);
167:
168: void ep_mii_setbit(struct ep_softc *, u_int16_t);
169: void ep_mii_clrbit(struct ep_softc *, u_int16_t);
170: u_int16_t ep_mii_readbit(struct ep_softc *, u_int16_t);
171: void ep_mii_sync(struct ep_softc *);
172: void ep_mii_sendbits(struct ep_softc *, u_int32_t, int);
173:
174: int epbusyeeprom(struct ep_softc *);
175: u_int16_t ep_read_eeprom(struct ep_softc *, u_int16_t);
176:
177: static inline void ep_reset_cmd(struct ep_softc *sc, u_int cmd,u_int arg);
178: static inline void ep_finish_reset(bus_space_tag_t, bus_space_handle_t);
179: static inline void ep_discard_rxtop(bus_space_tag_t, bus_space_handle_t);
180: static __inline int ep_w1_reg(struct ep_softc *, int);
181:
182: /*
183: * Issue a (reset) command, and be sure it has completed.
184: * Used for global reset, TX_RESET, RX_RESET.
185: */
186: static inline void
187: ep_reset_cmd(sc, cmd, arg)
188: struct ep_softc *sc;
189: u_int cmd, arg;
190: {
191: bus_space_tag_t iot = sc->sc_iot;
192: bus_space_handle_t ioh = sc->sc_ioh;
193:
194: bus_space_write_2(iot, ioh, cmd, arg);
195: ep_finish_reset(iot, ioh);
196: }
197:
198: /*
199: * Wait for any pending reset to complete.
200: */
201: static inline void
202: ep_finish_reset(iot, ioh)
203: bus_space_tag_t iot;
204: bus_space_handle_t ioh;
205: {
206: int i;
207:
208: for (i = 0; i < 10000; i++) {
209: if ((bus_space_read_2(iot, ioh, EP_STATUS) &
210: S_COMMAND_IN_PROGRESS) == 0)
211: break;
212: DELAY(10);
213: }
214: }
215:
216: static inline void
217: ep_discard_rxtop(iot, ioh)
218: bus_space_tag_t iot;
219: bus_space_handle_t ioh;
220: {
221: int i;
222:
223: bus_space_write_2(iot, ioh, EP_COMMAND, RX_DISCARD_TOP_PACK);
224:
225: /*
226: * Spin for about 1 msec, to avoid forcing a DELAY() between
227: * every received packet (adding latency and limiting pkt-recv rate).
228: * On PCI, at 4 30-nsec PCI bus cycles for a read, 8000 iterations
229: * is about right.
230: */
231: for (i = 0; i < 8000; i++) {
232: if ((bus_space_read_2(iot, ioh, EP_STATUS) &
233: S_COMMAND_IN_PROGRESS) == 0)
234: return;
235: }
236:
237: /* not fast enough, do DELAY()s */
238: ep_finish_reset(iot, ioh);
239: }
240:
241: /*
242: * Some chips (i.e., 3c574 RoadRunner) have Window 1 registers offset.
243: */
244: static __inline int
245: ep_w1_reg(sc, reg)
246: struct ep_softc *sc;
247: int reg;
248: {
249: switch (sc->ep_chipset) {
250: case EP_CHIPSET_ROADRUNNER:
251: switch (reg) {
252: case EP_W1_FREE_TX:
253: case EP_W1_RUNNER_RDCTL:
254: case EP_W1_RUNNER_WRCTL:
255: return (reg);
256: }
257: return (reg + 0x10);
258: }
259: return (reg);
260: }
261:
262: /*
263: * Back-end attach and configure.
264: */
265: void
266: epconfig(sc, chipset, enaddr)
267: struct ep_softc *sc;
268: u_short chipset;
269: u_int8_t *enaddr;
270: {
271: struct ifnet *ifp = &sc->sc_arpcom.ac_if;
272: bus_space_tag_t iot = sc->sc_iot;
273: bus_space_handle_t ioh = sc->sc_ioh;
274: u_int16_t i;
275:
276: sc->ep_chipset = chipset;
277:
278: /*
279: * We could have been groveling around in other register
280: * windows in the front-end; make sure we're in window 0
281: * to read the EEPROM.
282: */
283: GO_WINDOW(0);
284:
285: if (enaddr == NULL) {
286: /*
287: * Read the station address from the eeprom.
288: */
289: for (i = 0; i < 3; i++) {
290: u_int16_t x = ep_read_eeprom(sc, i);
291:
292: sc->sc_arpcom.ac_enaddr[(i << 1)] = x >> 8;
293: sc->sc_arpcom.ac_enaddr[(i << 1) + 1] = x;
294: }
295: } else {
296: bcopy(enaddr, sc->sc_arpcom.ac_enaddr, ETHER_ADDR_LEN);
297: }
298:
299: printf(" address %s", ether_sprintf(sc->sc_arpcom.ac_enaddr));
300: if (sc->ep_flags & EP_FLAGS_MII)
301: printf("\n");
302: else
303: printf(", ");
304:
305: /*
306: * Vortex-based (3c59x pci,eisa) cards allow FDDI-sized (4500) byte
307: * packets. Commands only take an 11-bit parameter, and 11 bits
308: * isn't enough to hold a full-size packet length.
309: * Commands to these cards implicitly upshift a packet size
310: * or threshold by 2 bits.
311: * To detect cards with large-packet support, we probe by setting
312: * the transmit threshold register, then change windows and
313: * read back the threshold register directly, and see if the
314: * threshold value was shifted or not.
315: */
316: bus_space_write_2(iot, ioh, EP_COMMAND,
317: SET_TX_AVAIL_THRESH | EP_LARGEWIN_PROBE );
318: GO_WINDOW(5);
319: i = bus_space_read_2(iot, ioh, EP_W5_TX_AVAIL_THRESH);
320: GO_WINDOW(1);
321: switch (i) {
322: case EP_LARGEWIN_PROBE:
323: case (EP_LARGEWIN_PROBE & EP_LARGEWIN_MASK):
324: sc->txashift = 0;
325: break;
326:
327: case (EP_LARGEWIN_PROBE << 2):
328: sc->txashift = 2;
329: /* XXX does the 3c515 support Vortex-style RESET_OPTIONS? */
330: break;
331:
332: default:
333: printf("wrote %x to TX_AVAIL_THRESH, read back %x. "
334: "Interface disabled\n", EP_THRESH_DISABLE, (int) i);
335: return;
336: }
337:
338: timeout_set(&sc->sc_epmbuffill_tmo, epmbuffill, sc);
339:
340: /*
341: * Ensure Tx-available interrupts are enabled for
342: * start the interface.
343: * XXX should be in epinit()?
344: */
345: bus_space_write_2(iot, ioh, EP_COMMAND,
346: SET_TX_AVAIL_THRESH | (1600 >> sc->txashift));
347:
348: bcopy(sc->sc_dev.dv_xname, ifp->if_xname, IFNAMSIZ);
349: ifp->if_softc = sc;
350: ifp->if_start = epstart;
351: ifp->if_ioctl = epioctl;
352: ifp->if_watchdog = epwatchdog;
353: ifp->if_flags =
354: IFF_BROADCAST | IFF_SIMPLEX | IFF_NOTRAILERS | IFF_MULTICAST;
355: IFQ_SET_READY(&ifp->if_snd);
356:
357: if_attach(ifp);
358: ether_ifattach(ifp);
359:
360: /*
361: * Finish configuration:
362: * determine chipset if the front-end couldn't do so,
363: * show board details, set media.
364: */
365:
366: GO_WINDOW(0);
367:
368: ifmedia_init(&sc->sc_mii.mii_media, 0, ep_media_change,
369: ep_media_status);
370: sc->sc_mii.mii_ifp = ifp;
371: sc->sc_mii.mii_readreg = ep_mii_readreg;
372: sc->sc_mii.mii_writereg = ep_mii_writereg;
373: sc->sc_mii.mii_statchg = ep_statchg;
374:
375: /*
376: * If we've got an indirect (ISA, PCMCIA?) board, the chipset
377: * is unknown. If the board has large-packet support, it's a
378: * Vortex/Boomerang, otherwise it's a 3c509.
379: * XXX use eeprom capability word instead?
380: */
381: if (sc->ep_chipset == EP_CHIPSET_UNKNOWN && sc->txashift) {
382: printf("warning: unknown chipset, possibly 3c515?\n");
383: #ifdef notyet
384: sc->sc_chipset = EP_CHIPSET_VORTEX;
385: #endif /* notyet */
386: }
387:
388: /*
389: * Ascertain which media types are present and inform ifmedia.
390: */
391: switch (sc->ep_chipset) {
392: case EP_CHIPSET_ROADRUNNER:
393: if (sc->ep_flags & EP_FLAGS_MII) {
394: ep_roadrunner_mii_enable(sc);
395: GO_WINDOW(0);
396: }
397: /* FALLTHROUGH */
398:
399: case EP_CHIPSET_BOOMERANG:
400: /*
401: * If the device has MII, probe it. We won't be using
402: * any `native' media in this case, only PHYs. If
403: * we don't, just treat the Boomerang like the Vortex.
404: */
405: if (sc->ep_flags & EP_FLAGS_MII) {
406: mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff,
407: MII_PHY_ANY, MII_OFFSET_ANY, 0);
408: if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) {
409: ifmedia_add(&sc->sc_mii.mii_media,
410: IFM_ETHER|IFM_NONE, 0, NULL);
411: ifmedia_set(&sc->sc_mii.mii_media,
412: IFM_ETHER|IFM_NONE);
413: } else {
414: ifmedia_set(&sc->sc_mii.mii_media,
415: IFM_ETHER|IFM_AUTO);
416: }
417: break;
418: }
419: /* FALLTHROUGH */
420:
421: /* on a direct bus, the attach routine can tell, but check anyway. */
422: case EP_CHIPSET_VORTEX:
423: case EP_CHIPSET_BOOMERANG2:
424: ep_vortex_probemedia(sc);
425: break;
426:
427: /* on ISA we can't yet tell 3c509 from 3c515. Assume the former. */
428: case EP_CHIPSET_3C509:
429: default:
430: ep_isa_probemedia(sc);
431: break;
432: }
433:
434: GO_WINDOW(1); /* Window 1 is operating window */
435:
436: sc->tx_start_thresh = 20; /* probably a good starting point. */
437:
438: ep_reset_cmd(sc, EP_COMMAND, RX_RESET);
439: ep_reset_cmd(sc, EP_COMMAND, TX_RESET);
440: }
441:
442: int
443: ep_detach(self)
444: struct device *self;
445: {
446: struct ep_softc *sc = (struct ep_softc *)self;
447: struct ifnet *ifp = &sc->sc_arpcom.ac_if;
448:
449: if (sc->ep_flags & EP_FLAGS_MII)
450: mii_detach(&sc->sc_mii, MII_PHY_ANY, MII_OFFSET_ANY);
451:
452: ifmedia_delete_instance(&sc->sc_mii.mii_media, IFM_INST_ANY);
453:
454: ether_ifdetach(ifp);
455: if_detach(ifp);
456:
457: return (0);
458: }
459:
460: /*
461: * Find supported media on 3c509-generation hardware that doesn't have
462: * a "reset_options" register in window 3.
463: * Use the config_cntrl register in window 0 instead.
464: * Used on original, 10Mbit ISA (3c509), 3c509B, and pre-Demon EISA cards
465: * that implement CONFIG_CTRL. We don't have a good way to set the
466: * default active medium; punt to ifconfig instead.
467: *
468: * XXX what about 3c515, pcmcia 10/100?
469: */
470: void
471: ep_isa_probemedia(sc)
472: struct ep_softc *sc;
473: {
474: bus_space_tag_t iot = sc->sc_iot;
475: bus_space_handle_t ioh = sc->sc_ioh;
476: struct ifmedia *ifm = &sc->sc_mii.mii_media;
477: int conn, i;
478: u_int16_t ep_w0_config, port;
479:
480: conn = 0;
481: GO_WINDOW(0);
482: ep_w0_config = bus_space_read_2(iot, ioh, EP_W0_CONFIG_CTRL);
483: for (i = 0; i < 3; i++) {
484: struct ep_media * epm = ep_isa_media + i;
485:
486: if ((ep_w0_config & epm->epm_eeprom_data) != 0) {
487: ifmedia_add(ifm, epm->epm_ifmedia, epm->epm_ifdata, 0);
488: if (conn)
489: printf("/");
490: printf("%s", epm->epm_name);
491: conn |= epm->epm_conn;
492: }
493: }
494: sc->ep_connectors = conn;
495:
496: /* get default medium from EEPROM */
497: if (epbusyeeprom(sc))
498: return; /* XXX why is eeprom busy? */
499: bus_space_write_2(iot, ioh, EP_W0_EEPROM_COMMAND,
500: READ_EEPROM | EEPROM_ADDR_CFG);
501: if (epbusyeeprom(sc))
502: return; /* XXX why is eeprom busy? */
503: port = bus_space_read_2(iot, ioh, EP_W0_EEPROM_DATA);
504: port = port >> 14;
505:
506: printf(" (default %s)\n", ep_vortex_media[port].epm_name);
507:
508: /* tell ifconfig what currently-active media is. */
509: ifmedia_set(ifm, ep_default_to_media[port]);
510:
511: /* XXX autoselect not yet implemented */
512: }
513:
514:
515: /*
516: * Find media present on large-packet-capable elink3 devices.
517: * Show onboard configuration of large-packet-capable elink3 devices
518: * (Demon, Vortex, Boomerang), which do not implement CONFIG_CTRL in window 0.
519: * Use media and card-version info in window 3 instead.
520: *
521: * XXX how much of this works with 3c515, pcmcia 10/100?
522: */
523: void
524: ep_vortex_probemedia(sc)
525: struct ep_softc *sc;
526: {
527: bus_space_tag_t iot = sc->sc_iot;
528: bus_space_handle_t ioh = sc->sc_ioh;
529: struct ifmedia *ifm = &sc->sc_mii.mii_media;
530: u_int config1, conn;
531: int reset_options;
532: int default_media; /* 3-bit encoding of default (EEPROM) media */
533: int autoselect; /* boolean: should default to autoselect */
534: const char *medium_name;
535: register int i;
536:
537: GO_WINDOW(3);
538: config1 = (u_int)bus_space_read_2(iot, ioh, EP_W3_INTERNAL_CONFIG + 2);
539: reset_options = (int)bus_space_read_1(iot, ioh, EP_W3_RESET_OPTIONS);
540: GO_WINDOW(0);
541:
542: default_media = (config1 & CONFIG_MEDIAMASK) >> CONFIG_MEDIAMASK_SHIFT;
543: autoselect = (config1 & CONFIG_AUTOSELECT) >> CONFIG_AUTOSELECT_SHIFT;
544:
545: /* set available media options */
546: conn = 0;
547: for (i = 0; i < 8; i++) {
548: const struct ep_media *epm = ep_vortex_media + i;
549:
550: if ((reset_options & epm->epm_eeprom_data) != 0) {
551: if (conn)
552: printf("/");
553: printf("%s", epm->epm_name);
554: conn |= epm->epm_conn;
555: ifmedia_add(ifm, epm->epm_ifmedia, epm->epm_ifdata, 0);
556: }
557: }
558:
559: sc->ep_connectors = conn;
560:
561: /* Show eeprom's idea of default media. */
562: medium_name = (default_media > 8)
563: ? "(unknown/impossible media)"
564: : ep_vortex_media[default_media].epm_name;
565: printf(" default %s%s",
566: medium_name, (autoselect) ? "/autoselect" : "");
567: /* sc->sc_media = ep_vortex_media[default_media].epm_ifdata;*/
568:
569: #ifdef notyet
570: /*
571: * Set default: either the active interface the card
572: * reads from the EEPROM, or if autoselect is true,
573: * whatever we find is actually connected.
574: *
575: * XXX autoselect not yet implemented.
576: */
577: #endif /* notyet */
578:
579: /* tell ifconfig what currently-active media is. */
580: ifmedia_set(ifm, ep_default_to_media[default_media]);
581: }
582:
583: /*
584: * Bring device up.
585: *
586: * The order in here seems important. Otherwise we may not receive
587: * interrupts. ?!
588: */
589: void
590: epinit(sc)
591: register struct ep_softc *sc;
592: {
593: register struct ifnet *ifp = &sc->sc_arpcom.ac_if;
594: bus_space_tag_t iot = sc->sc_iot;
595: bus_space_handle_t ioh = sc->sc_ioh;
596: int i;
597:
598: /* make sure any pending reset has completed before touching board */
599: ep_finish_reset(iot, ioh);
600:
601: /* cancel any pending I/O */
602: epstop(sc);
603:
604: if (sc->bustype != EP_BUS_PCI) {
605: GO_WINDOW(0);
606: bus_space_write_2(iot, ioh, EP_W0_CONFIG_CTRL, 0);
607: bus_space_write_2(iot, ioh, EP_W0_CONFIG_CTRL, ENABLE_DRQ_IRQ);
608: }
609:
610: if (sc->bustype == EP_BUS_PCMCIA) {
611: bus_space_write_2(iot, ioh, EP_W0_RESOURCE_CFG, 0x3f00);
612: }
613:
614: GO_WINDOW(2);
615: for (i = 0; i < 6; i++) /* Reload the ether_addr. */
616: bus_space_write_1(iot, ioh, EP_W2_ADDR_0 + i,
617: sc->sc_arpcom.ac_enaddr[i]);
618:
619: if (sc->bustype == EP_BUS_PCI || sc->bustype == EP_BUS_EISA)
620: /*
621: * Reset the station-address receive filter.
622: * A bug workaround for busmastering (Vortex, Demon) cards.
623: */
624: for (i = 0; i < 6; i++)
625: bus_space_write_1(iot, ioh, EP_W2_RECVMASK_0 + i, 0);
626:
627: ep_reset_cmd(sc, EP_COMMAND, RX_RESET);
628: ep_reset_cmd(sc, EP_COMMAND, TX_RESET);
629:
630: GO_WINDOW(1); /* Window 1 is operating window */
631: for (i = 0; i < 31; i++)
632: bus_space_read_1(iot, ioh, ep_w1_reg(sc, EP_W1_TX_STATUS));
633:
634: /* Set threshold for for Tx-space available interrupt. */
635: bus_space_write_2(iot, ioh, EP_COMMAND,
636: SET_TX_AVAIL_THRESH | (1600 >> sc->txashift));
637:
638: if (sc->ep_chipset == EP_CHIPSET_ROADRUNNER) {
639: /* Enable options in the PCMCIA LAN COR register, via
640: * RoadRunner Window 1.
641: *
642: * XXX MAGIC CONSTANTS!
643: */
644: u_int16_t cor;
645:
646: bus_space_write_2(iot, ioh, EP_W1_RUNNER_RDCTL, (1 << 11));
647:
648: cor = bus_space_read_2(iot, ioh, 0) & ~0x30;
649: bus_space_write_2(iot, ioh, 0, cor);
650:
651: bus_space_write_2(iot, ioh, EP_W1_RUNNER_WRCTL, 0);
652: bus_space_write_2(iot, ioh, EP_W1_RUNNER_RDCTL, 0);
653:
654: if (sc->ep_flags & EP_FLAGS_MII) {
655: ep_roadrunner_mii_enable(sc);
656: GO_WINDOW(1);
657: }
658: }
659:
660: /* Enable interrupts. */
661: bus_space_write_2(iot, ioh, EP_COMMAND, SET_RD_0_MASK |
662: S_CARD_FAILURE | S_RX_COMPLETE | S_TX_COMPLETE | S_TX_AVAIL);
663: bus_space_write_2(iot, ioh, EP_COMMAND, SET_INTR_MASK |
664: S_CARD_FAILURE | S_RX_COMPLETE | S_TX_COMPLETE | S_TX_AVAIL);
665:
666: /*
667: * Attempt to get rid of any stray interrupts that occurred during
668: * configuration. On the i386 this isn't possible because one may
669: * already be queued. However, a single stray interrupt is
670: * unimportant.
671: */
672: bus_space_write_2(iot, ioh, EP_COMMAND, ACK_INTR | 0xff);
673:
674: epsetfilter(sc);
675: epsetmedia(sc, sc->sc_mii.mii_media.ifm_cur->ifm_data);
676:
677: bus_space_write_2(iot, ioh, EP_COMMAND, RX_ENABLE);
678: bus_space_write_2(iot, ioh, EP_COMMAND, TX_ENABLE);
679:
680: epmbuffill(sc);
681:
682: /* Interface is now `running', with no output active. */
683: ifp->if_flags |= IFF_RUNNING;
684: ifp->if_flags &= ~IFF_OACTIVE;
685:
686: /* Attempt to start output, if any. */
687: epstart(ifp);
688: }
689:
690: /*
691: * Set multicast receive filter.
692: * elink3 hardware has no selective multicast filter in hardware.
693: * Enable reception of all multicasts and filter in software.
694: */
695: void
696: epsetfilter(sc)
697: register struct ep_softc *sc;
698: {
699: register struct ifnet *ifp = &sc->sc_arpcom.ac_if;
700:
701: GO_WINDOW(1); /* Window 1 is operating window */
702: bus_space_write_2(sc->sc_iot, sc->sc_ioh, EP_COMMAND, SET_RX_FILTER |
703: FIL_INDIVIDUAL | FIL_BRDCST |
704: ((ifp->if_flags & IFF_MULTICAST) ? FIL_MULTICAST : 0 ) |
705: ((ifp->if_flags & IFF_PROMISC) ? FIL_PROMISC : 0 ));
706: }
707:
708:
709: int
710: ep_media_change(ifp)
711: struct ifnet *ifp;
712: {
713: register struct ep_softc *sc = ifp->if_softc;
714:
715: return epsetmedia(sc, sc->sc_mii.mii_media.ifm_cur->ifm_data);
716: }
717:
718: /*
719: * Reset and enable the MII on the RoadRunner.
720: */
721: void
722: ep_roadrunner_mii_enable(sc)
723: struct ep_softc *sc;
724: {
725: bus_space_tag_t iot = sc->sc_iot;
726: bus_space_handle_t ioh = sc->sc_ioh;
727:
728: GO_WINDOW(3);
729: bus_space_write_2(iot, ioh, EP_W3_RESET_OPTIONS,
730: EP_PCI_100BASE_MII|EP_RUNNER_ENABLE_MII);
731: delay(1000);
732: bus_space_write_2(iot, ioh, EP_W3_RESET_OPTIONS,
733: EP_PCI_100BASE_MII|EP_RUNNER_MII_RESET|EP_RUNNER_ENABLE_MII);
734: ep_reset_cmd(sc, EP_COMMAND, TX_RESET);
735: ep_reset_cmd(sc, EP_COMMAND, RX_RESET);
736: delay(1000);
737: bus_space_write_2(iot, ioh, EP_W3_RESET_OPTIONS,
738: EP_PCI_100BASE_MII|EP_RUNNER_ENABLE_MII);
739: }
740:
741: /*
742: * Set active media to a specific given EPMEDIA_<> value.
743: * For vortex/demon/boomerang cards, update media field in w3_internal_config,
744: * and power on selected transceiver.
745: * For 3c509-generation cards (3c509/3c579/3c589/3c509B),
746: * update media field in w0_address_config, and power on selected xcvr.
747: */
748: int
749: epsetmedia(sc, medium)
750: struct ep_softc *sc;
751: int medium;
752: {
753: bus_space_tag_t iot = sc->sc_iot;
754: bus_space_handle_t ioh = sc->sc_ioh;
755: int w4_media;
756: int config0, config1;
757:
758: /*
759: * you can `ifconfig (link0|-link0) ep0' to get the following
760: * behaviour:
761: * -link0 disable AUI/UTP. enable BNC.
762: * link0 disable BNC. enable AUI.
763: * link1 if the card has a UTP connector, and link0 is
764: * set too, then you get the UTP port.
765: */
766:
767: /*
768: * First, change the media-control bits in EP_W4_MEDIA_TYPE.
769: */
770:
771: /* Turn everything off. First turn off linkbeat and UTP. */
772: GO_WINDOW(4);
773: w4_media = bus_space_read_2(iot, ioh, EP_W4_MEDIA_TYPE);
774: w4_media = w4_media & ~(ENABLE_UTP|SQE_ENABLE);
775: bus_space_write_2(iot, ioh, EP_W4_MEDIA_TYPE, w4_media);
776:
777: /* Turn off coax */
778: bus_space_write_2(iot, ioh, EP_COMMAND, STOP_TRANSCEIVER);
779: delay(1000);
780:
781: /* If the device has MII, select it, and then tell the
782: * PHY which media to use.
783: */
784: if (sc->ep_flags & EP_FLAGS_MII) {
785: int config0, config1;
786:
787: GO_WINDOW(3);
788:
789: if (sc->ep_chipset == EP_CHIPSET_ROADRUNNER) {
790: int resopt;
791:
792: resopt = bus_space_read_2(iot, ioh,
793: EP_W3_RESET_OPTIONS);
794: bus_space_write_2(iot, ioh, EP_W3_RESET_OPTIONS,
795: resopt | EP_RUNNER_ENABLE_MII);
796: }
797:
798: config0 = (u_int)bus_space_read_2(iot, ioh,
799: EP_W3_INTERNAL_CONFIG);
800: config1 = (u_int)bus_space_read_2(iot, ioh,
801: EP_W3_INTERNAL_CONFIG + 2);
802:
803: config1 = config1 & ~CONFIG_MEDIAMASK;
804: config1 |= (EPMEDIA_MII << CONFIG_MEDIAMASK_SHIFT);
805:
806: bus_space_write_2(iot, ioh, EP_W3_INTERNAL_CONFIG, config0);
807: bus_space_write_2(iot, ioh, EP_W3_INTERNAL_CONFIG + 2, config1);
808: GO_WINDOW(1); /* back to operating window */
809:
810: mii_mediachg(&sc->sc_mii);
811: return (0);
812: }
813:
814: /*
815: * Now turn on the selected media/transceiver.
816: */
817: GO_WINDOW(4);
818: switch (medium) {
819: case EPMEDIA_10BASE_T:
820: bus_space_write_2(iot, ioh, EP_W4_MEDIA_TYPE, (ENABLE_UTP |
821: (sc->bustype == EP_BUS_PCMCIA ? MEDIA_LED : 0)));
822: break;
823:
824: case EPMEDIA_10BASE_2:
825: bus_space_write_2(iot, ioh, EP_COMMAND, START_TRANSCEIVER);
826: DELAY(1000); /* 50ms not enough? */
827: break;
828:
829: /* XXX following only for new-generation cards */
830: case EPMEDIA_100BASE_TX:
831: case EPMEDIA_100BASE_FX:
832: case EPMEDIA_100BASE_T4: /* XXX check documentation */
833: bus_space_write_2(iot, ioh, EP_W4_MEDIA_TYPE,
834: w4_media | LINKBEAT_ENABLE);
835: DELAY(1000); /* not strictly necessary? */
836: break;
837:
838: case EPMEDIA_AUI:
839: bus_space_write_2(iot, ioh, EP_W4_MEDIA_TYPE,
840: w4_media | SQE_ENABLE);
841: DELAY(1000); /* not strictly necessary? */
842: break;
843: case EPMEDIA_MII:
844: break;
845: default:
846: #if defined(EP_DEBUG)
847: printf("%s unknown media 0x%x\n", sc->sc_dev.dv_xname, medium);
848: #endif
849: break;
850:
851: }
852:
853: /*
854: * Tell the chip which PHY [sic] to use.
855: */
856: switch (sc->ep_chipset) {
857: case EP_CHIPSET_VORTEX:
858: case EP_CHIPSET_BOOMERANG2:
859: GO_WINDOW(3);
860: config0 = (u_int)bus_space_read_2(iot, ioh,
861: EP_W3_INTERNAL_CONFIG);
862: config1 = (u_int)bus_space_read_2(iot, ioh,
863: EP_W3_INTERNAL_CONFIG + 2);
864:
865: #if defined(EP_DEBUG)
866: printf("%s: read 0x%x, 0x%x from EP_W3_CONFIG register\n",
867: sc->sc_dev.dv_xname, config0, config1);
868: #endif
869: config1 = config1 & ~CONFIG_MEDIAMASK;
870: config1 |= (medium << CONFIG_MEDIAMASK_SHIFT);
871:
872: #if defined(EP_DEBUG)
873: printf("epsetmedia: %s: medium 0x%x, 0x%x to EP_W3_CONFIG\n",
874: sc->sc_dev.dv_xname, medium, config1);
875: #endif
876: bus_space_write_2(iot, ioh, EP_W3_INTERNAL_CONFIG, config0);
877: bus_space_write_2(iot, ioh, EP_W3_INTERNAL_CONFIG + 2, config1);
878: break;
879:
880: default:
881: GO_WINDOW(0);
882: config0 = bus_space_read_2(iot, ioh, EP_W0_ADDRESS_CFG);
883: config0 &= 0x3fff;
884: bus_space_write_2(iot, ioh, EP_W0_ADDRESS_CFG,
885: config0 | (medium << 14));
886: DELAY(1000);
887: break;
888: }
889:
890: GO_WINDOW(1); /* Window 1 is operating window */
891: return (0);
892: }
893:
894:
895: /*
896: * Get currently-selected media from card.
897: * (if_media callback, may be called before interface is brought up).
898: */
899: void
900: ep_media_status(ifp, req)
901: struct ifnet *ifp;
902: struct ifmediareq *req;
903: {
904: register struct ep_softc *sc = ifp->if_softc;
905: bus_space_tag_t iot = sc->sc_iot;
906: bus_space_handle_t ioh = sc->sc_ioh;
907: u_int config1;
908: u_int ep_mediastatus;
909:
910: /*
911: * If we have MII, go ask the PHY what's going on.
912: */
913: if (sc->ep_flags & EP_FLAGS_MII) {
914: mii_pollstat(&sc->sc_mii);
915: req->ifm_active = sc->sc_mii.mii_media_active;
916: req->ifm_status = sc->sc_mii.mii_media_status;
917: return;
918: }
919:
920: /* XXX read from softc when we start autosensing media */
921: req->ifm_active = sc->sc_mii.mii_media.ifm_cur->ifm_media;
922:
923: switch (sc->ep_chipset) {
924: case EP_CHIPSET_VORTEX:
925: case EP_CHIPSET_BOOMERANG:
926: GO_WINDOW(3);
927: delay(5000);
928:
929: config1 = bus_space_read_2(iot, ioh, EP_W3_INTERNAL_CONFIG + 2);
930: GO_WINDOW(1);
931:
932: config1 =
933: (config1 & CONFIG_MEDIAMASK) >> CONFIG_MEDIAMASK_SHIFT;
934: req->ifm_active = ep_default_to_media[config1];
935:
936: /* XXX check full-duplex bits? */
937:
938: GO_WINDOW(4);
939: req->ifm_status = IFM_AVALID; /* XXX */
940: ep_mediastatus = bus_space_read_2(iot, ioh, EP_W4_MEDIA_TYPE);
941: if (ep_mediastatus & LINKBEAT_DETECT)
942: req->ifm_status |= IFM_ACTIVE; /* XXX automedia */
943:
944: break;
945:
946: case EP_CHIPSET_UNKNOWN:
947: case EP_CHIPSET_3C509:
948: req->ifm_status = 0; /* XXX */
949: break;
950:
951: default:
952: printf("%s: media_status on unknown chipset 0x%x\n",
953: ifp->if_xname, sc->ep_chipset);
954: break;
955: }
956:
957: /* XXX look for softc heartbeat for other chips or media */
958:
959: GO_WINDOW(1);
960: return;
961: }
962:
963:
964:
965: /*
966: * Start outputting on the interface.
967: * Always called as splnet().
968: */
969: void
970: epstart(ifp)
971: struct ifnet *ifp;
972: {
973: register struct ep_softc *sc = ifp->if_softc;
974: bus_space_tag_t iot = sc->sc_iot;
975: bus_space_handle_t ioh = sc->sc_ioh;
976: struct mbuf *m, *m0;
977: int sh, len, pad, txreg;
978:
979: /* Don't transmit if interface is busy or not running */
980: if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
981: return;
982:
983: startagain:
984: /* Sneak a peek at the next packet */
985: IFQ_POLL(&ifp->if_snd, m0);
986: if (m0 == NULL)
987: return;
988:
989: /* We need to use m->m_pkthdr.len, so require the header */
990: if ((m0->m_flags & M_PKTHDR) == 0)
991: panic("epstart: no header mbuf");
992: len = m0->m_pkthdr.len;
993:
994: pad = (4 - len) & 3;
995:
996: /*
997: * The 3c509 automatically pads short packets to minimum ethernet
998: * length, but we drop packets that are too large. Perhaps we should
999: * truncate them instead?
1000: */
1001: if (len + pad > ETHER_MAX_LEN) {
1002: /* packet is obviously too large: toss it */
1003: ++ifp->if_oerrors;
1004: IFQ_DEQUEUE(&ifp->if_snd, m0);
1005: m_freem(m0);
1006: goto readcheck;
1007: }
1008:
1009: if (bus_space_read_2(iot, ioh, ep_w1_reg(sc, EP_W1_FREE_TX)) <
1010: len + pad + 4) {
1011: bus_space_write_2(iot, ioh, EP_COMMAND,
1012: SET_TX_AVAIL_THRESH | ((len + pad + 4) >> sc->txashift));
1013: /* not enough room in FIFO */
1014: ifp->if_flags |= IFF_OACTIVE;
1015: return;
1016: } else {
1017: bus_space_write_2(iot, ioh, EP_COMMAND,
1018: SET_TX_AVAIL_THRESH | EP_THRESH_DISABLE);
1019: }
1020:
1021: IFQ_DEQUEUE(&ifp->if_snd, m0);
1022: if (m0 == NULL)
1023: return;
1024:
1025: bus_space_write_2(iot, ioh, EP_COMMAND, SET_TX_START_THRESH |
1026: ((len / 4 + sc->tx_start_thresh) /*>> sc->txashift*/));
1027:
1028: #if NBPFILTER > 0
1029: if (ifp->if_bpf)
1030: bpf_mtap(ifp->if_bpf, m0, BPF_DIRECTION_OUT);
1031: #endif
1032:
1033: /*
1034: * Do the output at splhigh() so that an interrupt from another device
1035: * won't cause a FIFO underrun.
1036: */
1037: sh = splhigh();
1038:
1039: txreg = ep_w1_reg(sc, EP_W1_TX_PIO_WR_1);
1040:
1041: bus_space_write_2(iot, ioh, txreg, len);
1042: bus_space_write_2(iot, ioh, txreg, 0xffff); /* Second is meaningless */
1043: if (EP_IS_BUS_32(sc->bustype)) {
1044: for (m = m0; m; ) {
1045: if (m->m_len > 3)
1046: bus_space_write_raw_multi_4(iot, ioh, txreg,
1047: mtod(m, u_int8_t *), m->m_len & ~3);
1048: if (m->m_len & 3)
1049: bus_space_write_multi_1(iot, ioh, txreg,
1050: mtod(m, u_int8_t *) + (m->m_len & ~3),
1051: m->m_len & 3);
1052: MFREE(m, m0);
1053: m = m0;
1054: }
1055: } else {
1056: for (m = m0; m; ) {
1057: if (m->m_len > 1)
1058: bus_space_write_raw_multi_2(iot, ioh, txreg,
1059: mtod(m, u_int8_t *), m->m_len & ~1);
1060: if (m->m_len & 1)
1061: bus_space_write_1(iot, ioh, txreg,
1062: *(mtod(m, u_int8_t *) + m->m_len - 1));
1063: MFREE(m, m0);
1064: m = m0;
1065: }
1066: }
1067: while (pad--)
1068: bus_space_write_1(iot, ioh, txreg, 0);
1069:
1070: splx(sh);
1071:
1072: ++ifp->if_opackets;
1073:
1074: readcheck:
1075: if ((bus_space_read_2(iot, ioh, ep_w1_reg(sc, EP_W1_RX_STATUS)) &
1076: ERR_INCOMPLETE) == 0) {
1077: /* We received a complete packet. */
1078: u_int16_t status = bus_space_read_2(iot, ioh, EP_STATUS);
1079:
1080: if ((status & S_INTR_LATCH) == 0) {
1081: /*
1082: * No interrupt, read the packet and continue
1083: * Is this supposed to happen? Is my motherboard
1084: * completely busted?
1085: */
1086: epread(sc);
1087: } else
1088: /* Got an interrupt, return to get it serviced. */
1089: return;
1090: } else {
1091: /* Check if we are stuck and reset [see XXX comment] */
1092: if (epstatus(sc)) {
1093: #ifdef EP_DEBUG
1094: if (ifp->if_flags & IFF_DEBUG)
1095: printf("%s: adapter reset\n",
1096: sc->sc_dev.dv_xname);
1097: #endif
1098: epreset(sc);
1099: }
1100: }
1101:
1102: goto startagain;
1103: }
1104:
1105:
1106: /*
1107: * XXX: The 3c509 card can get in a mode where both the fifo status bit
1108: * FIFOS_RX_OVERRUN and the status bit ERR_INCOMPLETE are set
1109: * We detect this situation and we reset the adapter.
1110: * It happens at times when there is a lot of broadcast traffic
1111: * on the cable (once in a blue moon).
1112: */
1113: int
1114: epstatus(sc)
1115: register struct ep_softc *sc;
1116: {
1117: bus_space_tag_t iot = sc->sc_iot;
1118: bus_space_handle_t ioh = sc->sc_ioh;
1119: u_int16_t fifost;
1120:
1121: /*
1122: * Check the FIFO status and act accordingly
1123: */
1124: GO_WINDOW(4);
1125: fifost = bus_space_read_2(iot, ioh, EP_W4_FIFO_DIAG);
1126: GO_WINDOW(1);
1127:
1128: if (fifost & FIFOS_RX_UNDERRUN) {
1129: #ifdef EP_DEBUG
1130: if (sc->sc_arpcom.ac_if.if_flags & IFF_DEBUG)
1131: printf("%s: RX underrun\n", sc->sc_dev.dv_xname);
1132: #endif
1133: epreset(sc);
1134: return 0;
1135: }
1136:
1137: if (fifost & FIFOS_RX_STATUS_OVERRUN) {
1138: #ifdef EP_DEBUG
1139: if (sc->sc_arpcom.ac_if.if_flags & IFF_DEBUG)
1140: printf("%s: RX Status overrun\n", sc->sc_dev.dv_xname);
1141: #endif
1142: return 1;
1143: }
1144:
1145: if (fifost & FIFOS_RX_OVERRUN) {
1146: #ifdef EP_DEBUG
1147: if (sc->sc_arpcom.ac_if.if_flags & IFF_DEBUG)
1148: printf("%s: RX overrun\n", sc->sc_dev.dv_xname);
1149: #endif
1150: return 1;
1151: }
1152:
1153: if (fifost & FIFOS_TX_OVERRUN) {
1154: #ifdef EP_DEBUG
1155: if (sc->sc_arpcom.ac_if.if_flags & IFF_DEBUG)
1156: printf("%s: TX overrun\n", sc->sc_dev.dv_xname);
1157: #endif
1158: epreset(sc);
1159: return 0;
1160: }
1161:
1162: return 0;
1163: }
1164:
1165:
1166: void
1167: eptxstat(sc)
1168: register struct ep_softc *sc;
1169: {
1170: bus_space_tag_t iot = sc->sc_iot;
1171: bus_space_handle_t ioh = sc->sc_ioh;
1172: int i;
1173:
1174: /*
1175: * We need to read+write TX_STATUS until we get a 0 status
1176: * in order to turn off the interrupt flag.
1177: */
1178: while ((i = bus_space_read_1(iot, ioh,
1179: ep_w1_reg(sc, EP_W1_TX_STATUS))) & TXS_COMPLETE) {
1180: bus_space_write_1(iot, ioh, ep_w1_reg(sc, EP_W1_TX_STATUS),
1181: 0x0);
1182:
1183: if (i & TXS_JABBER) {
1184: ++sc->sc_arpcom.ac_if.if_oerrors;
1185: #ifdef EP_DEBUG
1186: if (sc->sc_arpcom.ac_if.if_flags & IFF_DEBUG)
1187: printf("%s: jabber (%x)\n",
1188: sc->sc_dev.dv_xname, i);
1189: #endif
1190: epreset(sc);
1191: } else if (i & TXS_UNDERRUN) {
1192: ++sc->sc_arpcom.ac_if.if_oerrors;
1193: #ifdef EP_DEBUG
1194: if (sc->sc_arpcom.ac_if.if_flags & IFF_DEBUG)
1195: printf("%s: fifo underrun (%x) @%d\n",
1196: sc->sc_dev.dv_xname, i,
1197: sc->tx_start_thresh);
1198: #endif
1199: if (sc->tx_succ_ok < 100)
1200: sc->tx_start_thresh = min(ETHER_MAX_LEN,
1201: sc->tx_start_thresh + 20);
1202: sc->tx_succ_ok = 0;
1203: epreset(sc);
1204: } else if (i & TXS_MAX_COLLISION) {
1205: ++sc->sc_arpcom.ac_if.if_collisions;
1206: bus_space_write_2(iot, ioh, EP_COMMAND, TX_ENABLE);
1207: sc->sc_arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
1208: } else
1209: sc->tx_succ_ok = (sc->tx_succ_ok+1) & 127;
1210: }
1211: }
1212:
1213: int
1214: epintr(arg)
1215: void *arg;
1216: {
1217: register struct ep_softc *sc = arg;
1218: bus_space_tag_t iot = sc->sc_iot;
1219: bus_space_handle_t ioh = sc->sc_ioh;
1220: struct ifnet *ifp = &sc->sc_arpcom.ac_if;
1221: u_int16_t status;
1222: int ret = 0;
1223:
1224: for (;;) {
1225: bus_space_write_2(iot, ioh, EP_COMMAND, C_INTR_LATCH);
1226:
1227: status = bus_space_read_2(iot, ioh, EP_STATUS);
1228:
1229: if ((status & (S_TX_COMPLETE | S_TX_AVAIL |
1230: S_RX_COMPLETE | S_CARD_FAILURE)) == 0)
1231: break;
1232:
1233: ret = 1;
1234:
1235: /*
1236: * Acknowledge any interrupts. It's important that we do this
1237: * first, since there would otherwise be a race condition.
1238: * Due to the i386 interrupt queueing, we may get spurious
1239: * interrupts occasionally.
1240: */
1241: bus_space_write_2(iot, ioh, EP_COMMAND, ACK_INTR | status);
1242:
1243: if (status & S_RX_COMPLETE)
1244: epread(sc);
1245: if (status & S_TX_AVAIL) {
1246: ifp->if_flags &= ~IFF_OACTIVE;
1247: epstart(ifp);
1248: }
1249: if (status & S_CARD_FAILURE) {
1250: epreset(sc);
1251: return (1);
1252: }
1253: if (status & S_TX_COMPLETE) {
1254: eptxstat(sc);
1255: epstart(ifp);
1256: }
1257: }
1258:
1259: /* no more interrupts */
1260: return (ret);
1261: }
1262:
1263: void
1264: epread(sc)
1265: register struct ep_softc *sc;
1266: {
1267: bus_space_tag_t iot = sc->sc_iot;
1268: bus_space_handle_t ioh = sc->sc_ioh;
1269: struct ifnet *ifp = &sc->sc_arpcom.ac_if;
1270: struct mbuf *m;
1271: int len;
1272:
1273: len = bus_space_read_2(iot, ioh, ep_w1_reg(sc, EP_W1_RX_STATUS));
1274:
1275: again:
1276: #ifdef EP_DEBUG
1277: if (ifp->if_flags & IFF_DEBUG) {
1278: int err = len & ERR_MASK;
1279: char *s = NULL;
1280:
1281: if (len & ERR_INCOMPLETE)
1282: s = "incomplete packet";
1283: else if (err == ERR_OVERRUN)
1284: s = "packet overrun";
1285: else if (err == ERR_RUNT)
1286: s = "runt packet";
1287: else if (err == ERR_ALIGNMENT)
1288: s = "bad alignment";
1289: else if (err == ERR_CRC)
1290: s = "bad crc";
1291: else if (err == ERR_OVERSIZE)
1292: s = "oversized packet";
1293: else if (err == ERR_DRIBBLE)
1294: s = "dribble bits";
1295:
1296: if (s)
1297: printf("%s: %s\n", sc->sc_dev.dv_xname, s);
1298: }
1299: #endif
1300:
1301: if (len & ERR_INCOMPLETE)
1302: return;
1303:
1304: if (len & ERR_RX) {
1305: ++ifp->if_ierrors;
1306: goto abort;
1307: }
1308:
1309: len &= RX_BYTES_MASK; /* Lower 11 bits = RX bytes. */
1310:
1311: /* Pull packet off interface. */
1312: m = epget(sc, len);
1313: if (m == NULL) {
1314: ifp->if_ierrors++;
1315: goto abort;
1316: }
1317:
1318: ++ifp->if_ipackets;
1319:
1320: #if NBPFILTER > 0
1321: /*
1322: * Check if there's a BPF listener on this interface.
1323: * If so, hand off the raw packet to BPF.
1324: */
1325: if (ifp->if_bpf)
1326: bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_IN);
1327: #endif
1328:
1329: ether_input_mbuf(ifp, m);
1330:
1331: /*
1332: * In periods of high traffic we can actually receive enough
1333: * packets so that the fifo overrun bit will be set at this point,
1334: * even though we just read a packet. In this case we
1335: * are not going to receive any more interrupts. We check for
1336: * this condition and read again until the fifo is not full.
1337: * We could simplify this test by not using epstatus(), but
1338: * rechecking the RX_STATUS register directly. This test could
1339: * result in unnecessary looping in cases where there is a new
1340: * packet but the fifo is not full, but it will not fix the
1341: * stuck behavior.
1342: *
1343: * Even with this improvement, we still get packet overrun errors
1344: * which are hurting performance. Maybe when I get some more time
1345: * I'll modify epread() so that it can handle RX_EARLY interrupts.
1346: */
1347: if (epstatus(sc)) {
1348: len = bus_space_read_2(iot, ioh,
1349: ep_w1_reg(sc, EP_W1_RX_STATUS));
1350: /* Check if we are stuck and reset [see XXX comment] */
1351: if (len & ERR_INCOMPLETE) {
1352: #ifdef EP_DEBUG
1353: if (ifp->if_flags & IFF_DEBUG)
1354: printf("%s: adapter reset\n",
1355: sc->sc_dev.dv_xname);
1356: #endif
1357: epreset(sc);
1358: return;
1359: }
1360: goto again;
1361: }
1362:
1363: return;
1364:
1365: abort:
1366: ep_discard_rxtop(iot, ioh);
1367: }
1368:
1369: struct mbuf *
1370: epget(sc, totlen)
1371: struct ep_softc *sc;
1372: int totlen;
1373: {
1374: bus_space_tag_t iot = sc->sc_iot;
1375: bus_space_handle_t ioh = sc->sc_ioh;
1376: struct ifnet *ifp = &sc->sc_arpcom.ac_if;
1377: struct mbuf *top, **mp, *m;
1378: int len, pad, sh, rxreg;
1379:
1380: m = sc->mb[sc->next_mb];
1381: sc->mb[sc->next_mb] = NULL;
1382: if (m == NULL) {
1383: MGETHDR(m, M_DONTWAIT, MT_DATA);
1384: if (m == NULL)
1385: return (NULL);
1386: } else {
1387: /* If the queue is no longer full, refill. */
1388: if (sc->last_mb == sc->next_mb)
1389: timeout_add(&sc->sc_epmbuffill_tmo, 1);
1390: /* Convert one of our saved mbuf's. */
1391: sc->next_mb = (sc->next_mb + 1) % MAX_MBS;
1392: m->m_data = m->m_pktdat;
1393: m->m_flags = M_PKTHDR;
1394: m_tag_init(m);
1395: m->m_pkthdr.csum_flags = 0;
1396: }
1397: m->m_pkthdr.rcvif = ifp;
1398: m->m_pkthdr.len = totlen;
1399: pad = ALIGN(sizeof(struct ether_header)) - sizeof(struct ether_header);
1400: len = MHLEN;
1401: if (totlen >= MINCLSIZE) {
1402: MCLGET(m, M_DONTWAIT);
1403: if (m->m_flags & M_EXT)
1404: len = MCLBYTES;
1405: }
1406: m->m_data += pad;
1407: len -= pad;
1408: top = 0;
1409: mp = ⊤
1410:
1411: /*
1412: * We read the packet at splhigh() so that an interrupt from another
1413: * device doesn't cause the card's buffer to overflow while we're
1414: * reading it. We may still lose packets at other times.
1415: */
1416: sh = splhigh();
1417:
1418: rxreg = ep_w1_reg(sc, EP_W1_RX_PIO_RD_1);
1419:
1420: while (totlen > 0) {
1421: if (top) {
1422: m = sc->mb[sc->next_mb];
1423: sc->mb[sc->next_mb] = NULL;
1424: if (m == NULL) {
1425: MGET(m, M_DONTWAIT, MT_DATA);
1426: if (m == NULL) {
1427: splx(sh);
1428: m_freem(top);
1429: return (NULL);
1430: }
1431: } else
1432: sc->next_mb = (sc->next_mb + 1) % MAX_MBS;
1433:
1434: len = MLEN;
1435: }
1436: if (top && totlen >= MINCLSIZE) {
1437: MCLGET(m, M_DONTWAIT);
1438: if (m->m_flags & M_EXT)
1439: len = MCLBYTES;
1440: }
1441: len = min(totlen, len);
1442: if (EP_IS_BUS_32(sc->bustype)) {
1443: if (len > 3) {
1444: len &= ~3;
1445: bus_space_read_raw_multi_4(iot, ioh, rxreg,
1446: mtod(m, u_int8_t *), len);
1447: } else
1448: bus_space_read_multi_1(iot, ioh, rxreg,
1449: mtod(m, u_int8_t *), len);
1450: } else {
1451: if (len > 1) {
1452: len &= ~1;
1453: bus_space_read_raw_multi_2(iot, ioh, rxreg,
1454: mtod(m, u_int8_t *), len);
1455: } else
1456: *(mtod(m, u_int8_t *)) =
1457: bus_space_read_1(iot, ioh, rxreg);
1458: }
1459: m->m_len = len;
1460: totlen -= len;
1461: *mp = m;
1462: mp = &m->m_next;
1463: }
1464:
1465: ep_discard_rxtop(iot, ioh);
1466:
1467: splx(sh);
1468:
1469: return top;
1470: }
1471:
1472: int
1473: epioctl(ifp, cmd, data)
1474: register struct ifnet *ifp;
1475: u_long cmd;
1476: caddr_t data;
1477: {
1478: struct ep_softc *sc = ifp->if_softc;
1479: struct ifaddr *ifa = (struct ifaddr *)data;
1480: struct ifreq *ifr = (struct ifreq *)data;
1481: int s, error = 0;
1482:
1483: s = splnet();
1484:
1485: if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
1486: splx(s);
1487: return error;
1488: }
1489:
1490: switch (cmd) {
1491:
1492: case SIOCSIFADDR:
1493: ifp->if_flags |= IFF_UP;
1494:
1495: switch (ifa->ifa_addr->sa_family) {
1496: #ifdef INET
1497: case AF_INET:
1498: epinit(sc);
1499: arp_ifinit(&sc->sc_arpcom, ifa);
1500: break;
1501: #endif
1502: default:
1503: epinit(sc);
1504: break;
1505: }
1506: break;
1507:
1508: case SIOCSIFMEDIA:
1509: case SIOCGIFMEDIA:
1510: error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, cmd);
1511: break;
1512:
1513: case SIOCSIFMTU:
1514: if (ifr->ifr_mtu > ETHERMTU || ifr->ifr_mtu < ETHERMIN) {
1515: error = EINVAL;
1516: } else if (ifp->if_mtu != ifr->ifr_mtu) {
1517: ifp->if_mtu = ifr->ifr_mtu;
1518: }
1519: break;
1520:
1521: case SIOCSIFFLAGS:
1522: if ((ifp->if_flags & IFF_UP) == 0 &&
1523: (ifp->if_flags & IFF_RUNNING) != 0) {
1524: /*
1525: * If interface is marked down and it is running, then
1526: * stop it.
1527: */
1528: epstop(sc);
1529: ifp->if_flags &= ~IFF_RUNNING;
1530: } else if ((ifp->if_flags & IFF_UP) != 0 &&
1531: (ifp->if_flags & IFF_RUNNING) == 0) {
1532: /*
1533: * If interface is marked up and it is stopped, then
1534: * start it.
1535: */
1536: epinit(sc);
1537: } else if ((ifp->if_flags & IFF_UP) != 0) {
1538: /*
1539: * Reset the interface to pick up changes in any other
1540: * flags that affect hardware registers.
1541: */
1542: epinit(sc);
1543: }
1544: break;
1545:
1546: case SIOCADDMULTI:
1547: case SIOCDELMULTI:
1548: error = (cmd == SIOCADDMULTI) ?
1549: ether_addmulti(ifr, &sc->sc_arpcom) :
1550: ether_delmulti(ifr, &sc->sc_arpcom);
1551:
1552: if (error == ENETRESET) {
1553: /*
1554: * Multicast list has changed; set the hardware filter
1555: * accordingly.
1556: */
1557: if (ifp->if_flags & IFF_RUNNING)
1558: epreset(sc);
1559: error = 0;
1560: }
1561: break;
1562:
1563: default:
1564: error = EINVAL;
1565: break;
1566: }
1567:
1568: splx(s);
1569: return (error);
1570: }
1571:
1572: void
1573: epreset(sc)
1574: struct ep_softc *sc;
1575: {
1576: int s;
1577:
1578: s = splnet();
1579: epinit(sc);
1580: splx(s);
1581: }
1582:
1583: void
1584: epwatchdog(ifp)
1585: struct ifnet *ifp;
1586: {
1587: struct ep_softc *sc = ifp->if_softc;
1588:
1589: log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
1590: ++sc->sc_arpcom.ac_if.if_oerrors;
1591:
1592: epreset(sc);
1593: }
1594:
1595: void
1596: epstop(sc)
1597: register struct ep_softc *sc;
1598: {
1599: bus_space_tag_t iot = sc->sc_iot;
1600: bus_space_handle_t ioh = sc->sc_ioh;
1601:
1602: if (sc->ep_flags & EP_FLAGS_MII) {
1603: mii_down(&sc->sc_mii);
1604: }
1605:
1606: if (sc->ep_chipset == EP_CHIPSET_ROADRUNNER) {
1607: /* Clear the FIFO buffer count, thus halting
1608: * any currently-running transactions.
1609: */
1610: GO_WINDOW(1); /* sanity */
1611: bus_space_write_2(iot, ioh, EP_W1_RUNNER_WRCTL, 0);
1612: bus_space_write_2(iot, ioh, EP_W1_RUNNER_RDCTL, 0);
1613: }
1614:
1615: bus_space_write_2(iot, ioh, EP_COMMAND, RX_DISABLE);
1616: ep_discard_rxtop(iot, ioh);
1617:
1618: bus_space_write_2(iot, ioh, EP_COMMAND, TX_DISABLE);
1619: bus_space_write_2(iot, ioh, EP_COMMAND, STOP_TRANSCEIVER);
1620:
1621: ep_reset_cmd(sc, EP_COMMAND, RX_RESET);
1622: ep_reset_cmd(sc, EP_COMMAND, TX_RESET);
1623:
1624: bus_space_write_2(iot, ioh, EP_COMMAND, C_INTR_LATCH);
1625: bus_space_write_2(iot, ioh, EP_COMMAND, SET_RD_0_MASK);
1626: bus_space_write_2(iot, ioh, EP_COMMAND, SET_INTR_MASK);
1627: bus_space_write_2(iot, ioh, EP_COMMAND, SET_RX_FILTER);
1628:
1629: epmbufempty(sc);
1630: }
1631:
1632: /*
1633: * We get eeprom data from the id_port given an offset into the
1634: * eeprom. Basically; after the ID_sequence is sent to all of
1635: * the cards; they enter the ID_CMD state where they will accept
1636: * command requests. 0x80-0xbf loads the eeprom data. We then
1637: * read the port 16 times and with every read; the cards check
1638: * for contention (ie: if one card writes a 0 bit and another
1639: * writes a 1 bit then the host sees a 0. At the end of the cycle;
1640: * each card compares the data on the bus; if there is a difference
1641: * then that card goes into ID_WAIT state again). In the meantime;
1642: * one bit of data is returned in the AX register which is conveniently
1643: * returned to us by bus_space_read_1(). Hence; we read 16 times getting one
1644: * bit of data with each read.
1645: *
1646: * NOTE: the caller must provide an i/o handle for ELINK_ID_PORT!
1647: */
1648: u_int16_t
1649: epreadeeprom(iot, ioh, offset)
1650: bus_space_tag_t iot;
1651: bus_space_handle_t ioh;
1652: int offset;
1653: {
1654: u_int16_t data = 0;
1655: int i;
1656:
1657: bus_space_write_1(iot, ioh, 0, 0x80 + offset);
1658: delay(1000);
1659: for (i = 0; i < 16; i++)
1660: data = (data << 1) | (bus_space_read_2(iot, ioh, 0) & 1);
1661: return (data);
1662: }
1663:
1664: int
1665: epbusyeeprom(sc)
1666: struct ep_softc *sc;
1667: {
1668: bus_space_tag_t iot = sc->sc_iot;
1669: bus_space_handle_t ioh = sc->sc_ioh;
1670: int i = 100, j;
1671:
1672: while (i--) {
1673: j = bus_space_read_2(iot, ioh, EP_W0_EEPROM_COMMAND);
1674: if (j & EEPROM_BUSY)
1675: delay(100);
1676: else
1677: break;
1678: }
1679: if (!i) {
1680: printf("\n%s: eeprom failed to come ready\n",
1681: sc->sc_dev.dv_xname);
1682: return (1);
1683: }
1684: if (sc->bustype != EP_BUS_PCMCIA && sc->bustype != EP_BUS_PCI &&
1685: (j & EEPROM_TST_MODE)) {
1686: printf("\n%s: erase pencil mark, or disable PnP mode!\n",
1687: sc->sc_dev.dv_xname);
1688: return (1);
1689: }
1690: return (0);
1691: }
1692:
1693: u_int16_t
1694: ep_read_eeprom(sc, offset)
1695: struct ep_softc *sc;
1696: u_int16_t offset;
1697: {
1698: u_int16_t readcmd;
1699:
1700: /*
1701: * RoadRunner has a larger EEPROM, so a different read command
1702: * is required.
1703: */
1704: if (sc->ep_chipset == EP_CHIPSET_ROADRUNNER)
1705: readcmd = READ_EEPROM_RR;
1706: else
1707: readcmd = READ_EEPROM;
1708:
1709: if (epbusyeeprom(sc))
1710: return (0); /* XXX why is eeprom busy? */
1711: bus_space_write_2(sc->sc_iot, sc->sc_ioh, EP_W0_EEPROM_COMMAND,
1712: readcmd | offset);
1713: if (epbusyeeprom(sc))
1714: return (0); /* XXX why is eeprom busy? */
1715:
1716: return (bus_space_read_2(sc->sc_iot, sc->sc_ioh, EP_W0_EEPROM_DATA));
1717: }
1718:
1719: void
1720: epmbuffill(v)
1721: void *v;
1722: {
1723: struct ep_softc *sc = v;
1724: int s, i;
1725:
1726: s = splnet();
1727: i = sc->last_mb;
1728: do {
1729: if (sc->mb[i] == NULL)
1730: MGET(sc->mb[i], M_DONTWAIT, MT_DATA);
1731: if (sc->mb[i] == NULL)
1732: break;
1733: i = (i + 1) % MAX_MBS;
1734: } while (i != sc->next_mb);
1735: sc->last_mb = i;
1736: /* If the queue was not filled, try again. */
1737: if (sc->last_mb != sc->next_mb)
1738: timeout_add(&sc->sc_epmbuffill_tmo, 1);
1739: splx(s);
1740: }
1741:
1742: void
1743: epmbufempty(sc)
1744: struct ep_softc *sc;
1745: {
1746: int s, i;
1747:
1748: s = splnet();
1749: for (i = 0; i<MAX_MBS; i++) {
1750: if (sc->mb[i]) {
1751: m_freem(sc->mb[i]);
1752: sc->mb[i] = NULL;
1753: }
1754: }
1755: sc->last_mb = sc->next_mb = 0;
1756: timeout_del(&sc->sc_epmbuffill_tmo);
1757: splx(s);
1758: }
1759:
1760: void
1761: ep_mii_setbit(sc, bit)
1762: struct ep_softc *sc;
1763: u_int16_t bit;
1764: {
1765: u_int16_t val;
1766:
1767: /* We assume we're already in Window 4 */
1768: val = bus_space_read_2(sc->sc_iot, sc->sc_ioh, EP_W4_BOOM_PHYSMGMT);
1769: bus_space_write_2(sc->sc_iot, sc->sc_ioh, EP_W4_BOOM_PHYSMGMT,
1770: val | bit);
1771: }
1772:
1773: void
1774: ep_mii_clrbit(sc, bit)
1775: struct ep_softc *sc;
1776: u_int16_t bit;
1777: {
1778: u_int16_t val;
1779:
1780: /* We assume we're already in Window 4 */
1781: val = bus_space_read_2(sc->sc_iot, sc->sc_ioh, EP_W4_BOOM_PHYSMGMT);
1782: bus_space_write_2(sc->sc_iot, sc->sc_ioh, EP_W4_BOOM_PHYSMGMT,
1783: val & ~bit);
1784: }
1785:
1786: u_int16_t
1787: ep_mii_readbit(sc, bit)
1788: struct ep_softc *sc;
1789: u_int16_t bit;
1790: {
1791:
1792: /* We assume we're already in Window 4 */
1793: return (bus_space_read_2(sc->sc_iot, sc->sc_ioh, EP_W4_BOOM_PHYSMGMT) &
1794: bit);
1795: }
1796:
1797: void
1798: ep_mii_sync(sc)
1799: struct ep_softc *sc;
1800: {
1801: int i;
1802:
1803: /* We assume we're already in Window 4 */
1804: ep_mii_clrbit(sc, PHYSMGMT_DIR);
1805: for (i = 0; i < 32; i++) {
1806: ep_mii_clrbit(sc, PHYSMGMT_CLK);
1807: ep_mii_setbit(sc, PHYSMGMT_CLK);
1808: }
1809: }
1810:
1811: void
1812: ep_mii_sendbits(sc, data, nbits)
1813: struct ep_softc *sc;
1814: u_int32_t data;
1815: int nbits;
1816: {
1817: int i;
1818:
1819: /* We assume we're already in Window 4 */
1820: ep_mii_setbit(sc, PHYSMGMT_DIR);
1821: for (i = 1 << (nbits - 1); i; i = i >> 1) {
1822: ep_mii_clrbit(sc, PHYSMGMT_CLK);
1823: ep_mii_readbit(sc, PHYSMGMT_CLK);
1824: if (data & i)
1825: ep_mii_setbit(sc, PHYSMGMT_DATA);
1826: else
1827: ep_mii_clrbit(sc, PHYSMGMT_DATA);
1828: ep_mii_setbit(sc, PHYSMGMT_CLK);
1829: ep_mii_readbit(sc, PHYSMGMT_CLK);
1830: }
1831: }
1832:
1833: int
1834: ep_mii_readreg(self, phy, reg)
1835: struct device *self;
1836: int phy, reg;
1837: {
1838: struct ep_softc *sc = (struct ep_softc *)self;
1839: int val = 0, i, err;
1840:
1841: /*
1842: * Read the PHY register by manually driving the MII control lines.
1843: */
1844:
1845: GO_WINDOW(4);
1846:
1847: bus_space_write_2(sc->sc_iot, sc->sc_ioh, EP_W4_BOOM_PHYSMGMT, 0);
1848:
1849: ep_mii_sync(sc);
1850: ep_mii_sendbits(sc, MII_COMMAND_START, 2);
1851: ep_mii_sendbits(sc, MII_COMMAND_READ, 2);
1852: ep_mii_sendbits(sc, phy, 5);
1853: ep_mii_sendbits(sc, reg, 5);
1854:
1855: ep_mii_clrbit(sc, PHYSMGMT_DIR);
1856: ep_mii_clrbit(sc, PHYSMGMT_CLK);
1857: ep_mii_setbit(sc, PHYSMGMT_CLK);
1858: ep_mii_clrbit(sc, PHYSMGMT_CLK);
1859:
1860: err = ep_mii_readbit(sc, PHYSMGMT_DATA);
1861: ep_mii_setbit(sc, PHYSMGMT_CLK);
1862:
1863: /* Even if an error occurs, must still clock out the cycle. */
1864: for (i = 0; i < 16; i++) {
1865: val <<= 1;
1866: ep_mii_clrbit(sc, PHYSMGMT_CLK);
1867: if (err == 0 && ep_mii_readbit(sc, PHYSMGMT_DATA))
1868: val |= 1;
1869: ep_mii_setbit(sc, PHYSMGMT_CLK);
1870: }
1871: ep_mii_clrbit(sc, PHYSMGMT_CLK);
1872: ep_mii_setbit(sc, PHYSMGMT_CLK);
1873:
1874: GO_WINDOW(1); /* back to operating window */
1875:
1876: return (err ? 0 : val);
1877: }
1878:
1879: void
1880: ep_mii_writereg(self, phy, reg, val)
1881: struct device *self;
1882: int phy, reg, val;
1883: {
1884: struct ep_softc *sc = (struct ep_softc *)self;
1885:
1886: /*
1887: * Write the PHY register by manually driving the MII control lines.
1888: */
1889:
1890: GO_WINDOW(4);
1891:
1892: ep_mii_sync(sc);
1893: ep_mii_sendbits(sc, MII_COMMAND_START, 2);
1894: ep_mii_sendbits(sc, MII_COMMAND_WRITE, 2);
1895: ep_mii_sendbits(sc, phy, 5);
1896: ep_mii_sendbits(sc, reg, 5);
1897: ep_mii_sendbits(sc, MII_COMMAND_ACK, 2);
1898: ep_mii_sendbits(sc, val, 16);
1899:
1900: ep_mii_clrbit(sc, PHYSMGMT_CLK);
1901: ep_mii_setbit(sc, PHYSMGMT_CLK);
1902:
1903: GO_WINDOW(1); /* back to operating window */
1904: }
1905:
1906: void
1907: ep_statchg(self)
1908: struct device *self;
1909: {
1910: struct ep_softc *sc = (struct ep_softc *)self;
1911: bus_space_tag_t iot = sc->sc_iot;
1912: bus_space_handle_t ioh = sc->sc_ioh;
1913: int mctl;
1914:
1915: /* XXX Update ifp->if_baudrate */
1916:
1917: GO_WINDOW(3);
1918: mctl = bus_space_read_2(iot, ioh, EP_W3_MAC_CONTROL);
1919: if (sc->sc_mii.mii_media_active & IFM_FDX)
1920: mctl |= MAC_CONTROL_FDX;
1921: else
1922: mctl &= ~MAC_CONTROL_FDX;
1923: bus_space_write_2(iot, ioh, EP_W3_MAC_CONTROL, mctl);
1924: GO_WINDOW(1); /* back to operating window */
1925: }
CVSweb