]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/pci/if_ste.c
Add missing <sys/module.h> includes
[FreeBSD/FreeBSD.git] / sys / pci / if_ste.c
1 /*
2  * Copyright (c) 1997, 1998, 1999
3  *      Bill Paul <wpaul@ctr.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
33 #include <sys/cdefs.h>
34 __FBSDID("$FreeBSD$");
35
36 #include <sys/param.h>
37 #include <sys/systm.h>
38 #include <sys/sockio.h>
39 #include <sys/mbuf.h>
40 #include <sys/malloc.h>
41 #include <sys/kernel.h>
42 #include <sys/module.h>
43 #include <sys/socket.h>
44 #include <sys/sysctl.h>
45
46 #include <net/if.h>
47 #include <net/if_arp.h>
48 #include <net/ethernet.h>
49 #include <net/if_dl.h>
50 #include <net/if_media.h>
51 #include <net/if_vlan_var.h>
52
53 #include <net/bpf.h>
54
55 #include <vm/vm.h>              /* for vtophys */
56 #include <vm/pmap.h>            /* for vtophys */
57 #include <machine/bus_memio.h>
58 #include <machine/bus_pio.h>
59 #include <machine/bus.h>
60 #include <machine/resource.h>
61 #include <sys/bus.h>
62 #include <sys/rman.h>
63
64 #include <dev/mii/mii.h>
65 #include <dev/mii/miivar.h>
66
67 #include <dev/pci/pcireg.h>
68 #include <dev/pci/pcivar.h>
69
70 /* "controller miibus0" required.  See GENERIC if you get errors here. */
71 #include "miibus_if.h"
72
73 #define STE_USEIOSPACE
74
75 #include <pci/if_stereg.h>
76
77 MODULE_DEPEND(ste, pci, 1, 1, 1);
78 MODULE_DEPEND(ste, ether, 1, 1, 1);
79 MODULE_DEPEND(ste, miibus, 1, 1, 1);
80
81 /*
82  * Various supported device vendors/types and their names.
83  */
84 static struct ste_type ste_devs[] = {
85         { ST_VENDORID, ST_DEVICEID_ST201, "Sundance ST201 10/100BaseTX" },
86         { DL_VENDORID, DL_DEVICEID_DL10050, "D-Link DL10050 10/100BaseTX" },
87         { 0, 0, NULL }
88 };
89
90 static int ste_probe            (device_t);
91 static int ste_attach           (device_t);
92 static int ste_detach           (device_t);
93 static void ste_init            (void *);
94 static void ste_intr            (void *);
95 static void ste_rxeoc           (struct ste_softc *);
96 static void ste_rxeof           (struct ste_softc *);
97 static void ste_txeoc           (struct ste_softc *);
98 static void ste_txeof           (struct ste_softc *);
99 static void ste_stats_update    (void *);
100 static void ste_stop            (struct ste_softc *);
101 static void ste_reset           (struct ste_softc *);
102 static int ste_ioctl            (struct ifnet *, u_long, caddr_t);
103 static int ste_encap            (struct ste_softc *, struct ste_chain *,
104                                         struct mbuf *);
105 static void ste_start           (struct ifnet *);
106 static void ste_watchdog        (struct ifnet *);
107 static void ste_shutdown        (device_t);
108 static int ste_newbuf           (struct ste_softc *,
109                                         struct ste_chain_onefrag *,
110                                         struct mbuf *);
111 static int ste_ifmedia_upd      (struct ifnet *);
112 static void ste_ifmedia_sts     (struct ifnet *, struct ifmediareq *);
113
114 static void ste_mii_sync        (struct ste_softc *);
115 static void ste_mii_send        (struct ste_softc *, u_int32_t, int);
116 static int ste_mii_readreg      (struct ste_softc *, struct ste_mii_frame *);
117 static int ste_mii_writereg     (struct ste_softc *, struct ste_mii_frame *);
118 static int ste_miibus_readreg   (device_t, int, int);
119 static int ste_miibus_writereg  (device_t, int, int, int);
120 static void ste_miibus_statchg  (device_t);
121
122 static int ste_eeprom_wait      (struct ste_softc *);
123 static int ste_read_eeprom      (struct ste_softc *, caddr_t, int, int, int);
124 static void ste_wait            (struct ste_softc *);
125 static u_int8_t ste_calchash    (caddr_t);
126 static void ste_setmulti        (struct ste_softc *);
127 static int ste_init_rx_list     (struct ste_softc *);
128 static void ste_init_tx_list    (struct ste_softc *);
129
130 #ifdef STE_USEIOSPACE
131 #define STE_RES                 SYS_RES_IOPORT
132 #define STE_RID                 STE_PCI_LOIO
133 #else
134 #define STE_RES                 SYS_RES_MEMORY
135 #define STE_RID                 STE_PCI_LOMEM
136 #endif
137
138 static device_method_t ste_methods[] = {
139         /* Device interface */
140         DEVMETHOD(device_probe,         ste_probe),
141         DEVMETHOD(device_attach,        ste_attach),
142         DEVMETHOD(device_detach,        ste_detach),
143         DEVMETHOD(device_shutdown,      ste_shutdown),
144
145         /* bus interface */
146         DEVMETHOD(bus_print_child,      bus_generic_print_child),
147         DEVMETHOD(bus_driver_added,     bus_generic_driver_added),
148
149         /* MII interface */
150         DEVMETHOD(miibus_readreg,       ste_miibus_readreg),
151         DEVMETHOD(miibus_writereg,      ste_miibus_writereg),
152         DEVMETHOD(miibus_statchg,       ste_miibus_statchg),
153
154         { 0, 0 }
155 };
156
157 static driver_t ste_driver = {
158         "ste",
159         ste_methods,
160         sizeof(struct ste_softc)
161 };
162
163 static devclass_t ste_devclass;
164
165 DRIVER_MODULE(ste, pci, ste_driver, ste_devclass, 0, 0);
166 DRIVER_MODULE(miibus, ste, miibus_driver, miibus_devclass, 0, 0);
167
168 SYSCTL_NODE(_hw, OID_AUTO, ste, CTLFLAG_RD, 0, "if_ste parameters");
169
170 static int ste_rxsyncs;
171 SYSCTL_INT(_hw_ste, OID_AUTO, rxsyncs, CTLFLAG_RW, &ste_rxsyncs, 0, "");
172
173 #define STE_SETBIT4(sc, reg, x)                         \
174         CSR_WRITE_4(sc, reg, CSR_READ_4(sc, reg) | (x))
175
176 #define STE_CLRBIT4(sc, reg, x)                         \
177         CSR_WRITE_4(sc, reg, CSR_READ_4(sc, reg) & ~(x))
178
179 #define STE_SETBIT2(sc, reg, x)                         \
180         CSR_WRITE_2(sc, reg, CSR_READ_2(sc, reg) | (x))
181
182 #define STE_CLRBIT2(sc, reg, x)                         \
183         CSR_WRITE_2(sc, reg, CSR_READ_2(sc, reg) & ~(x))
184
185 #define STE_SETBIT1(sc, reg, x)                         \
186         CSR_WRITE_1(sc, reg, CSR_READ_1(sc, reg) | (x))
187
188 #define STE_CLRBIT1(sc, reg, x)                         \
189         CSR_WRITE_1(sc, reg, CSR_READ_1(sc, reg) & ~(x))
190
191
192 #define MII_SET(x)              STE_SETBIT1(sc, STE_PHYCTL, x)
193 #define MII_CLR(x)              STE_CLRBIT1(sc, STE_PHYCTL, x) 
194
195 /*
196  * Sync the PHYs by setting data bit and strobing the clock 32 times.
197  */
198 static void
199 ste_mii_sync(sc)
200         struct ste_softc                *sc;
201 {
202         register int            i;
203
204         MII_SET(STE_PHYCTL_MDIR|STE_PHYCTL_MDATA);
205
206         for (i = 0; i < 32; i++) {
207                 MII_SET(STE_PHYCTL_MCLK);
208                 DELAY(1);
209                 MII_CLR(STE_PHYCTL_MCLK);
210                 DELAY(1);
211         }
212
213         return;
214 }
215
216 /*
217  * Clock a series of bits through the MII.
218  */
219 static void
220 ste_mii_send(sc, bits, cnt)
221         struct ste_softc                *sc;
222         u_int32_t               bits;
223         int                     cnt;
224 {
225         int                     i;
226
227         MII_CLR(STE_PHYCTL_MCLK);
228
229         for (i = (0x1 << (cnt - 1)); i; i >>= 1) {
230                 if (bits & i) {
231                         MII_SET(STE_PHYCTL_MDATA);
232                 } else {
233                         MII_CLR(STE_PHYCTL_MDATA);
234                 }
235                 DELAY(1);
236                 MII_CLR(STE_PHYCTL_MCLK);
237                 DELAY(1);
238                 MII_SET(STE_PHYCTL_MCLK);
239         }
240 }
241
242 /*
243  * Read an PHY register through the MII.
244  */
245 static int
246 ste_mii_readreg(sc, frame)
247         struct ste_softc                *sc;
248         struct ste_mii_frame    *frame;
249         
250 {
251         int                     i, ack;
252
253         STE_LOCK(sc);
254
255         /*
256          * Set up frame for RX.
257          */
258         frame->mii_stdelim = STE_MII_STARTDELIM;
259         frame->mii_opcode = STE_MII_READOP;
260         frame->mii_turnaround = 0;
261         frame->mii_data = 0;
262         
263         CSR_WRITE_2(sc, STE_PHYCTL, 0);
264         /*
265          * Turn on data xmit.
266          */
267         MII_SET(STE_PHYCTL_MDIR);
268
269         ste_mii_sync(sc);
270
271         /*
272          * Send command/address info.
273          */
274         ste_mii_send(sc, frame->mii_stdelim, 2);
275         ste_mii_send(sc, frame->mii_opcode, 2);
276         ste_mii_send(sc, frame->mii_phyaddr, 5);
277         ste_mii_send(sc, frame->mii_regaddr, 5);
278
279         /* Turn off xmit. */
280         MII_CLR(STE_PHYCTL_MDIR);
281
282         /* Idle bit */
283         MII_CLR((STE_PHYCTL_MCLK|STE_PHYCTL_MDATA));
284         DELAY(1);
285         MII_SET(STE_PHYCTL_MCLK);
286         DELAY(1);
287
288         /* Check for ack */
289         MII_CLR(STE_PHYCTL_MCLK);
290         DELAY(1);
291         ack = CSR_READ_2(sc, STE_PHYCTL) & STE_PHYCTL_MDATA;
292         MII_SET(STE_PHYCTL_MCLK);
293         DELAY(1);
294
295         /*
296          * Now try reading data bits. If the ack failed, we still
297          * need to clock through 16 cycles to keep the PHY(s) in sync.
298          */
299         if (ack) {
300                 for(i = 0; i < 16; i++) {
301                         MII_CLR(STE_PHYCTL_MCLK);
302                         DELAY(1);
303                         MII_SET(STE_PHYCTL_MCLK);
304                         DELAY(1);
305                 }
306                 goto fail;
307         }
308
309         for (i = 0x8000; i; i >>= 1) {
310                 MII_CLR(STE_PHYCTL_MCLK);
311                 DELAY(1);
312                 if (!ack) {
313                         if (CSR_READ_2(sc, STE_PHYCTL) & STE_PHYCTL_MDATA)
314                                 frame->mii_data |= i;
315                         DELAY(1);
316                 }
317                 MII_SET(STE_PHYCTL_MCLK);
318                 DELAY(1);
319         }
320
321 fail:
322
323         MII_CLR(STE_PHYCTL_MCLK);
324         DELAY(1);
325         MII_SET(STE_PHYCTL_MCLK);
326         DELAY(1);
327
328         STE_UNLOCK(sc);
329
330         if (ack)
331                 return(1);
332         return(0);
333 }
334
335 /*
336  * Write to a PHY register through the MII.
337  */
338 static int
339 ste_mii_writereg(sc, frame)
340         struct ste_softc                *sc;
341         struct ste_mii_frame    *frame;
342         
343 {
344         STE_LOCK(sc);
345
346         /*
347          * Set up frame for TX.
348          */
349
350         frame->mii_stdelim = STE_MII_STARTDELIM;
351         frame->mii_opcode = STE_MII_WRITEOP;
352         frame->mii_turnaround = STE_MII_TURNAROUND;
353         
354         /*
355          * Turn on data output.
356          */
357         MII_SET(STE_PHYCTL_MDIR);
358
359         ste_mii_sync(sc);
360
361         ste_mii_send(sc, frame->mii_stdelim, 2);
362         ste_mii_send(sc, frame->mii_opcode, 2);
363         ste_mii_send(sc, frame->mii_phyaddr, 5);
364         ste_mii_send(sc, frame->mii_regaddr, 5);
365         ste_mii_send(sc, frame->mii_turnaround, 2);
366         ste_mii_send(sc, frame->mii_data, 16);
367
368         /* Idle bit. */
369         MII_SET(STE_PHYCTL_MCLK);
370         DELAY(1);
371         MII_CLR(STE_PHYCTL_MCLK);
372         DELAY(1);
373
374         /*
375          * Turn off xmit.
376          */
377         MII_CLR(STE_PHYCTL_MDIR);
378
379         STE_UNLOCK(sc);
380
381         return(0);
382 }
383
384 static int
385 ste_miibus_readreg(dev, phy, reg)
386         device_t                dev;
387         int                     phy, reg;
388 {
389         struct ste_softc        *sc;
390         struct ste_mii_frame    frame;
391
392         sc = device_get_softc(dev);
393
394         if ( sc->ste_one_phy && phy != 0 )
395                 return (0);
396
397         bzero((char *)&frame, sizeof(frame));
398
399         frame.mii_phyaddr = phy;
400         frame.mii_regaddr = reg;
401         ste_mii_readreg(sc, &frame);
402
403         return(frame.mii_data);
404 }
405
406 static int
407 ste_miibus_writereg(dev, phy, reg, data)
408         device_t                dev;
409         int                     phy, reg, data;
410 {
411         struct ste_softc        *sc;
412         struct ste_mii_frame    frame;
413
414         sc = device_get_softc(dev);
415         bzero((char *)&frame, sizeof(frame));
416
417         frame.mii_phyaddr = phy;
418         frame.mii_regaddr = reg;
419         frame.mii_data = data;
420
421         ste_mii_writereg(sc, &frame);
422
423         return(0);
424 }
425
426 static void
427 ste_miibus_statchg(dev)
428         device_t                dev;
429 {
430         struct ste_softc        *sc;
431         struct mii_data         *mii;
432
433         sc = device_get_softc(dev);
434         STE_LOCK(sc);
435         mii = device_get_softc(sc->ste_miibus);
436
437         if ((mii->mii_media_active & IFM_GMASK) == IFM_FDX) {
438                 STE_SETBIT2(sc, STE_MACCTL0, STE_MACCTL0_FULLDUPLEX);
439         } else {
440                 STE_CLRBIT2(sc, STE_MACCTL0, STE_MACCTL0_FULLDUPLEX);
441         }
442         STE_UNLOCK(sc);
443
444         return;
445 }
446  
447 static int
448 ste_ifmedia_upd(ifp)
449         struct ifnet            *ifp;
450 {
451         struct ste_softc        *sc;
452         struct mii_data         *mii;
453
454         sc = ifp->if_softc;
455         mii = device_get_softc(sc->ste_miibus);
456         sc->ste_link = 0;
457         if (mii->mii_instance) {
458                 struct mii_softc        *miisc;
459                 LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
460                         mii_phy_reset(miisc);
461         }
462         mii_mediachg(mii);
463
464         return(0);
465 }
466
467 static void
468 ste_ifmedia_sts(ifp, ifmr)
469         struct ifnet            *ifp;
470         struct ifmediareq       *ifmr;
471 {
472         struct ste_softc        *sc;
473         struct mii_data         *mii;
474
475         sc = ifp->if_softc;
476         mii = device_get_softc(sc->ste_miibus);
477
478         mii_pollstat(mii);
479         ifmr->ifm_active = mii->mii_media_active;
480         ifmr->ifm_status = mii->mii_media_status;
481
482         return;
483 }
484
485 static void
486 ste_wait(sc)
487         struct ste_softc                *sc;
488 {
489         register int            i;
490
491         for (i = 0; i < STE_TIMEOUT; i++) {
492                 if (!(CSR_READ_4(sc, STE_DMACTL) & STE_DMACTL_DMA_HALTINPROG))
493                         break;
494         }
495
496         if (i == STE_TIMEOUT)
497                 printf("ste%d: command never completed!\n", sc->ste_unit);
498
499         return;
500 }
501
502 /*
503  * The EEPROM is slow: give it time to come ready after issuing
504  * it a command.
505  */
506 static int
507 ste_eeprom_wait(sc)
508         struct ste_softc                *sc;
509 {
510         int                     i;
511
512         DELAY(1000);
513
514         for (i = 0; i < 100; i++) {
515                 if (CSR_READ_2(sc, STE_EEPROM_CTL) & STE_EECTL_BUSY)
516                         DELAY(1000);
517                 else
518                         break;
519         }
520
521         if (i == 100) {
522                 printf("ste%d: eeprom failed to come ready\n", sc->ste_unit);
523                 return(1);
524         }
525
526         return(0);
527 }
528
529 /*
530  * Read a sequence of words from the EEPROM. Note that ethernet address
531  * data is stored in the EEPROM in network byte order.
532  */
533 static int
534 ste_read_eeprom(sc, dest, off, cnt, swap)
535         struct ste_softc                *sc;
536         caddr_t                 dest;
537         int                     off;
538         int                     cnt;
539         int                     swap;
540 {
541         int                     err = 0, i;
542         u_int16_t               word = 0, *ptr;
543
544         if (ste_eeprom_wait(sc))
545                 return(1);
546
547         for (i = 0; i < cnt; i++) {
548                 CSR_WRITE_2(sc, STE_EEPROM_CTL, STE_EEOPCODE_READ | (off + i));
549                 err = ste_eeprom_wait(sc);
550                 if (err)
551                         break;
552                 word = CSR_READ_2(sc, STE_EEPROM_DATA);
553                 ptr = (u_int16_t *)(dest + (i * 2));
554                 if (swap)
555                         *ptr = ntohs(word);
556                 else
557                         *ptr = word;    
558         }
559
560         return(err ? 1 : 0);
561 }
562
563 static u_int8_t
564 ste_calchash(addr)
565         caddr_t                 addr;
566 {
567
568         u_int32_t               crc, carry;
569         int                     i, j;
570         u_int8_t                c;
571
572         /* Compute CRC for the address value. */
573         crc = 0xFFFFFFFF; /* initial value */
574
575         for (i = 0; i < 6; i++) {
576                 c = *(addr + i);
577                 for (j = 0; j < 8; j++) {
578                         carry = ((crc & 0x80000000) ? 1 : 0) ^ (c & 0x01);
579                         crc <<= 1;
580                         c >>= 1;
581                         if (carry)
582                                 crc = (crc ^ 0x04c11db6) | carry;
583                 }
584         }
585
586         /* return the filter bit position */
587         return(crc & 0x0000003F);
588 }
589
590 static void
591 ste_setmulti(sc)
592         struct ste_softc        *sc;
593 {
594         struct ifnet            *ifp;
595         int                     h = 0;
596         u_int32_t               hashes[2] = { 0, 0 };
597         struct ifmultiaddr      *ifma;
598
599         ifp = &sc->arpcom.ac_if;
600         if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) {
601                 STE_SETBIT1(sc, STE_RX_MODE, STE_RXMODE_ALLMULTI);
602                 STE_CLRBIT1(sc, STE_RX_MODE, STE_RXMODE_MULTIHASH);
603                 return;
604         }
605
606         /* first, zot all the existing hash bits */
607         CSR_WRITE_2(sc, STE_MAR0, 0);
608         CSR_WRITE_2(sc, STE_MAR1, 0);
609         CSR_WRITE_2(sc, STE_MAR2, 0);
610         CSR_WRITE_2(sc, STE_MAR3, 0);
611
612         /* now program new ones */
613         TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
614                 if (ifma->ifma_addr->sa_family != AF_LINK)
615                         continue;
616                 h = ste_calchash(LLADDR((struct sockaddr_dl *)ifma->ifma_addr));
617                 if (h < 32)
618                         hashes[0] |= (1 << h);
619                 else
620                         hashes[1] |= (1 << (h - 32));
621         }
622
623         CSR_WRITE_2(sc, STE_MAR0, hashes[0] & 0xFFFF);
624         CSR_WRITE_2(sc, STE_MAR1, (hashes[0] >> 16) & 0xFFFF);
625         CSR_WRITE_2(sc, STE_MAR2, hashes[1] & 0xFFFF);
626         CSR_WRITE_2(sc, STE_MAR3, (hashes[1] >> 16) & 0xFFFF);
627         STE_CLRBIT1(sc, STE_RX_MODE, STE_RXMODE_ALLMULTI);
628         STE_SETBIT1(sc, STE_RX_MODE, STE_RXMODE_MULTIHASH);
629
630         return;
631 }
632
633 #ifdef DEVICE_POLLING
634 static poll_handler_t ste_poll;
635
636 static void
637 ste_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
638 {
639         struct ste_softc *sc = ifp->if_softc;
640
641         STE_LOCK(sc);
642         if (!(ifp->if_capenable & IFCAP_POLLING)) {
643                 ether_poll_deregister(ifp);
644                 cmd = POLL_DEREGISTER;
645         }
646         if (cmd == POLL_DEREGISTER) { /* final call, enable interrupts */
647                 CSR_WRITE_2(sc, STE_IMR, STE_INTRS);
648                 goto done;
649         }
650
651         sc->rxcycles = count;
652         if (cmd == POLL_AND_CHECK_STATUS)
653                 ste_rxeoc(sc);
654         ste_rxeof(sc);
655         ste_txeof(sc);
656         if (ifp->if_snd.ifq_head != NULL)
657                 ste_start(ifp);
658
659         if (cmd == POLL_AND_CHECK_STATUS) {
660                 u_int16_t status;
661
662                 status = CSR_READ_2(sc, STE_ISR_ACK);
663
664                 if (status & STE_ISR_TX_DONE)
665                         ste_txeoc(sc);
666
667                 if (status & STE_ISR_STATS_OFLOW) {
668                         untimeout(ste_stats_update, sc, sc->ste_stat_ch);
669                         ste_stats_update(sc);
670                 }
671
672                 if (status & STE_ISR_LINKEVENT)
673                         mii_pollstat(device_get_softc(sc->ste_miibus));
674
675                 if (status & STE_ISR_HOSTERR) {
676                         ste_reset(sc);
677                         ste_init(sc);
678                 }
679         }
680 done:
681         STE_UNLOCK(sc);
682 }
683 #endif /* DEVICE_POLLING */
684
685 static void
686 ste_intr(xsc)
687         void                    *xsc;
688 {
689         struct ste_softc        *sc;
690         struct ifnet            *ifp;
691         u_int16_t               status;
692
693         sc = xsc;
694         STE_LOCK(sc);
695         ifp = &sc->arpcom.ac_if;
696
697 #ifdef DEVICE_POLLING
698         if (ifp->if_flags & IFF_POLLING)
699                 goto done;
700         if ((ifp->if_capenable & IFCAP_POLLING) &&
701             ether_poll_register(ste_poll, ifp)) { /* ok, disable interrupts */
702                 CSR_WRITE_2(sc, STE_IMR, 0);
703                 ste_poll(ifp, 0, 1);
704                 goto done;
705         }
706 #endif /* DEVICE_POLLING */
707
708         /* See if this is really our interrupt. */
709         if (!(CSR_READ_2(sc, STE_ISR) & STE_ISR_INTLATCH)) {
710                 STE_UNLOCK(sc);
711                 return;
712         }
713
714         for (;;) {
715                 status = CSR_READ_2(sc, STE_ISR_ACK);
716
717                 if (!(status & STE_INTRS))
718                         break;
719
720                 if (status & STE_ISR_RX_DMADONE) {
721                         ste_rxeoc(sc);
722                         ste_rxeof(sc);
723                 }
724
725                 if (status & STE_ISR_TX_DMADONE)
726                         ste_txeof(sc);
727
728                 if (status & STE_ISR_TX_DONE)
729                         ste_txeoc(sc);
730
731                 if (status & STE_ISR_STATS_OFLOW) {
732                         untimeout(ste_stats_update, sc, sc->ste_stat_ch);
733                         ste_stats_update(sc);
734                 }
735
736                 if (status & STE_ISR_LINKEVENT)
737                         mii_pollstat(device_get_softc(sc->ste_miibus));
738
739
740                 if (status & STE_ISR_HOSTERR) {
741                         ste_reset(sc);
742                         ste_init(sc);
743                 }
744         }
745
746         /* Re-enable interrupts */
747         CSR_WRITE_2(sc, STE_IMR, STE_INTRS);
748
749         if (ifp->if_snd.ifq_head != NULL)
750                 ste_start(ifp);
751
752 #ifdef DEVICE_POLLING
753 done:
754 #endif /* DEVICE_POLLING */
755         STE_UNLOCK(sc);
756
757         return;
758 }
759
760 static void
761 ste_rxeoc(struct ste_softc *sc)
762 {
763         struct ste_chain_onefrag *cur_rx;
764
765         STE_LOCK_ASSERT(sc);
766
767         if (sc->ste_cdata.ste_rx_head->ste_ptr->ste_status == 0) {
768                 cur_rx = sc->ste_cdata.ste_rx_head;
769                 do {
770                         cur_rx = cur_rx->ste_next;
771                         /* If the ring is empty, just return. */
772                         if (cur_rx == sc->ste_cdata.ste_rx_head)
773                                 return;
774                 } while (cur_rx->ste_ptr->ste_status == 0);
775                 if (sc->ste_cdata.ste_rx_head->ste_ptr->ste_status == 0) {
776                         /* We've fallen behind the chip: catch it. */
777                         sc->ste_cdata.ste_rx_head = cur_rx;
778                         ++ste_rxsyncs;
779                 }
780         }
781 }
782
783 /*
784  * A frame has been uploaded: pass the resulting mbuf chain up to
785  * the higher level protocols.
786  */
787 static void
788 ste_rxeof(sc)
789         struct ste_softc                *sc;
790 {
791         struct mbuf             *m;
792         struct ifnet            *ifp;
793         struct ste_chain_onefrag        *cur_rx;
794         int                     total_len = 0, count=0;
795         u_int32_t               rxstat;
796
797         STE_LOCK_ASSERT(sc);
798
799         ifp = &sc->arpcom.ac_if;
800
801         while((rxstat = sc->ste_cdata.ste_rx_head->ste_ptr->ste_status)
802               & STE_RXSTAT_DMADONE) {
803 #ifdef DEVICE_POLLING
804                 if (ifp->if_flags & IFF_POLLING) {
805                         if (sc->rxcycles <= 0)
806                                 break;
807                         sc->rxcycles--;
808                 }
809 #endif /* DEVICE_POLLING */
810                 if ((STE_RX_LIST_CNT - count) < 3) {
811                         break;
812                 }
813
814                 cur_rx = sc->ste_cdata.ste_rx_head;
815                 sc->ste_cdata.ste_rx_head = cur_rx->ste_next;
816
817                 /*
818                  * If an error occurs, update stats, clear the
819                  * status word and leave the mbuf cluster in place:
820                  * it should simply get re-used next time this descriptor
821                  * comes up in the ring.
822                  */
823                 if (rxstat & STE_RXSTAT_FRAME_ERR) {
824                         ifp->if_ierrors++;
825                         cur_rx->ste_ptr->ste_status = 0;
826                         continue;
827                 }
828
829                 /*
830                  * If there error bit was not set, the upload complete
831                  * bit should be set which means we have a valid packet.
832                  * If not, something truly strange has happened.
833                  */
834                 if (!(rxstat & STE_RXSTAT_DMADONE)) {
835                         printf("ste%d: bad receive status -- packet dropped\n",
836                                                         sc->ste_unit);
837                         ifp->if_ierrors++;
838                         cur_rx->ste_ptr->ste_status = 0;
839                         continue;
840                 }
841
842                 /* No errors; receive the packet. */    
843                 m = cur_rx->ste_mbuf;
844                 total_len = cur_rx->ste_ptr->ste_status & STE_RXSTAT_FRAMELEN;
845
846                 /*
847                  * Try to conjure up a new mbuf cluster. If that
848                  * fails, it means we have an out of memory condition and
849                  * should leave the buffer in place and continue. This will
850                  * result in a lost packet, but there's little else we
851                  * can do in this situation.
852                  */
853                 if (ste_newbuf(sc, cur_rx, NULL) == ENOBUFS) {
854                         ifp->if_ierrors++;
855                         cur_rx->ste_ptr->ste_status = 0;
856                         continue;
857                 }
858
859                 m->m_pkthdr.rcvif = ifp;
860                 m->m_pkthdr.len = m->m_len = total_len;
861
862                 ifp->if_ipackets++;
863                 STE_UNLOCK(sc);
864                 (*ifp->if_input)(ifp, m);
865                 STE_LOCK(sc);
866
867                 cur_rx->ste_ptr->ste_status = 0;
868                 count++;
869         }
870
871         return;
872 }
873
874 static void
875 ste_txeoc(sc)
876         struct ste_softc        *sc;
877 {
878         u_int8_t                txstat;
879         struct ifnet            *ifp;
880
881         ifp = &sc->arpcom.ac_if;
882
883         while ((txstat = CSR_READ_1(sc, STE_TX_STATUS)) &
884             STE_TXSTATUS_TXDONE) {
885                 if (txstat & STE_TXSTATUS_UNDERRUN ||
886                     txstat & STE_TXSTATUS_EXCESSCOLLS ||
887                     txstat & STE_TXSTATUS_RECLAIMERR) {
888                         ifp->if_oerrors++;
889                         printf("ste%d: transmission error: %x\n",
890                             sc->ste_unit, txstat);
891
892                         ste_reset(sc);
893                         ste_init(sc);
894
895                         if (txstat & STE_TXSTATUS_UNDERRUN &&
896                             sc->ste_tx_thresh < STE_PACKET_SIZE) {
897                                 sc->ste_tx_thresh += STE_MIN_FRAMELEN;
898                                 printf("ste%d: tx underrun, increasing tx"
899                                     " start threshold to %d bytes\n",
900                                     sc->ste_unit, sc->ste_tx_thresh);
901                         }
902                         CSR_WRITE_2(sc, STE_TX_STARTTHRESH, sc->ste_tx_thresh);
903                         CSR_WRITE_2(sc, STE_TX_RECLAIM_THRESH,
904                             (STE_PACKET_SIZE >> 4));
905                 }
906                 ste_init(sc);
907                 CSR_WRITE_2(sc, STE_TX_STATUS, txstat);
908         }
909
910         return;
911 }
912
913 static void
914 ste_txeof(sc)
915         struct ste_softc        *sc;
916 {
917         struct ste_chain        *cur_tx;
918         struct ifnet            *ifp;
919         int                     idx;
920
921         ifp = &sc->arpcom.ac_if;
922
923         idx = sc->ste_cdata.ste_tx_cons;
924         while(idx != sc->ste_cdata.ste_tx_prod) {
925                 cur_tx = &sc->ste_cdata.ste_tx_chain[idx];
926
927                 if (!(cur_tx->ste_ptr->ste_ctl & STE_TXCTL_DMADONE))
928                         break;
929
930                 m_freem(cur_tx->ste_mbuf);
931                 cur_tx->ste_mbuf = NULL;
932                 ifp->if_flags &= ~IFF_OACTIVE;
933                 ifp->if_opackets++;
934
935                 STE_INC(idx, STE_TX_LIST_CNT);
936         }
937
938         sc->ste_cdata.ste_tx_cons = idx;
939         if (idx == sc->ste_cdata.ste_tx_prod)
940                 ifp->if_timer = 0;
941 }
942
943 static void
944 ste_stats_update(xsc)
945         void                    *xsc;
946 {
947         struct ste_softc        *sc;
948         struct ifnet            *ifp;
949         struct mii_data         *mii;
950
951         sc = xsc;
952         STE_LOCK(sc);
953
954         ifp = &sc->arpcom.ac_if;
955         mii = device_get_softc(sc->ste_miibus);
956
957         ifp->if_collisions += CSR_READ_1(sc, STE_LATE_COLLS)
958             + CSR_READ_1(sc, STE_MULTI_COLLS)
959             + CSR_READ_1(sc, STE_SINGLE_COLLS);
960
961         if (!sc->ste_link) {
962                 mii_pollstat(mii);
963                 if (mii->mii_media_status & IFM_ACTIVE &&
964                     IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
965                         sc->ste_link++;
966                         /*
967                         * we don't get a call-back on re-init so do it
968                         * otherwise we get stuck in the wrong link state
969                         */
970                         ste_miibus_statchg(sc->ste_dev);
971                         if (ifp->if_snd.ifq_head != NULL)
972                                 ste_start(ifp);
973                 }
974         }
975
976         sc->ste_stat_ch = timeout(ste_stats_update, sc, hz);
977         STE_UNLOCK(sc);
978
979         return;
980 }
981
982
983 /*
984  * Probe for a Sundance ST201 chip. Check the PCI vendor and device
985  * IDs against our list and return a device name if we find a match.
986  */
987 static int
988 ste_probe(dev)
989         device_t                dev;
990 {
991         struct ste_type         *t;
992
993         t = ste_devs;
994
995         while(t->ste_name != NULL) {
996                 if ((pci_get_vendor(dev) == t->ste_vid) &&
997                     (pci_get_device(dev) == t->ste_did)) {
998                         device_set_desc(dev, t->ste_name);
999                         return(0);
1000                 }
1001                 t++;
1002         }
1003
1004         return(ENXIO);
1005 }
1006
1007 /*
1008  * Attach the interface. Allocate softc structures, do ifmedia
1009  * setup and ethernet/BPF attach.
1010  */
1011 static int
1012 ste_attach(dev)
1013         device_t                dev;
1014 {
1015         struct ste_softc        *sc;
1016         struct ifnet            *ifp;
1017         int                     unit, error = 0, rid;
1018
1019         sc = device_get_softc(dev);
1020         unit = device_get_unit(dev);
1021         sc->ste_dev = dev;
1022
1023         /*
1024          * Only use one PHY since this chip reports multiple
1025          * Note on the DFE-550 the PHY is at 1 on the DFE-580
1026          * it is at 0 & 1.  It is rev 0x12.
1027          */
1028         if (pci_get_vendor(dev) == DL_VENDORID &&
1029             pci_get_device(dev) == DL_DEVICEID_DL10050 &&
1030             pci_get_revid(dev) == 0x12 )
1031                 sc->ste_one_phy = 1;
1032
1033         mtx_init(&sc->ste_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
1034             MTX_DEF | MTX_RECURSE);
1035 #ifndef BURN_BRIDGES
1036         /*
1037          * Handle power management nonsense.
1038          */
1039         if (pci_get_powerstate(dev) != PCI_POWERSTATE_D0) {
1040                 u_int32_t               iobase, membase, irq;
1041
1042                 /* Save important PCI config data. */
1043                 iobase = pci_read_config(dev, STE_PCI_LOIO, 4);
1044                 membase = pci_read_config(dev, STE_PCI_LOMEM, 4);
1045                 irq = pci_read_config(dev, STE_PCI_INTLINE, 4);
1046
1047                 /* Reset the power state. */
1048                 printf("ste%d: chip is in D%d power mode "
1049                     "-- setting to D0\n", unit,
1050                     pci_get_powerstate(dev));
1051                 pci_set_powerstate(dev, PCI_POWERSTATE_D0);
1052
1053                 /* Restore PCI config data. */
1054                 pci_write_config(dev, STE_PCI_LOIO, iobase, 4);
1055                 pci_write_config(dev, STE_PCI_LOMEM, membase, 4);
1056                 pci_write_config(dev, STE_PCI_INTLINE, irq, 4);
1057         }
1058 #endif
1059         /*
1060          * Map control/status registers.
1061          */
1062         pci_enable_busmaster(dev);
1063
1064         rid = STE_RID;
1065         sc->ste_res = bus_alloc_resource_any(dev, STE_RES, &rid, RF_ACTIVE);
1066
1067         if (sc->ste_res == NULL) {
1068                 printf ("ste%d: couldn't map ports/memory\n", unit);
1069                 error = ENXIO;
1070                 goto fail;
1071         }
1072
1073         sc->ste_btag = rman_get_bustag(sc->ste_res);
1074         sc->ste_bhandle = rman_get_bushandle(sc->ste_res);
1075
1076         /* Allocate interrupt */
1077         rid = 0;
1078         sc->ste_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
1079             RF_SHAREABLE | RF_ACTIVE);
1080
1081         if (sc->ste_irq == NULL) {
1082                 printf("ste%d: couldn't map interrupt\n", unit);
1083                 error = ENXIO;
1084                 goto fail;
1085         }
1086
1087         callout_handle_init(&sc->ste_stat_ch);
1088
1089         /* Reset the adapter. */
1090         ste_reset(sc);
1091
1092         /*
1093          * Get station address from the EEPROM.
1094          */
1095         if (ste_read_eeprom(sc, (caddr_t)&sc->arpcom.ac_enaddr,
1096             STE_EEADDR_NODE0, 3, 0)) {
1097                 printf("ste%d: failed to read station address\n", unit);
1098                 error = ENXIO;;
1099                 goto fail;
1100         }
1101
1102         sc->ste_unit = unit;
1103
1104         /* Allocate the descriptor queues. */
1105         sc->ste_ldata = contigmalloc(sizeof(struct ste_list_data), M_DEVBUF,
1106             M_NOWAIT, 0, 0xffffffff, PAGE_SIZE, 0);
1107
1108         if (sc->ste_ldata == NULL) {
1109                 printf("ste%d: no memory for list buffers!\n", unit);
1110                 error = ENXIO;
1111                 goto fail;
1112         }
1113
1114         bzero(sc->ste_ldata, sizeof(struct ste_list_data));
1115
1116         /* Do MII setup. */
1117         if (mii_phy_probe(dev, &sc->ste_miibus,
1118             ste_ifmedia_upd, ste_ifmedia_sts)) {
1119                 printf("ste%d: MII without any phy!\n", sc->ste_unit);
1120                 error = ENXIO;
1121                 goto fail;
1122         }
1123
1124         ifp = &sc->arpcom.ac_if;
1125         ifp->if_softc = sc;
1126         if_initname(ifp, device_get_name(dev), device_get_unit(dev));
1127         ifp->if_mtu = ETHERMTU;
1128         ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
1129         ifp->if_ioctl = ste_ioctl;
1130         ifp->if_start = ste_start;
1131         ifp->if_watchdog = ste_watchdog;
1132         ifp->if_init = ste_init;
1133         ifp->if_baudrate = 10000000;
1134         ifp->if_snd.ifq_maxlen = STE_TX_LIST_CNT - 1;
1135
1136         sc->ste_tx_thresh = STE_TXSTART_THRESH;
1137
1138         /*
1139          * Call MI attach routine.
1140          */
1141         ether_ifattach(ifp, sc->arpcom.ac_enaddr);
1142
1143         /*
1144          * Tell the upper layer(s) we support long frames.
1145          */
1146         ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
1147         ifp->if_capabilities |= IFCAP_VLAN_MTU;
1148 #ifdef DEVICE_POLLING
1149         ifp->if_capabilities |= IFCAP_POLLING;
1150 #endif
1151         ifp->if_capenable = ifp->if_capabilities;
1152
1153         /* Hook interrupt last to avoid having to lock softc */
1154         error = bus_setup_intr(dev, sc->ste_irq, INTR_TYPE_NET,
1155             ste_intr, sc, &sc->ste_intrhand);
1156
1157         if (error) {
1158                 printf("ste%d: couldn't set up irq\n", unit);
1159                 ether_ifdetach(ifp);
1160                 goto fail;
1161         }
1162
1163 fail:
1164         if (error)
1165                 ste_detach(dev);
1166
1167         return(error);
1168 }
1169
1170 /*
1171  * Shutdown hardware and free up resources. This can be called any
1172  * time after the mutex has been initialized. It is called in both
1173  * the error case in attach and the normal detach case so it needs
1174  * to be careful about only freeing resources that have actually been
1175  * allocated.
1176  */
1177 static int
1178 ste_detach(dev)
1179         device_t                dev;
1180 {
1181         struct ste_softc        *sc;
1182         struct ifnet            *ifp;
1183
1184         sc = device_get_softc(dev);
1185         KASSERT(mtx_initialized(&sc->ste_mtx), ("ste mutex not initialized"));
1186         STE_LOCK(sc);
1187         ifp = &sc->arpcom.ac_if;
1188
1189         /* These should only be active if attach succeeded */
1190         if (device_is_attached(dev)) {
1191                 ste_stop(sc);
1192                 ether_ifdetach(ifp);
1193         }
1194         if (sc->ste_miibus)
1195                 device_delete_child(dev, sc->ste_miibus);
1196         bus_generic_detach(dev);
1197
1198         if (sc->ste_intrhand)
1199                 bus_teardown_intr(dev, sc->ste_irq, sc->ste_intrhand);
1200         if (sc->ste_irq)
1201                 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->ste_irq);
1202         if (sc->ste_res)
1203                 bus_release_resource(dev, STE_RES, STE_RID, sc->ste_res);
1204
1205         if (sc->ste_ldata) {
1206                 contigfree(sc->ste_ldata, sizeof(struct ste_list_data),
1207                     M_DEVBUF);
1208         }
1209
1210         STE_UNLOCK(sc);
1211         mtx_destroy(&sc->ste_mtx);
1212
1213         return(0);
1214 }
1215
1216 static int
1217 ste_newbuf(sc, c, m)
1218         struct ste_softc        *sc;
1219         struct ste_chain_onefrag        *c;
1220         struct mbuf             *m;
1221 {
1222         struct mbuf             *m_new = NULL;
1223
1224         if (m == NULL) {
1225                 MGETHDR(m_new, M_DONTWAIT, MT_DATA);
1226                 if (m_new == NULL)
1227                         return(ENOBUFS);
1228                 MCLGET(m_new, M_DONTWAIT);
1229                 if (!(m_new->m_flags & M_EXT)) {
1230                         m_freem(m_new);
1231                         return(ENOBUFS);
1232                 }
1233                 m_new->m_len = m_new->m_pkthdr.len = MCLBYTES;
1234         } else {
1235                 m_new = m;
1236                 m_new->m_len = m_new->m_pkthdr.len = MCLBYTES;
1237                 m_new->m_data = m_new->m_ext.ext_buf;
1238         }
1239
1240         m_adj(m_new, ETHER_ALIGN);
1241
1242         c->ste_mbuf = m_new;
1243         c->ste_ptr->ste_status = 0;
1244         c->ste_ptr->ste_frag.ste_addr = vtophys(mtod(m_new, caddr_t));
1245         c->ste_ptr->ste_frag.ste_len = (1536 + ETHER_VLAN_ENCAP_LEN) | STE_FRAG_LAST;
1246
1247         return(0);
1248 }
1249
1250 static int
1251 ste_init_rx_list(sc)
1252         struct ste_softc        *sc;
1253 {
1254         struct ste_chain_data   *cd;
1255         struct ste_list_data    *ld;
1256         int                     i;
1257
1258         cd = &sc->ste_cdata;
1259         ld = sc->ste_ldata;
1260
1261         for (i = 0; i < STE_RX_LIST_CNT; i++) {
1262                 cd->ste_rx_chain[i].ste_ptr = &ld->ste_rx_list[i];
1263                 if (ste_newbuf(sc, &cd->ste_rx_chain[i], NULL) == ENOBUFS)
1264                         return(ENOBUFS);
1265                 if (i == (STE_RX_LIST_CNT - 1)) {
1266                         cd->ste_rx_chain[i].ste_next =
1267                             &cd->ste_rx_chain[0];
1268                         ld->ste_rx_list[i].ste_next =
1269                             vtophys(&ld->ste_rx_list[0]);
1270                 } else {
1271                         cd->ste_rx_chain[i].ste_next =
1272                             &cd->ste_rx_chain[i + 1];
1273                         ld->ste_rx_list[i].ste_next =
1274                             vtophys(&ld->ste_rx_list[i + 1]);
1275                 }
1276                 ld->ste_rx_list[i].ste_status = 0;
1277         }
1278
1279         cd->ste_rx_head = &cd->ste_rx_chain[0];
1280
1281         return(0);
1282 }
1283
1284 static void
1285 ste_init_tx_list(sc)
1286         struct ste_softc        *sc;
1287 {
1288         struct ste_chain_data   *cd;
1289         struct ste_list_data    *ld;
1290         int                     i;
1291
1292         cd = &sc->ste_cdata;
1293         ld = sc->ste_ldata;
1294         for (i = 0; i < STE_TX_LIST_CNT; i++) {
1295                 cd->ste_tx_chain[i].ste_ptr = &ld->ste_tx_list[i];
1296                 cd->ste_tx_chain[i].ste_ptr->ste_next = 0;
1297                 cd->ste_tx_chain[i].ste_ptr->ste_ctl  = 0;
1298                 cd->ste_tx_chain[i].ste_phys = vtophys(&ld->ste_tx_list[i]);
1299                 if (i == (STE_TX_LIST_CNT - 1))
1300                         cd->ste_tx_chain[i].ste_next =
1301                             &cd->ste_tx_chain[0];
1302                 else
1303                         cd->ste_tx_chain[i].ste_next =
1304                             &cd->ste_tx_chain[i + 1];
1305         }
1306
1307         cd->ste_tx_prod = 0;
1308         cd->ste_tx_cons = 0;
1309
1310         return;
1311 }
1312
1313 static void
1314 ste_init(xsc)
1315         void                    *xsc;
1316 {
1317         struct ste_softc        *sc;
1318         int                     i;
1319         struct ifnet            *ifp;
1320
1321         sc = xsc;
1322         STE_LOCK(sc);
1323         ifp = &sc->arpcom.ac_if;
1324
1325         ste_stop(sc);
1326
1327         /* Init our MAC address */
1328         for (i = 0; i < ETHER_ADDR_LEN; i++) {
1329                 CSR_WRITE_1(sc, STE_PAR0 + i, sc->arpcom.ac_enaddr[i]);
1330         }
1331
1332         /* Init RX list */
1333         if (ste_init_rx_list(sc) == ENOBUFS) {
1334                 printf("ste%d: initialization failed: no "
1335                     "memory for RX buffers\n", sc->ste_unit);
1336                 ste_stop(sc);
1337                 STE_UNLOCK(sc);
1338                 return;
1339         }
1340
1341         /* Set RX polling interval */
1342         CSR_WRITE_1(sc, STE_RX_DMAPOLL_PERIOD, 64);
1343
1344         /* Init TX descriptors */
1345         ste_init_tx_list(sc);
1346
1347         /* Set the TX freethresh value */
1348         CSR_WRITE_1(sc, STE_TX_DMABURST_THRESH, STE_PACKET_SIZE >> 8);
1349
1350         /* Set the TX start threshold for best performance. */
1351         CSR_WRITE_2(sc, STE_TX_STARTTHRESH, sc->ste_tx_thresh);
1352
1353         /* Set the TX reclaim threshold. */
1354         CSR_WRITE_1(sc, STE_TX_RECLAIM_THRESH, (STE_PACKET_SIZE >> 4));
1355
1356         /* Set up the RX filter. */
1357         CSR_WRITE_1(sc, STE_RX_MODE, STE_RXMODE_UNICAST);
1358
1359         /* If we want promiscuous mode, set the allframes bit. */
1360         if (ifp->if_flags & IFF_PROMISC) {
1361                 STE_SETBIT1(sc, STE_RX_MODE, STE_RXMODE_PROMISC);
1362         } else {
1363                 STE_CLRBIT1(sc, STE_RX_MODE, STE_RXMODE_PROMISC);
1364         }
1365
1366         /* Set capture broadcast bit to accept broadcast frames. */
1367         if (ifp->if_flags & IFF_BROADCAST) {
1368                 STE_SETBIT1(sc, STE_RX_MODE, STE_RXMODE_BROADCAST);
1369         } else {
1370                 STE_CLRBIT1(sc, STE_RX_MODE, STE_RXMODE_BROADCAST);
1371         }
1372
1373         ste_setmulti(sc);
1374
1375         /* Load the address of the RX list. */
1376         STE_SETBIT4(sc, STE_DMACTL, STE_DMACTL_RXDMA_STALL);
1377         ste_wait(sc);
1378         CSR_WRITE_4(sc, STE_RX_DMALIST_PTR,
1379             vtophys(&sc->ste_ldata->ste_rx_list[0]));
1380         STE_SETBIT4(sc, STE_DMACTL, STE_DMACTL_RXDMA_UNSTALL);
1381         STE_SETBIT4(sc, STE_DMACTL, STE_DMACTL_RXDMA_UNSTALL);
1382
1383         /* Set TX polling interval (defer until we TX first packet */
1384         CSR_WRITE_1(sc, STE_TX_DMAPOLL_PERIOD, 0);
1385
1386         /* Load address of the TX list */
1387         STE_SETBIT4(sc, STE_DMACTL, STE_DMACTL_TXDMA_STALL);
1388         ste_wait(sc);
1389         CSR_WRITE_4(sc, STE_TX_DMALIST_PTR, 0);
1390         STE_SETBIT4(sc, STE_DMACTL, STE_DMACTL_TXDMA_UNSTALL);
1391         STE_SETBIT4(sc, STE_DMACTL, STE_DMACTL_TXDMA_UNSTALL);
1392         ste_wait(sc);
1393         sc->ste_tx_prev = NULL;
1394
1395         /* Enable receiver and transmitter */
1396         CSR_WRITE_2(sc, STE_MACCTL0, 0);
1397         CSR_WRITE_2(sc, STE_MACCTL1, 0);
1398         STE_SETBIT2(sc, STE_MACCTL1, STE_MACCTL1_TX_ENABLE);
1399         STE_SETBIT2(sc, STE_MACCTL1, STE_MACCTL1_RX_ENABLE);
1400
1401         /* Enable stats counters. */
1402         STE_SETBIT2(sc, STE_MACCTL1, STE_MACCTL1_STATS_ENABLE);
1403
1404         CSR_WRITE_2(sc, STE_ISR, 0xFFFF);
1405 #ifdef DEVICE_POLLING
1406         /* Disable interrupts if we are polling. */
1407         if (ifp->if_flags & IFF_POLLING)
1408                 CSR_WRITE_2(sc, STE_IMR, 0);
1409         else   
1410 #endif /* DEVICE_POLLING */
1411         /* Enable interrupts. */
1412         CSR_WRITE_2(sc, STE_IMR, STE_INTRS);
1413
1414         /* Accept VLAN length packets */
1415         CSR_WRITE_2(sc, STE_MAX_FRAMELEN, ETHER_MAX_LEN + ETHER_VLAN_ENCAP_LEN);
1416
1417         ste_ifmedia_upd(ifp);
1418
1419         ifp->if_flags |= IFF_RUNNING;
1420         ifp->if_flags &= ~IFF_OACTIVE;
1421
1422         sc->ste_stat_ch = timeout(ste_stats_update, sc, hz);
1423         STE_UNLOCK(sc);
1424
1425         return;
1426 }
1427
1428 static void
1429 ste_stop(sc)
1430         struct ste_softc        *sc;
1431 {
1432         int                     i;
1433         struct ifnet            *ifp;
1434
1435         STE_LOCK(sc);
1436         ifp = &sc->arpcom.ac_if;
1437
1438         untimeout(ste_stats_update, sc, sc->ste_stat_ch);
1439         ifp->if_flags &= ~(IFF_RUNNING|IFF_OACTIVE);
1440 #ifdef DEVICE_POLLING
1441         ether_poll_deregister(ifp);
1442 #endif /* DEVICE_POLLING */
1443
1444         CSR_WRITE_2(sc, STE_IMR, 0);
1445         STE_SETBIT2(sc, STE_MACCTL1, STE_MACCTL1_TX_DISABLE);
1446         STE_SETBIT2(sc, STE_MACCTL1, STE_MACCTL1_RX_DISABLE);
1447         STE_SETBIT2(sc, STE_MACCTL1, STE_MACCTL1_STATS_DISABLE);
1448         STE_SETBIT2(sc, STE_DMACTL, STE_DMACTL_TXDMA_STALL);
1449         STE_SETBIT2(sc, STE_DMACTL, STE_DMACTL_RXDMA_STALL);
1450         ste_wait(sc);
1451         /* 
1452          * Try really hard to stop the RX engine or under heavy RX 
1453          * data chip will write into de-allocated memory.
1454          */
1455         ste_reset(sc);
1456
1457         sc->ste_link = 0;
1458
1459         for (i = 0; i < STE_RX_LIST_CNT; i++) {
1460                 if (sc->ste_cdata.ste_rx_chain[i].ste_mbuf != NULL) {
1461                         m_freem(sc->ste_cdata.ste_rx_chain[i].ste_mbuf);
1462                         sc->ste_cdata.ste_rx_chain[i].ste_mbuf = NULL;
1463                 }
1464         }
1465
1466         for (i = 0; i < STE_TX_LIST_CNT; i++) {
1467                 if (sc->ste_cdata.ste_tx_chain[i].ste_mbuf != NULL) {
1468                         m_freem(sc->ste_cdata.ste_tx_chain[i].ste_mbuf);
1469                         sc->ste_cdata.ste_tx_chain[i].ste_mbuf = NULL;
1470                 }
1471         }
1472
1473         bzero(sc->ste_ldata, sizeof(struct ste_list_data));
1474         STE_UNLOCK(sc);
1475
1476         return;
1477 }
1478
1479 static void
1480 ste_reset(sc)
1481         struct ste_softc        *sc;
1482 {
1483         int                     i;
1484
1485         STE_SETBIT4(sc, STE_ASICCTL,
1486             STE_ASICCTL_GLOBAL_RESET|STE_ASICCTL_RX_RESET|
1487             STE_ASICCTL_TX_RESET|STE_ASICCTL_DMA_RESET|
1488             STE_ASICCTL_FIFO_RESET|STE_ASICCTL_NETWORK_RESET|
1489             STE_ASICCTL_AUTOINIT_RESET|STE_ASICCTL_HOST_RESET|
1490             STE_ASICCTL_EXTRESET_RESET);
1491
1492         DELAY(100000);
1493
1494         for (i = 0; i < STE_TIMEOUT; i++) {
1495                 if (!(CSR_READ_4(sc, STE_ASICCTL) & STE_ASICCTL_RESET_BUSY))
1496                         break;
1497         }
1498
1499         if (i == STE_TIMEOUT)
1500                 printf("ste%d: global reset never completed\n", sc->ste_unit);
1501
1502         return;
1503 }
1504
1505 static int
1506 ste_ioctl(ifp, command, data)
1507         struct ifnet            *ifp;
1508         u_long                  command;
1509         caddr_t                 data;
1510 {
1511         struct ste_softc        *sc;
1512         struct ifreq            *ifr;
1513         struct mii_data         *mii;
1514         int                     error = 0;
1515
1516         sc = ifp->if_softc;
1517         STE_LOCK(sc);
1518         ifr = (struct ifreq *)data;
1519
1520         switch(command) {
1521         case SIOCSIFFLAGS:
1522                 if (ifp->if_flags & IFF_UP) {
1523                         if (ifp->if_flags & IFF_RUNNING &&
1524                             ifp->if_flags & IFF_PROMISC &&
1525                             !(sc->ste_if_flags & IFF_PROMISC)) {
1526                                 STE_SETBIT1(sc, STE_RX_MODE,
1527                                     STE_RXMODE_PROMISC);
1528                         } else if (ifp->if_flags & IFF_RUNNING &&
1529                             !(ifp->if_flags & IFF_PROMISC) &&
1530                             sc->ste_if_flags & IFF_PROMISC) {
1531                                 STE_CLRBIT1(sc, STE_RX_MODE,
1532                                     STE_RXMODE_PROMISC);
1533                         } 
1534                         if (ifp->if_flags & IFF_RUNNING &&
1535                             (ifp->if_flags ^ sc->ste_if_flags) & IFF_ALLMULTI)
1536                                 ste_setmulti(sc);
1537                         if (!(ifp->if_flags & IFF_RUNNING)) {
1538                                 sc->ste_tx_thresh = STE_TXSTART_THRESH;
1539                                 ste_init(sc);
1540                         }
1541                 } else {
1542                         if (ifp->if_flags & IFF_RUNNING)
1543                                 ste_stop(sc);
1544                 }
1545                 sc->ste_if_flags = ifp->if_flags;
1546                 error = 0;
1547                 break;
1548         case SIOCADDMULTI:
1549         case SIOCDELMULTI:
1550                 ste_setmulti(sc);
1551                 error = 0;
1552                 break;
1553         case SIOCGIFMEDIA:
1554         case SIOCSIFMEDIA:
1555                 mii = device_get_softc(sc->ste_miibus);
1556                 error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command);
1557                 break;
1558         case SIOCSIFCAP:
1559                 ifp->if_capenable &= ~IFCAP_POLLING;
1560                 ifp->if_capenable |= ifr->ifr_reqcap & IFCAP_POLLING;
1561                 break;
1562         default:
1563                 error = ether_ioctl(ifp, command, data);
1564                 break;
1565         }
1566
1567         STE_UNLOCK(sc);
1568
1569         return(error);
1570 }
1571
1572 static int
1573 ste_encap(sc, c, m_head)
1574         struct ste_softc        *sc;
1575         struct ste_chain        *c;
1576         struct mbuf             *m_head;
1577 {
1578         int                     frag = 0;
1579         struct ste_frag         *f = NULL;
1580         struct mbuf             *m;
1581         struct ste_desc         *d;
1582
1583         d = c->ste_ptr;
1584         d->ste_ctl = 0;
1585
1586 encap_retry:
1587         for (m = m_head, frag = 0; m != NULL; m = m->m_next) {
1588                 if (m->m_len != 0) {
1589                         if (frag == STE_MAXFRAGS)
1590                                 break;
1591                         f = &d->ste_frags[frag];
1592                         f->ste_addr = vtophys(mtod(m, vm_offset_t));
1593                         f->ste_len = m->m_len;
1594                         frag++;
1595                 }
1596         }
1597
1598         if (m != NULL) {
1599                 struct mbuf *mn;
1600
1601                 /*
1602                  * We ran out of segments. We have to recopy this
1603                  * mbuf chain first. Bail out if we can't get the
1604                  * new buffers.
1605                  */
1606                 mn = m_defrag(m_head, M_DONTWAIT);
1607                 if (mn == NULL) {
1608                         m_freem(m_head);
1609                         return ENOMEM;
1610                 }
1611                 m_head = mn;
1612                 goto encap_retry;
1613         }
1614
1615         c->ste_mbuf = m_head;
1616         d->ste_frags[frag - 1].ste_len |= STE_FRAG_LAST;
1617         d->ste_ctl = 1;
1618
1619         return(0);
1620 }
1621
1622 static void
1623 ste_start(ifp)
1624         struct ifnet            *ifp;
1625 {
1626         struct ste_softc        *sc;
1627         struct mbuf             *m_head = NULL;
1628         struct ste_chain        *cur_tx;
1629         int                     idx;
1630
1631         sc = ifp->if_softc;
1632         STE_LOCK(sc);
1633
1634         if (!sc->ste_link) {
1635                 STE_UNLOCK(sc);
1636                 return;
1637         }
1638
1639         if (ifp->if_flags & IFF_OACTIVE) {
1640                 STE_UNLOCK(sc);
1641                 return;
1642         }
1643
1644         idx = sc->ste_cdata.ste_tx_prod;
1645
1646         while(sc->ste_cdata.ste_tx_chain[idx].ste_mbuf == NULL) {
1647                 /*
1648                  * We cannot re-use the last (free) descriptor;
1649                  * the chip may not have read its ste_next yet.
1650                  */
1651                 if (STE_NEXT(idx, STE_TX_LIST_CNT) ==
1652                     sc->ste_cdata.ste_tx_cons) {
1653                         ifp->if_flags |= IFF_OACTIVE;
1654                         break;
1655                 }
1656
1657                 IF_DEQUEUE(&ifp->if_snd, m_head);
1658                 if (m_head == NULL)
1659                         break;
1660
1661                 cur_tx = &sc->ste_cdata.ste_tx_chain[idx];
1662
1663                 if (ste_encap(sc, cur_tx, m_head) != 0)
1664                         break;
1665
1666                 cur_tx->ste_ptr->ste_next = 0;
1667
1668                 if (sc->ste_tx_prev == NULL) {
1669                         cur_tx->ste_ptr->ste_ctl = STE_TXCTL_DMAINTR | 1;
1670                         /* Load address of the TX list */
1671                         STE_SETBIT4(sc, STE_DMACTL, STE_DMACTL_TXDMA_STALL);
1672                         ste_wait(sc);
1673
1674                         CSR_WRITE_4(sc, STE_TX_DMALIST_PTR,
1675                             vtophys(&sc->ste_ldata->ste_tx_list[0]));
1676
1677                         /* Set TX polling interval to start TX engine */
1678                         CSR_WRITE_1(sc, STE_TX_DMAPOLL_PERIOD, 64);
1679                   
1680                         STE_SETBIT4(sc, STE_DMACTL, STE_DMACTL_TXDMA_UNSTALL);
1681                         ste_wait(sc);
1682                 }else{
1683                         cur_tx->ste_ptr->ste_ctl = STE_TXCTL_DMAINTR | 1;
1684                         sc->ste_tx_prev->ste_ptr->ste_next
1685                                 = cur_tx->ste_phys;
1686                 }
1687
1688                 sc->ste_tx_prev = cur_tx;
1689
1690                 /*
1691                  * If there's a BPF listener, bounce a copy of this frame
1692                  * to him.
1693                  */
1694                 BPF_MTAP(ifp, cur_tx->ste_mbuf);
1695
1696                 STE_INC(idx, STE_TX_LIST_CNT);
1697                 ifp->if_timer = 5;
1698         }
1699         sc->ste_cdata.ste_tx_prod = idx;
1700
1701         STE_UNLOCK(sc);
1702
1703         return;
1704 }
1705
1706 static void
1707 ste_watchdog(ifp)
1708         struct ifnet            *ifp;
1709 {
1710         struct ste_softc        *sc;
1711
1712         sc = ifp->if_softc;
1713         STE_LOCK(sc);
1714
1715         ifp->if_oerrors++;
1716         printf("ste%d: watchdog timeout\n", sc->ste_unit);
1717
1718         ste_txeoc(sc);
1719         ste_txeof(sc);
1720         ste_rxeoc(sc);
1721         ste_rxeof(sc);
1722         ste_reset(sc);
1723         ste_init(sc);
1724
1725         if (ifp->if_snd.ifq_head != NULL)
1726                 ste_start(ifp);
1727         STE_UNLOCK(sc);
1728
1729         return;
1730 }
1731
1732 static void
1733 ste_shutdown(dev)
1734         device_t                dev;
1735 {
1736         struct ste_softc        *sc;
1737
1738         sc = device_get_softc(dev);
1739
1740         ste_stop(sc);
1741
1742         return;
1743 }