Merge from vendor branch AWK:
[dragonfly.git] / sys / dev / netif / dc / if_dc.c
1 /*
2  * Copyright (c) 1997, 1998, 1999
3  *      Bill Paul <wpaul@ee.columbia.edu>.  All rights reserved.
4  *
5  * Redistribution 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, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by Bill Paul.
16  * 4. Neither the name of the author nor the names of any co-contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
24  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
30  * THE POSSIBILITY OF SUCH DAMAGE.
31  *
32  * $FreeBSD: src/sys/pci/if_dc.c,v 1.9.2.45 2003/06/08 14:31:53 mux Exp $
33  * $DragonFly: src/sys/dev/netif/dc/if_dc.c,v 1.12 2004/04/16 14:21:57 joerg Exp $
34  *
35  * $FreeBSD: src/sys/pci/if_dc.c,v 1.9.2.45 2003/06/08 14:31:53 mux Exp $
36  */
37
38 /*
39  * DEC "tulip" clone ethernet driver. Supports the DEC/Intel 21143
40  * series chips and several workalikes including the following:
41  *
42  * Macronix 98713/98715/98725/98727/98732 PMAC (www.macronix.com)
43  * Macronix/Lite-On 82c115 PNIC II (www.macronix.com)
44  * Lite-On 82c168/82c169 PNIC (www.litecom.com)
45  * ASIX Electronics AX88140A (www.asix.com.tw)
46  * ASIX Electronics AX88141 (www.asix.com.tw)
47  * ADMtek AL981 (www.admtek.com.tw)
48  * ADMtek AN985 (www.admtek.com.tw)
49  * Davicom DM9100, DM9102, DM9102A (www.davicom8.com)
50  * Accton EN1217 (www.accton.com)
51  * Conexant LANfinity (www.conexant.com)
52  *
53  * Datasheets for the 21143 are available at developer.intel.com.
54  * Datasheets for the clone parts can be found at their respective sites.
55  * (Except for the PNIC; see www.freebsd.org/~wpaul/PNIC/pnic.ps.gz.)
56  * The PNIC II is essentially a Macronix 98715A chip; the only difference
57  * worth noting is that its multicast hash table is only 128 bits wide
58  * instead of 512.
59  *
60  * Written by Bill Paul <wpaul@ee.columbia.edu>
61  * Electrical Engineering Department
62  * Columbia University, New York City
63  */
64
65 /*
66  * The Intel 21143 is the successor to the DEC 21140. It is basically
67  * the same as the 21140 but with a few new features. The 21143 supports
68  * three kinds of media attachments:
69  *
70  * o MII port, for 10Mbps and 100Mbps support and NWAY
71  *   autonegotiation provided by an external PHY.
72  * o SYM port, for symbol mode 100Mbps support.
73  * o 10baseT port.
74  * o AUI/BNC port.
75  *
76  * The 100Mbps SYM port and 10baseT port can be used together in
77  * combination with the internal NWAY support to create a 10/100
78  * autosensing configuration.
79  *
80  * Note that not all tulip workalikes are handled in this driver: we only
81  * deal with those which are relatively well behaved. The Winbond is
82  * handled separately due to its different register offsets and the
83  * special handling needed for its various bugs. The PNIC is handled
84  * here, but I'm not thrilled about it.
85  *
86  * All of the workalike chips use some form of MII transceiver support
87  * with the exception of the Macronix chips, which also have a SYM port.
88  * The ASIX AX88140A is also documented to have a SYM port, but all
89  * the cards I've seen use an MII transceiver, probably because the
90  * AX88140A doesn't support internal NWAY.
91  */
92
93 #include <sys/param.h>
94 #include <sys/systm.h>
95 #include <sys/sockio.h>
96 #include <sys/mbuf.h>
97 #include <sys/malloc.h>
98 #include <sys/kernel.h>
99 #include <sys/socket.h>
100 #include <sys/sysctl.h>
101
102 #include <net/if.h>
103 #include <net/if_arp.h>
104 #include <net/ethernet.h>
105 #include <net/if_dl.h>
106 #include <net/if_media.h>
107 #include <net/if_types.h>
108 #include <net/vlan/if_vlan_var.h>
109
110 #include <net/bpf.h>
111
112 #include <vm/vm.h>              /* for vtophys */
113 #include <vm/pmap.h>            /* for vtophys */
114 #include <machine/clock.h>      /* for DELAY */
115 #include <machine/bus_pio.h>
116 #include <machine/bus_memio.h>
117 #include <machine/bus.h>
118 #include <machine/resource.h>
119 #include <sys/bus.h>
120 #include <sys/rman.h>
121
122 #include "../mii_layer/mii.h"
123 #include "../mii_layer/miivar.h"
124
125 #include <bus/pci/pcireg.h>
126 #include <bus/pci/pcivar.h>
127
128 #define DC_USEIOSPACE
129 #ifdef __alpha__
130 #define SRM_MEDIA
131 #endif
132
133 #include "if_dcreg.h"
134
135 /* "controller miibus0" required.  See GENERIC if you get errors here. */
136 #include "miibus_if.h"
137
138 /*
139  * Various supported device vendors/types and their names.
140  */
141 static struct dc_type dc_devs[] = {
142         { DC_VENDORID_DEC, DC_DEVICEID_21143,
143                 "Intel 21143 10/100BaseTX" },
144         { DC_VENDORID_DAVICOM, DC_DEVICEID_DM9009,
145                 "Davicom DM9009 10/100BaseTX" },
146         { DC_VENDORID_DAVICOM, DC_DEVICEID_DM9100,
147                 "Davicom DM9100 10/100BaseTX" },
148         { DC_VENDORID_DAVICOM, DC_DEVICEID_DM9102,
149                 "Davicom DM9102 10/100BaseTX" },
150         { DC_VENDORID_DAVICOM, DC_DEVICEID_DM9102,
151                 "Davicom DM9102A 10/100BaseTX" },
152         { DC_VENDORID_ADMTEK, DC_DEVICEID_AL981,
153                 "ADMtek AL981 10/100BaseTX" },
154         { DC_VENDORID_ADMTEK, DC_DEVICEID_AN985,
155                 "ADMtek AN985 10/100BaseTX" },
156         { DC_VENDORID_ASIX, DC_DEVICEID_AX88140A,
157                 "ASIX AX88140A 10/100BaseTX" },
158         { DC_VENDORID_ASIX, DC_DEVICEID_AX88140A,
159                 "ASIX AX88141 10/100BaseTX" },
160         { DC_VENDORID_MX, DC_DEVICEID_98713,
161                 "Macronix 98713 10/100BaseTX" },
162         { DC_VENDORID_MX, DC_DEVICEID_98713,
163                 "Macronix 98713A 10/100BaseTX" },
164         { DC_VENDORID_CP, DC_DEVICEID_98713_CP,
165                 "Compex RL100-TX 10/100BaseTX" },
166         { DC_VENDORID_CP, DC_DEVICEID_98713_CP,
167                 "Compex RL100-TX 10/100BaseTX" },
168         { DC_VENDORID_MX, DC_DEVICEID_987x5,
169                 "Macronix 98715/98715A 10/100BaseTX" },
170         { DC_VENDORID_MX, DC_DEVICEID_987x5,
171                 "Macronix 98715AEC-C 10/100BaseTX" },
172         { DC_VENDORID_MX, DC_DEVICEID_987x5,
173                 "Macronix 98725 10/100BaseTX" },
174         { DC_VENDORID_MX, DC_DEVICEID_98727,
175                 "Macronix 98727/98732 10/100BaseTX" },
176         { DC_VENDORID_LO, DC_DEVICEID_82C115,
177                 "LC82C115 PNIC II 10/100BaseTX" },
178         { DC_VENDORID_LO, DC_DEVICEID_82C168,
179                 "82c168 PNIC 10/100BaseTX" },
180         { DC_VENDORID_LO, DC_DEVICEID_82C168,
181                 "82c169 PNIC 10/100BaseTX" },
182         { DC_VENDORID_ACCTON, DC_DEVICEID_EN1217,
183                 "Accton EN1217 10/100BaseTX" },
184         { DC_VENDORID_ACCTON, DC_DEVICEID_EN2242,
185                 "Accton EN2242 MiniPCI 10/100BaseTX" },
186         { DC_VENDORID_CONEXANT, DC_DEVICEID_RS7112,
187                 "Conexant LANfinity MiniPCI 10/100BaseTX" },
188         { DC_VENDORID_3COM, DC_DEVICEID_3CSOHOB,
189                 "3Com OfficeConnect 10/100B" },
190         { 0, 0, NULL }
191 };
192
193 static int dc_probe             (device_t);
194 static int dc_attach            (device_t);
195 static int dc_detach            (device_t);
196 static int dc_suspend           (device_t);
197 static int dc_resume            (device_t);
198 static void dc_acpi             (device_t);
199 static struct dc_type *dc_devtype       (device_t);
200 static int dc_newbuf            (struct dc_softc *, int, struct mbuf *);
201 static int dc_encap             (struct dc_softc *, struct mbuf *,
202                                         u_int32_t *);
203 static int dc_coal              (struct dc_softc *, struct mbuf **);
204 static void dc_pnic_rx_bug_war  (struct dc_softc *, int);
205 static int dc_rx_resync         (struct dc_softc *);
206 static void dc_rxeof            (struct dc_softc *);
207 static void dc_txeof            (struct dc_softc *);
208 static void dc_tick             (void *);
209 static void dc_tx_underrun      (struct dc_softc *);
210 static void dc_intr             (void *);
211 static void dc_start            (struct ifnet *);
212 static int dc_ioctl             (struct ifnet *, u_long, caddr_t,
213                                         struct ucred *);
214 static void dc_init             (void *);
215 static void dc_stop             (struct dc_softc *);
216 static void dc_watchdog         (struct ifnet *);
217 static void dc_shutdown         (device_t);
218 static int dc_ifmedia_upd       (struct ifnet *);
219 static void dc_ifmedia_sts      (struct ifnet *, struct ifmediareq *);
220
221 static void dc_delay            (struct dc_softc *);
222 static void dc_eeprom_idle      (struct dc_softc *);
223 static void dc_eeprom_putbyte   (struct dc_softc *, int);
224 static void dc_eeprom_getword   (struct dc_softc *, int, u_int16_t *);
225 static void dc_eeprom_getword_pnic
226                                 (struct dc_softc *, int, u_int16_t *);
227 static void dc_eeprom_width     (struct dc_softc *);
228 static void dc_read_eeprom      (struct dc_softc *, caddr_t, int,
229                                                         int, int);
230
231 static void dc_mii_writebit     (struct dc_softc *, int);
232 static int dc_mii_readbit       (struct dc_softc *);
233 static void dc_mii_sync         (struct dc_softc *);
234 static void dc_mii_send         (struct dc_softc *, u_int32_t, int);
235 static int dc_mii_readreg       (struct dc_softc *, struct dc_mii_frame *);
236 static int dc_mii_writereg      (struct dc_softc *, struct dc_mii_frame *);
237 static int dc_miibus_readreg    (device_t, int, int);
238 static int dc_miibus_writereg   (device_t, int, int, int);
239 static void dc_miibus_statchg   (device_t);
240 static void dc_miibus_mediainit (device_t);
241
242 static void dc_setcfg           (struct dc_softc *, int);
243 static u_int32_t dc_crc_le      (struct dc_softc *, caddr_t);
244 static u_int32_t dc_crc_be      (caddr_t);
245 static void dc_setfilt_21143    (struct dc_softc *);
246 static void dc_setfilt_asix     (struct dc_softc *);
247 static void dc_setfilt_admtek   (struct dc_softc *);
248
249 static void dc_setfilt          (struct dc_softc *);
250
251 static void dc_reset            (struct dc_softc *);
252 static int dc_list_rx_init      (struct dc_softc *);
253 static int dc_list_tx_init      (struct dc_softc *);
254
255 static void dc_read_srom        (struct dc_softc *, int);
256 static void dc_parse_21143_srom (struct dc_softc *);
257 static void dc_decode_leaf_sia  (struct dc_softc *,
258                                     struct dc_eblock_sia *);
259 static void dc_decode_leaf_mii  (struct dc_softc *,
260                                     struct dc_eblock_mii *);
261 static void dc_decode_leaf_sym  (struct dc_softc *,
262                                     struct dc_eblock_sym *);
263 static void dc_apply_fixup      (struct dc_softc *, int);
264
265 #ifdef DC_USEIOSPACE
266 #define DC_RES                  SYS_RES_IOPORT
267 #define DC_RID                  DC_PCI_CFBIO
268 #else
269 #define DC_RES                  SYS_RES_MEMORY
270 #define DC_RID                  DC_PCI_CFBMA
271 #endif
272
273 static device_method_t dc_methods[] = {
274         /* Device interface */
275         DEVMETHOD(device_probe,         dc_probe),
276         DEVMETHOD(device_attach,        dc_attach),
277         DEVMETHOD(device_detach,        dc_detach),
278         DEVMETHOD(device_suspend,       dc_suspend),
279         DEVMETHOD(device_resume,        dc_resume),
280         DEVMETHOD(device_shutdown,      dc_shutdown),
281
282         /* bus interface */
283         DEVMETHOD(bus_print_child,      bus_generic_print_child),
284         DEVMETHOD(bus_driver_added,     bus_generic_driver_added),
285
286         /* MII interface */
287         DEVMETHOD(miibus_readreg,       dc_miibus_readreg),
288         DEVMETHOD(miibus_writereg,      dc_miibus_writereg),
289         DEVMETHOD(miibus_statchg,       dc_miibus_statchg),
290         DEVMETHOD(miibus_mediainit,     dc_miibus_mediainit),
291
292         { 0, 0 }
293 };
294
295 static driver_t dc_driver = {
296         "dc",
297         dc_methods,
298         sizeof(struct dc_softc)
299 };
300
301 static devclass_t dc_devclass;
302
303 #ifdef __i386__
304 static int dc_quick=1;
305 SYSCTL_INT(_hw, OID_AUTO, dc_quick, CTLFLAG_RW,
306         &dc_quick,0,"do not mdevget in dc driver");
307 #endif
308
309 DECLARE_DUMMY_MODULE(if_dc);
310 DRIVER_MODULE(if_dc, pci, dc_driver, dc_devclass, 0, 0);
311 DRIVER_MODULE(miibus, dc, miibus_driver, miibus_devclass, 0, 0);
312
313 #define DC_SETBIT(sc, reg, x)                           \
314         CSR_WRITE_4(sc, reg, CSR_READ_4(sc, reg) | (x))
315
316 #define DC_CLRBIT(sc, reg, x)                           \
317         CSR_WRITE_4(sc, reg, CSR_READ_4(sc, reg) & ~(x))
318
319 #define SIO_SET(x)      DC_SETBIT(sc, DC_SIO, (x))
320 #define SIO_CLR(x)      DC_CLRBIT(sc, DC_SIO, (x))
321
322 static void dc_delay(sc)
323         struct dc_softc         *sc;
324 {
325         int                     idx;
326
327         for (idx = (300 / 33) + 1; idx > 0; idx--)
328                 CSR_READ_4(sc, DC_BUSCTL);
329 }
330
331 static void dc_eeprom_width(sc)
332         struct dc_softc         *sc;
333 {
334         int i;
335
336         /* Force EEPROM to idle state. */
337         dc_eeprom_idle(sc);
338
339         /* Enter EEPROM access mode. */
340         CSR_WRITE_4(sc, DC_SIO, DC_SIO_EESEL);
341         dc_delay(sc);
342         DC_SETBIT(sc, DC_SIO, DC_SIO_ROMCTL_READ);
343         dc_delay(sc);
344         DC_CLRBIT(sc, DC_SIO, DC_SIO_EE_CLK);
345         dc_delay(sc);
346         DC_SETBIT(sc, DC_SIO, DC_SIO_EE_CS);
347         dc_delay(sc);
348
349         for (i = 3; i--;) {
350                 if (6 & (1 << i))
351                         DC_SETBIT(sc, DC_SIO, DC_SIO_EE_DATAIN);
352                 else
353                         DC_CLRBIT(sc, DC_SIO, DC_SIO_EE_DATAIN);
354                 dc_delay(sc);
355                 DC_SETBIT(sc, DC_SIO, DC_SIO_EE_CLK);
356                 dc_delay(sc);
357                 DC_CLRBIT(sc, DC_SIO, DC_SIO_EE_CLK);
358                 dc_delay(sc);
359         }
360
361         for (i = 1; i <= 12; i++) {
362                 DC_SETBIT(sc, DC_SIO, DC_SIO_EE_CLK);
363                 dc_delay(sc);
364                 if (!(CSR_READ_4(sc, DC_SIO) & DC_SIO_EE_DATAOUT)) {
365                         DC_CLRBIT(sc, DC_SIO, DC_SIO_EE_CLK);
366                         dc_delay(sc);
367                         break;
368                 }
369                 DC_CLRBIT(sc, DC_SIO, DC_SIO_EE_CLK);
370                 dc_delay(sc);
371         }
372
373         /* Turn off EEPROM access mode. */
374         dc_eeprom_idle(sc);
375
376         if (i < 4 || i > 12)
377                 sc->dc_romwidth = 6;
378         else
379                 sc->dc_romwidth = i;
380
381         /* Enter EEPROM access mode. */
382         CSR_WRITE_4(sc, DC_SIO, DC_SIO_EESEL);
383         dc_delay(sc);
384         DC_SETBIT(sc, DC_SIO, DC_SIO_ROMCTL_READ);
385         dc_delay(sc);
386         DC_CLRBIT(sc, DC_SIO, DC_SIO_EE_CLK);
387         dc_delay(sc);
388         DC_SETBIT(sc, DC_SIO, DC_SIO_EE_CS);
389         dc_delay(sc);
390
391         /* Turn off EEPROM access mode. */
392         dc_eeprom_idle(sc);
393 }
394
395 static void dc_eeprom_idle(sc)
396         struct dc_softc         *sc;
397 {
398         int             i;
399
400         CSR_WRITE_4(sc, DC_SIO, DC_SIO_EESEL);
401         dc_delay(sc);
402         DC_SETBIT(sc, DC_SIO, DC_SIO_ROMCTL_READ);
403         dc_delay(sc);
404         DC_CLRBIT(sc, DC_SIO, DC_SIO_EE_CLK);
405         dc_delay(sc);
406         DC_SETBIT(sc, DC_SIO, DC_SIO_EE_CS);
407         dc_delay(sc);
408
409         for (i = 0; i < 25; i++) {
410                 DC_CLRBIT(sc, DC_SIO, DC_SIO_EE_CLK);
411                 dc_delay(sc);
412                 DC_SETBIT(sc, DC_SIO, DC_SIO_EE_CLK);
413                 dc_delay(sc);
414         }
415
416         DC_CLRBIT(sc, DC_SIO, DC_SIO_EE_CLK);
417         dc_delay(sc);
418         DC_CLRBIT(sc, DC_SIO, DC_SIO_EE_CS);
419         dc_delay(sc);
420         CSR_WRITE_4(sc, DC_SIO, 0x00000000);
421
422         return;
423 }
424
425 /*
426  * Send a read command and address to the EEPROM, check for ACK.
427  */
428 static void dc_eeprom_putbyte(sc, addr)
429         struct dc_softc         *sc;
430         int                     addr;
431 {
432         int             d, i;
433
434         d = DC_EECMD_READ >> 6;
435         for (i = 3; i--; ) {
436                 if (d & (1 << i))
437                         DC_SETBIT(sc, DC_SIO, DC_SIO_EE_DATAIN);
438                 else
439                         DC_CLRBIT(sc, DC_SIO, DC_SIO_EE_DATAIN);
440                 dc_delay(sc);
441                 DC_SETBIT(sc, DC_SIO, DC_SIO_EE_CLK);
442                 dc_delay(sc);
443                 DC_CLRBIT(sc, DC_SIO, DC_SIO_EE_CLK);
444                 dc_delay(sc);
445         }
446
447         /*
448          * Feed in each bit and strobe the clock.
449          */
450         for (i = sc->dc_romwidth; i--;) {
451                 if (addr & (1 << i)) {
452                         SIO_SET(DC_SIO_EE_DATAIN);
453                 } else {
454                         SIO_CLR(DC_SIO_EE_DATAIN);
455                 }
456                 dc_delay(sc);
457                 SIO_SET(DC_SIO_EE_CLK);
458                 dc_delay(sc);
459                 SIO_CLR(DC_SIO_EE_CLK);
460                 dc_delay(sc);
461         }
462
463         return;
464 }
465
466 /*
467  * Read a word of data stored in the EEPROM at address 'addr.'
468  * The PNIC 82c168/82c169 has its own non-standard way to read
469  * the EEPROM.
470  */
471 static void dc_eeprom_getword_pnic(sc, addr, dest)
472         struct dc_softc         *sc;
473         int                     addr;
474         u_int16_t               *dest;
475 {
476         int             i;
477         u_int32_t               r;
478
479         CSR_WRITE_4(sc, DC_PN_SIOCTL, DC_PN_EEOPCODE_READ|addr);
480
481         for (i = 0; i < DC_TIMEOUT; i++) {
482                 DELAY(1);
483                 r = CSR_READ_4(sc, DC_SIO);
484                 if (!(r & DC_PN_SIOCTL_BUSY)) {
485                         *dest = (u_int16_t)(r & 0xFFFF);
486                         return;
487                 }
488         }
489
490         return;
491 }
492
493 /*
494  * Read a word of data stored in the EEPROM at address 'addr.'
495  */
496 static void dc_eeprom_getword(sc, addr, dest)
497         struct dc_softc         *sc;
498         int                     addr;
499         u_int16_t               *dest;
500 {
501         int             i;
502         u_int16_t               word = 0;
503
504         /* Force EEPROM to idle state. */
505         dc_eeprom_idle(sc);
506
507         /* Enter EEPROM access mode. */
508         CSR_WRITE_4(sc, DC_SIO, DC_SIO_EESEL);
509         dc_delay(sc);
510         DC_SETBIT(sc, DC_SIO,  DC_SIO_ROMCTL_READ);
511         dc_delay(sc);
512         DC_CLRBIT(sc, DC_SIO, DC_SIO_EE_CLK);
513         dc_delay(sc);
514         DC_SETBIT(sc, DC_SIO, DC_SIO_EE_CS);
515         dc_delay(sc);
516
517         /*
518          * Send address of word we want to read.
519          */
520         dc_eeprom_putbyte(sc, addr);
521
522         /*
523          * Start reading bits from EEPROM.
524          */
525         for (i = 0x8000; i; i >>= 1) {
526                 SIO_SET(DC_SIO_EE_CLK);
527                 dc_delay(sc);
528                 if (CSR_READ_4(sc, DC_SIO) & DC_SIO_EE_DATAOUT)
529                         word |= i;
530                 dc_delay(sc);
531                 SIO_CLR(DC_SIO_EE_CLK);
532                 dc_delay(sc);
533         }
534
535         /* Turn off EEPROM access mode. */
536         dc_eeprom_idle(sc);
537
538         *dest = word;
539
540         return;
541 }
542
543 /*
544  * Read a sequence of words from the EEPROM.
545  */
546 static void dc_read_eeprom(sc, dest, off, cnt, swap)
547         struct dc_softc         *sc;
548         caddr_t                 dest;
549         int                     off;
550         int                     cnt;
551         int                     swap;
552 {
553         int                     i;
554         u_int16_t               word = 0, *ptr;
555
556         for (i = 0; i < cnt; i++) {
557                 if (DC_IS_PNIC(sc))
558                         dc_eeprom_getword_pnic(sc, off + i, &word);
559                 else
560                         dc_eeprom_getword(sc, off + i, &word);
561                 ptr = (u_int16_t *)(dest + (i * 2));
562                 if (swap)
563                         *ptr = ntohs(word);
564                 else
565                         *ptr = word;
566         }
567
568         return;
569 }
570
571 /*
572  * The following two routines are taken from the Macronix 98713
573  * Application Notes pp.19-21.
574  */
575 /*
576  * Write a bit to the MII bus.
577  */
578 static void dc_mii_writebit(sc, bit)
579         struct dc_softc         *sc;
580         int                     bit;
581 {
582         if (bit)
583                 CSR_WRITE_4(sc, DC_SIO,
584                     DC_SIO_ROMCTL_WRITE|DC_SIO_MII_DATAOUT);
585         else
586                 CSR_WRITE_4(sc, DC_SIO, DC_SIO_ROMCTL_WRITE);
587
588         DC_SETBIT(sc, DC_SIO, DC_SIO_MII_CLK);
589         DC_CLRBIT(sc, DC_SIO, DC_SIO_MII_CLK);
590
591         return;
592 }
593
594 /*
595  * Read a bit from the MII bus.
596  */
597 static int dc_mii_readbit(sc)
598         struct dc_softc         *sc;
599 {
600         CSR_WRITE_4(sc, DC_SIO, DC_SIO_ROMCTL_READ|DC_SIO_MII_DIR);
601         CSR_READ_4(sc, DC_SIO);
602         DC_SETBIT(sc, DC_SIO, DC_SIO_MII_CLK);
603         DC_CLRBIT(sc, DC_SIO, DC_SIO_MII_CLK);
604         if (CSR_READ_4(sc, DC_SIO) & DC_SIO_MII_DATAIN)
605                 return(1);
606
607         return(0);
608 }
609
610 /*
611  * Sync the PHYs by setting data bit and strobing the clock 32 times.
612  */
613 static void dc_mii_sync(sc)
614         struct dc_softc         *sc;
615 {
616         int             i;
617
618         CSR_WRITE_4(sc, DC_SIO, DC_SIO_ROMCTL_WRITE);
619
620         for (i = 0; i < 32; i++)
621                 dc_mii_writebit(sc, 1);
622
623         return;
624 }
625
626 /*
627  * Clock a series of bits through the MII.
628  */
629 static void dc_mii_send(sc, bits, cnt)
630         struct dc_softc         *sc;
631         u_int32_t               bits;
632         int                     cnt;
633 {
634         int                     i;
635
636         for (i = (0x1 << (cnt - 1)); i; i >>= 1)
637                 dc_mii_writebit(sc, bits & i);
638 }
639
640 /*
641  * Read an PHY register through the MII.
642  */
643 static int dc_mii_readreg(sc, frame)
644         struct dc_softc         *sc;
645         struct dc_mii_frame     *frame;
646         
647 {
648         int                     i, ack, s;
649
650         s = splimp();
651
652         /*
653          * Set up frame for RX.
654          */
655         frame->mii_stdelim = DC_MII_STARTDELIM;
656         frame->mii_opcode = DC_MII_READOP;
657         frame->mii_turnaround = 0;
658         frame->mii_data = 0;
659         
660         /*
661          * Sync the PHYs.
662          */
663         dc_mii_sync(sc);
664
665         /*
666          * Send command/address info.
667          */
668         dc_mii_send(sc, frame->mii_stdelim, 2);
669         dc_mii_send(sc, frame->mii_opcode, 2);
670         dc_mii_send(sc, frame->mii_phyaddr, 5);
671         dc_mii_send(sc, frame->mii_regaddr, 5);
672
673 #ifdef notdef
674         /* Idle bit */
675         dc_mii_writebit(sc, 1);
676         dc_mii_writebit(sc, 0);
677 #endif
678
679         /* Check for ack */
680         ack = dc_mii_readbit(sc);
681
682         /*
683          * Now try reading data bits. If the ack failed, we still
684          * need to clock through 16 cycles to keep the PHY(s) in sync.
685          */
686         if (ack) {
687                 for(i = 0; i < 16; i++) {
688                         dc_mii_readbit(sc);
689                 }
690                 goto fail;
691         }
692
693         for (i = 0x8000; i; i >>= 1) {
694                 if (!ack) {
695                         if (dc_mii_readbit(sc))
696                                 frame->mii_data |= i;
697                 }
698         }
699
700 fail:
701
702         dc_mii_writebit(sc, 0);
703         dc_mii_writebit(sc, 0);
704
705         splx(s);
706
707         if (ack)
708                 return(1);
709         return(0);
710 }
711
712 /*
713  * Write to a PHY register through the MII.
714  */
715 static int dc_mii_writereg(sc, frame)
716         struct dc_softc         *sc;
717         struct dc_mii_frame     *frame;
718         
719 {
720         int                     s;
721
722         s = splimp();
723         /*
724          * Set up frame for TX.
725          */
726
727         frame->mii_stdelim = DC_MII_STARTDELIM;
728         frame->mii_opcode = DC_MII_WRITEOP;
729         frame->mii_turnaround = DC_MII_TURNAROUND;
730
731         /*
732          * Sync the PHYs.
733          */     
734         dc_mii_sync(sc);
735
736         dc_mii_send(sc, frame->mii_stdelim, 2);
737         dc_mii_send(sc, frame->mii_opcode, 2);
738         dc_mii_send(sc, frame->mii_phyaddr, 5);
739         dc_mii_send(sc, frame->mii_regaddr, 5);
740         dc_mii_send(sc, frame->mii_turnaround, 2);
741         dc_mii_send(sc, frame->mii_data, 16);
742
743         /* Idle bit. */
744         dc_mii_writebit(sc, 0);
745         dc_mii_writebit(sc, 0);
746
747         splx(s);
748
749         return(0);
750 }
751
752 static int dc_miibus_readreg(dev, phy, reg)
753         device_t                dev;
754         int                     phy, reg;
755 {
756         struct dc_mii_frame     frame;
757         struct dc_softc         *sc;
758         int                     i, rval, phy_reg = 0;
759
760         sc = device_get_softc(dev);
761         bzero((char *)&frame, sizeof(frame));
762
763         /*
764          * Note: both the AL981 and AN985 have internal PHYs,
765          * however the AL981 provides direct access to the PHY
766          * registers while the AN985 uses a serial MII interface.
767          * The AN985's MII interface is also buggy in that you
768          * can read from any MII address (0 to 31), but only address 1
769          * behaves normally. To deal with both cases, we pretend
770          * that the PHY is at MII address 1.
771          */
772         if (DC_IS_ADMTEK(sc) && phy != DC_ADMTEK_PHYADDR)
773                 return(0);
774
775         /*
776          * Note: the ukphy probes of the RS7112 report a PHY at
777          * MII address 0 (possibly HomePNA?) and 1 (ethernet)
778          * so we only respond to correct one.
779          */
780         if (DC_IS_CONEXANT(sc) && phy != DC_CONEXANT_PHYADDR)
781                 return(0);
782
783         if (sc->dc_pmode != DC_PMODE_MII) {
784                 if (phy == (MII_NPHY - 1)) {
785                         switch(reg) {
786                         case MII_BMSR:
787                         /*
788                          * Fake something to make the probe
789                          * code think there's a PHY here.
790                          */
791                                 return(BMSR_MEDIAMASK);
792                                 break;
793                         case MII_PHYIDR1:
794                                 if (DC_IS_PNIC(sc))
795                                         return(DC_VENDORID_LO);
796                                 return(DC_VENDORID_DEC);
797                                 break;
798                         case MII_PHYIDR2:
799                                 if (DC_IS_PNIC(sc))
800                                         return(DC_DEVICEID_82C168);
801                                 return(DC_DEVICEID_21143);
802                                 break;
803                         default:
804                                 return(0);
805                                 break;
806                         }
807                 } else
808                         return(0);
809         }
810
811         if (DC_IS_PNIC(sc)) {
812                 CSR_WRITE_4(sc, DC_PN_MII, DC_PN_MIIOPCODE_READ |
813                     (phy << 23) | (reg << 18));
814                 for (i = 0; i < DC_TIMEOUT; i++) {
815                         DELAY(1);
816                         rval = CSR_READ_4(sc, DC_PN_MII);
817                         if (!(rval & DC_PN_MII_BUSY)) {
818                                 rval &= 0xFFFF;
819                                 return(rval == 0xFFFF ? 0 : rval);
820                         }
821                 }
822                 return(0);
823         }
824
825         if (DC_IS_COMET(sc)) {
826                 switch(reg) {
827                 case MII_BMCR:
828                         phy_reg = DC_AL_BMCR;
829                         break;
830                 case MII_BMSR:
831                         phy_reg = DC_AL_BMSR;
832                         break;
833                 case MII_PHYIDR1:
834                         phy_reg = DC_AL_VENID;
835                         break;
836                 case MII_PHYIDR2:
837                         phy_reg = DC_AL_DEVID;
838                         break;
839                 case MII_ANAR:
840                         phy_reg = DC_AL_ANAR;
841                         break;
842                 case MII_ANLPAR:
843                         phy_reg = DC_AL_LPAR;
844                         break;
845                 case MII_ANER:
846                         phy_reg = DC_AL_ANER;
847                         break;
848                 default:
849                         printf("dc%d: phy_read: bad phy register %x\n",
850                             sc->dc_unit, reg);
851                         return(0);
852                         break;
853                 }
854
855                 rval = CSR_READ_4(sc, phy_reg) & 0x0000FFFF;
856
857                 if (rval == 0xFFFF)
858                         return(0);
859                 return(rval);
860         }
861
862         frame.mii_phyaddr = phy;
863         frame.mii_regaddr = reg;
864         if (sc->dc_type == DC_TYPE_98713) {
865                 phy_reg = CSR_READ_4(sc, DC_NETCFG);
866                 CSR_WRITE_4(sc, DC_NETCFG, phy_reg & ~DC_NETCFG_PORTSEL);
867         }
868         dc_mii_readreg(sc, &frame);
869         if (sc->dc_type == DC_TYPE_98713)
870                 CSR_WRITE_4(sc, DC_NETCFG, phy_reg);
871
872         return(frame.mii_data);
873 }
874
875 static int dc_miibus_writereg(dev, phy, reg, data)
876         device_t                dev;
877         int                     phy, reg, data;
878 {
879         struct dc_softc         *sc;
880         struct dc_mii_frame     frame;
881         int                     i, phy_reg = 0;
882
883         sc = device_get_softc(dev);
884         bzero((char *)&frame, sizeof(frame));
885
886         if (DC_IS_ADMTEK(sc) && phy != DC_ADMTEK_PHYADDR)
887                 return(0);
888
889         if (DC_IS_CONEXANT(sc) && phy != DC_CONEXANT_PHYADDR)
890                 return(0);
891
892         if (DC_IS_PNIC(sc)) {
893                 CSR_WRITE_4(sc, DC_PN_MII, DC_PN_MIIOPCODE_WRITE |
894                     (phy << 23) | (reg << 10) | data);
895                 for (i = 0; i < DC_TIMEOUT; i++) {
896                         if (!(CSR_READ_4(sc, DC_PN_MII) & DC_PN_MII_BUSY))
897                                 break;
898                 }
899                 return(0);
900         }
901
902         if (DC_IS_COMET(sc)) {
903                 switch(reg) {
904                 case MII_BMCR:
905                         phy_reg = DC_AL_BMCR;
906                         break;
907                 case MII_BMSR:
908                         phy_reg = DC_AL_BMSR;
909                         break;
910                 case MII_PHYIDR1:
911                         phy_reg = DC_AL_VENID;
912                         break;
913                 case MII_PHYIDR2:
914                         phy_reg = DC_AL_DEVID;
915                         break;
916                 case MII_ANAR:
917                         phy_reg = DC_AL_ANAR;
918                         break;
919                 case MII_ANLPAR:
920                         phy_reg = DC_AL_LPAR;
921                         break;
922                 case MII_ANER:
923                         phy_reg = DC_AL_ANER;
924                         break;
925                 default:
926                         printf("dc%d: phy_write: bad phy register %x\n",
927                             sc->dc_unit, reg);
928                         return(0);
929                         break;
930                 }
931
932                 CSR_WRITE_4(sc, phy_reg, data);
933                 return(0);
934         }
935
936         frame.mii_phyaddr = phy;
937         frame.mii_regaddr = reg;
938         frame.mii_data = data;
939
940         if (sc->dc_type == DC_TYPE_98713) {
941                 phy_reg = CSR_READ_4(sc, DC_NETCFG);
942                 CSR_WRITE_4(sc, DC_NETCFG, phy_reg & ~DC_NETCFG_PORTSEL);
943         }
944         dc_mii_writereg(sc, &frame);
945         if (sc->dc_type == DC_TYPE_98713)
946                 CSR_WRITE_4(sc, DC_NETCFG, phy_reg);
947
948         return(0);
949 }
950
951 static void dc_miibus_statchg(dev)
952         device_t                dev;
953 {
954         struct dc_softc         *sc;
955         struct mii_data         *mii;
956         struct ifmedia          *ifm;
957
958         sc = device_get_softc(dev);
959         if (DC_IS_ADMTEK(sc))
960                 return;
961
962         mii = device_get_softc(sc->dc_miibus);
963         ifm = &mii->mii_media;
964         if (DC_IS_DAVICOM(sc) &&
965             IFM_SUBTYPE(ifm->ifm_media) == IFM_homePNA) {
966                 dc_setcfg(sc, ifm->ifm_media);
967                 sc->dc_if_media = ifm->ifm_media;
968         } else {
969                 dc_setcfg(sc, mii->mii_media_active);
970                 sc->dc_if_media = mii->mii_media_active;
971         }
972
973         return;
974 }
975
976 /*
977  * Special support for DM9102A cards with HomePNA PHYs. Note:
978  * with the Davicom DM9102A/DM9801 eval board that I have, it seems
979  * to be impossible to talk to the management interface of the DM9801
980  * PHY (its MDIO pin is not connected to anything). Consequently,
981  * the driver has to just 'know' about the additional mode and deal
982  * with it itself. *sigh*
983  */
984 static void dc_miibus_mediainit(dev)
985         device_t                dev;
986 {
987         struct dc_softc         *sc;
988         struct mii_data         *mii;
989         struct ifmedia          *ifm;
990         int                     rev;
991
992         rev = pci_read_config(dev, DC_PCI_CFRV, 4) & 0xFF;
993
994         sc = device_get_softc(dev);
995         mii = device_get_softc(sc->dc_miibus);
996         ifm = &mii->mii_media;
997
998         if (DC_IS_DAVICOM(sc) && rev >= DC_REVISION_DM9102A)
999                 ifmedia_add(ifm, IFM_ETHER|IFM_homePNA, 0, NULL);
1000
1001         return;
1002 }
1003
1004 #define DC_POLY         0xEDB88320
1005 #define DC_BITS_512     9
1006 #define DC_BITS_128     7
1007 #define DC_BITS_64      6
1008
1009 static u_int32_t dc_crc_le(sc, addr)
1010         struct dc_softc         *sc;
1011         caddr_t                 addr;
1012 {
1013         u_int32_t               idx, bit, data, crc;
1014
1015         /* Compute CRC for the address value. */
1016         crc = 0xFFFFFFFF; /* initial value */
1017
1018         for (idx = 0; idx < 6; idx++) {
1019                 for (data = *addr++, bit = 0; bit < 8; bit++, data >>= 1)
1020                         crc = (crc >> 1) ^ (((crc ^ data) & 1) ? DC_POLY : 0);
1021         }
1022
1023         /*
1024          * The hash table on the PNIC II and the MX98715AEC-C/D/E
1025          * chips is only 128 bits wide.
1026          */
1027         if (sc->dc_flags & DC_128BIT_HASH)
1028                 return (crc & ((1 << DC_BITS_128) - 1));
1029
1030         /* The hash table on the MX98715BEC is only 64 bits wide. */
1031         if (sc->dc_flags & DC_64BIT_HASH)
1032                 return (crc & ((1 << DC_BITS_64) - 1));
1033
1034         return (crc & ((1 << DC_BITS_512) - 1));
1035 }
1036
1037 /*
1038  * Calculate CRC of a multicast group address, return the lower 6 bits.
1039  */
1040 static u_int32_t dc_crc_be(addr)
1041         caddr_t                 addr;
1042 {
1043         u_int32_t               crc, carry;
1044         int                     i, j;
1045         u_int8_t                c;
1046
1047         /* Compute CRC for the address value. */
1048         crc = 0xFFFFFFFF; /* initial value */
1049
1050         for (i = 0; i < 6; i++) {
1051                 c = *(addr + i);
1052                 for (j = 0; j < 8; j++) {
1053                         carry = ((crc & 0x80000000) ? 1 : 0) ^ (c & 0x01);
1054                         crc <<= 1;
1055                         c >>= 1;
1056                         if (carry)
1057                                 crc = (crc ^ 0x04c11db6) | carry;
1058                 }
1059         }
1060
1061         /* return the filter bit position */
1062         return((crc >> 26) & 0x0000003F);
1063 }
1064
1065 /*
1066  * 21143-style RX filter setup routine. Filter programming is done by
1067  * downloading a special setup frame into the TX engine. 21143, Macronix,
1068  * PNIC, PNIC II and Davicom chips are programmed this way.
1069  *
1070  * We always program the chip using 'hash perfect' mode, i.e. one perfect
1071  * address (our node address) and a 512-bit hash filter for multicast
1072  * frames. We also sneak the broadcast address into the hash filter since
1073  * we need that too.
1074  */
1075 void dc_setfilt_21143(sc)
1076         struct dc_softc         *sc;
1077 {
1078         struct dc_desc          *sframe;
1079         u_int32_t               h, *sp;
1080         struct ifmultiaddr      *ifma;
1081         struct ifnet            *ifp;
1082         int                     i;
1083
1084         ifp = &sc->arpcom.ac_if;
1085
1086         i = sc->dc_cdata.dc_tx_prod;
1087         DC_INC(sc->dc_cdata.dc_tx_prod, DC_TX_LIST_CNT);
1088         sc->dc_cdata.dc_tx_cnt++;
1089         sframe = &sc->dc_ldata->dc_tx_list[i];
1090         sp = (u_int32_t *)&sc->dc_cdata.dc_sbuf;
1091         bzero((char *)sp, DC_SFRAME_LEN);
1092
1093         sframe->dc_data = vtophys(&sc->dc_cdata.dc_sbuf);
1094         sframe->dc_ctl = DC_SFRAME_LEN | DC_TXCTL_SETUP | DC_TXCTL_TLINK |
1095             DC_FILTER_HASHPERF | DC_TXCTL_FINT;
1096
1097         sc->dc_cdata.dc_tx_chain[i] = (struct mbuf *)&sc->dc_cdata.dc_sbuf;
1098
1099         /* If we want promiscuous mode, set the allframes bit. */
1100         if (ifp->if_flags & IFF_PROMISC)
1101                 DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_RX_PROMISC);
1102         else
1103                 DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_RX_PROMISC);
1104
1105         if (ifp->if_flags & IFF_ALLMULTI)
1106                 DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_RX_ALLMULTI);
1107         else
1108                 DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_RX_ALLMULTI);
1109
1110         for (ifma = ifp->if_multiaddrs.lh_first; ifma != NULL;
1111             ifma = ifma->ifma_link.le_next) {
1112                 if (ifma->ifma_addr->sa_family != AF_LINK)
1113                         continue;
1114                 h = dc_crc_le(sc,
1115                     LLADDR((struct sockaddr_dl *)ifma->ifma_addr));
1116                 sp[h >> 4] |= 1 << (h & 0xF);
1117         }
1118
1119         if (ifp->if_flags & IFF_BROADCAST) {
1120                 h = dc_crc_le(sc, (caddr_t)&etherbroadcastaddr);
1121                 sp[h >> 4] |= 1 << (h & 0xF);
1122         }
1123
1124         /* Set our MAC address */
1125         sp[39] = ((u_int16_t *)sc->arpcom.ac_enaddr)[0];
1126         sp[40] = ((u_int16_t *)sc->arpcom.ac_enaddr)[1];
1127         sp[41] = ((u_int16_t *)sc->arpcom.ac_enaddr)[2];
1128
1129         sframe->dc_status = DC_TXSTAT_OWN;
1130         CSR_WRITE_4(sc, DC_TXSTART, 0xFFFFFFFF);
1131
1132         /*
1133          * The PNIC takes an exceedingly long time to process its
1134          * setup frame; wait 10ms after posting the setup frame
1135          * before proceeding, just so it has time to swallow its
1136          * medicine.
1137          */
1138         DELAY(10000);
1139
1140         ifp->if_timer = 5;
1141
1142         return;
1143 }
1144
1145 void dc_setfilt_admtek(sc)
1146         struct dc_softc         *sc;
1147 {
1148         struct ifnet            *ifp;
1149         int                     h = 0;
1150         u_int32_t               hashes[2] = { 0, 0 };
1151         struct ifmultiaddr      *ifma;
1152
1153         ifp = &sc->arpcom.ac_if;
1154
1155         /* Init our MAC address */
1156         CSR_WRITE_4(sc, DC_AL_PAR0, *(u_int32_t *)(&sc->arpcom.ac_enaddr[0]));
1157         CSR_WRITE_4(sc, DC_AL_PAR1, *(u_int32_t *)(&sc->arpcom.ac_enaddr[4]));
1158
1159         /* If we want promiscuous mode, set the allframes bit. */
1160         if (ifp->if_flags & IFF_PROMISC)
1161                 DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_RX_PROMISC);
1162         else
1163                 DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_RX_PROMISC);
1164
1165         if (ifp->if_flags & IFF_ALLMULTI)
1166                 DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_RX_ALLMULTI);
1167         else
1168                 DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_RX_ALLMULTI);
1169
1170         /* first, zot all the existing hash bits */
1171         CSR_WRITE_4(sc, DC_AL_MAR0, 0);
1172         CSR_WRITE_4(sc, DC_AL_MAR1, 0);
1173
1174         /*
1175          * If we're already in promisc or allmulti mode, we
1176          * don't have to bother programming the multicast filter.
1177          */
1178         if (ifp->if_flags & (IFF_PROMISC|IFF_ALLMULTI))
1179                 return;
1180
1181         /* now program new ones */
1182         for (ifma = ifp->if_multiaddrs.lh_first; ifma != NULL;
1183             ifma = ifma->ifma_link.le_next) {
1184                 if (ifma->ifma_addr->sa_family != AF_LINK)
1185                         continue;
1186                 if (DC_IS_CENTAUR(sc))
1187                         h = dc_crc_le(sc, LLADDR((struct sockaddr_dl *)ifma->ifma_addr));
1188                 else
1189                         h = dc_crc_be(LLADDR((struct sockaddr_dl *)ifma->ifma_addr));
1190                 if (h < 32)
1191                         hashes[0] |= (1 << h);
1192                 else
1193                         hashes[1] |= (1 << (h - 32));
1194         }
1195
1196         CSR_WRITE_4(sc, DC_AL_MAR0, hashes[0]);
1197         CSR_WRITE_4(sc, DC_AL_MAR1, hashes[1]);
1198
1199         return;
1200 }
1201
1202 void dc_setfilt_asix(sc)
1203         struct dc_softc         *sc;
1204 {
1205         struct ifnet            *ifp;
1206         int                     h = 0;
1207         u_int32_t               hashes[2] = { 0, 0 };
1208         struct ifmultiaddr      *ifma;
1209
1210         ifp = &sc->arpcom.ac_if;
1211
1212         /* Init our MAC address */
1213         CSR_WRITE_4(sc, DC_AX_FILTIDX, DC_AX_FILTIDX_PAR0);
1214         CSR_WRITE_4(sc, DC_AX_FILTDATA,
1215             *(u_int32_t *)(&sc->arpcom.ac_enaddr[0]));
1216         CSR_WRITE_4(sc, DC_AX_FILTIDX, DC_AX_FILTIDX_PAR1);
1217         CSR_WRITE_4(sc, DC_AX_FILTDATA,
1218             *(u_int32_t *)(&sc->arpcom.ac_enaddr[4]));
1219
1220         /* If we want promiscuous mode, set the allframes bit. */
1221         if (ifp->if_flags & IFF_PROMISC)
1222                 DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_RX_PROMISC);
1223         else
1224                 DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_RX_PROMISC);
1225
1226         if (ifp->if_flags & IFF_ALLMULTI)
1227                 DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_RX_ALLMULTI);
1228         else
1229                 DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_RX_ALLMULTI);
1230
1231         /*
1232          * The ASIX chip has a special bit to enable reception
1233          * of broadcast frames.
1234          */
1235         if (ifp->if_flags & IFF_BROADCAST)
1236                 DC_SETBIT(sc, DC_NETCFG, DC_AX_NETCFG_RX_BROAD);
1237         else
1238                 DC_CLRBIT(sc, DC_NETCFG, DC_AX_NETCFG_RX_BROAD);
1239
1240         /* first, zot all the existing hash bits */
1241         CSR_WRITE_4(sc, DC_AX_FILTIDX, DC_AX_FILTIDX_MAR0);
1242         CSR_WRITE_4(sc, DC_AX_FILTDATA, 0);
1243         CSR_WRITE_4(sc, DC_AX_FILTIDX, DC_AX_FILTIDX_MAR1);
1244         CSR_WRITE_4(sc, DC_AX_FILTDATA, 0);
1245
1246         /*
1247          * If we're already in promisc or allmulti mode, we
1248          * don't have to bother programming the multicast filter.
1249          */
1250         if (ifp->if_flags & (IFF_PROMISC|IFF_ALLMULTI))
1251                 return;
1252
1253         /* now program new ones */
1254         for (ifma = ifp->if_multiaddrs.lh_first; ifma != NULL;
1255             ifma = ifma->ifma_link.le_next) {
1256                 if (ifma->ifma_addr->sa_family != AF_LINK)
1257                         continue;
1258                 h = dc_crc_be(LLADDR((struct sockaddr_dl *)ifma->ifma_addr));
1259                 if (h < 32)
1260                         hashes[0] |= (1 << h);
1261                 else
1262                         hashes[1] |= (1 << (h - 32));
1263         }
1264
1265         CSR_WRITE_4(sc, DC_AX_FILTIDX, DC_AX_FILTIDX_MAR0);
1266         CSR_WRITE_4(sc, DC_AX_FILTDATA, hashes[0]);
1267         CSR_WRITE_4(sc, DC_AX_FILTIDX, DC_AX_FILTIDX_MAR1);
1268         CSR_WRITE_4(sc, DC_AX_FILTDATA, hashes[1]);
1269
1270         return;
1271 }
1272
1273 static void dc_setfilt(sc)
1274         struct dc_softc         *sc;
1275 {
1276         if (DC_IS_INTEL(sc) || DC_IS_MACRONIX(sc) || DC_IS_PNIC(sc) ||
1277             DC_IS_PNICII(sc) || DC_IS_DAVICOM(sc) || DC_IS_CONEXANT(sc))
1278                 dc_setfilt_21143(sc);
1279
1280         if (DC_IS_ASIX(sc))
1281                 dc_setfilt_asix(sc);
1282
1283         if (DC_IS_ADMTEK(sc))
1284                 dc_setfilt_admtek(sc);
1285
1286         return;
1287 }
1288
1289 /*
1290  * In order to fiddle with the
1291  * 'full-duplex' and '100Mbps' bits in the netconfig register, we
1292  * first have to put the transmit and/or receive logic in the idle state.
1293  */
1294 static void dc_setcfg(sc, media)
1295         struct dc_softc         *sc;
1296         int                     media;
1297 {
1298         int                     i, restart = 0;
1299         u_int32_t               isr;
1300
1301         if (IFM_SUBTYPE(media) == IFM_NONE)
1302                 return;
1303
1304         if (CSR_READ_4(sc, DC_NETCFG) & (DC_NETCFG_TX_ON|DC_NETCFG_RX_ON)) {
1305                 restart = 1;
1306                 DC_CLRBIT(sc, DC_NETCFG, (DC_NETCFG_TX_ON|DC_NETCFG_RX_ON));
1307
1308                 for (i = 0; i < DC_TIMEOUT; i++) {
1309                         isr = CSR_READ_4(sc, DC_ISR);
1310                         if (isr & DC_ISR_TX_IDLE ||
1311                             (isr & DC_ISR_RX_STATE) == DC_RXSTATE_STOPPED)
1312                                 break;
1313                         DELAY(10);
1314                 }
1315
1316                 if (i == DC_TIMEOUT)
1317                         printf("dc%d: failed to force tx and "
1318                                 "rx to idle state\n", sc->dc_unit);
1319         }
1320
1321         if (IFM_SUBTYPE(media) == IFM_100_TX) {
1322                 DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_SPEEDSEL);
1323                 DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_HEARTBEAT);
1324                 if (sc->dc_pmode == DC_PMODE_MII) {
1325                         int     watchdogreg;
1326
1327                         if (DC_IS_INTEL(sc)) {
1328                         /* there's a write enable bit here that reads as 1 */
1329                                 watchdogreg = CSR_READ_4(sc, DC_WATCHDOG);
1330                                 watchdogreg &= ~DC_WDOG_CTLWREN;
1331                                 watchdogreg |= DC_WDOG_JABBERDIS;
1332                                 CSR_WRITE_4(sc, DC_WATCHDOG, watchdogreg);
1333                         } else {
1334                                 DC_SETBIT(sc, DC_WATCHDOG, DC_WDOG_JABBERDIS);
1335                         }
1336                         DC_CLRBIT(sc, DC_NETCFG, (DC_NETCFG_PCS|
1337                             DC_NETCFG_PORTSEL|DC_NETCFG_SCRAMBLER));
1338                         if (sc->dc_type == DC_TYPE_98713)
1339                                 DC_SETBIT(sc, DC_NETCFG, (DC_NETCFG_PCS|
1340                                     DC_NETCFG_SCRAMBLER));
1341                         if (!DC_IS_DAVICOM(sc))
1342                                 DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_PORTSEL);
1343                         DC_CLRBIT(sc, DC_10BTCTRL, 0xFFFF);
1344                         if (DC_IS_INTEL(sc))
1345                                 dc_apply_fixup(sc, IFM_AUTO);
1346                 } else {
1347                         if (DC_IS_PNIC(sc)) {
1348                                 DC_PN_GPIO_SETBIT(sc, DC_PN_GPIO_SPEEDSEL);
1349                                 DC_PN_GPIO_SETBIT(sc, DC_PN_GPIO_100TX_LOOP);
1350                                 DC_SETBIT(sc, DC_PN_NWAY, DC_PN_NWAY_SPEEDSEL);
1351                         }
1352                         DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_PORTSEL);
1353                         DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_PCS);
1354                         DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_SCRAMBLER);
1355                         if (DC_IS_INTEL(sc))
1356                                 dc_apply_fixup(sc,
1357                                     (media & IFM_GMASK) == IFM_FDX ?
1358                                     IFM_100_TX|IFM_FDX : IFM_100_TX);
1359                 }
1360         }
1361
1362         if (IFM_SUBTYPE(media) == IFM_10_T) {
1363                 DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_SPEEDSEL);
1364                 DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_HEARTBEAT);
1365                 if (sc->dc_pmode == DC_PMODE_MII) {
1366                         int     watchdogreg;
1367
1368                         /* there's a write enable bit here that reads as 1 */
1369                         if (DC_IS_INTEL(sc)) {
1370                                 watchdogreg = CSR_READ_4(sc, DC_WATCHDOG);
1371                                 watchdogreg &= ~DC_WDOG_CTLWREN;
1372                                 watchdogreg |= DC_WDOG_JABBERDIS;
1373                                 CSR_WRITE_4(sc, DC_WATCHDOG, watchdogreg);
1374                         } else {
1375                                 DC_SETBIT(sc, DC_WATCHDOG, DC_WDOG_JABBERDIS);
1376                         }
1377                         DC_CLRBIT(sc, DC_NETCFG, (DC_NETCFG_PCS|
1378                             DC_NETCFG_PORTSEL|DC_NETCFG_SCRAMBLER));
1379                         if (sc->dc_type == DC_TYPE_98713)
1380                                 DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_PCS);
1381                         if (!DC_IS_DAVICOM(sc))
1382                                 DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_PORTSEL);
1383                         DC_CLRBIT(sc, DC_10BTCTRL, 0xFFFF);
1384                         if (DC_IS_INTEL(sc))
1385                                 dc_apply_fixup(sc, IFM_AUTO);
1386                 } else {
1387                         if (DC_IS_PNIC(sc)) {
1388                                 DC_PN_GPIO_CLRBIT(sc, DC_PN_GPIO_SPEEDSEL);
1389                                 DC_PN_GPIO_SETBIT(sc, DC_PN_GPIO_100TX_LOOP);
1390                                 DC_CLRBIT(sc, DC_PN_NWAY, DC_PN_NWAY_SPEEDSEL);
1391                         }
1392                         DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_PORTSEL);
1393                         DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_PCS);
1394                         DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_SCRAMBLER);
1395                         if (DC_IS_INTEL(sc)) {
1396                                 DC_CLRBIT(sc, DC_SIARESET, DC_SIA_RESET);
1397                                 DC_CLRBIT(sc, DC_10BTCTRL, 0xFFFF);
1398                                 if ((media & IFM_GMASK) == IFM_FDX)
1399                                         DC_SETBIT(sc, DC_10BTCTRL, 0x7F3D);
1400                                 else
1401                                         DC_SETBIT(sc, DC_10BTCTRL, 0x7F3F);
1402                                 DC_SETBIT(sc, DC_SIARESET, DC_SIA_RESET);
1403                                 DC_CLRBIT(sc, DC_10BTCTRL,
1404                                     DC_TCTL_AUTONEGENBL);
1405                                 dc_apply_fixup(sc,
1406                                     (media & IFM_GMASK) == IFM_FDX ?
1407                                     IFM_10_T|IFM_FDX : IFM_10_T);
1408                                 DELAY(20000);
1409                         }
1410                 }
1411         }
1412
1413         /*
1414          * If this is a Davicom DM9102A card with a DM9801 HomePNA
1415          * PHY and we want HomePNA mode, set the portsel bit to turn
1416          * on the external MII port.
1417          */
1418         if (DC_IS_DAVICOM(sc)) {
1419                 if (IFM_SUBTYPE(media) == IFM_homePNA) {
1420                         DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_PORTSEL);
1421                         sc->dc_link = 1;
1422                 } else {
1423                         DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_PORTSEL);
1424                 }
1425         }
1426
1427         if ((media & IFM_GMASK) == IFM_FDX) {
1428                 DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_FULLDUPLEX);
1429                 if (sc->dc_pmode == DC_PMODE_SYM && DC_IS_PNIC(sc))
1430                         DC_SETBIT(sc, DC_PN_NWAY, DC_PN_NWAY_DUPLEX);
1431         } else {
1432                 DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_FULLDUPLEX);
1433                 if (sc->dc_pmode == DC_PMODE_SYM && DC_IS_PNIC(sc))
1434                         DC_CLRBIT(sc, DC_PN_NWAY, DC_PN_NWAY_DUPLEX);
1435         }
1436
1437         if (restart)
1438                 DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_TX_ON|DC_NETCFG_RX_ON);
1439
1440         return;
1441 }
1442
1443 static void dc_reset(sc)
1444         struct dc_softc         *sc;
1445 {
1446         int             i;
1447
1448         DC_SETBIT(sc, DC_BUSCTL, DC_BUSCTL_RESET);
1449
1450         for (i = 0; i < DC_TIMEOUT; i++) {
1451                 DELAY(10);
1452                 if (!(CSR_READ_4(sc, DC_BUSCTL) & DC_BUSCTL_RESET))
1453                         break;
1454         }
1455
1456         if (DC_IS_ASIX(sc) || DC_IS_ADMTEK(sc) || DC_IS_CONEXANT(sc)) {
1457                 DELAY(10000);
1458                 DC_CLRBIT(sc, DC_BUSCTL, DC_BUSCTL_RESET);
1459                 i = 0;
1460         }
1461
1462         if (i == DC_TIMEOUT)
1463                 printf("dc%d: reset never completed!\n", sc->dc_unit);
1464
1465         /* Wait a little while for the chip to get its brains in order. */
1466         DELAY(1000);
1467
1468         CSR_WRITE_4(sc, DC_IMR, 0x00000000);
1469         CSR_WRITE_4(sc, DC_BUSCTL, 0x00000000);
1470         CSR_WRITE_4(sc, DC_NETCFG, 0x00000000);
1471
1472         /*
1473          * Bring the SIA out of reset. In some cases, it looks
1474          * like failing to unreset the SIA soon enough gets it
1475          * into a state where it will never come out of reset
1476          * until we reset the whole chip again.
1477          */
1478         if (DC_IS_INTEL(sc)) {
1479                 DC_SETBIT(sc, DC_SIARESET, DC_SIA_RESET);
1480                 CSR_WRITE_4(sc, DC_10BTCTRL, 0);
1481                 CSR_WRITE_4(sc, DC_WATCHDOG, 0);
1482         }
1483
1484         return;
1485 }
1486
1487 static struct dc_type *dc_devtype(dev)
1488         device_t                dev;
1489 {
1490         struct dc_type          *t;
1491         u_int32_t               rev;
1492
1493         t = dc_devs;
1494
1495         while(t->dc_name != NULL) {
1496                 if ((pci_get_vendor(dev) == t->dc_vid) &&
1497                     (pci_get_device(dev) == t->dc_did)) {
1498                         /* Check the PCI revision */
1499                         rev = pci_read_config(dev, DC_PCI_CFRV, 4) & 0xFF;
1500                         if (t->dc_did == DC_DEVICEID_98713 &&
1501                             rev >= DC_REVISION_98713A)
1502                                 t++;
1503                         if (t->dc_did == DC_DEVICEID_98713_CP &&
1504                             rev >= DC_REVISION_98713A)
1505                                 t++;
1506                         if (t->dc_did == DC_DEVICEID_987x5 &&
1507                             rev >= DC_REVISION_98715AEC_C)
1508                                 t++;
1509                         if (t->dc_did == DC_DEVICEID_987x5 &&
1510                             rev >= DC_REVISION_98725)
1511                                 t++;
1512                         if (t->dc_did == DC_DEVICEID_AX88140A &&
1513                             rev >= DC_REVISION_88141)
1514                                 t++;
1515                         if (t->dc_did == DC_DEVICEID_82C168 &&
1516                             rev >= DC_REVISION_82C169)
1517                                 t++;
1518                         if (t->dc_did == DC_DEVICEID_DM9102 &&
1519                             rev >= DC_REVISION_DM9102A)
1520                                 t++;
1521                         return(t);
1522                 }
1523                 t++;
1524         }
1525
1526         return(NULL);
1527 }
1528
1529 /*
1530  * Probe for a 21143 or clone chip. Check the PCI vendor and device
1531  * IDs against our list and return a device name if we find a match.
1532  * We do a little bit of extra work to identify the exact type of
1533  * chip. The MX98713 and MX98713A have the same PCI vendor/device ID,
1534  * but different revision IDs. The same is true for 98715/98715A
1535  * chips and the 98725, as well as the ASIX and ADMtek chips. In some
1536  * cases, the exact chip revision affects driver behavior.
1537  */
1538 static int dc_probe(dev)
1539         device_t                dev;
1540 {
1541         struct dc_type          *t;
1542
1543         t = dc_devtype(dev);
1544
1545         if (t != NULL) {
1546                 device_set_desc(dev, t->dc_name);
1547                 return(0);
1548         }
1549
1550         return(ENXIO);
1551 }
1552
1553 static void dc_acpi(dev)
1554         device_t                dev;
1555 {
1556         u_int32_t               r, cptr;
1557         int                     unit;
1558
1559         unit = device_get_unit(dev);
1560
1561         /* Find the location of the capabilities block */
1562         cptr = pci_read_config(dev, DC_PCI_CCAP, 4) & 0xFF;
1563
1564         r = pci_read_config(dev, cptr, 4) & 0xFF;
1565         if (r == 0x01) {
1566
1567                 r = pci_read_config(dev, cptr + 4, 4);
1568                 if (r & DC_PSTATE_D3) {
1569                         u_int32_t               iobase, membase, irq;
1570
1571                         /* Save important PCI config data. */
1572                         iobase = pci_read_config(dev, DC_PCI_CFBIO, 4);
1573                         membase = pci_read_config(dev, DC_PCI_CFBMA, 4);
1574                         irq = pci_read_config(dev, DC_PCI_CFIT, 4);
1575
1576                         /* Reset the power state. */
1577                         printf("dc%d: chip is in D%d power mode "
1578                             "-- setting to D0\n", unit, r & DC_PSTATE_D3);
1579                         r &= 0xFFFFFFFC;
1580                         pci_write_config(dev, cptr + 4, r, 4);
1581
1582                         /* Restore PCI config data. */
1583                         pci_write_config(dev, DC_PCI_CFBIO, iobase, 4);
1584                         pci_write_config(dev, DC_PCI_CFBMA, membase, 4);
1585                         pci_write_config(dev, DC_PCI_CFIT, irq, 4);
1586                 }
1587         }
1588         return;
1589 }
1590
1591 static void dc_apply_fixup(sc, media)
1592         struct dc_softc         *sc;
1593         int                     media;
1594 {
1595         struct dc_mediainfo     *m;
1596         u_int8_t                *p;
1597         int                     i;
1598         u_int32_t               reg;
1599
1600         m = sc->dc_mi;
1601
1602         while (m != NULL) {
1603                 if (m->dc_media == media)
1604                         break;
1605                 m = m->dc_next;
1606         }
1607
1608         if (m == NULL)
1609                 return;
1610
1611         for (i = 0, p = m->dc_reset_ptr; i < m->dc_reset_len; i++, p += 2) {
1612                 reg = (p[0] | (p[1] << 8)) << 16;
1613                 CSR_WRITE_4(sc, DC_WATCHDOG, reg);
1614         }
1615
1616         for (i = 0, p = m->dc_gp_ptr; i < m->dc_gp_len; i++, p += 2) {
1617                 reg = (p[0] | (p[1] << 8)) << 16;
1618                 CSR_WRITE_4(sc, DC_WATCHDOG, reg);
1619         }
1620
1621         return;
1622 }
1623
1624 static void dc_decode_leaf_sia(sc, l)
1625         struct dc_softc         *sc;
1626         struct dc_eblock_sia    *l;
1627 {
1628         struct dc_mediainfo     *m;
1629
1630         m = malloc(sizeof(struct dc_mediainfo), M_DEVBUF, M_INTWAIT | M_ZERO);
1631         if (l->dc_sia_code == DC_SIA_CODE_10BT)
1632                 m->dc_media = IFM_10_T;
1633
1634         if (l->dc_sia_code == DC_SIA_CODE_10BT_FDX)
1635                 m->dc_media = IFM_10_T|IFM_FDX;
1636
1637         if (l->dc_sia_code == DC_SIA_CODE_10B2)
1638                 m->dc_media = IFM_10_2;
1639
1640         if (l->dc_sia_code == DC_SIA_CODE_10B5)
1641                 m->dc_media = IFM_10_5;
1642
1643         m->dc_gp_len = 2;
1644         m->dc_gp_ptr = (u_int8_t *)&l->dc_sia_gpio_ctl;
1645
1646         m->dc_next = sc->dc_mi;
1647         sc->dc_mi = m;
1648
1649         sc->dc_pmode = DC_PMODE_SIA;
1650
1651         return;
1652 }
1653
1654 static void dc_decode_leaf_sym(sc, l)
1655         struct dc_softc         *sc;
1656         struct dc_eblock_sym    *l;
1657 {
1658         struct dc_mediainfo     *m;
1659
1660         m = malloc(sizeof(struct dc_mediainfo), M_DEVBUF, M_INTWAIT | M_ZERO);
1661         if (l->dc_sym_code == DC_SYM_CODE_100BT)
1662                 m->dc_media = IFM_100_TX;
1663
1664         if (l->dc_sym_code == DC_SYM_CODE_100BT_FDX)
1665                 m->dc_media = IFM_100_TX|IFM_FDX;
1666
1667         m->dc_gp_len = 2;
1668         m->dc_gp_ptr = (u_int8_t *)&l->dc_sym_gpio_ctl;
1669
1670         m->dc_next = sc->dc_mi;
1671         sc->dc_mi = m;
1672
1673         sc->dc_pmode = DC_PMODE_SYM;
1674
1675         return;
1676 }
1677
1678 static void dc_decode_leaf_mii(sc, l)
1679         struct dc_softc         *sc;
1680         struct dc_eblock_mii    *l;
1681 {
1682         u_int8_t                *p;
1683         struct dc_mediainfo     *m;
1684
1685         m = malloc(sizeof(struct dc_mediainfo), M_DEVBUF, M_INTWAIT | M_ZERO);
1686         /* We abuse IFM_AUTO to represent MII. */
1687         m->dc_media = IFM_AUTO;
1688         m->dc_gp_len = l->dc_gpr_len;
1689
1690         p = (u_int8_t *)l;
1691         p += sizeof(struct dc_eblock_mii);
1692         m->dc_gp_ptr = p;
1693         p += 2 * l->dc_gpr_len;
1694         m->dc_reset_len = *p;
1695         p++;
1696         m->dc_reset_ptr = p;
1697
1698         m->dc_next = sc->dc_mi;
1699         sc->dc_mi = m;
1700
1701         return;
1702 }
1703
1704 static void dc_read_srom(sc, bits)
1705         struct dc_softc         *sc;
1706         int                     bits;
1707 {
1708         int size;
1709
1710         size = 2 << bits;
1711         sc->dc_srom = malloc(size, M_DEVBUF, M_INTWAIT);
1712         dc_read_eeprom(sc, (caddr_t)sc->dc_srom, 0, (size / 2), 0);
1713 }
1714
1715 static void dc_parse_21143_srom(sc)
1716         struct dc_softc         *sc;
1717 {
1718         struct dc_leaf_hdr      *lhdr;
1719         struct dc_eblock_hdr    *hdr;
1720         int                     i, loff;
1721         char                    *ptr;
1722         int                     have_mii;
1723
1724         have_mii = 0;
1725         loff = sc->dc_srom[27];
1726         lhdr = (struct dc_leaf_hdr *)&(sc->dc_srom[loff]);
1727
1728         ptr = (char *)lhdr;
1729         ptr += sizeof(struct dc_leaf_hdr) - 1;
1730         /*
1731          * Look if we got a MII media block.
1732          */
1733         for (i = 0; i < lhdr->dc_mcnt; i++) {
1734                 hdr = (struct dc_eblock_hdr *)ptr;
1735                 if (hdr->dc_type == DC_EBLOCK_MII)
1736                     have_mii++;
1737
1738                 ptr += (hdr->dc_len & 0x7F);
1739                 ptr++;
1740         }
1741
1742         /*
1743          * Do the same thing again. Only use SIA and SYM media
1744          * blocks if no MII media block is available.
1745          */
1746         ptr = (char *)lhdr;
1747         ptr += sizeof(struct dc_leaf_hdr) - 1;
1748         for (i = 0; i < lhdr->dc_mcnt; i++) {
1749                 hdr = (struct dc_eblock_hdr *)ptr;
1750                 switch(hdr->dc_type) {
1751                 case DC_EBLOCK_MII:
1752                         dc_decode_leaf_mii(sc, (struct dc_eblock_mii *)hdr);
1753                         break;
1754                 case DC_EBLOCK_SIA:
1755                         if (! have_mii)
1756                                 dc_decode_leaf_sia(sc,
1757                                     (struct dc_eblock_sia *)hdr);
1758                         break;
1759                 case DC_EBLOCK_SYM:
1760                         if (! have_mii)
1761                                 dc_decode_leaf_sym(sc,
1762                                     (struct dc_eblock_sym *)hdr);
1763                         break;
1764                 default:
1765                         /* Don't care. Yet. */
1766                         break;
1767                 }
1768                 ptr += (hdr->dc_len & 0x7F);
1769                 ptr++;
1770         }
1771
1772         return;
1773 }
1774
1775 /*
1776  * Attach the interface. Allocate softc structures, do ifmedia
1777  * setup and ethernet/BPF attach.
1778  */
1779 static int dc_attach(dev)
1780         device_t                dev;
1781 {
1782         int                     s, tmp = 0;
1783         u_char                  eaddr[ETHER_ADDR_LEN];
1784         u_int32_t               command;
1785         struct dc_softc         *sc;
1786         struct ifnet            *ifp;
1787         u_int32_t               revision;
1788         int                     unit, error = 0, rid, mac_offset;
1789
1790         s = splimp();
1791
1792         sc = device_get_softc(dev);
1793         unit = device_get_unit(dev);
1794         bzero(sc, sizeof(struct dc_softc));
1795
1796         /*
1797          * Handle power management nonsense.
1798          */
1799         dc_acpi(dev);
1800
1801         /*
1802          * Map control/status registers.
1803          */
1804         command = pci_read_config(dev, PCIR_COMMAND, 4);
1805         command |= (PCIM_CMD_PORTEN|PCIM_CMD_MEMEN|PCIM_CMD_BUSMASTEREN);
1806         pci_write_config(dev, PCIR_COMMAND, command, 4);
1807         command = pci_read_config(dev, PCIR_COMMAND, 4);
1808
1809 #ifdef DC_USEIOSPACE
1810         if (!(command & PCIM_CMD_PORTEN)) {
1811                 printf("dc%d: failed to enable I/O ports!\n", unit);
1812                 error = ENXIO;
1813                 goto fail;
1814         }
1815 #else
1816         if (!(command & PCIM_CMD_MEMEN)) {
1817                 printf("dc%d: failed to enable memory mapping!\n", unit);
1818                 error = ENXIO;
1819                 goto fail;
1820         }
1821 #endif
1822
1823         rid = DC_RID;
1824         sc->dc_res = bus_alloc_resource(dev, DC_RES, &rid,
1825             0, ~0, 1, RF_ACTIVE);
1826
1827         if (sc->dc_res == NULL) {
1828                 printf("dc%d: couldn't map ports/memory\n", unit);
1829                 error = ENXIO;
1830                 goto fail;
1831         }
1832
1833         sc->dc_btag = rman_get_bustag(sc->dc_res);
1834         sc->dc_bhandle = rman_get_bushandle(sc->dc_res);
1835
1836         /* Allocate interrupt */
1837         rid = 0;
1838         sc->dc_irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0, 1,
1839             RF_SHAREABLE | RF_ACTIVE);
1840
1841         if (sc->dc_irq == NULL) {
1842                 printf("dc%d: couldn't map interrupt\n", unit);
1843                 bus_release_resource(dev, DC_RES, DC_RID, sc->dc_res);
1844                 error = ENXIO;
1845                 goto fail;
1846         }
1847
1848         error = bus_setup_intr(dev, sc->dc_irq, INTR_TYPE_NET,
1849             dc_intr, sc, &sc->dc_intrhand);
1850
1851         if (error) {
1852                 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->dc_irq);
1853                 bus_release_resource(dev, DC_RES, DC_RID, sc->dc_res);
1854                 printf("dc%d: couldn't set up irq\n", unit);
1855                 goto fail;
1856         }
1857         
1858         /* Need this info to decide on a chip type. */
1859         sc->dc_info = dc_devtype(dev);
1860         revision = pci_read_config(dev, DC_PCI_CFRV, 4) & 0x000000FF;
1861
1862         /* Get the eeprom width, but PNIC has diff eeprom */
1863         if (sc->dc_info->dc_did != DC_DEVICEID_82C168)
1864                 dc_eeprom_width(sc);
1865
1866         switch(sc->dc_info->dc_did) {
1867         case DC_DEVICEID_21143:
1868                 sc->dc_type = DC_TYPE_21143;
1869                 sc->dc_flags |= DC_TX_POLL|DC_TX_USE_TX_INTR;
1870                 sc->dc_flags |= DC_REDUCED_MII_POLL;
1871                 /* Save EEPROM contents so we can parse them later. */
1872                 dc_read_srom(sc, sc->dc_romwidth);
1873                 break;
1874         case DC_DEVICEID_DM9009:
1875         case DC_DEVICEID_DM9100:
1876         case DC_DEVICEID_DM9102:
1877                 sc->dc_type = DC_TYPE_DM9102;
1878                 sc->dc_flags |= DC_TX_COALESCE|DC_TX_INTR_ALWAYS;
1879                 sc->dc_flags |= DC_REDUCED_MII_POLL|DC_TX_STORENFWD;
1880                 sc->dc_pmode = DC_PMODE_MII;
1881                 /* Increase the latency timer value. */
1882                 command = pci_read_config(dev, DC_PCI_CFLT, 4);
1883                 command &= 0xFFFF00FF;
1884                 command |= 0x00008000;
1885                 pci_write_config(dev, DC_PCI_CFLT, command, 4);
1886                 break;
1887         case DC_DEVICEID_AL981:
1888                 sc->dc_type = DC_TYPE_AL981;
1889                 sc->dc_flags |= DC_TX_USE_TX_INTR;
1890                 sc->dc_flags |= DC_TX_ADMTEK_WAR;
1891                 sc->dc_pmode = DC_PMODE_MII;
1892                 dc_read_srom(sc, sc->dc_romwidth);
1893                 break;
1894         case DC_DEVICEID_AN985:
1895         case DC_DEVICEID_EN2242:
1896         case DC_DEVICEID_3CSOHOB:
1897                 sc->dc_type = DC_TYPE_AN985;
1898                 sc->dc_flags |= DC_64BIT_HASH;
1899                 sc->dc_flags |= DC_TX_USE_TX_INTR;
1900                 sc->dc_flags |= DC_TX_ADMTEK_WAR;
1901                 sc->dc_pmode = DC_PMODE_MII;
1902                 dc_read_srom(sc, sc->dc_romwidth);
1903                 break;
1904         case DC_DEVICEID_98713:
1905         case DC_DEVICEID_98713_CP:
1906                 if (revision < DC_REVISION_98713A) {
1907                         sc->dc_type = DC_TYPE_98713;
1908                 }
1909                 if (revision >= DC_REVISION_98713A) {
1910                         sc->dc_type = DC_TYPE_98713A;
1911                         sc->dc_flags |= DC_21143_NWAY;
1912                 }
1913                 sc->dc_flags |= DC_REDUCED_MII_POLL;
1914                 sc->dc_flags |= DC_TX_POLL|DC_TX_USE_TX_INTR;
1915                 break;
1916         case DC_DEVICEID_987x5:
1917         case DC_DEVICEID_EN1217:
1918                 /*
1919                  * Macronix MX98715AEC-C/D/E parts have only a
1920                  * 128-bit hash table. We need to deal with these
1921                  * in the same manner as the PNIC II so that we
1922                  * get the right number of bits out of the
1923                  * CRC routine.
1924                  */
1925                 if (revision >= DC_REVISION_98715AEC_C &&
1926                     revision < DC_REVISION_98725)
1927                         sc->dc_flags |= DC_128BIT_HASH;
1928                 sc->dc_type = DC_TYPE_987x5;
1929                 sc->dc_flags |= DC_TX_POLL|DC_TX_USE_TX_INTR;
1930                 sc->dc_flags |= DC_REDUCED_MII_POLL|DC_21143_NWAY;
1931                 break;
1932         case DC_DEVICEID_98727:
1933                 sc->dc_type = DC_TYPE_987x5;
1934                 sc->dc_flags |= DC_TX_POLL|DC_TX_USE_TX_INTR;
1935                 sc->dc_flags |= DC_REDUCED_MII_POLL|DC_21143_NWAY;
1936                 break;
1937         case DC_DEVICEID_82C115:
1938                 sc->dc_type = DC_TYPE_PNICII;
1939                 sc->dc_flags |= DC_TX_POLL|DC_TX_USE_TX_INTR|DC_128BIT_HASH;
1940                 sc->dc_flags |= DC_REDUCED_MII_POLL|DC_21143_NWAY;
1941                 break;
1942         case DC_DEVICEID_82C168:
1943                 sc->dc_type = DC_TYPE_PNIC;
1944                 sc->dc_flags |= DC_TX_STORENFWD|DC_TX_INTR_ALWAYS;
1945                 sc->dc_flags |= DC_PNIC_RX_BUG_WAR;
1946                 sc->dc_pnic_rx_buf = malloc(DC_RXLEN * 5, M_DEVBUF, M_WAITOK);
1947                 if (revision < DC_REVISION_82C169)
1948                         sc->dc_pmode = DC_PMODE_SYM;
1949                 break;
1950         case DC_DEVICEID_AX88140A:
1951                 sc->dc_type = DC_TYPE_ASIX;
1952                 sc->dc_flags |= DC_TX_USE_TX_INTR|DC_TX_INTR_FIRSTFRAG;
1953                 sc->dc_flags |= DC_REDUCED_MII_POLL;
1954                 sc->dc_pmode = DC_PMODE_MII;
1955                 break;
1956         case DC_DEVICEID_RS7112:
1957                 sc->dc_type = DC_TYPE_CONEXANT;
1958                 sc->dc_flags |= DC_TX_INTR_ALWAYS;
1959                 sc->dc_flags |= DC_REDUCED_MII_POLL;
1960                 sc->dc_pmode = DC_PMODE_MII;
1961                 dc_read_srom(sc, sc->dc_romwidth);
1962                 break;
1963         default:
1964                 printf("dc%d: unknown device: %x\n", sc->dc_unit,
1965                     sc->dc_info->dc_did);
1966                 break;
1967         }
1968
1969         /* Save the cache line size. */
1970         if (DC_IS_DAVICOM(sc))
1971                 sc->dc_cachesize = 0;
1972         else
1973                 sc->dc_cachesize = pci_read_config(dev,
1974                     DC_PCI_CFLT, 4) & 0xFF;
1975
1976         /* Reset the adapter. */
1977         dc_reset(sc);
1978
1979         /* Take 21143 out of snooze mode */
1980         if (DC_IS_INTEL(sc)) {
1981                 command = pci_read_config(dev, DC_PCI_CFDD, 4);
1982                 command &= ~(DC_CFDD_SNOOZE_MODE|DC_CFDD_SLEEP_MODE);
1983                 pci_write_config(dev, DC_PCI_CFDD, command, 4);
1984         }
1985
1986         /*
1987          * Try to learn something about the supported media.
1988          * We know that ASIX and ADMtek and Davicom devices
1989          * will *always* be using MII media, so that's a no-brainer.
1990          * The tricky ones are the Macronix/PNIC II and the
1991          * Intel 21143.
1992          */
1993         if (DC_IS_INTEL(sc))
1994                 dc_parse_21143_srom(sc);
1995         else if (DC_IS_MACRONIX(sc) || DC_IS_PNICII(sc)) {
1996                 if (sc->dc_type == DC_TYPE_98713)
1997                         sc->dc_pmode = DC_PMODE_MII;
1998                 else
1999                         sc->dc_pmode = DC_PMODE_SYM;
2000         } else if (!sc->dc_pmode)
2001                 sc->dc_pmode = DC_PMODE_MII;
2002
2003         /*
2004          * Get station address from the EEPROM.
2005          */
2006         switch(sc->dc_type) {
2007         case DC_TYPE_98713:
2008         case DC_TYPE_98713A:
2009         case DC_TYPE_987x5:
2010         case DC_TYPE_PNICII:
2011                 dc_read_eeprom(sc, (caddr_t)&mac_offset,
2012                     (DC_EE_NODEADDR_OFFSET / 2), 1, 0);
2013                 dc_read_eeprom(sc, (caddr_t)&eaddr, (mac_offset / 2), 3, 0);
2014                 break;
2015         case DC_TYPE_PNIC:
2016                 dc_read_eeprom(sc, (caddr_t)&eaddr, 0, 3, 1);
2017                 break;
2018         case DC_TYPE_DM9102:
2019         case DC_TYPE_21143:
2020         case DC_TYPE_ASIX:
2021                 dc_read_eeprom(sc, (caddr_t)&eaddr, DC_EE_NODEADDR, 3, 0);
2022                 break;
2023         case DC_TYPE_AL981:
2024         case DC_TYPE_AN985:
2025                 bcopy(&sc->dc_srom[DC_AL_EE_NODEADDR], (caddr_t)&eaddr,
2026                     ETHER_ADDR_LEN);
2027                 dc_read_eeprom(sc, (caddr_t)&eaddr, DC_AL_EE_NODEADDR, 3, 0);
2028                 break;
2029         case DC_TYPE_CONEXANT:
2030                 bcopy(sc->dc_srom + DC_CONEXANT_EE_NODEADDR, &eaddr, 6);
2031                 break;
2032         default:
2033                 dc_read_eeprom(sc, (caddr_t)&eaddr, DC_EE_NODEADDR, 3, 0);
2034                 break;
2035         }
2036
2037         /*
2038          * A 21143 or clone chip was detected. Inform the world.
2039          */
2040         printf("dc%d: Ethernet address: %6D\n", unit, eaddr, ":");
2041
2042         sc->dc_unit = unit;
2043
2044         sc->dc_ldata = contigmalloc(sizeof(struct dc_list_data), M_DEVBUF,
2045             M_NOWAIT, 0, 0xffffffff, PAGE_SIZE, 0);
2046
2047         if (sc->dc_ldata == NULL) {
2048                 printf("dc%d: no memory for list buffers!\n", unit);
2049                 if (sc->dc_pnic_rx_buf != NULL)
2050                         free(sc->dc_pnic_rx_buf, M_DEVBUF);
2051                 bus_teardown_intr(dev, sc->dc_irq, sc->dc_intrhand);
2052                 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->dc_irq);
2053                 bus_release_resource(dev, DC_RES, DC_RID, sc->dc_res);
2054                 error = ENXIO;
2055                 goto fail;
2056         }
2057
2058         bzero(sc->dc_ldata, sizeof(struct dc_list_data));
2059
2060         ifp = &sc->arpcom.ac_if;
2061         ifp->if_softc = sc;
2062         if_initname(ifp, "dc", unit);
2063         ifp->if_mtu = ETHERMTU;
2064         ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
2065         ifp->if_ioctl = dc_ioctl;
2066         ifp->if_output = ether_output;
2067         ifp->if_start = dc_start;
2068         ifp->if_watchdog = dc_watchdog;
2069         ifp->if_init = dc_init;
2070         ifp->if_baudrate = 10000000;
2071         ifp->if_snd.ifq_maxlen = DC_TX_LIST_CNT - 1;
2072
2073         /*
2074          * Do MII setup. If this is a 21143, check for a PHY on the
2075          * MII bus after applying any necessary fixups to twiddle the
2076          * GPIO bits. If we don't end up finding a PHY, restore the
2077          * old selection (SIA only or SIA/SYM) and attach the dcphy
2078          * driver instead.
2079          */
2080         if (DC_IS_INTEL(sc)) {
2081                 dc_apply_fixup(sc, IFM_AUTO);
2082                 tmp = sc->dc_pmode;
2083                 sc->dc_pmode = DC_PMODE_MII;
2084         }
2085
2086         error = mii_phy_probe(dev, &sc->dc_miibus,
2087             dc_ifmedia_upd, dc_ifmedia_sts);
2088
2089         if (error && DC_IS_INTEL(sc)) {
2090                 sc->dc_pmode = tmp;
2091                 if (sc->dc_pmode != DC_PMODE_SIA)
2092                         sc->dc_pmode = DC_PMODE_SYM;
2093                 sc->dc_flags |= DC_21143_NWAY;
2094                 mii_phy_probe(dev, &sc->dc_miibus,
2095                     dc_ifmedia_upd, dc_ifmedia_sts);
2096                 /*
2097                  * For non-MII cards, we need to have the 21143
2098                  * drive the LEDs. Except there are some systems
2099                  * like the NEC VersaPro NoteBook PC which have no
2100                  * LEDs, and twiddling these bits has adverse effects
2101                  * on them. (I.e. you suddenly can't get a link.)
2102                  */
2103                 if (pci_read_config(dev, DC_PCI_CSID, 4) != 0x80281033)
2104                         sc->dc_flags |= DC_TULIP_LEDS;
2105                 error = 0;
2106         }
2107
2108         if (error) {
2109                 printf("dc%d: MII without any PHY!\n", sc->dc_unit);
2110                 contigfree(sc->dc_ldata, sizeof(struct dc_list_data),
2111                     M_DEVBUF);
2112                 if (sc->dc_pnic_rx_buf != NULL)
2113                         free(sc->dc_pnic_rx_buf, M_DEVBUF);
2114                 bus_teardown_intr(dev, sc->dc_irq, sc->dc_intrhand);
2115                 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->dc_irq);
2116                 bus_release_resource(dev, DC_RES, DC_RID, sc->dc_res);
2117                 error = ENXIO;
2118                 goto fail;
2119         }
2120
2121         /*
2122          * Call MI attach routine.
2123          */
2124         ether_ifattach(ifp, eaddr);
2125         callout_handle_init(&sc->dc_stat_ch);
2126
2127         if (DC_IS_ADMTEK(sc)) {
2128                 /*
2129                  * Set automatic TX underrun recovery for the ADMtek chips
2130                  */
2131                 DC_SETBIT(sc, DC_AL_CR, DC_AL_CR_ATUR);
2132         }
2133
2134         /*
2135          * Tell the upper layer(s) we support long frames.
2136          */
2137         ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
2138
2139 #ifdef SRM_MEDIA
2140         sc->dc_srm_media = 0;
2141
2142         /* Remember the SRM console media setting */
2143         if (DC_IS_INTEL(sc)) {
2144                 command = pci_read_config(dev, DC_PCI_CFDD, 4);
2145                 command &= ~(DC_CFDD_SNOOZE_MODE|DC_CFDD_SLEEP_MODE);
2146                 switch ((command >> 8) & 0xff) {
2147                 case 3: 
2148                         sc->dc_srm_media = IFM_10_T;
2149                         break;
2150                 case 4: 
2151                         sc->dc_srm_media = IFM_10_T | IFM_FDX;
2152                         break;
2153                 case 5: 
2154                         sc->dc_srm_media = IFM_100_TX;
2155                         break;
2156                 case 6: 
2157                         sc->dc_srm_media = IFM_100_TX | IFM_FDX;
2158                         break;
2159                 }
2160                 if (sc->dc_srm_media)
2161                         sc->dc_srm_media |= IFM_ACTIVE | IFM_ETHER;
2162         }
2163 #endif
2164
2165
2166 fail:
2167         splx(s);
2168
2169         return(error);
2170 }
2171
2172 static int dc_detach(dev)
2173         device_t                dev;
2174 {
2175         struct dc_softc         *sc;
2176         struct ifnet            *ifp;
2177         int                     s;
2178         struct dc_mediainfo     *m;
2179
2180         s = splimp();
2181
2182         sc = device_get_softc(dev);
2183         ifp = &sc->arpcom.ac_if;
2184
2185         dc_stop(sc);
2186         ether_ifdetach(ifp);
2187
2188         bus_generic_detach(dev);
2189         device_delete_child(dev, sc->dc_miibus);
2190
2191         bus_teardown_intr(dev, sc->dc_irq, sc->dc_intrhand);
2192         bus_release_resource(dev, SYS_RES_IRQ, 0, sc->dc_irq);
2193         bus_release_resource(dev, DC_RES, DC_RID, sc->dc_res);
2194
2195         contigfree(sc->dc_ldata, sizeof(struct dc_list_data), M_DEVBUF);
2196         if (sc->dc_pnic_rx_buf != NULL)
2197                 free(sc->dc_pnic_rx_buf, M_DEVBUF);
2198
2199         while(sc->dc_mi != NULL) {
2200                 m = sc->dc_mi->dc_next;
2201                 free(sc->dc_mi, M_DEVBUF);
2202                 sc->dc_mi = m;
2203         }
2204         free(sc->dc_srom, M_DEVBUF);
2205
2206         splx(s);
2207
2208         return(0);
2209 }
2210
2211 /*
2212  * Initialize the transmit descriptors.
2213  */
2214 static int dc_list_tx_init(sc)
2215         struct dc_softc         *sc;
2216 {
2217         struct dc_chain_data    *cd;
2218         struct dc_list_data     *ld;
2219         int                     i;
2220
2221         cd = &sc->dc_cdata;
2222         ld = sc->dc_ldata;
2223         for (i = 0; i < DC_TX_LIST_CNT; i++) {
2224                 if (i == (DC_TX_LIST_CNT - 1)) {
2225                         ld->dc_tx_list[i].dc_next =
2226                             vtophys(&ld->dc_tx_list[0]);
2227                 } else {
2228                         ld->dc_tx_list[i].dc_next =
2229                             vtophys(&ld->dc_tx_list[i + 1]);
2230                 }
2231                 cd->dc_tx_chain[i] = NULL;
2232                 ld->dc_tx_list[i].dc_data = 0;
2233                 ld->dc_tx_list[i].dc_ctl = 0;
2234         }
2235
2236         cd->dc_tx_prod = cd->dc_tx_cons = cd->dc_tx_cnt = 0;
2237
2238         return(0);
2239 }
2240
2241
2242 /*
2243  * Initialize the RX descriptors and allocate mbufs for them. Note that
2244  * we arrange the descriptors in a closed ring, so that the last descriptor
2245  * points back to the first.
2246  */
2247 static int dc_list_rx_init(sc)
2248         struct dc_softc         *sc;
2249 {
2250         struct dc_chain_data    *cd;
2251         struct dc_list_data     *ld;
2252         int                     i;
2253
2254         cd = &sc->dc_cdata;
2255         ld = sc->dc_ldata;
2256
2257         for (i = 0; i < DC_RX_LIST_CNT; i++) {
2258                 if (dc_newbuf(sc, i, NULL) == ENOBUFS)
2259                         return(ENOBUFS);
2260                 if (i == (DC_RX_LIST_CNT - 1)) {
2261                         ld->dc_rx_list[i].dc_next =
2262                             vtophys(&ld->dc_rx_list[0]);
2263                 } else {
2264                         ld->dc_rx_list[i].dc_next =
2265                             vtophys(&ld->dc_rx_list[i + 1]);
2266                 }
2267         }
2268
2269         cd->dc_rx_prod = 0;
2270
2271         return(0);
2272 }
2273
2274 /*
2275  * Initialize an RX descriptor and attach an MBUF cluster.
2276  */
2277 static int dc_newbuf(sc, i, m)
2278         struct dc_softc         *sc;
2279         int                     i;
2280         struct mbuf             *m;
2281 {
2282         struct mbuf             *m_new = NULL;
2283         struct dc_desc          *c;
2284
2285         c = &sc->dc_ldata->dc_rx_list[i];
2286
2287         if (m == NULL) {
2288                 MGETHDR(m_new, M_DONTWAIT, MT_DATA);
2289                 if (m_new == NULL)
2290                         return(ENOBUFS);
2291
2292                 MCLGET(m_new, M_DONTWAIT);
2293                 if (!(m_new->m_flags & M_EXT)) {
2294                         m_freem(m_new);
2295                         return(ENOBUFS);
2296                 }
2297                 m_new->m_len = m_new->m_pkthdr.len = MCLBYTES;
2298         } else {
2299                 m_new = m;
2300                 m_new->m_len = m_new->m_pkthdr.len = MCLBYTES;
2301                 m_new->m_data = m_new->m_ext.ext_buf;
2302         }
2303
2304         m_adj(m_new, sizeof(u_int64_t));
2305
2306         /*
2307          * If this is a PNIC chip, zero the buffer. This is part
2308          * of the workaround for the receive bug in the 82c168 and
2309          * 82c169 chips.
2310          */
2311         if (sc->dc_flags & DC_PNIC_RX_BUG_WAR)
2312                 bzero((char *)mtod(m_new, char *), m_new->m_len);
2313
2314         sc->dc_cdata.dc_rx_chain[i] = m_new;
2315         c->dc_data = vtophys(mtod(m_new, caddr_t));
2316         c->dc_ctl = DC_RXCTL_RLINK | DC_RXLEN;
2317         c->dc_status = DC_RXSTAT_OWN;
2318
2319         return(0);
2320 }
2321
2322 /*
2323  * Grrrrr.
2324  * The PNIC chip has a terrible bug in it that manifests itself during
2325  * periods of heavy activity. The exact mode of failure if difficult to
2326  * pinpoint: sometimes it only happens in promiscuous mode, sometimes it
2327  * will happen on slow machines. The bug is that sometimes instead of
2328  * uploading one complete frame during reception, it uploads what looks
2329  * like the entire contents of its FIFO memory. The frame we want is at
2330  * the end of the whole mess, but we never know exactly how much data has
2331  * been uploaded, so salvaging the frame is hard.
2332  *
2333  * There is only one way to do it reliably, and it's disgusting.
2334  * Here's what we know:
2335  *
2336  * - We know there will always be somewhere between one and three extra
2337  *   descriptors uploaded.
2338  *
2339  * - We know the desired received frame will always be at the end of the
2340  *   total data upload.
2341  *
2342  * - We know the size of the desired received frame because it will be
2343  *   provided in the length field of the status word in the last descriptor.
2344  *
2345  * Here's what we do:
2346  *
2347  * - When we allocate buffers for the receive ring, we bzero() them.
2348  *   This means that we know that the buffer contents should be all
2349  *   zeros, except for data uploaded by the chip.
2350  *
2351  * - We also force the PNIC chip to upload frames that include the
2352  *   ethernet CRC at the end.
2353  *
2354  * - We gather all of the bogus frame data into a single buffer.
2355  *
2356  * - We then position a pointer at the end of this buffer and scan
2357  *   backwards until we encounter the first non-zero byte of data.
2358  *   This is the end of the received frame. We know we will encounter
2359  *   some data at the end of the frame because the CRC will always be
2360  *   there, so even if the sender transmits a packet of all zeros,
2361  *   we won't be fooled.
2362  *
2363  * - We know the size of the actual received frame, so we subtract
2364  *   that value from the current pointer location. This brings us
2365  *   to the start of the actual received packet.
2366  *
2367  * - We copy this into an mbuf and pass it on, along with the actual
2368  *   frame length.
2369  *
2370  * The performance hit is tremendous, but it beats dropping frames all
2371  * the time.
2372  */
2373
2374 #define DC_WHOLEFRAME   (DC_RXSTAT_FIRSTFRAG|DC_RXSTAT_LASTFRAG)
2375 static void dc_pnic_rx_bug_war(sc, idx)
2376         struct dc_softc         *sc;
2377         int                     idx;
2378 {
2379         struct dc_desc          *cur_rx;
2380         struct dc_desc          *c = NULL;
2381         struct mbuf             *m = NULL;
2382         unsigned char           *ptr;
2383         int                     i, total_len;
2384         u_int32_t               rxstat = 0;
2385
2386         i = sc->dc_pnic_rx_bug_save;
2387         cur_rx = &sc->dc_ldata->dc_rx_list[idx];
2388         ptr = sc->dc_pnic_rx_buf;
2389         bzero(ptr, DC_RXLEN * 5);
2390
2391         /* Copy all the bytes from the bogus buffers. */
2392         while (1) {
2393                 c = &sc->dc_ldata->dc_rx_list[i];
2394                 rxstat = c->dc_status;
2395                 m = sc->dc_cdata.dc_rx_chain[i];
2396                 bcopy(mtod(m, char *), ptr, DC_RXLEN);
2397                 ptr += DC_RXLEN;
2398                 /* If this is the last buffer, break out. */
2399                 if (i == idx || rxstat & DC_RXSTAT_LASTFRAG)
2400                         break;
2401                 dc_newbuf(sc, i, m);
2402                 DC_INC(i, DC_RX_LIST_CNT);
2403         }
2404
2405         /* Find the length of the actual receive frame. */
2406         total_len = DC_RXBYTES(rxstat);
2407
2408         /* Scan backwards until we hit a non-zero byte. */
2409         while(*ptr == 0x00)
2410                 ptr--;
2411
2412         /* Round off. */
2413         if ((uintptr_t)(ptr) & 0x3)
2414                 ptr -= 1;
2415
2416         /* Now find the start of the frame. */
2417         ptr -= total_len;
2418         if (ptr < sc->dc_pnic_rx_buf)
2419                 ptr = sc->dc_pnic_rx_buf;
2420
2421         /*
2422          * Now copy the salvaged frame to the last mbuf and fake up
2423          * the status word to make it look like a successful
2424          * frame reception.
2425          */
2426         dc_newbuf(sc, i, m);
2427         bcopy(ptr, mtod(m, char *), total_len); 
2428         cur_rx->dc_status = rxstat | DC_RXSTAT_FIRSTFRAG;
2429
2430         return;
2431 }
2432
2433 /*
2434  * This routine searches the RX ring for dirty descriptors in the
2435  * event that the rxeof routine falls out of sync with the chip's
2436  * current descriptor pointer. This may happen sometimes as a result
2437  * of a "no RX buffer available" condition that happens when the chip
2438  * consumes all of the RX buffers before the driver has a chance to
2439  * process the RX ring. This routine may need to be called more than
2440  * once to bring the driver back in sync with the chip, however we
2441  * should still be getting RX DONE interrupts to drive the search
2442  * for new packets in the RX ring, so we should catch up eventually.
2443  */
2444 static int dc_rx_resync(sc)
2445         struct dc_softc         *sc;
2446 {
2447         int                     i, pos;
2448         struct dc_desc          *cur_rx;
2449
2450         pos = sc->dc_cdata.dc_rx_prod;
2451
2452         for (i = 0; i < DC_RX_LIST_CNT; i++) {
2453                 cur_rx = &sc->dc_ldata->dc_rx_list[pos];
2454                 if (!(cur_rx->dc_status & DC_RXSTAT_OWN))
2455                         break;
2456                 DC_INC(pos, DC_RX_LIST_CNT);
2457         }
2458
2459         /* If the ring really is empty, then just return. */
2460         if (i == DC_RX_LIST_CNT)
2461                 return(0);
2462
2463         /* We've fallen behing the chip: catch it. */
2464         sc->dc_cdata.dc_rx_prod = pos;
2465
2466         return(EAGAIN);
2467 }
2468
2469 /*
2470  * A frame has been uploaded: pass the resulting mbuf chain up to
2471  * the higher level protocols.
2472  */
2473 static void dc_rxeof(sc)
2474         struct dc_softc         *sc;
2475 {
2476         struct ether_header     *eh;
2477         struct mbuf             *m;
2478         struct ifnet            *ifp;
2479         struct dc_desc          *cur_rx;
2480         int                     i, total_len = 0;
2481         u_int32_t               rxstat;
2482
2483         ifp = &sc->arpcom.ac_if;
2484         i = sc->dc_cdata.dc_rx_prod;
2485
2486         while(!(sc->dc_ldata->dc_rx_list[i].dc_status & DC_RXSTAT_OWN)) {
2487
2488 #ifdef DEVICE_POLLING
2489                 if (ifp->if_flags & IFF_POLLING) {
2490                         if (sc->rxcycles <= 0)
2491                                 break;
2492                         sc->rxcycles--;
2493                 }
2494 #endif /* DEVICE_POLLING */
2495                 cur_rx = &sc->dc_ldata->dc_rx_list[i];
2496                 rxstat = cur_rx->dc_status;
2497                 m = sc->dc_cdata.dc_rx_chain[i];
2498                 total_len = DC_RXBYTES(rxstat);
2499
2500                 if (sc->dc_flags & DC_PNIC_RX_BUG_WAR) {
2501                         if ((rxstat & DC_WHOLEFRAME) != DC_WHOLEFRAME) {
2502                                 if (rxstat & DC_RXSTAT_FIRSTFRAG)
2503                                         sc->dc_pnic_rx_bug_save = i;
2504                                 if ((rxstat & DC_RXSTAT_LASTFRAG) == 0) {
2505                                         DC_INC(i, DC_RX_LIST_CNT);
2506                                         continue;
2507                                 }
2508                                 dc_pnic_rx_bug_war(sc, i);
2509                                 rxstat = cur_rx->dc_status;
2510                                 total_len = DC_RXBYTES(rxstat);
2511                         }
2512                 }
2513
2514                 sc->dc_cdata.dc_rx_chain[i] = NULL;
2515
2516                 /*
2517                  * If an error occurs, update stats, clear the
2518                  * status word and leave the mbuf cluster in place:
2519                  * it should simply get re-used next time this descriptor
2520                  * comes up in the ring.  However, don't report long
2521                  * frames as errors since they could be vlans
2522                  */
2523                 if ((rxstat & DC_RXSTAT_RXERR)){ 
2524                         if (!(rxstat & DC_RXSTAT_GIANT) ||
2525                             (rxstat & (DC_RXSTAT_CRCERR | DC_RXSTAT_DRIBBLE |
2526                                        DC_RXSTAT_MIIERE | DC_RXSTAT_COLLSEEN |
2527                                        DC_RXSTAT_RUNT   | DC_RXSTAT_DE))) {
2528                                 ifp->if_ierrors++;
2529                                 if (rxstat & DC_RXSTAT_COLLSEEN)
2530                                         ifp->if_collisions++;
2531                                 dc_newbuf(sc, i, m);
2532                                 if (rxstat & DC_RXSTAT_CRCERR) {
2533                                         DC_INC(i, DC_RX_LIST_CNT);
2534                                         continue;
2535                                 } else {
2536                                         dc_init(sc);
2537                                         return;
2538                                 }
2539                         }
2540                 }
2541
2542                 /* No errors; receive the packet. */    
2543                 total_len -= ETHER_CRC_LEN;
2544
2545 #ifdef __i386__
2546                 /*
2547                  * On the x86 we do not have alignment problems, so try to
2548                  * allocate a new buffer for the receive ring, and pass up
2549                  * the one where the packet is already, saving the expensive
2550                  * copy done in m_devget().
2551                  * If we are on an architecture with alignment problems, or
2552                  * if the allocation fails, then use m_devget and leave the
2553                  * existing buffer in the receive ring.
2554                  */
2555                 if (dc_quick && dc_newbuf(sc, i, NULL) == 0) {
2556                         m->m_pkthdr.rcvif = ifp;
2557                         m->m_pkthdr.len = m->m_len = total_len;
2558                         DC_INC(i, DC_RX_LIST_CNT);
2559                 } else
2560 #endif
2561                 {
2562                         struct mbuf *m0;
2563
2564                         m0 = m_devget(mtod(m, char *) - ETHER_ALIGN,
2565                             total_len + ETHER_ALIGN, 0, ifp, NULL);
2566                         dc_newbuf(sc, i, m);
2567                         DC_INC(i, DC_RX_LIST_CNT);
2568                         if (m0 == NULL) {
2569                                 ifp->if_ierrors++;
2570                                 continue;
2571                         }
2572                         m_adj(m0, ETHER_ALIGN);
2573                         m = m0;
2574                 }
2575
2576                 ifp->if_ipackets++;
2577                 eh = mtod(m, struct ether_header *);
2578
2579                 /* Remove header from mbuf and pass it on. */
2580                 m_adj(m, sizeof(struct ether_header));
2581                 ether_input(ifp, eh, m);
2582         }
2583
2584         sc->dc_cdata.dc_rx_prod = i;
2585 }
2586
2587 /*
2588  * A frame was downloaded to the chip. It's safe for us to clean up
2589  * the list buffers.
2590  */
2591
2592 static void
2593 dc_txeof(sc)
2594         struct dc_softc         *sc;
2595 {
2596         struct dc_desc          *cur_tx = NULL;
2597         struct ifnet            *ifp;
2598         int                     idx;
2599
2600         ifp = &sc->arpcom.ac_if;
2601
2602         /*
2603          * Go through our tx list and free mbufs for those
2604          * frames that have been transmitted.
2605          */
2606         idx = sc->dc_cdata.dc_tx_cons;
2607         while(idx != sc->dc_cdata.dc_tx_prod) {
2608                 u_int32_t               txstat;
2609
2610                 cur_tx = &sc->dc_ldata->dc_tx_list[idx];
2611                 txstat = cur_tx->dc_status;
2612
2613                 if (txstat & DC_TXSTAT_OWN)
2614                         break;
2615
2616                 if (!(cur_tx->dc_ctl & DC_TXCTL_LASTFRAG) ||
2617                     cur_tx->dc_ctl & DC_TXCTL_SETUP) {
2618                         if (cur_tx->dc_ctl & DC_TXCTL_SETUP) {
2619                                 /*
2620                                  * Yes, the PNIC is so brain damaged
2621                                  * that it will sometimes generate a TX
2622                                  * underrun error while DMAing the RX
2623                                  * filter setup frame. If we detect this,
2624                                  * we have to send the setup frame again,
2625                                  * or else the filter won't be programmed
2626                                  * correctly.
2627                                  */
2628                                 if (DC_IS_PNIC(sc)) {
2629                                         if (txstat & DC_TXSTAT_ERRSUM)
2630                                                 dc_setfilt(sc);
2631                                 }
2632                                 sc->dc_cdata.dc_tx_chain[idx] = NULL;
2633                         }
2634                         sc->dc_cdata.dc_tx_cnt--;
2635                         DC_INC(idx, DC_TX_LIST_CNT);
2636                         continue;
2637                 }
2638
2639                 if (DC_IS_CONEXANT(sc)) {
2640                         /*
2641                          * For some reason Conexant chips like
2642                          * setting the CARRLOST flag even when
2643                          * the carrier is there. In CURRENT we
2644                          * have the same problem for Xircom
2645                          * cards !
2646                          */
2647                         if (/*sc->dc_type == DC_TYPE_21143 &&*/
2648                             sc->dc_pmode == DC_PMODE_MII &&
2649                             ((txstat & 0xFFFF) & ~(DC_TXSTAT_ERRSUM|
2650                             DC_TXSTAT_NOCARRIER)))
2651                                 txstat &= ~DC_TXSTAT_ERRSUM;
2652                 } else {
2653                         if (/*sc->dc_type == DC_TYPE_21143 &&*/
2654                             sc->dc_pmode == DC_PMODE_MII &&
2655                             ((txstat & 0xFFFF) & ~(DC_TXSTAT_ERRSUM|
2656                             DC_TXSTAT_NOCARRIER|DC_TXSTAT_CARRLOST)))
2657                                 txstat &= ~DC_TXSTAT_ERRSUM;
2658                 }
2659
2660                 if (txstat & DC_TXSTAT_ERRSUM) {
2661                         ifp->if_oerrors++;
2662                         if (txstat & DC_TXSTAT_EXCESSCOLL)
2663                                 ifp->if_collisions++;
2664                         if (txstat & DC_TXSTAT_LATECOLL)
2665                                 ifp->if_collisions++;
2666                         if (!(txstat & DC_TXSTAT_UNDERRUN)) {
2667                                 dc_init(sc);
2668                                 return;
2669                         }
2670                 }
2671
2672                 ifp->if_collisions += (txstat & DC_TXSTAT_COLLCNT) >> 3;
2673
2674                 ifp->if_opackets++;
2675                 if (sc->dc_cdata.dc_tx_chain[idx] != NULL) {
2676                         m_freem(sc->dc_cdata.dc_tx_chain[idx]);
2677                         sc->dc_cdata.dc_tx_chain[idx] = NULL;
2678                 }
2679
2680                 sc->dc_cdata.dc_tx_cnt--;
2681                 DC_INC(idx, DC_TX_LIST_CNT);
2682         }
2683
2684         if (idx != sc->dc_cdata.dc_tx_cons) {
2685                 /* some buffers have been freed */
2686                 sc->dc_cdata.dc_tx_cons = idx;
2687                 ifp->if_flags &= ~IFF_OACTIVE;
2688         }
2689         ifp->if_timer = (sc->dc_cdata.dc_tx_cnt == 0) ? 0 : 5;
2690
2691         return;
2692 }
2693
2694 static void dc_tick(xsc)
2695         void                    *xsc;
2696 {
2697         struct dc_softc         *sc;
2698         struct mii_data         *mii;
2699         struct ifnet            *ifp;
2700         int                     s;
2701         u_int32_t               r;
2702
2703         s = splimp();
2704
2705         sc = xsc;
2706         ifp = &sc->arpcom.ac_if;
2707         mii = device_get_softc(sc->dc_miibus);
2708
2709         if (sc->dc_flags & DC_REDUCED_MII_POLL) {
2710                 if (sc->dc_flags & DC_21143_NWAY) {
2711                         r = CSR_READ_4(sc, DC_10BTSTAT);
2712                         if (IFM_SUBTYPE(mii->mii_media_active) ==
2713                             IFM_100_TX && (r & DC_TSTAT_LS100)) {
2714                                 sc->dc_link = 0;
2715                                 mii_mediachg(mii);
2716                         }
2717                         if (IFM_SUBTYPE(mii->mii_media_active) ==
2718                             IFM_10_T && (r & DC_TSTAT_LS10)) {
2719                                 sc->dc_link = 0;
2720                                 mii_mediachg(mii);
2721                         }
2722                         if (sc->dc_link == 0)
2723                                 mii_tick(mii);
2724                 } else {
2725                         r = CSR_READ_4(sc, DC_ISR);
2726                         if ((r & DC_ISR_RX_STATE) == DC_RXSTATE_WAIT &&
2727                             sc->dc_cdata.dc_tx_cnt == 0)
2728                                 mii_tick(mii);
2729                                 if (!(mii->mii_media_status & IFM_ACTIVE))
2730                                         sc->dc_link = 0;
2731                 }
2732         } else
2733                 mii_tick(mii);
2734
2735         /*
2736          * When the init routine completes, we expect to be able to send
2737          * packets right away, and in fact the network code will send a
2738          * gratuitous ARP the moment the init routine marks the interface
2739          * as running. However, even though the MAC may have been initialized,
2740          * there may be a delay of a few seconds before the PHY completes
2741          * autonegotiation and the link is brought up. Any transmissions
2742          * made during that delay will be lost. Dealing with this is tricky:
2743          * we can't just pause in the init routine while waiting for the
2744          * PHY to come ready since that would bring the whole system to
2745          * a screeching halt for several seconds.
2746          *
2747          * What we do here is prevent the TX start routine from sending
2748          * any packets until a link has been established. After the
2749          * interface has been initialized, the tick routine will poll
2750          * the state of the PHY until the IFM_ACTIVE flag is set. Until
2751          * that time, packets will stay in the send queue, and once the
2752          * link comes up, they will be flushed out to the wire.
2753          */
2754         if (!sc->dc_link) {
2755                 mii_pollstat(mii);
2756                 if (mii->mii_media_status & IFM_ACTIVE &&
2757                     IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
2758                         sc->dc_link++;
2759                         if (ifp->if_snd.ifq_head != NULL)
2760                                 dc_start(ifp);
2761                 }
2762         }
2763
2764         if (sc->dc_flags & DC_21143_NWAY && !sc->dc_link)
2765                 sc->dc_stat_ch = timeout(dc_tick, sc, hz/10);
2766         else
2767                 sc->dc_stat_ch = timeout(dc_tick, sc, hz);
2768
2769         splx(s);
2770
2771         return;
2772 }
2773
2774 /*
2775  * A transmit underrun has occurred.  Back off the transmit threshold,
2776  * or switch to store and forward mode if we have to.
2777  */
2778 static void dc_tx_underrun(sc)
2779         struct dc_softc         *sc;
2780 {
2781         u_int32_t               isr;
2782         int                     i;
2783
2784         if (DC_IS_DAVICOM(sc))
2785                 dc_init(sc);
2786
2787         if (DC_IS_INTEL(sc)) {
2788                 /*
2789                  * The real 21143 requires that the transmitter be idle
2790                  * in order to change the transmit threshold or store
2791                  * and forward state.
2792                  */
2793                 DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_TX_ON);
2794
2795                 for (i = 0; i < DC_TIMEOUT; i++) {
2796                         isr = CSR_READ_4(sc, DC_ISR);
2797                         if (isr & DC_ISR_TX_IDLE)
2798                                 break;
2799                         DELAY(10);
2800                 }
2801                 if (i == DC_TIMEOUT) {
2802                         printf("dc%d: failed to force tx to idle state\n",
2803                             sc->dc_unit);
2804                         dc_init(sc);
2805                 }
2806         }
2807
2808         printf("dc%d: TX underrun -- ", sc->dc_unit);
2809         sc->dc_txthresh += DC_TXTHRESH_INC;
2810         if (sc->dc_txthresh > DC_TXTHRESH_MAX) {
2811                 printf("using store and forward mode\n");
2812                 DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_STORENFWD);
2813         } else {
2814                 printf("increasing TX threshold\n");
2815                 DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_TX_THRESH);
2816                 DC_SETBIT(sc, DC_NETCFG, sc->dc_txthresh);
2817         }
2818
2819         if (DC_IS_INTEL(sc))
2820                 DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_TX_ON);
2821
2822         return;
2823 }
2824
2825 #ifdef DEVICE_POLLING
2826 static poll_handler_t dc_poll;
2827
2828 static void
2829 dc_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
2830 {
2831         struct  dc_softc *sc = ifp->if_softc;
2832
2833         if (cmd == POLL_DEREGISTER) { /* final call, enable interrupts */
2834                 /* Re-enable interrupts. */
2835                 CSR_WRITE_4(sc, DC_IMR, DC_INTRS);
2836                 return;
2837         }
2838         sc->rxcycles = count;
2839         dc_rxeof(sc);
2840         dc_txeof(sc);
2841         if (ifp->if_snd.ifq_head != NULL && !(ifp->if_flags & IFF_OACTIVE))
2842                 dc_start(ifp);
2843
2844         if (cmd == POLL_AND_CHECK_STATUS) { /* also check status register */
2845                 u_int32_t          status;
2846
2847                 status = CSR_READ_4(sc, DC_ISR);
2848                 status &= (DC_ISR_RX_WATDOGTIMEO|DC_ISR_RX_NOBUF|
2849                         DC_ISR_TX_NOBUF|DC_ISR_TX_IDLE|DC_ISR_TX_UNDERRUN|
2850                         DC_ISR_BUS_ERR);
2851                 if (!status)
2852                         return ;
2853                 /* ack what we have */
2854                 CSR_WRITE_4(sc, DC_ISR, status);
2855
2856                 if (status & (DC_ISR_RX_WATDOGTIMEO|DC_ISR_RX_NOBUF) ) {
2857                         u_int32_t r = CSR_READ_4(sc, DC_FRAMESDISCARDED);
2858                         ifp->if_ierrors += (r & 0xffff) + ((r >> 17) & 0x7ff);
2859
2860                         if (dc_rx_resync(sc))
2861                                 dc_rxeof(sc);
2862                 }
2863                 /* restart transmit unit if necessary */
2864                 if (status & DC_ISR_TX_IDLE && sc->dc_cdata.dc_tx_cnt)
2865                         CSR_WRITE_4(sc, DC_TXSTART, 0xFFFFFFFF);
2866
2867                 if (status & DC_ISR_TX_UNDERRUN)
2868                         dc_tx_underrun(sc);
2869
2870                 if (status & DC_ISR_BUS_ERR) {
2871                         printf("dc_poll: dc%d bus error\n", sc->dc_unit);
2872                         dc_reset(sc);
2873                         dc_init(sc);
2874                 }
2875         }
2876 }
2877 #endif /* DEVICE_POLLING */
2878
2879 static void dc_intr(arg)
2880         void                    *arg;
2881 {
2882         struct dc_softc         *sc;
2883         struct ifnet            *ifp;
2884         u_int32_t               status;
2885
2886         sc = arg;
2887
2888         if (sc->suspended) {
2889                 return;
2890         }
2891
2892         ifp = &sc->arpcom.ac_if;
2893
2894 #ifdef DEVICE_POLLING
2895         if (ifp->if_flags & IFF_POLLING)
2896                 return;
2897         if (ether_poll_register(dc_poll, ifp)) { /* ok, disable interrupts */
2898                 CSR_WRITE_4(sc, DC_IMR, 0x00000000);
2899                 return;
2900         }
2901 #endif /* DEVICE_POLLING */
2902
2903         if ( (CSR_READ_4(sc, DC_ISR) & DC_INTRS) == 0)
2904                 return ;
2905
2906         /* Suppress unwanted interrupts */
2907         if (!(ifp->if_flags & IFF_UP)) {
2908                 if (CSR_READ_4(sc, DC_ISR) & DC_INTRS)
2909                         dc_stop(sc);
2910                 return;
2911         }
2912
2913         /* Disable interrupts. */
2914         CSR_WRITE_4(sc, DC_IMR, 0x00000000);
2915
2916         while((status = CSR_READ_4(sc, DC_ISR)) & DC_INTRS) {
2917
2918                 CSR_WRITE_4(sc, DC_ISR, status);
2919
2920                 if (status & DC_ISR_RX_OK) {
2921                         int             curpkts;
2922                         curpkts = ifp->if_ipackets;
2923                         dc_rxeof(sc);
2924                         if (curpkts == ifp->if_ipackets) {
2925                                 while(dc_rx_resync(sc))
2926                                         dc_rxeof(sc);
2927                         }
2928                 }
2929
2930                 if (status & (DC_ISR_TX_OK|DC_ISR_TX_NOBUF))
2931                         dc_txeof(sc);
2932
2933                 if (status & DC_ISR_TX_IDLE) {
2934                         dc_txeof(sc);
2935                         if (sc->dc_cdata.dc_tx_cnt) {
2936                                 DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_TX_ON);
2937                                 CSR_WRITE_4(sc, DC_TXSTART, 0xFFFFFFFF);
2938                         }
2939                 }
2940
2941                 if (status & DC_ISR_TX_UNDERRUN)
2942                         dc_tx_underrun(sc);
2943
2944                 if ((status & DC_ISR_RX_WATDOGTIMEO)
2945                     || (status & DC_ISR_RX_NOBUF)) {
2946                         int             curpkts;
2947                         curpkts = ifp->if_ipackets;
2948                         dc_rxeof(sc);
2949                         if (curpkts == ifp->if_ipackets) {
2950                                 while(dc_rx_resync(sc))
2951                                         dc_rxeof(sc);
2952                         }
2953                 }
2954
2955                 if (status & DC_ISR_BUS_ERR) {
2956                         dc_reset(sc);
2957                         dc_init(sc);
2958                 }
2959         }
2960
2961         /* Re-enable interrupts. */
2962         CSR_WRITE_4(sc, DC_IMR, DC_INTRS);
2963
2964         if (ifp->if_snd.ifq_head != NULL)
2965                 dc_start(ifp);
2966
2967         return;
2968 }
2969
2970 /*
2971  * Encapsulate an mbuf chain in a descriptor by coupling the mbuf data
2972  * pointers to the fragment pointers.
2973  */
2974 static int dc_encap(sc, m_head, txidx)
2975         struct dc_softc         *sc;
2976         struct mbuf             *m_head;
2977         u_int32_t               *txidx;
2978 {
2979         struct dc_desc          *f = NULL;
2980         struct mbuf             *m;
2981         int                     frag, cur, cnt = 0;
2982
2983         /*
2984          * Start packing the mbufs in this chain into
2985          * the fragment pointers. Stop when we run out
2986          * of fragments or hit the end of the mbuf chain.
2987          */
2988         m = m_head;
2989         cur = frag = *txidx;
2990
2991         for (m = m_head; m != NULL; m = m->m_next) {
2992                 if (m->m_len != 0) {
2993                         if (sc->dc_flags & DC_TX_ADMTEK_WAR) {
2994                                 if (*txidx != sc->dc_cdata.dc_tx_prod &&
2995                                     frag == (DC_TX_LIST_CNT - 1))
2996                                         return(ENOBUFS);
2997                         }
2998                         if ((DC_TX_LIST_CNT -
2999                             (sc->dc_cdata.dc_tx_cnt + cnt)) < 5)
3000                                 return(ENOBUFS);
3001
3002                         f = &sc->dc_ldata->dc_tx_list[frag];
3003                         f->dc_ctl = DC_TXCTL_TLINK | m->m_len;
3004                         if (cnt == 0) {
3005                                 f->dc_status = 0;
3006                                 f->dc_ctl |= DC_TXCTL_FIRSTFRAG;
3007                         } else
3008                                 f->dc_status = DC_TXSTAT_OWN;
3009                         f->dc_data = vtophys(mtod(m, vm_offset_t));
3010                         cur = frag;
3011                         DC_INC(frag, DC_TX_LIST_CNT);
3012                         cnt++;
3013                 }
3014         }
3015
3016         if (m != NULL)
3017                 return(ENOBUFS);
3018
3019         sc->dc_cdata.dc_tx_cnt += cnt;
3020         sc->dc_cdata.dc_tx_chain[cur] = m_head;
3021         sc->dc_ldata->dc_tx_list[cur].dc_ctl |= DC_TXCTL_LASTFRAG;
3022         if (sc->dc_flags & DC_TX_INTR_FIRSTFRAG)
3023                 sc->dc_ldata->dc_tx_list[*txidx].dc_ctl |= DC_TXCTL_FINT;
3024         if (sc->dc_flags & DC_TX_INTR_ALWAYS)
3025                 sc->dc_ldata->dc_tx_list[cur].dc_ctl |= DC_TXCTL_FINT;
3026         if (sc->dc_flags & DC_TX_USE_TX_INTR && sc->dc_cdata.dc_tx_cnt > 64)
3027                 sc->dc_ldata->dc_tx_list[cur].dc_ctl |= DC_TXCTL_FINT;
3028         sc->dc_ldata->dc_tx_list[*txidx].dc_status = DC_TXSTAT_OWN;
3029         *txidx = frag;
3030
3031         return(0);
3032 }
3033
3034 /*
3035  * Coalesce an mbuf chain into a single mbuf cluster buffer.
3036  * Needed for some really badly behaved chips that just can't
3037  * do scatter/gather correctly.
3038  */
3039 static int dc_coal(sc, m_head)
3040         struct dc_softc         *sc;
3041         struct mbuf             **m_head;
3042 {
3043         struct mbuf             *m_new, *m;
3044
3045         m = *m_head;
3046         MGETHDR(m_new, M_DONTWAIT, MT_DATA);
3047         if (m_new == NULL)
3048                 return(ENOBUFS);
3049         if (m->m_pkthdr.len > MHLEN) {
3050                 MCLGET(m_new, M_DONTWAIT);
3051                 if (!(m_new->m_flags & M_EXT)) {
3052                         m_freem(m_new);
3053                         return(ENOBUFS);
3054                 }
3055         }
3056         m_copydata(m, 0, m->m_pkthdr.len, mtod(m_new, caddr_t));
3057         m_new->m_pkthdr.len = m_new->m_len = m->m_pkthdr.len;
3058         m_freem(m);
3059         *m_head = m_new;
3060
3061         return(0);
3062 }
3063
3064 /*
3065  * Main transmit routine. To avoid having to do mbuf copies, we put pointers
3066  * to the mbuf data regions directly in the transmit lists. We also save a
3067  * copy of the pointers since the transmit list fragment pointers are
3068  * physical addresses.
3069  */
3070
3071 static void dc_start(ifp)
3072         struct ifnet            *ifp;
3073 {
3074         struct dc_softc         *sc;
3075         struct mbuf             *m_head = NULL;
3076         int                     idx;
3077
3078         sc = ifp->if_softc;
3079
3080         if (!sc->dc_link && ifp->if_snd.ifq_len < 10)
3081                 return;
3082
3083         if (ifp->if_flags & IFF_OACTIVE)
3084                 return;
3085
3086         idx = sc->dc_cdata.dc_tx_prod;
3087
3088         while(sc->dc_cdata.dc_tx_chain[idx] == NULL) {
3089                 IF_DEQUEUE(&ifp->if_snd, m_head);
3090                 if (m_head == NULL)
3091                         break;
3092
3093                 if (sc->dc_flags & DC_TX_COALESCE &&
3094                     m_head->m_next != NULL) {
3095                         /* only coalesce if have >1 mbufs */
3096                         if (dc_coal(sc, &m_head)) {
3097                                 IF_PREPEND(&ifp->if_snd, m_head);
3098                                 ifp->if_flags |= IFF_OACTIVE;
3099                                 break;
3100                         }
3101                 }
3102
3103                 if (dc_encap(sc, m_head, &idx)) {
3104                         IF_PREPEND(&ifp->if_snd, m_head);
3105                         ifp->if_flags |= IFF_OACTIVE;
3106                         break;
3107                 }
3108
3109                 /*
3110                  * If there's a BPF listener, bounce a copy of this frame
3111                  * to him.
3112                  */
3113                 if (ifp->if_bpf)
3114                         bpf_mtap(ifp, m_head);
3115
3116                 if (sc->dc_flags & DC_TX_ONE) {
3117                         ifp->if_flags |= IFF_OACTIVE;
3118                         break;
3119                 }
3120         }
3121
3122         /* Transmit */
3123         sc->dc_cdata.dc_tx_prod = idx;
3124         if (!(sc->dc_flags & DC_TX_POLL))
3125                 CSR_WRITE_4(sc, DC_TXSTART, 0xFFFFFFFF);
3126
3127         /*
3128          * Set a timeout in case the chip goes out to lunch.
3129          */
3130         ifp->if_timer = 5;
3131
3132         return;
3133 }
3134
3135 static void dc_init(xsc)
3136         void                    *xsc;
3137 {
3138         struct dc_softc         *sc = xsc;
3139         struct ifnet            *ifp = &sc->arpcom.ac_if;
3140         struct mii_data         *mii;
3141         int                     s;
3142
3143         s = splimp();
3144
3145         mii = device_get_softc(sc->dc_miibus);
3146
3147         /*
3148          * Cancel pending I/O and free all RX/TX buffers.
3149          */
3150         dc_stop(sc);
3151         dc_reset(sc);
3152
3153         /*
3154          * Set cache alignment and burst length.
3155          */
3156         if (DC_IS_ASIX(sc) || DC_IS_DAVICOM(sc))
3157                 CSR_WRITE_4(sc, DC_BUSCTL, 0);
3158         else
3159                 CSR_WRITE_4(sc, DC_BUSCTL, DC_BUSCTL_MRME|DC_BUSCTL_MRLE);
3160         /*
3161          * Evenly share the bus between receive and transmit process.
3162          */
3163         if (DC_IS_INTEL(sc))
3164                 DC_SETBIT(sc, DC_BUSCTL, DC_BUSCTL_ARBITRATION);
3165         if (DC_IS_DAVICOM(sc) || DC_IS_INTEL(sc)) {
3166                 DC_SETBIT(sc, DC_BUSCTL, DC_BURSTLEN_USECA);
3167         } else {
3168                 DC_SETBIT(sc, DC_BUSCTL, DC_BURSTLEN_16LONG);
3169         }
3170         if (sc->dc_flags & DC_TX_POLL)
3171                 DC_SETBIT(sc, DC_BUSCTL, DC_TXPOLL_1);
3172         switch(sc->dc_cachesize) {
3173         case 32:
3174                 DC_SETBIT(sc, DC_BUSCTL, DC_CACHEALIGN_32LONG);
3175                 break;
3176         case 16:
3177                 DC_SETBIT(sc, DC_BUSCTL, DC_CACHEALIGN_16LONG);
3178                 break; 
3179         case 8:
3180                 DC_SETBIT(sc, DC_BUSCTL, DC_CACHEALIGN_8LONG);
3181                 break;  
3182         case 0:
3183         default:
3184                 DC_SETBIT(sc, DC_BUSCTL, DC_CACHEALIGN_NONE);
3185                 break;
3186         }
3187
3188         if (sc->dc_flags & DC_TX_STORENFWD)
3189                 DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_STORENFWD);
3190         else {
3191                 if (sc->dc_txthresh > DC_TXTHRESH_MAX) {
3192                         DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_STORENFWD);
3193                 } else {
3194                         DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_STORENFWD);
3195                         DC_SETBIT(sc, DC_NETCFG, sc->dc_txthresh);
3196                 }
3197         }
3198
3199         DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_NO_RXCRC);
3200         DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_TX_BACKOFF);
3201
3202         if (DC_IS_MACRONIX(sc) || DC_IS_PNICII(sc)) {
3203                 /*
3204                  * The app notes for the 98713 and 98715A say that
3205                  * in order to have the chips operate properly, a magic
3206                  * number must be written to CSR16. Macronix does not
3207                  * document the meaning of these bits so there's no way
3208                  * to know exactly what they do. The 98713 has a magic
3209                  * number all its own; the rest all use a different one.
3210                  */
3211                 DC_CLRBIT(sc, DC_MX_MAGICPACKET, 0xFFFF0000);
3212                 if (sc->dc_type == DC_TYPE_98713)
3213                         DC_SETBIT(sc, DC_MX_MAGICPACKET, DC_MX_MAGIC_98713);
3214                 else
3215                         DC_SETBIT(sc, DC_MX_MAGICPACKET, DC_MX_MAGIC_98715);
3216         }
3217
3218         DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_TX_THRESH);
3219         DC_SETBIT(sc, DC_NETCFG, DC_TXTHRESH_MIN);
3220
3221         /* Init circular RX list. */
3222         if (dc_list_rx_init(sc) == ENOBUFS) {
3223                 printf("dc%d: initialization failed: no "
3224                     "memory for rx buffers\n", sc->dc_unit);
3225                 dc_stop(sc);
3226                 (void)splx(s);
3227                 return;
3228         }
3229
3230         /*
3231          * Init tx descriptors.
3232          */
3233         dc_list_tx_init(sc);
3234
3235         /*
3236          * Load the address of the RX list.
3237          */
3238         CSR_WRITE_4(sc, DC_RXADDR, vtophys(&sc->dc_ldata->dc_rx_list[0]));
3239         CSR_WRITE_4(sc, DC_TXADDR, vtophys(&sc->dc_ldata->dc_tx_list[0]));
3240
3241         /*
3242          * Enable interrupts.
3243          */
3244 #ifdef DEVICE_POLLING
3245         /*
3246          * ... but only if we are not polling, and make sure they are off in
3247          * the case of polling. Some cards (e.g. fxp) turn interrupts on
3248          * after a reset.
3249          */
3250         if (ifp->if_flags & IFF_POLLING)
3251                 CSR_WRITE_4(sc, DC_IMR, 0x00000000);
3252         else
3253 #endif
3254         CSR_WRITE_4(sc, DC_IMR, DC_INTRS);
3255         CSR_WRITE_4(sc, DC_ISR, 0xFFFFFFFF);
3256
3257         /* Enable transmitter. */
3258         DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_TX_ON);
3259
3260         /*
3261          * If this is an Intel 21143 and we're not using the
3262          * MII port, program the LED control pins so we get
3263          * link and activity indications.
3264          */
3265         if (sc->dc_flags & DC_TULIP_LEDS) {
3266                 CSR_WRITE_4(sc, DC_WATCHDOG,
3267                     DC_WDOG_CTLWREN|DC_WDOG_LINK|DC_WDOG_ACTIVITY);   
3268                 CSR_WRITE_4(sc, DC_WATCHDOG, 0);
3269         }
3270
3271         /*
3272          * Load the RX/multicast filter. We do this sort of late
3273          * because the filter programming scheme on the 21143 and
3274          * some clones requires DMAing a setup frame via the TX
3275          * engine, and we need the transmitter enabled for that.
3276          */
3277         dc_setfilt(sc);
3278
3279         /* Enable receiver. */
3280         DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_RX_ON);
3281         CSR_WRITE_4(sc, DC_RXSTART, 0xFFFFFFFF);
3282
3283         mii_mediachg(mii);
3284         dc_setcfg(sc, sc->dc_if_media);
3285
3286         ifp->if_flags |= IFF_RUNNING;
3287         ifp->if_flags &= ~IFF_OACTIVE;
3288
3289         (void)splx(s);
3290
3291         /* Don't start the ticker if this is a homePNA link. */
3292         if (IFM_SUBTYPE(mii->mii_media.ifm_media) == IFM_homePNA)
3293                 sc->dc_link = 1;
3294         else {
3295                 if (sc->dc_flags & DC_21143_NWAY)
3296                         sc->dc_stat_ch = timeout(dc_tick, sc, hz/10);
3297                 else
3298                         sc->dc_stat_ch = timeout(dc_tick, sc, hz);
3299         }
3300
3301 #ifdef SRM_MEDIA
3302         if(sc->dc_srm_media) {
3303                 struct ifreq ifr;
3304
3305                 ifr.ifr_media = sc->dc_srm_media;
3306                 ifmedia_ioctl(ifp, &ifr, &mii->mii_media, SIOCSIFMEDIA);                
3307                 sc->dc_srm_media = 0;
3308         }
3309 #endif
3310         return;
3311 }
3312
3313 /*
3314  * Set media options.
3315  */
3316 static int dc_ifmedia_upd(ifp)
3317         struct ifnet            *ifp;
3318 {
3319         struct dc_softc         *sc;
3320         struct mii_data         *mii;
3321         struct ifmedia          *ifm;
3322
3323         sc = ifp->if_softc;
3324         mii = device_get_softc(sc->dc_miibus);
3325         mii_mediachg(mii);
3326         ifm = &mii->mii_media;
3327
3328         if (DC_IS_DAVICOM(sc) &&
3329             IFM_SUBTYPE(ifm->ifm_media) == IFM_homePNA)
3330                 dc_setcfg(sc, ifm->ifm_media);
3331         else
3332                 sc->dc_link = 0;
3333
3334         return(0);
3335 }
3336
3337 /*
3338  * Report current media status.
3339  */
3340 static void dc_ifmedia_sts(ifp, ifmr)
3341         struct ifnet            *ifp;
3342         struct ifmediareq       *ifmr;
3343 {
3344         struct dc_softc         *sc;
3345         struct mii_data         *mii;
3346         struct ifmedia          *ifm;
3347
3348         sc = ifp->if_softc;
3349         mii = device_get_softc(sc->dc_miibus);
3350         mii_pollstat(mii);
3351         ifm = &mii->mii_media;
3352         if (DC_IS_DAVICOM(sc)) {
3353                 if (IFM_SUBTYPE(ifm->ifm_media) == IFM_homePNA) {
3354                         ifmr->ifm_active = ifm->ifm_media;
3355                         ifmr->ifm_status = 0;
3356                         return;
3357                 }
3358         }
3359         ifmr->ifm_active = mii->mii_media_active;
3360         ifmr->ifm_status = mii->mii_media_status;
3361
3362         return;
3363 }
3364
3365 static int dc_ioctl(ifp, command, data, cr)
3366         struct ifnet            *ifp;
3367         u_long                  command;
3368         caddr_t                 data;
3369         struct ucred            *cr;
3370 {
3371         struct dc_softc         *sc = ifp->if_softc;
3372         struct ifreq            *ifr = (struct ifreq *) data;
3373         struct mii_data         *mii;
3374         int                     s, error = 0;
3375
3376         s = splimp();
3377
3378         switch(command) {
3379         case SIOCSIFADDR:
3380         case SIOCGIFADDR:
3381         case SIOCSIFMTU:
3382                 error = ether_ioctl(ifp, command, data);
3383                 break;
3384         case SIOCSIFFLAGS:
3385                 if (ifp->if_flags & IFF_UP) {
3386                         int need_setfilt = (ifp->if_flags ^ sc->dc_if_flags) &
3387                                 (IFF_PROMISC | IFF_ALLMULTI);
3388                         if (ifp->if_flags & IFF_RUNNING) {
3389                                 if (need_setfilt)
3390                                         dc_setfilt(sc);
3391                         } else {
3392                                 sc->dc_txthresh = 0;
3393                                 dc_init(sc);
3394                         }
3395                 } else {
3396                         if (ifp->if_flags & IFF_RUNNING)
3397                                 dc_stop(sc);
3398                 }
3399                 sc->dc_if_flags = ifp->if_flags;
3400                 error = 0;
3401                 break;
3402         case SIOCADDMULTI:
3403         case SIOCDELMULTI:
3404                 dc_setfilt(sc);
3405                 error = 0;
3406                 break;
3407         case SIOCGIFMEDIA:
3408         case SIOCSIFMEDIA:
3409                 mii = device_get_softc(sc->dc_miibus);
3410                 error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command);
3411 #ifdef SRM_MEDIA
3412                 if (sc->dc_srm_media)
3413                         sc->dc_srm_media = 0;
3414 #endif
3415                 break;
3416         default:
3417                 error = EINVAL;
3418                 break;
3419         }
3420
3421         (void)splx(s);
3422
3423         return(error);
3424 }
3425
3426 static void dc_watchdog(ifp)
3427         struct ifnet            *ifp;
3428 {
3429         struct dc_softc         *sc;
3430
3431         sc = ifp->if_softc;
3432
3433         ifp->if_oerrors++;
3434         printf("dc%d: watchdog timeout\n", sc->dc_unit);
3435
3436         dc_stop(sc);
3437         dc_reset(sc);
3438         dc_init(sc);
3439
3440         if (ifp->if_snd.ifq_head != NULL)
3441                 dc_start(ifp);
3442
3443         return;
3444 }
3445
3446 /*
3447  * Stop the adapter and free any mbufs allocated to the
3448  * RX and TX lists.
3449  */
3450 static void dc_stop(sc)
3451         struct dc_softc         *sc;
3452 {
3453         int             i;
3454         struct ifnet            *ifp;
3455
3456         ifp = &sc->arpcom.ac_if;
3457         ifp->if_timer = 0;
3458
3459         untimeout(dc_tick, sc, sc->dc_stat_ch);
3460
3461         ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
3462 #ifdef DEVICE_POLLING
3463         ether_poll_deregister(ifp);
3464 #endif
3465
3466         DC_CLRBIT(sc, DC_NETCFG, (DC_NETCFG_RX_ON|DC_NETCFG_TX_ON));
3467         CSR_WRITE_4(sc, DC_IMR, 0x00000000);
3468         CSR_WRITE_4(sc, DC_TXADDR, 0x00000000);
3469         CSR_WRITE_4(sc, DC_RXADDR, 0x00000000);
3470         sc->dc_link = 0;
3471
3472         /*
3473          * Free data in the RX lists.
3474          */
3475         for (i = 0; i < DC_RX_LIST_CNT; i++) {
3476                 if (sc->dc_cdata.dc_rx_chain[i] != NULL) {
3477                         m_freem(sc->dc_cdata.dc_rx_chain[i]);
3478                         sc->dc_cdata.dc_rx_chain[i] = NULL;
3479                 }
3480         }
3481         bzero((char *)&sc->dc_ldata->dc_rx_list,
3482                 sizeof(sc->dc_ldata->dc_rx_list));
3483
3484         /*
3485          * Free the TX list buffers.
3486          */
3487         for (i = 0; i < DC_TX_LIST_CNT; i++) {
3488                 if (sc->dc_cdata.dc_tx_chain[i] != NULL) {
3489                         if ((sc->dc_ldata->dc_tx_list[i].dc_ctl &
3490                             DC_TXCTL_SETUP) ||
3491                             !(sc->dc_ldata->dc_tx_list[i].dc_ctl &
3492                             DC_TXCTL_LASTFRAG)) {
3493                                 sc->dc_cdata.dc_tx_chain[i] = NULL;
3494                                 continue;
3495                         }
3496                         m_freem(sc->dc_cdata.dc_tx_chain[i]);
3497                         sc->dc_cdata.dc_tx_chain[i] = NULL;
3498                 }
3499         }
3500
3501         bzero((char *)&sc->dc_ldata->dc_tx_list,
3502                 sizeof(sc->dc_ldata->dc_tx_list));
3503
3504         return;
3505 }
3506
3507 /*
3508  * Stop all chip I/O so that the kernel's probe routines don't
3509  * get confused by errant DMAs when rebooting.
3510  */
3511 static void dc_shutdown(dev)
3512         device_t                dev;
3513 {
3514         struct dc_softc         *sc;
3515
3516         sc = device_get_softc(dev);
3517
3518         dc_stop(sc);
3519
3520         return;
3521 }
3522
3523 /*
3524  * Device suspend routine.  Stop the interface and save some PCI
3525  * settings in case the BIOS doesn't restore them properly on
3526  * resume.
3527  */
3528 static int dc_suspend(dev)
3529         device_t                dev;
3530 {
3531         int             i;
3532         int                     s;
3533         struct dc_softc         *sc;
3534
3535         s = splimp();
3536
3537         sc = device_get_softc(dev);
3538
3539         dc_stop(sc);
3540
3541         for (i = 0; i < 5; i++)
3542                 sc->saved_maps[i] = pci_read_config(dev, PCIR_MAPS + i * 4, 4);
3543         sc->saved_biosaddr = pci_read_config(dev, PCIR_BIOS, 4);
3544         sc->saved_intline = pci_read_config(dev, PCIR_INTLINE, 1);
3545         sc->saved_cachelnsz = pci_read_config(dev, PCIR_CACHELNSZ, 1);
3546         sc->saved_lattimer = pci_read_config(dev, PCIR_LATTIMER, 1);
3547
3548         sc->suspended = 1;
3549
3550         splx(s);
3551         return (0);
3552 }
3553
3554 /*
3555  * Device resume routine.  Restore some PCI settings in case the BIOS
3556  * doesn't, re-enable busmastering, and restart the interface if
3557  * appropriate.
3558  */
3559 static int dc_resume(dev)
3560         device_t                dev;
3561 {
3562         int             i;
3563         int                     s;
3564         struct dc_softc         *sc;
3565         struct ifnet            *ifp;
3566
3567         s = splimp();
3568
3569         sc = device_get_softc(dev);
3570         ifp = &sc->arpcom.ac_if;
3571
3572         dc_acpi(dev);
3573
3574         /* better way to do this? */
3575         for (i = 0; i < 5; i++)
3576                 pci_write_config(dev, PCIR_MAPS + i * 4, sc->saved_maps[i], 4);
3577         pci_write_config(dev, PCIR_BIOS, sc->saved_biosaddr, 4);
3578         pci_write_config(dev, PCIR_INTLINE, sc->saved_intline, 1);
3579         pci_write_config(dev, PCIR_CACHELNSZ, sc->saved_cachelnsz, 1);
3580         pci_write_config(dev, PCIR_LATTIMER, sc->saved_lattimer, 1);
3581
3582         /* reenable busmastering */
3583         pci_enable_busmaster(dev);
3584         pci_enable_io(dev, DC_RES);
3585
3586         /* reinitialize interface if necessary */
3587         if (ifp->if_flags & IFF_UP)
3588                 dc_init(sc);
3589
3590         sc->suspended = 0;
3591
3592         splx(s);
3593         return (0);
3594 }