This source file includes following definitions.
- nge_delay
- nge_eeprom_idle
- nge_eeprom_putbyte
- nge_eeprom_getword
- nge_read_eeprom
- nge_mii_sync
- nge_mii_send
- nge_mii_readreg
- nge_mii_writereg
- nge_miibus_readreg
- nge_miibus_writereg
- nge_miibus_statchg
- nge_setmulti
- nge_reset
- nge_probe
- nge_attach
- nge_list_tx_init
- nge_list_rx_init
- nge_newbuf
- nge_alloc_jumbo_mem
- nge_jalloc
- nge_jfree
- nge_rxeof
- nge_txeof
- nge_tick
- nge_intr
- nge_encap
- nge_start
- nge_init
- nge_ifmedia_mii_upd
- nge_ifmedia_mii_sts
- nge_ifmedia_tbi_upd
- nge_ifmedia_tbi_sts
- nge_ioctl
- nge_watchdog
- nge_stop
- nge_shutdown
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91 #include "bpfilter.h"
92 #include "vlan.h"
93
94 #include <sys/param.h>
95 #include <sys/systm.h>
96 #include <sys/sockio.h>
97 #include <sys/mbuf.h>
98 #include <sys/malloc.h>
99 #include <sys/kernel.h>
100 #include <sys/device.h>
101 #include <sys/socket.h>
102
103 #include <net/if.h>
104 #include <net/if_dl.h>
105 #include <net/if_media.h>
106
107 #ifdef INET
108 #include <netinet/in.h>
109 #include <netinet/in_systm.h>
110 #include <netinet/in_var.h>
111 #include <netinet/ip.h>
112 #include <netinet/if_ether.h>
113 #endif
114
115 #if NVLAN > 0
116 #include <net/if_types.h>
117 #include <net/if_vlan_var.h>
118 #endif
119
120 #if NBPFILTER > 0
121 #include <net/bpf.h>
122 #endif
123
124 #include <uvm/uvm_extern.h>
125 #define VTOPHYS(v) vtophys((vaddr_t)(v))
126
127 #include <dev/pci/pcireg.h>
128 #include <dev/pci/pcivar.h>
129 #include <dev/pci/pcidevs.h>
130
131 #include <dev/mii/mii.h>
132 #include <dev/mii/miivar.h>
133
134 #define NGE_USEIOSPACE
135
136 #include <dev/pci/if_ngereg.h>
137
138 int nge_probe(struct device *, void *, void *);
139 void nge_attach(struct device *, struct device *, void *);
140
141 int nge_alloc_jumbo_mem(struct nge_softc *);
142 void *nge_jalloc(struct nge_softc *);
143 void nge_jfree(caddr_t, u_int, void *);
144
145 int nge_newbuf(struct nge_softc *, struct nge_desc *,
146 struct mbuf *);
147 int nge_encap(struct nge_softc *, struct mbuf *, u_int32_t *);
148 void nge_rxeof(struct nge_softc *);
149 void nge_txeof(struct nge_softc *);
150 int nge_intr(void *);
151 void nge_tick(void *);
152 void nge_start(struct ifnet *);
153 int nge_ioctl(struct ifnet *, u_long, caddr_t);
154 void nge_init(void *);
155 void nge_stop(struct nge_softc *);
156 void nge_watchdog(struct ifnet *);
157 void nge_shutdown(void *);
158 int nge_ifmedia_mii_upd(struct ifnet *);
159 void nge_ifmedia_mii_sts(struct ifnet *, struct ifmediareq *);
160 int nge_ifmedia_tbi_upd(struct ifnet *);
161 void nge_ifmedia_tbi_sts(struct ifnet *, struct ifmediareq *);
162
163 void nge_delay(struct nge_softc *);
164 void nge_eeprom_idle(struct nge_softc *);
165 void nge_eeprom_putbyte(struct nge_softc *, int);
166 void nge_eeprom_getword(struct nge_softc *, int, u_int16_t *);
167 void nge_read_eeprom(struct nge_softc *, caddr_t, int, int, int);
168
169 void nge_mii_sync(struct nge_softc *);
170 void nge_mii_send(struct nge_softc *, u_int32_t, int);
171 int nge_mii_readreg(struct nge_softc *, struct nge_mii_frame *);
172 int nge_mii_writereg(struct nge_softc *, struct nge_mii_frame *);
173
174 int nge_miibus_readreg(struct device *, int, int);
175 void nge_miibus_writereg(struct device *, int, int, int);
176 void nge_miibus_statchg(struct device *);
177
178 void nge_setmulti(struct nge_softc *);
179 void nge_reset(struct nge_softc *);
180 int nge_list_rx_init(struct nge_softc *);
181 int nge_list_tx_init(struct nge_softc *);
182
183 #ifdef NGE_USEIOSPACE
184 #define NGE_RES SYS_RES_IOPORT
185 #define NGE_RID NGE_PCI_LOIO
186 #else
187 #define NGE_RES SYS_RES_MEMORY
188 #define NGE_RID NGE_PCI_LOMEM
189 #endif
190
191 #ifdef NGE_DEBUG
192 #define DPRINTF(x) if (ngedebug) printf x
193 #define DPRINTFN(n,x) if (ngedebug >= (n)) printf x
194 int ngedebug = 0;
195 #else
196 #define DPRINTF(x)
197 #define DPRINTFN(n,x)
198 #endif
199
200 #define NGE_SETBIT(sc, reg, x) \
201 CSR_WRITE_4(sc, reg, \
202 CSR_READ_4(sc, reg) | (x))
203
204 #define NGE_CLRBIT(sc, reg, x) \
205 CSR_WRITE_4(sc, reg, \
206 CSR_READ_4(sc, reg) & ~(x))
207
208 #define SIO_SET(x) \
209 CSR_WRITE_4(sc, NGE_MEAR, CSR_READ_4(sc, NGE_MEAR) | (x))
210
211 #define SIO_CLR(x) \
212 CSR_WRITE_4(sc, NGE_MEAR, CSR_READ_4(sc, NGE_MEAR) & ~(x))
213
214 void
215 nge_delay(sc)
216 struct nge_softc *sc;
217 {
218 int idx;
219
220 for (idx = (300 / 33) + 1; idx > 0; idx--)
221 CSR_READ_4(sc, NGE_CSR);
222 }
223
224 void
225 nge_eeprom_idle(sc)
226 struct nge_softc *sc;
227 {
228 int i;
229
230 SIO_SET(NGE_MEAR_EE_CSEL);
231 nge_delay(sc);
232 SIO_SET(NGE_MEAR_EE_CLK);
233 nge_delay(sc);
234
235 for (i = 0; i < 25; i++) {
236 SIO_CLR(NGE_MEAR_EE_CLK);
237 nge_delay(sc);
238 SIO_SET(NGE_MEAR_EE_CLK);
239 nge_delay(sc);
240 }
241
242 SIO_CLR(NGE_MEAR_EE_CLK);
243 nge_delay(sc);
244 SIO_CLR(NGE_MEAR_EE_CSEL);
245 nge_delay(sc);
246 CSR_WRITE_4(sc, NGE_MEAR, 0x00000000);
247 }
248
249
250
251
252 void
253 nge_eeprom_putbyte(sc, addr)
254 struct nge_softc *sc;
255 int addr;
256 {
257 int d, i;
258
259 d = addr | NGE_EECMD_READ;
260
261
262
263
264 for (i = 0x400; i; i >>= 1) {
265 if (d & i) {
266 SIO_SET(NGE_MEAR_EE_DIN);
267 } else {
268 SIO_CLR(NGE_MEAR_EE_DIN);
269 }
270 nge_delay(sc);
271 SIO_SET(NGE_MEAR_EE_CLK);
272 nge_delay(sc);
273 SIO_CLR(NGE_MEAR_EE_CLK);
274 nge_delay(sc);
275 }
276 }
277
278
279
280
281 void
282 nge_eeprom_getword(sc, addr, dest)
283 struct nge_softc *sc;
284 int addr;
285 u_int16_t *dest;
286 {
287 int i;
288 u_int16_t word = 0;
289
290
291 nge_eeprom_idle(sc);
292
293
294 nge_delay(sc);
295 SIO_CLR(NGE_MEAR_EE_CLK);
296 nge_delay(sc);
297 SIO_SET(NGE_MEAR_EE_CSEL);
298 nge_delay(sc);
299
300
301
302
303 nge_eeprom_putbyte(sc, addr);
304
305
306
307
308 for (i = 0x8000; i; i >>= 1) {
309 SIO_SET(NGE_MEAR_EE_CLK);
310 nge_delay(sc);
311 if (CSR_READ_4(sc, NGE_MEAR) & NGE_MEAR_EE_DOUT)
312 word |= i;
313 nge_delay(sc);
314 SIO_CLR(NGE_MEAR_EE_CLK);
315 nge_delay(sc);
316 }
317
318
319 nge_eeprom_idle(sc);
320
321 *dest = word;
322 }
323
324
325
326
327 void
328 nge_read_eeprom(sc, dest, off, cnt, swap)
329 struct nge_softc *sc;
330 caddr_t dest;
331 int off;
332 int cnt;
333 int swap;
334 {
335 int i;
336 u_int16_t word = 0, *ptr;
337
338 for (i = 0; i < cnt; i++) {
339 nge_eeprom_getword(sc, off + i, &word);
340 ptr = (u_int16_t *)(dest + (i * 2));
341 if (swap)
342 *ptr = ntohs(word);
343 else
344 *ptr = word;
345 }
346 }
347
348
349
350
351 void
352 nge_mii_sync(sc)
353 struct nge_softc *sc;
354 {
355 int i;
356
357 SIO_SET(NGE_MEAR_MII_DIR|NGE_MEAR_MII_DATA);
358
359 for (i = 0; i < 32; i++) {
360 SIO_SET(NGE_MEAR_MII_CLK);
361 DELAY(1);
362 SIO_CLR(NGE_MEAR_MII_CLK);
363 DELAY(1);
364 }
365 }
366
367
368
369
370 void
371 nge_mii_send(sc, bits, cnt)
372 struct nge_softc *sc;
373 u_int32_t bits;
374 int cnt;
375 {
376 int i;
377
378 SIO_CLR(NGE_MEAR_MII_CLK);
379
380 for (i = (0x1 << (cnt - 1)); i; i >>= 1) {
381 if (bits & i) {
382 SIO_SET(NGE_MEAR_MII_DATA);
383 } else {
384 SIO_CLR(NGE_MEAR_MII_DATA);
385 }
386 DELAY(1);
387 SIO_CLR(NGE_MEAR_MII_CLK);
388 DELAY(1);
389 SIO_SET(NGE_MEAR_MII_CLK);
390 }
391 }
392
393
394
395
396 int
397 nge_mii_readreg(sc, frame)
398 struct nge_softc *sc;
399 struct nge_mii_frame *frame;
400 {
401 int i, ack, s;
402
403 s = splnet();
404
405
406
407
408 frame->mii_stdelim = NGE_MII_STARTDELIM;
409 frame->mii_opcode = NGE_MII_READOP;
410 frame->mii_turnaround = 0;
411 frame->mii_data = 0;
412
413 CSR_WRITE_4(sc, NGE_MEAR, 0);
414
415
416
417
418 SIO_SET(NGE_MEAR_MII_DIR);
419
420 nge_mii_sync(sc);
421
422
423
424
425 nge_mii_send(sc, frame->mii_stdelim, 2);
426 nge_mii_send(sc, frame->mii_opcode, 2);
427 nge_mii_send(sc, frame->mii_phyaddr, 5);
428 nge_mii_send(sc, frame->mii_regaddr, 5);
429
430
431 SIO_CLR((NGE_MEAR_MII_CLK|NGE_MEAR_MII_DATA));
432 DELAY(1);
433 SIO_SET(NGE_MEAR_MII_CLK);
434 DELAY(1);
435
436
437 SIO_CLR(NGE_MEAR_MII_DIR);
438
439 SIO_CLR(NGE_MEAR_MII_CLK);
440 DELAY(1);
441 ack = CSR_READ_4(sc, NGE_MEAR) & NGE_MEAR_MII_DATA;
442 SIO_SET(NGE_MEAR_MII_CLK);
443 DELAY(1);
444
445
446
447
448
449 if (ack) {
450 for(i = 0; i < 16; i++) {
451 SIO_CLR(NGE_MEAR_MII_CLK);
452 DELAY(1);
453 SIO_SET(NGE_MEAR_MII_CLK);
454 DELAY(1);
455 }
456 goto fail;
457 }
458
459 for (i = 0x8000; i; i >>= 1) {
460 SIO_CLR(NGE_MEAR_MII_CLK);
461 DELAY(1);
462 if (!ack) {
463 if (CSR_READ_4(sc, NGE_MEAR) & NGE_MEAR_MII_DATA)
464 frame->mii_data |= i;
465 DELAY(1);
466 }
467 SIO_SET(NGE_MEAR_MII_CLK);
468 DELAY(1);
469 }
470
471 fail:
472
473 SIO_CLR(NGE_MEAR_MII_CLK);
474 DELAY(1);
475 SIO_SET(NGE_MEAR_MII_CLK);
476 DELAY(1);
477
478 splx(s);
479
480 if (ack)
481 return(1);
482 return(0);
483 }
484
485
486
487
488 int
489 nge_mii_writereg(sc, frame)
490 struct nge_softc *sc;
491 struct nge_mii_frame *frame;
492 {
493 int s;
494
495 s = splnet();
496
497
498
499
500 frame->mii_stdelim = NGE_MII_STARTDELIM;
501 frame->mii_opcode = NGE_MII_WRITEOP;
502 frame->mii_turnaround = NGE_MII_TURNAROUND;
503
504
505
506
507 SIO_SET(NGE_MEAR_MII_DIR);
508
509 nge_mii_sync(sc);
510
511 nge_mii_send(sc, frame->mii_stdelim, 2);
512 nge_mii_send(sc, frame->mii_opcode, 2);
513 nge_mii_send(sc, frame->mii_phyaddr, 5);
514 nge_mii_send(sc, frame->mii_regaddr, 5);
515 nge_mii_send(sc, frame->mii_turnaround, 2);
516 nge_mii_send(sc, frame->mii_data, 16);
517
518
519 SIO_SET(NGE_MEAR_MII_CLK);
520 DELAY(1);
521 SIO_CLR(NGE_MEAR_MII_CLK);
522 DELAY(1);
523
524
525
526
527 SIO_CLR(NGE_MEAR_MII_DIR);
528
529 splx(s);
530
531 return(0);
532 }
533
534 int
535 nge_miibus_readreg(dev, phy, reg)
536 struct device *dev;
537 int phy, reg;
538 {
539 struct nge_softc *sc = (struct nge_softc *)dev;
540 struct nge_mii_frame frame;
541
542 DPRINTFN(9, ("%s: nge_miibus_readreg\n", sc->sc_dv.dv_xname));
543
544 bzero((char *)&frame, sizeof(frame));
545
546 frame.mii_phyaddr = phy;
547 frame.mii_regaddr = reg;
548 nge_mii_readreg(sc, &frame);
549
550 return(frame.mii_data);
551 }
552
553 void
554 nge_miibus_writereg(dev, phy, reg, data)
555 struct device *dev;
556 int phy, reg, data;
557 {
558 struct nge_softc *sc = (struct nge_softc *)dev;
559 struct nge_mii_frame frame;
560
561
562 DPRINTFN(9, ("%s: nge_miibus_writereg\n", sc->sc_dv.dv_xname));
563
564 bzero((char *)&frame, sizeof(frame));
565
566 frame.mii_phyaddr = phy;
567 frame.mii_regaddr = reg;
568 frame.mii_data = data;
569 nge_mii_writereg(sc, &frame);
570 }
571
572 void
573 nge_miibus_statchg(dev)
574 struct device *dev;
575 {
576 struct nge_softc *sc = (struct nge_softc *)dev;
577 struct mii_data *mii = &sc->nge_mii;
578 u_int32_t txcfg, rxcfg;
579
580 txcfg = CSR_READ_4(sc, NGE_TX_CFG);
581 rxcfg = CSR_READ_4(sc, NGE_RX_CFG);
582
583 DPRINTFN(4, ("%s: nge_miibus_statchg txcfg=%#x, rxcfg=%#x\n",
584 sc->sc_dv.dv_xname, txcfg, rxcfg));
585
586 if ((mii->mii_media_active & IFM_GMASK) == IFM_FDX) {
587 txcfg |= (NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR);
588 rxcfg |= (NGE_RXCFG_RX_FDX);
589 } else {
590 txcfg &= ~(NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR);
591 rxcfg &= ~(NGE_RXCFG_RX_FDX);
592 }
593
594 txcfg |= NGE_TXCFG_AUTOPAD;
595
596 CSR_WRITE_4(sc, NGE_TX_CFG, txcfg);
597 CSR_WRITE_4(sc, NGE_RX_CFG, rxcfg);
598
599
600 if (IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T)
601 NGE_SETBIT(sc, NGE_CFG, NGE_CFG_MODE_1000);
602 else
603 NGE_CLRBIT(sc, NGE_CFG, NGE_CFG_MODE_1000);
604 }
605
606 void
607 nge_setmulti(sc)
608 struct nge_softc *sc;
609 {
610 struct arpcom *ac = &sc->arpcom;
611 struct ifnet *ifp = &ac->ac_if;
612 struct ether_multi *enm;
613 struct ether_multistep step;
614 u_int32_t h = 0, i, filtsave;
615 int bit, index;
616
617 allmulti:
618 if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) {
619 NGE_CLRBIT(sc, NGE_RXFILT_CTL,
620 NGE_RXFILTCTL_MCHASH|NGE_RXFILTCTL_UCHASH);
621 NGE_SETBIT(sc, NGE_RXFILT_CTL, NGE_RXFILTCTL_ALLMULTI);
622 return;
623 }
624
625
626
627
628
629
630
631 NGE_SETBIT(sc, NGE_RXFILT_CTL, NGE_RXFILTCTL_MCHASH);
632 NGE_CLRBIT(sc, NGE_RXFILT_CTL,
633 NGE_RXFILTCTL_ALLMULTI|NGE_RXFILTCTL_UCHASH);
634
635 filtsave = CSR_READ_4(sc, NGE_RXFILT_CTL);
636
637
638 for (i = 0; i < NGE_MCAST_FILTER_LEN; i += 2) {
639 CSR_WRITE_4(sc, NGE_RXFILT_CTL, NGE_FILTADDR_MCAST_LO + i);
640 CSR_WRITE_4(sc, NGE_RXFILT_DATA, 0);
641 }
642
643
644
645
646
647
648
649 ETHER_FIRST_MULTI(step, ac, enm);
650 while (enm != NULL) {
651 if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
652 ifp->if_flags |= IFF_ALLMULTI;
653 goto allmulti;
654 }
655 h = (ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN) >> 21) &
656 0x00000FFF;
657 index = (h >> 4) & 0x7F;
658 bit = h & 0xF;
659 CSR_WRITE_4(sc, NGE_RXFILT_CTL,
660 NGE_FILTADDR_MCAST_LO + (index * 2));
661 NGE_SETBIT(sc, NGE_RXFILT_DATA, (1 << bit));
662 ETHER_NEXT_MULTI(step, enm);
663 }
664
665 CSR_WRITE_4(sc, NGE_RXFILT_CTL, filtsave);
666 }
667
668 void
669 nge_reset(sc)
670 struct nge_softc *sc;
671 {
672 int i;
673
674 NGE_SETBIT(sc, NGE_CSR, NGE_CSR_RESET);
675
676 for (i = 0; i < NGE_TIMEOUT; i++) {
677 if (!(CSR_READ_4(sc, NGE_CSR) & NGE_CSR_RESET))
678 break;
679 }
680
681 if (i == NGE_TIMEOUT)
682 printf("%s: reset never completed\n", sc->sc_dv.dv_xname);
683
684
685 DELAY(1000);
686
687
688
689
690
691 CSR_WRITE_4(sc, NGE_CLKRUN, NGE_CLKRUN_PMESTS);
692 CSR_WRITE_4(sc, NGE_CLKRUN, 0);
693 }
694
695
696
697
698
699 int
700 nge_probe(parent, match, aux)
701 struct device *parent;
702 void *match;
703 void *aux;
704 {
705 struct pci_attach_args *pa = (struct pci_attach_args *)aux;
706
707 if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_NS &&
708 PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_NS_DP83820)
709 return (1);
710
711 return (0);
712 }
713
714
715
716
717
718 void
719 nge_attach(parent, self, aux)
720 struct device *parent, *self;
721 void *aux;
722 {
723 struct nge_softc *sc = (struct nge_softc *)self;
724 struct pci_attach_args *pa = aux;
725 pci_chipset_tag_t pc = pa->pa_pc;
726 pci_intr_handle_t ih;
727 const char *intrstr = NULL;
728 bus_size_t size;
729 bus_dma_segment_t seg;
730 bus_dmamap_t dmamap;
731 int rseg;
732 u_char eaddr[ETHER_ADDR_LEN];
733 pcireg_t command;
734 #ifndef NGE_USEIOSPACE
735 pcireg_t memtype;
736 #endif
737 struct ifnet *ifp;
738 caddr_t kva;
739
740
741
742
743 DPRINTFN(5, ("%s: preparing for conf read\n", sc->sc_dv.dv_xname));
744 command = pci_conf_read(pc, pa->pa_tag, NGE_PCI_CAPID) & 0x000000FF;
745 if (command == 0x01) {
746 command = pci_conf_read(pc, pa->pa_tag, NGE_PCI_PWRMGMTCTRL);
747 if (command & NGE_PSTATE_MASK) {
748 pcireg_t iobase, membase, irq;
749
750
751 iobase = pci_conf_read(pc, pa->pa_tag, NGE_PCI_LOIO);
752 membase = pci_conf_read(pc, pa->pa_tag, NGE_PCI_LOMEM);
753 irq = pci_conf_read(pc, pa->pa_tag, NGE_PCI_INTLINE);
754
755
756 printf("%s: chip is in D%d power mode "
757 "-- setting to D0\n", sc->sc_dv.dv_xname,
758 command & NGE_PSTATE_MASK);
759 command &= 0xFFFFFFFC;
760 pci_conf_write(pc, pa->pa_tag,
761 NGE_PCI_PWRMGMTCTRL, command);
762
763
764 pci_conf_write(pc, pa->pa_tag, NGE_PCI_LOIO, iobase);
765 pci_conf_write(pc, pa->pa_tag, NGE_PCI_LOMEM, membase);
766 pci_conf_write(pc, pa->pa_tag, NGE_PCI_INTLINE, irq);
767 }
768 }
769
770
771
772
773 DPRINTFN(5, ("%s: map control/status regs\n", sc->sc_dv.dv_xname));
774
775 #ifdef NGE_USEIOSPACE
776 DPRINTFN(5, ("%s: pci_mapreg_map\n", sc->sc_dv.dv_xname));
777 if (pci_mapreg_map(pa, NGE_PCI_LOIO, PCI_MAPREG_TYPE_IO, 0,
778 &sc->nge_btag, &sc->nge_bhandle, NULL, &size, 0)) {
779 printf(": can't map i/o space\n");
780 return;
781 }
782 #else
783 DPRINTFN(5, ("%s: pci_mapreg_map\n", sc->sc_dv.dv_xname));
784 memtype = pci_mapreg_type(pc, pa->pa_tag, NGE_PCI_LOMEM);
785 switch (memtype) {
786 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT:
787 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT:
788 if (pci_mapreg_map(pa, NGE_PCI_LOMEM,
789 memtype, 0, &sc->nge_btag, &sc->nge_bhandle,
790 NULL, &size, 0) == 0)
791 break;
792 default:
793 printf(": can't map mem space\n");
794 return;
795 }
796 #endif
797
798
799 CSR_WRITE_4(sc, NGE_IER, 0);
800
801 DPRINTFN(5, ("%s: pci_intr_map\n", sc->sc_dv.dv_xname));
802 if (pci_intr_map(pa, &ih)) {
803 printf(": couldn't map interrupt\n");
804 goto fail_1;
805 }
806
807 DPRINTFN(5, ("%s: pci_intr_string\n", sc->sc_dv.dv_xname));
808 intrstr = pci_intr_string(pc, ih);
809 DPRINTFN(5, ("%s: pci_intr_establish\n", sc->sc_dv.dv_xname));
810 sc->nge_intrhand = pci_intr_establish(pc, ih, IPL_NET, nge_intr, sc,
811 sc->sc_dv.dv_xname);
812 if (sc->nge_intrhand == NULL) {
813 printf(": couldn't establish interrupt");
814 if (intrstr != NULL)
815 printf(" at %s", intrstr);
816 printf("\n");
817 goto fail_1;
818 }
819 printf(": %s", intrstr);
820
821
822 DPRINTFN(5, ("%s: nge_reset\n", sc->sc_dv.dv_xname));
823 nge_reset(sc);
824
825
826
827
828 DPRINTFN(5, ("%s: nge_read_eeprom\n", sc->sc_dv.dv_xname));
829 nge_read_eeprom(sc, (caddr_t)&eaddr[4], NGE_EE_NODEADDR, 1, 0);
830 nge_read_eeprom(sc, (caddr_t)&eaddr[2], NGE_EE_NODEADDR + 1, 1, 0);
831 nge_read_eeprom(sc, (caddr_t)&eaddr[0], NGE_EE_NODEADDR + 2, 1, 0);
832
833
834
835
836 printf(", address %s\n", ether_sprintf(eaddr));
837
838 bcopy(eaddr, (char *)&sc->arpcom.ac_enaddr, ETHER_ADDR_LEN);
839
840 sc->sc_dmatag = pa->pa_dmat;
841 DPRINTFN(5, ("%s: bus_dmamem_alloc\n", sc->sc_dv.dv_xname));
842 if (bus_dmamem_alloc(sc->sc_dmatag, sizeof(struct nge_list_data),
843 PAGE_SIZE, 0, &seg, 1, &rseg, BUS_DMA_NOWAIT)) {
844 printf("%s: can't alloc rx buffers\n", sc->sc_dv.dv_xname);
845 goto fail_2;
846 }
847 DPRINTFN(5, ("%s: bus_dmamem_map\n", sc->sc_dv.dv_xname));
848 if (bus_dmamem_map(sc->sc_dmatag, &seg, rseg,
849 sizeof(struct nge_list_data), &kva,
850 BUS_DMA_NOWAIT)) {
851 printf("%s: can't map dma buffers (%d bytes)\n",
852 sc->sc_dv.dv_xname, sizeof(struct nge_list_data));
853 goto fail_3;
854 }
855 DPRINTFN(5, ("%s: bus_dmamem_create\n", sc->sc_dv.dv_xname));
856 if (bus_dmamap_create(sc->sc_dmatag, sizeof(struct nge_list_data), 1,
857 sizeof(struct nge_list_data), 0,
858 BUS_DMA_NOWAIT, &dmamap)) {
859 printf("%s: can't create dma map\n", sc->sc_dv.dv_xname);
860 goto fail_4;
861 }
862 DPRINTFN(5, ("%s: bus_dmamem_load\n", sc->sc_dv.dv_xname));
863 if (bus_dmamap_load(sc->sc_dmatag, dmamap, kva,
864 sizeof(struct nge_list_data), NULL,
865 BUS_DMA_NOWAIT)) {
866 goto fail_5;
867 }
868
869 DPRINTFN(5, ("%s: bzero\n", sc->sc_dv.dv_xname));
870 sc->nge_ldata = (struct nge_list_data *)kva;
871 bzero(sc->nge_ldata, sizeof(struct nge_list_data));
872
873
874 DPRINTFN(5, ("%s: nge_alloc_jumbo_mem\n", sc->sc_dv.dv_xname));
875 if (nge_alloc_jumbo_mem(sc)) {
876 printf("%s: jumbo buffer allocation failed\n",
877 sc->sc_dv.dv_xname);
878 goto fail_5;
879 }
880
881 ifp = &sc->arpcom.ac_if;
882 ifp->if_softc = sc;
883 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
884 ifp->if_ioctl = nge_ioctl;
885 ifp->if_start = nge_start;
886 ifp->if_watchdog = nge_watchdog;
887 ifp->if_baudrate = 1000000000;
888 ifp->if_hardmtu = NGE_JUMBO_MTU;
889 IFQ_SET_MAXLEN(&ifp->if_snd, NGE_TX_LIST_CNT - 1);
890 IFQ_SET_READY(&ifp->if_snd);
891 DPRINTFN(5, ("%s: bcopy\n", sc->sc_dv.dv_xname));
892 bcopy(sc->sc_dv.dv_xname, ifp->if_xname, IFNAMSIZ);
893
894 ifp->if_capabilities = IFCAP_VLAN_MTU;
895
896 #ifdef NGE_VLAN
897 ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING;
898 #endif
899
900
901
902
903 DPRINTFN(5, ("%s: mii setup\n", sc->sc_dv.dv_xname));
904 if (CSR_READ_4(sc, NGE_CFG) & NGE_CFG_TBI_EN) {
905 DPRINTFN(5, ("%s: TBI mode\n", sc->sc_dv.dv_xname));
906 sc->nge_tbi = 1;
907
908 ifmedia_init(&sc->nge_ifmedia, 0, nge_ifmedia_tbi_upd,
909 nge_ifmedia_tbi_sts);
910
911 ifmedia_add(&sc->nge_ifmedia, IFM_ETHER|IFM_NONE, 0, NULL),
912 ifmedia_add(&sc->nge_ifmedia, IFM_ETHER|IFM_1000_SX, 0, NULL);
913 ifmedia_add(&sc->nge_ifmedia, IFM_ETHER|IFM_1000_SX|IFM_FDX,
914 0, NULL);
915 ifmedia_add(&sc->nge_ifmedia, IFM_ETHER|IFM_AUTO, 0, NULL);
916
917 ifmedia_set(&sc->nge_ifmedia, IFM_ETHER|IFM_AUTO);
918
919 CSR_WRITE_4(sc, NGE_GPIO, CSR_READ_4(sc, NGE_GPIO)
920 | NGE_GPIO_GP4_OUT
921 | NGE_GPIO_GP1_OUTENB | NGE_GPIO_GP2_OUTENB
922 | NGE_GPIO_GP3_OUTENB | NGE_GPIO_GP4_OUTENB
923 | NGE_GPIO_GP5_OUTENB);
924
925 NGE_SETBIT(sc, NGE_CFG, NGE_CFG_MODE_1000);
926 } else {
927 sc->nge_mii.mii_ifp = ifp;
928 sc->nge_mii.mii_readreg = nge_miibus_readreg;
929 sc->nge_mii.mii_writereg = nge_miibus_writereg;
930 sc->nge_mii.mii_statchg = nge_miibus_statchg;
931
932 ifmedia_init(&sc->nge_mii.mii_media, 0, nge_ifmedia_mii_upd,
933 nge_ifmedia_mii_sts);
934 mii_attach(&sc->sc_dv, &sc->nge_mii, 0xffffffff, MII_PHY_ANY,
935 MII_OFFSET_ANY, 0);
936
937 if (LIST_FIRST(&sc->nge_mii.mii_phys) == NULL) {
938
939 printf("%s: no PHY found!\n", sc->sc_dv.dv_xname);
940 ifmedia_add(&sc->nge_mii.mii_media,
941 IFM_ETHER|IFM_MANUAL, 0, NULL);
942 ifmedia_set(&sc->nge_mii.mii_media,
943 IFM_ETHER|IFM_MANUAL);
944 }
945 else
946 ifmedia_set(&sc->nge_mii.mii_media,
947 IFM_ETHER|IFM_AUTO);
948 }
949
950
951
952
953 DPRINTFN(5, ("%s: if_attach\n", sc->sc_dv.dv_xname));
954 if_attach(ifp);
955 DPRINTFN(5, ("%s: ether_ifattach\n", sc->sc_dv.dv_xname));
956 ether_ifattach(ifp);
957 DPRINTFN(5, ("%s: timeout_set\n", sc->sc_dv.dv_xname));
958 timeout_set(&sc->nge_timeout, nge_tick, sc);
959 timeout_add(&sc->nge_timeout, hz);
960 return;
961
962 fail_5:
963 bus_dmamap_destroy(sc->sc_dmatag, dmamap);
964
965 fail_4:
966 bus_dmamem_unmap(sc->sc_dmatag, kva,
967 sizeof(struct nge_list_data));
968
969 fail_3:
970 bus_dmamem_free(sc->sc_dmatag, &seg, rseg);
971
972 fail_2:
973 pci_intr_disestablish(pc, sc->nge_intrhand);
974
975 fail_1:
976 bus_space_unmap(sc->nge_btag, sc->nge_bhandle, size);
977 }
978
979
980
981
982 int
983 nge_list_tx_init(sc)
984 struct nge_softc *sc;
985 {
986 struct nge_list_data *ld;
987 struct nge_ring_data *cd;
988 int i;
989
990 cd = &sc->nge_cdata;
991 ld = sc->nge_ldata;
992
993 for (i = 0; i < NGE_TX_LIST_CNT; i++) {
994 if (i == (NGE_TX_LIST_CNT - 1)) {
995 ld->nge_tx_list[i].nge_nextdesc =
996 &ld->nge_tx_list[0];
997 ld->nge_tx_list[i].nge_next =
998 VTOPHYS(&ld->nge_tx_list[0]);
999 } else {
1000 ld->nge_tx_list[i].nge_nextdesc =
1001 &ld->nge_tx_list[i + 1];
1002 ld->nge_tx_list[i].nge_next =
1003 VTOPHYS(&ld->nge_tx_list[i + 1]);
1004 }
1005 ld->nge_tx_list[i].nge_mbuf = NULL;
1006 ld->nge_tx_list[i].nge_ptr = 0;
1007 ld->nge_tx_list[i].nge_ctl = 0;
1008 }
1009
1010 cd->nge_tx_prod = cd->nge_tx_cons = cd->nge_tx_cnt = 0;
1011
1012 return(0);
1013 }
1014
1015
1016
1017
1018
1019
1020
1021 int
1022 nge_list_rx_init(sc)
1023 struct nge_softc *sc;
1024 {
1025 struct nge_list_data *ld;
1026 struct nge_ring_data *cd;
1027 int i;
1028
1029 ld = sc->nge_ldata;
1030 cd = &sc->nge_cdata;
1031
1032 for (i = 0; i < NGE_RX_LIST_CNT; i++) {
1033 if (nge_newbuf(sc, &ld->nge_rx_list[i], NULL) == ENOBUFS)
1034 return(ENOBUFS);
1035 if (i == (NGE_RX_LIST_CNT - 1)) {
1036 ld->nge_rx_list[i].nge_nextdesc =
1037 &ld->nge_rx_list[0];
1038 ld->nge_rx_list[i].nge_next =
1039 VTOPHYS(&ld->nge_rx_list[0]);
1040 } else {
1041 ld->nge_rx_list[i].nge_nextdesc =
1042 &ld->nge_rx_list[i + 1];
1043 ld->nge_rx_list[i].nge_next =
1044 VTOPHYS(&ld->nge_rx_list[i + 1]);
1045 }
1046 }
1047
1048 cd->nge_rx_prod = 0;
1049
1050 return(0);
1051 }
1052
1053
1054
1055
1056 int
1057 nge_newbuf(sc, c, m)
1058 struct nge_softc *sc;
1059 struct nge_desc *c;
1060 struct mbuf *m;
1061 {
1062 struct mbuf *m_new = NULL;
1063
1064 if (m == NULL) {
1065 caddr_t buf = NULL;
1066
1067 MGETHDR(m_new, M_DONTWAIT, MT_DATA);
1068 if (m_new == NULL)
1069 return (ENOBUFS);
1070
1071
1072 buf = nge_jalloc(sc);
1073 if (buf == NULL) {
1074 m_freem(m_new);
1075 return (ENOBUFS);
1076 }
1077
1078
1079 m_new->m_len = m_new->m_pkthdr.len = NGE_MCLBYTES;
1080 MEXTADD(m_new, buf, NGE_MCLBYTES, 0, nge_jfree, sc);
1081 } else {
1082
1083
1084
1085
1086
1087 m_new = m;
1088 m_new->m_len = m_new->m_pkthdr.len = NGE_MCLBYTES;
1089 m_new->m_data = m_new->m_ext.ext_buf;
1090 }
1091
1092 m_adj(m_new, sizeof(u_int64_t));
1093
1094 c->nge_mbuf = m_new;
1095 c->nge_ptr = VTOPHYS(mtod(m_new, caddr_t));
1096 DPRINTFN(7,("%s: c->nge_ptr=%#x\n", sc->sc_dv.dv_xname,
1097 c->nge_ptr));
1098 c->nge_ctl = m_new->m_len;
1099 c->nge_extsts = 0;
1100
1101 return(0);
1102 }
1103
1104 int
1105 nge_alloc_jumbo_mem(sc)
1106 struct nge_softc *sc;
1107 {
1108 caddr_t ptr, kva;
1109 bus_dma_segment_t seg;
1110 bus_dmamap_t dmamap;
1111 int i, rseg, state, error;
1112 struct nge_jpool_entry *entry;
1113
1114 state = error = 0;
1115
1116 if (bus_dmamem_alloc(sc->sc_dmatag, NGE_JMEM, PAGE_SIZE, 0,
1117 &seg, 1, &rseg, BUS_DMA_NOWAIT)) {
1118 printf("%s: can't alloc rx buffers\n", sc->sc_dv.dv_xname);
1119 return (ENOBUFS);
1120 }
1121
1122 state = 1;
1123 if (bus_dmamem_map(sc->sc_dmatag, &seg, rseg, NGE_JMEM, &kva,
1124 BUS_DMA_NOWAIT)) {
1125 printf("%s: can't map dma buffers (%d bytes)\n",
1126 sc->sc_dv.dv_xname, NGE_JMEM);
1127 error = ENOBUFS;
1128 goto out;
1129 }
1130
1131 state = 2;
1132 if (bus_dmamap_create(sc->sc_dmatag, NGE_JMEM, 1,
1133 NGE_JMEM, 0, BUS_DMA_NOWAIT, &dmamap)) {
1134 printf("%s: can't create dma map\n", sc->sc_dv.dv_xname);
1135 error = ENOBUFS;
1136 goto out;
1137 }
1138
1139 state = 3;
1140 if (bus_dmamap_load(sc->sc_dmatag, dmamap, kva, NGE_JMEM,
1141 NULL, BUS_DMA_NOWAIT)) {
1142 printf("%s: can't load dma map\n", sc->sc_dv.dv_xname);
1143 error = ENOBUFS;
1144 goto out;
1145 }
1146
1147 state = 4;
1148 sc->nge_cdata.nge_jumbo_buf = (caddr_t)kva;
1149 DPRINTFN(1,("%s: nge_jumbo_buf=%#x, NGE_MCLBYTES=%#x\n",
1150 sc->sc_dv.dv_xname , sc->nge_cdata.nge_jumbo_buf,
1151 NGE_MCLBYTES));
1152
1153 LIST_INIT(&sc->nge_jfree_listhead);
1154 LIST_INIT(&sc->nge_jinuse_listhead);
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164 ptr = sc->nge_cdata.nge_jumbo_buf;
1165 for (i = 0; i < NGE_JSLOTS; i++) {
1166 sc->nge_cdata.nge_jslots[i].nge_buf = ptr;
1167 sc->nge_cdata.nge_jslots[i].nge_inuse = 0;
1168 ptr += NGE_MCLBYTES;
1169 entry = malloc(sizeof(struct nge_jpool_entry),
1170 M_DEVBUF, M_NOWAIT);
1171 if (entry == NULL) {
1172 sc->nge_cdata.nge_jumbo_buf = NULL;
1173 printf("%s: no memory for jumbo buffer queue!\n",
1174 sc->sc_dv.dv_xname);
1175 error = ENOBUFS;
1176 goto out;
1177 }
1178 entry->slot = i;
1179 LIST_INSERT_HEAD(&sc->nge_jfree_listhead, entry,
1180 jpool_entries);
1181 }
1182 out:
1183 if (error != 0) {
1184 switch (state) {
1185 case 4:
1186 bus_dmamap_unload(sc->sc_dmatag, dmamap);
1187 case 3:
1188 bus_dmamap_destroy(sc->sc_dmatag, dmamap);
1189 case 2:
1190 bus_dmamem_unmap(sc->sc_dmatag, kva, NGE_JMEM);
1191 case 1:
1192 bus_dmamem_free(sc->sc_dmatag, &seg, rseg);
1193 break;
1194 default:
1195 break;
1196 }
1197 }
1198
1199 return (error);
1200 }
1201
1202
1203
1204
1205 void *
1206 nge_jalloc(sc)
1207 struct nge_softc *sc;
1208 {
1209 struct nge_jpool_entry *entry;
1210
1211 entry = LIST_FIRST(&sc->nge_jfree_listhead);
1212
1213 if (entry == NULL)
1214 return (NULL);
1215
1216 LIST_REMOVE(entry, jpool_entries);
1217 LIST_INSERT_HEAD(&sc->nge_jinuse_listhead, entry, jpool_entries);
1218 sc->nge_cdata.nge_jslots[entry->slot].nge_inuse = 1;
1219 return(sc->nge_cdata.nge_jslots[entry->slot].nge_buf);
1220 }
1221
1222
1223
1224
1225 void
1226 nge_jfree(buf, size, arg)
1227 caddr_t buf;
1228 u_int size;
1229 void *arg;
1230 {
1231 struct nge_softc *sc;
1232 int i;
1233 struct nge_jpool_entry *entry;
1234
1235
1236 sc = (struct nge_softc *)arg;
1237
1238 if (sc == NULL)
1239 panic("nge_jfree: can't find softc pointer!");
1240
1241
1242
1243 i = ((vaddr_t)buf - (vaddr_t)sc->nge_cdata.nge_jumbo_buf)
1244 / NGE_MCLBYTES;
1245
1246 if ((i < 0) || (i >= NGE_JSLOTS))
1247 panic("nge_jfree: asked to free buffer that we don't manage!");
1248 else if (sc->nge_cdata.nge_jslots[i].nge_inuse == 0)
1249 panic("nge_jfree: buffer already free!");
1250 else {
1251 sc->nge_cdata.nge_jslots[i].nge_inuse--;
1252 if(sc->nge_cdata.nge_jslots[i].nge_inuse == 0) {
1253 entry = LIST_FIRST(&sc->nge_jinuse_listhead);
1254 if (entry == NULL)
1255 panic("nge_jfree: buffer not in use!");
1256 entry->slot = i;
1257 LIST_REMOVE(entry, jpool_entries);
1258 LIST_INSERT_HEAD(&sc->nge_jfree_listhead,
1259 entry, jpool_entries);
1260 }
1261 }
1262 }
1263
1264
1265
1266
1267
1268 void
1269 nge_rxeof(sc)
1270 struct nge_softc *sc;
1271 {
1272 struct mbuf *m;
1273 struct ifnet *ifp;
1274 struct nge_desc *cur_rx;
1275 int i, total_len = 0;
1276 u_int32_t rxstat;
1277
1278 ifp = &sc->arpcom.ac_if;
1279 i = sc->nge_cdata.nge_rx_prod;
1280
1281 while(NGE_OWNDESC(&sc->nge_ldata->nge_rx_list[i])) {
1282 struct mbuf *m0 = NULL;
1283 u_int32_t extsts;
1284
1285 cur_rx = &sc->nge_ldata->nge_rx_list[i];
1286 rxstat = cur_rx->nge_rxstat;
1287 extsts = cur_rx->nge_extsts;
1288 m = cur_rx->nge_mbuf;
1289 cur_rx->nge_mbuf = NULL;
1290 total_len = NGE_RXBYTES(cur_rx);
1291 NGE_INC(i, NGE_RX_LIST_CNT);
1292
1293
1294
1295
1296
1297
1298
1299 if (!(rxstat & NGE_CMDSTS_PKT_OK)) {
1300 ifp->if_ierrors++;
1301 nge_newbuf(sc, cur_rx, m);
1302 continue;
1303 }
1304
1305
1306
1307
1308
1309
1310 #ifndef __STRICT_ALIGNMENT
1311
1312
1313
1314
1315
1316
1317
1318
1319 if (nge_newbuf(sc, cur_rx, NULL) == ENOBUFS) {
1320 #endif
1321 m0 = m_devget(mtod(m, char *), total_len,
1322 ETHER_ALIGN, ifp, NULL);
1323 nge_newbuf(sc, cur_rx, m);
1324 if (m0 == NULL) {
1325 ifp->if_ierrors++;
1326 continue;
1327 }
1328 m_adj(m0, ETHER_ALIGN);
1329 m = m0;
1330 #ifndef __STRICT_ALIGNMENT
1331 } else {
1332 m->m_pkthdr.rcvif = ifp;
1333 m->m_pkthdr.len = m->m_len = total_len;
1334 }
1335 #endif
1336
1337 ifp->if_ipackets++;
1338
1339 #if NBPFILTER > 0
1340
1341
1342
1343 if (ifp->if_bpf)
1344 bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_IN);
1345 #endif
1346
1347
1348 if (extsts & NGE_RXEXTSTS_IPPKT) {
1349 if (!(extsts & NGE_RXEXTSTS_IPCSUMERR))
1350 m->m_pkthdr.csum_flags |= M_IPV4_CSUM_IN_OK;
1351 if ((extsts & NGE_RXEXTSTS_TCPPKT) &&
1352 (!(extsts & NGE_RXEXTSTS_TCPCSUMERR)))
1353 m->m_pkthdr.csum_flags |= M_TCP_CSUM_IN_OK;
1354 else if ((extsts & NGE_RXEXTSTS_UDPPKT) &&
1355 (!(extsts & NGE_RXEXTSTS_UDPCSUMERR)))
1356 m->m_pkthdr.csum_flags |= M_UDP_CSUM_IN_OK;
1357 }
1358
1359 ether_input_mbuf(ifp, m);
1360 }
1361
1362 sc->nge_cdata.nge_rx_prod = i;
1363 }
1364
1365
1366
1367
1368
1369
1370 void
1371 nge_txeof(sc)
1372 struct nge_softc *sc;
1373 {
1374 struct nge_desc *cur_tx;
1375 struct ifnet *ifp;
1376 u_int32_t idx;
1377
1378 ifp = &sc->arpcom.ac_if;
1379
1380
1381
1382
1383
1384 idx = sc->nge_cdata.nge_tx_cons;
1385 while (idx != sc->nge_cdata.nge_tx_prod) {
1386 cur_tx = &sc->nge_ldata->nge_tx_list[idx];
1387
1388 if (NGE_OWNDESC(cur_tx))
1389 break;
1390
1391 if (cur_tx->nge_ctl & NGE_CMDSTS_MORE) {
1392 sc->nge_cdata.nge_tx_cnt--;
1393 NGE_INC(idx, NGE_TX_LIST_CNT);
1394 continue;
1395 }
1396
1397 if (!(cur_tx->nge_ctl & NGE_CMDSTS_PKT_OK)) {
1398 ifp->if_oerrors++;
1399 if (cur_tx->nge_txstat & NGE_TXSTAT_EXCESSCOLLS)
1400 ifp->if_collisions++;
1401 if (cur_tx->nge_txstat & NGE_TXSTAT_OUTOFWINCOLL)
1402 ifp->if_collisions++;
1403 }
1404
1405 ifp->if_collisions +=
1406 (cur_tx->nge_txstat & NGE_TXSTAT_COLLCNT) >> 16;
1407
1408 ifp->if_opackets++;
1409 if (cur_tx->nge_mbuf != NULL) {
1410 m_freem(cur_tx->nge_mbuf);
1411 cur_tx->nge_mbuf = NULL;
1412 ifp->if_flags &= ~IFF_OACTIVE;
1413 }
1414
1415 sc->nge_cdata.nge_tx_cnt--;
1416 NGE_INC(idx, NGE_TX_LIST_CNT);
1417 }
1418
1419 sc->nge_cdata.nge_tx_cons = idx;
1420
1421 if (idx == sc->nge_cdata.nge_tx_prod)
1422 ifp->if_timer = 0;
1423 }
1424
1425 void
1426 nge_tick(xsc)
1427 void *xsc;
1428 {
1429 struct nge_softc *sc = xsc;
1430 struct mii_data *mii = &sc->nge_mii;
1431 struct ifnet *ifp = &sc->arpcom.ac_if;
1432 int s;
1433
1434 s = splnet();
1435
1436 DPRINTFN(10, ("%s: nge_tick: link=%d\n", sc->sc_dv.dv_xname,
1437 sc->nge_link));
1438
1439 timeout_add(&sc->nge_timeout, hz);
1440 if (sc->nge_link) {
1441 splx(s);
1442 return;
1443 }
1444
1445 if (sc->nge_tbi) {
1446 if (IFM_SUBTYPE(sc->nge_ifmedia.ifm_cur->ifm_media)
1447 == IFM_AUTO) {
1448 u_int32_t bmsr, anlpar, txcfg, rxcfg;
1449
1450 bmsr = CSR_READ_4(sc, NGE_TBI_BMSR);
1451 DPRINTFN(2, ("%s: nge_tick: bmsr=%#x\n",
1452 sc->sc_dv.dv_xname, bmsr));
1453
1454 if (!(bmsr & NGE_TBIBMSR_ANEG_DONE)) {
1455 CSR_WRITE_4(sc, NGE_TBI_BMCR, 0);
1456
1457 splx(s);
1458 return;
1459 }
1460
1461 anlpar = CSR_READ_4(sc, NGE_TBI_ANLPAR);
1462 txcfg = CSR_READ_4(sc, NGE_TX_CFG);
1463 rxcfg = CSR_READ_4(sc, NGE_RX_CFG);
1464
1465 DPRINTFN(2, ("%s: nge_tick: anlpar=%#x, txcfg=%#x, "
1466 "rxcfg=%#x\n", sc->sc_dv.dv_xname, anlpar,
1467 txcfg, rxcfg));
1468
1469 if (anlpar == 0 || anlpar & NGE_TBIANAR_FDX) {
1470 txcfg |= (NGE_TXCFG_IGN_HBEAT|
1471 NGE_TXCFG_IGN_CARR);
1472 rxcfg |= NGE_RXCFG_RX_FDX;
1473 } else {
1474 txcfg &= ~(NGE_TXCFG_IGN_HBEAT|
1475 NGE_TXCFG_IGN_CARR);
1476 rxcfg &= ~(NGE_RXCFG_RX_FDX);
1477 }
1478 txcfg |= NGE_TXCFG_AUTOPAD;
1479 CSR_WRITE_4(sc, NGE_TX_CFG, txcfg);
1480 CSR_WRITE_4(sc, NGE_RX_CFG, rxcfg);
1481 }
1482
1483 DPRINTF(("%s: gigabit link up\n", sc->sc_dv.dv_xname));
1484 sc->nge_link++;
1485 if (!IFQ_IS_EMPTY(&ifp->if_snd))
1486 nge_start(ifp);
1487 } else {
1488 mii_tick(mii);
1489 if (mii->mii_media_status & IFM_ACTIVE &&
1490 IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
1491 sc->nge_link++;
1492 if (IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T)
1493 DPRINTF(("%s: gigabit link up\n",
1494 sc->sc_dv.dv_xname));
1495 if (!IFQ_IS_EMPTY(&ifp->if_snd))
1496 nge_start(ifp);
1497 }
1498
1499 }
1500
1501 splx(s);
1502 }
1503
1504 int
1505 nge_intr(arg)
1506 void *arg;
1507 {
1508 struct nge_softc *sc;
1509 struct ifnet *ifp;
1510 u_int32_t status;
1511 int claimed = 0;
1512
1513 sc = arg;
1514 ifp = &sc->arpcom.ac_if;
1515
1516
1517 if (!(ifp->if_flags & IFF_UP)) {
1518 nge_stop(sc);
1519 return (0);
1520 }
1521
1522
1523 CSR_WRITE_4(sc, NGE_IER, 0);
1524
1525
1526 if(sc->nge_tbi)
1527 CSR_WRITE_4(sc, NGE_GPIO, CSR_READ_4(sc, NGE_GPIO)
1528 | NGE_GPIO_GP3_OUT);
1529
1530 for (;;) {
1531
1532 status = CSR_READ_4(sc, NGE_ISR);
1533
1534 if ((status & NGE_INTRS) == 0)
1535 break;
1536
1537 claimed = 1;
1538
1539 if ((status & NGE_ISR_TX_DESC_OK) ||
1540 (status & NGE_ISR_TX_ERR) ||
1541 (status & NGE_ISR_TX_OK) ||
1542 (status & NGE_ISR_TX_IDLE))
1543 nge_txeof(sc);
1544
1545 if ((status & NGE_ISR_RX_DESC_OK) ||
1546 (status & NGE_ISR_RX_ERR) ||
1547 (status & NGE_ISR_RX_OFLOW) ||
1548 (status & NGE_ISR_RX_FIFO_OFLOW) ||
1549 (status & NGE_ISR_RX_IDLE) ||
1550 (status & NGE_ISR_RX_OK))
1551 nge_rxeof(sc);
1552
1553 if ((status & NGE_ISR_RX_IDLE))
1554 NGE_SETBIT(sc, NGE_CSR, NGE_CSR_RX_ENABLE);
1555
1556 if (status & NGE_ISR_SYSERR) {
1557 nge_reset(sc);
1558 ifp->if_flags &= ~IFF_RUNNING;
1559 nge_init(sc);
1560 }
1561
1562 #if 0
1563
1564
1565
1566
1567
1568 if (status & NGE_IMR_PHY_INTR) {
1569 sc->nge_link = 0;
1570 nge_tick(sc);
1571 }
1572 #endif
1573 }
1574
1575
1576 CSR_WRITE_4(sc, NGE_IER, 1);
1577
1578 if (!IFQ_IS_EMPTY(&ifp->if_snd))
1579 nge_start(ifp);
1580
1581
1582 if(sc->nge_tbi)
1583 CSR_WRITE_4(sc, NGE_GPIO, CSR_READ_4(sc, NGE_GPIO)
1584 & ~NGE_GPIO_GP3_OUT);
1585
1586 return claimed;
1587 }
1588
1589
1590
1591
1592
1593 int
1594 nge_encap(sc, m_head, txidx)
1595 struct nge_softc *sc;
1596 struct mbuf *m_head;
1597 u_int32_t *txidx;
1598 {
1599 struct nge_desc *f = NULL;
1600 struct mbuf *m;
1601 int frag, cur, cnt = 0;
1602 #if NVLAN > 0
1603 struct ifvlan *ifv = NULL;
1604
1605 if ((m_head->m_flags & (M_PROTO1|M_PKTHDR)) == (M_PROTO1|M_PKTHDR) &&
1606 m_head->m_pkthdr.rcvif != NULL)
1607 ifv = m_head->m_pkthdr.rcvif->if_softc;
1608 #endif
1609
1610
1611
1612
1613
1614
1615 m = m_head;
1616 cur = frag = *txidx;
1617
1618 for (m = m_head; m != NULL; m = m->m_next) {
1619 if (m->m_len != 0) {
1620 if ((NGE_TX_LIST_CNT -
1621 (sc->nge_cdata.nge_tx_cnt + cnt)) < 2)
1622 return(ENOBUFS);
1623 f = &sc->nge_ldata->nge_tx_list[frag];
1624 f->nge_ctl = NGE_CMDSTS_MORE | m->m_len;
1625 f->nge_ptr = VTOPHYS(mtod(m, vaddr_t));
1626 DPRINTFN(7,("%s: f->nge_ptr=%#x\n",
1627 sc->sc_dv.dv_xname, f->nge_ptr));
1628 if (cnt != 0)
1629 f->nge_ctl |= NGE_CMDSTS_OWN;
1630 cur = frag;
1631 NGE_INC(frag, NGE_TX_LIST_CNT);
1632 cnt++;
1633 }
1634 }
1635
1636 if (m != NULL)
1637 return(ENOBUFS);
1638
1639 sc->nge_ldata->nge_tx_list[*txidx].nge_extsts = 0;
1640
1641 #if NVLAN > 0
1642 if (ifv != NULL) {
1643 sc->nge_ldata->nge_tx_list[cur].nge_extsts |=
1644 (NGE_TXEXTSTS_VLANPKT|ifv->ifv_tag);
1645 }
1646 #endif
1647
1648 sc->nge_ldata->nge_tx_list[cur].nge_mbuf = m_head;
1649 sc->nge_ldata->nge_tx_list[cur].nge_ctl &= ~NGE_CMDSTS_MORE;
1650 sc->nge_ldata->nge_tx_list[*txidx].nge_ctl |= NGE_CMDSTS_OWN;
1651 sc->nge_cdata.nge_tx_cnt += cnt;
1652 *txidx = frag;
1653
1654 return(0);
1655 }
1656
1657
1658
1659
1660
1661
1662
1663
1664 void
1665 nge_start(ifp)
1666 struct ifnet *ifp;
1667 {
1668 struct nge_softc *sc;
1669 struct mbuf *m_head = NULL;
1670 u_int32_t idx;
1671 int pkts = 0;
1672
1673 sc = ifp->if_softc;
1674
1675 if (!sc->nge_link)
1676 return;
1677
1678 idx = sc->nge_cdata.nge_tx_prod;
1679
1680 if (ifp->if_flags & IFF_OACTIVE)
1681 return;
1682
1683 while(sc->nge_ldata->nge_tx_list[idx].nge_mbuf == NULL) {
1684 IFQ_POLL(&ifp->if_snd, m_head);
1685 if (m_head == NULL)
1686 break;
1687
1688 if (nge_encap(sc, m_head, &idx)) {
1689 ifp->if_flags |= IFF_OACTIVE;
1690 break;
1691 }
1692
1693
1694 IFQ_DEQUEUE(&ifp->if_snd, m_head);
1695 pkts++;
1696
1697 #if NBPFILTER > 0
1698
1699
1700
1701
1702 if (ifp->if_bpf)
1703 bpf_mtap(ifp->if_bpf, m_head, BPF_DIRECTION_OUT);
1704 #endif
1705 }
1706 if (pkts == 0)
1707 return;
1708
1709
1710 sc->nge_cdata.nge_tx_prod = idx;
1711 NGE_SETBIT(sc, NGE_CSR, NGE_CSR_TX_ENABLE);
1712
1713
1714
1715
1716 ifp->if_timer = 5;
1717 }
1718
1719 void
1720 nge_init(xsc)
1721 void *xsc;
1722 {
1723 struct nge_softc *sc = xsc;
1724 struct ifnet *ifp = &sc->arpcom.ac_if;
1725 struct mii_data *mii;
1726 u_int32_t txcfg, rxcfg;
1727 int s, media;
1728
1729 if (ifp->if_flags & IFF_RUNNING)
1730 return;
1731
1732 s = splnet();
1733
1734
1735
1736
1737 nge_stop(sc);
1738
1739 mii = sc->nge_tbi ? NULL: &sc->nge_mii;
1740
1741
1742 CSR_WRITE_4(sc, NGE_RXFILT_CTL, NGE_FILTADDR_PAR0);
1743 CSR_WRITE_4(sc, NGE_RXFILT_DATA,
1744 ((u_int16_t *)sc->arpcom.ac_enaddr)[0]);
1745 CSR_WRITE_4(sc, NGE_RXFILT_CTL, NGE_FILTADDR_PAR1);
1746 CSR_WRITE_4(sc, NGE_RXFILT_DATA,
1747 ((u_int16_t *)sc->arpcom.ac_enaddr)[1]);
1748 CSR_WRITE_4(sc, NGE_RXFILT_CTL, NGE_FILTADDR_PAR2);
1749 CSR_WRITE_4(sc, NGE_RXFILT_DATA,
1750 ((u_int16_t *)sc->arpcom.ac_enaddr)[2]);
1751
1752
1753 if (nge_list_rx_init(sc) == ENOBUFS) {
1754 printf("%s: initialization failed: no "
1755 "memory for rx buffers\n", sc->sc_dv.dv_xname);
1756 nge_stop(sc);
1757 splx(s);
1758 return;
1759 }
1760
1761
1762
1763
1764 nge_list_tx_init(sc);
1765
1766
1767
1768
1769
1770
1771
1772 NGE_SETBIT(sc, NGE_RXFILT_CTL, NGE_RXFILTCTL_ARP);
1773 NGE_SETBIT(sc, NGE_RXFILT_CTL, NGE_RXFILTCTL_PERFECT);
1774
1775
1776 if (ifp->if_flags & IFF_PROMISC)
1777 NGE_SETBIT(sc, NGE_RXFILT_CTL, NGE_RXFILTCTL_ALLPHYS);
1778 else
1779 NGE_CLRBIT(sc, NGE_RXFILT_CTL, NGE_RXFILTCTL_ALLPHYS);
1780
1781
1782
1783
1784 if (ifp->if_flags & IFF_BROADCAST)
1785 NGE_SETBIT(sc, NGE_RXFILT_CTL, NGE_RXFILTCTL_BROAD);
1786 else
1787 NGE_CLRBIT(sc, NGE_RXFILT_CTL, NGE_RXFILTCTL_BROAD);
1788
1789
1790
1791
1792 nge_setmulti(sc);
1793
1794
1795 NGE_SETBIT(sc, NGE_RXFILT_CTL, NGE_RXFILTCTL_ENABLE);
1796
1797
1798
1799
1800 CSR_WRITE_4(sc, NGE_RX_LISTPTR,
1801 VTOPHYS(&sc->nge_ldata->nge_rx_list[0]));
1802 CSR_WRITE_4(sc, NGE_TX_LISTPTR,
1803 VTOPHYS(&sc->nge_ldata->nge_tx_list[0]));
1804
1805
1806 CSR_WRITE_4(sc, NGE_RX_CFG, NGE_RXCFG);
1807
1808
1809
1810
1811
1812 CSR_WRITE_4(sc, NGE_VLAN_IP_RXCTL, NGE_VIPRXCTL_IPCSUM_ENB);
1813
1814
1815 CSR_WRITE_4(sc, NGE_TX_CFG, NGE_TXCFG);
1816
1817 #if NVLAN > 0
1818
1819
1820
1821
1822
1823 if (ifp->if_capabilities & IFCAP_VLAN_HWTAGGING)
1824 NGE_SETBIT(sc, NGE_VLAN_IP_TXCTL, NGE_VIPTXCTL_TAG_PER_PKT);
1825 #endif
1826
1827
1828 if (sc->nge_tbi)
1829 media = sc->nge_ifmedia.ifm_cur->ifm_media;
1830 else
1831 media = mii->mii_media_active;
1832
1833 txcfg = CSR_READ_4(sc, NGE_TX_CFG);
1834 rxcfg = CSR_READ_4(sc, NGE_RX_CFG);
1835
1836 DPRINTFN(4, ("%s: nge_init txcfg=%#x, rxcfg=%#x\n",
1837 sc->sc_dv.dv_xname, txcfg, rxcfg));
1838
1839 if ((media & IFM_GMASK) == IFM_FDX) {
1840 txcfg |= (NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR);
1841 rxcfg |= (NGE_RXCFG_RX_FDX);
1842 } else {
1843 txcfg &= ~(NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR);
1844 rxcfg &= ~(NGE_RXCFG_RX_FDX);
1845 }
1846
1847 txcfg |= NGE_TXCFG_AUTOPAD;
1848
1849 CSR_WRITE_4(sc, NGE_TX_CFG, txcfg);
1850 CSR_WRITE_4(sc, NGE_RX_CFG, rxcfg);
1851
1852 nge_tick(sc);
1853
1854
1855
1856
1857
1858
1859
1860 NGE_SETBIT(sc, NGE_CFG, NGE_CFG_PHYINTR_SPD|NGE_CFG_PHYINTR_LNK|
1861 NGE_CFG_PHYINTR_DUP|NGE_CFG_EXTSTS_ENB);
1862
1863 DPRINTFN(1, ("%s: nge_init: config=%#x\n", sc->sc_dv.dv_xname,
1864 CSR_READ_4(sc, NGE_CFG)));
1865
1866
1867
1868
1869
1870
1871
1872 CSR_WRITE_4(sc, NGE_IHR, 0x01);
1873
1874
1875
1876
1877 CSR_WRITE_4(sc, NGE_IMR, NGE_INTRS);
1878 CSR_WRITE_4(sc, NGE_IER, 1);
1879
1880
1881 NGE_CLRBIT(sc, NGE_CSR, NGE_CSR_TX_DISABLE|NGE_CSR_RX_DISABLE);
1882 NGE_SETBIT(sc, NGE_CSR, NGE_CSR_RX_ENABLE);
1883
1884 if (sc->nge_tbi)
1885 nge_ifmedia_tbi_upd(ifp);
1886 else
1887 nge_ifmedia_mii_upd(ifp);
1888
1889 ifp->if_flags |= IFF_RUNNING;
1890 ifp->if_flags &= ~IFF_OACTIVE;
1891
1892 splx(s);
1893 }
1894
1895
1896
1897
1898 int
1899 nge_ifmedia_mii_upd(ifp)
1900 struct ifnet *ifp;
1901 {
1902 struct nge_softc *sc = ifp->if_softc;
1903 struct mii_data *mii = &sc->nge_mii;
1904
1905 DPRINTFN(2, ("%s: nge_ifmedia_mii_upd\n", sc->sc_dv.dv_xname));
1906
1907 sc->nge_link = 0;
1908
1909 if (mii->mii_instance) {
1910 struct mii_softc *miisc;
1911 LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
1912 mii_phy_reset(miisc);
1913 }
1914 mii_mediachg(mii);
1915
1916 return(0);
1917 }
1918
1919
1920
1921
1922 void
1923 nge_ifmedia_mii_sts(ifp, ifmr)
1924 struct ifnet *ifp;
1925 struct ifmediareq *ifmr;
1926 {
1927 struct nge_softc *sc = ifp->if_softc;
1928 struct mii_data *mii = &sc->nge_mii;
1929
1930 DPRINTFN(2, ("%s: nge_ifmedia_mii_sts\n", sc->sc_dv.dv_xname));
1931
1932 mii_pollstat(mii);
1933 ifmr->ifm_active = mii->mii_media_active;
1934 ifmr->ifm_status = mii->mii_media_status;
1935 }
1936
1937
1938
1939
1940 int
1941 nge_ifmedia_tbi_upd(ifp)
1942 struct ifnet *ifp;
1943 {
1944 struct nge_softc *sc = ifp->if_softc;
1945
1946 DPRINTFN(2, ("%s: nge_ifmedia_tbi_upd\n", sc->sc_dv.dv_xname));
1947
1948 sc->nge_link = 0;
1949
1950 if (IFM_SUBTYPE(sc->nge_ifmedia.ifm_cur->ifm_media)
1951 == IFM_AUTO) {
1952 u_int32_t anar, bmcr;
1953 anar = CSR_READ_4(sc, NGE_TBI_ANAR);
1954 anar |= (NGE_TBIANAR_HDX | NGE_TBIANAR_FDX);
1955 CSR_WRITE_4(sc, NGE_TBI_ANAR, anar);
1956
1957 bmcr = CSR_READ_4(sc, NGE_TBI_BMCR);
1958 bmcr |= (NGE_TBIBMCR_ENABLE_ANEG|NGE_TBIBMCR_RESTART_ANEG);
1959 CSR_WRITE_4(sc, NGE_TBI_BMCR, bmcr);
1960
1961 bmcr &= ~(NGE_TBIBMCR_RESTART_ANEG);
1962 CSR_WRITE_4(sc, NGE_TBI_BMCR, bmcr);
1963 } else {
1964 u_int32_t txcfg, rxcfg;
1965 txcfg = CSR_READ_4(sc, NGE_TX_CFG);
1966 rxcfg = CSR_READ_4(sc, NGE_RX_CFG);
1967
1968 if ((sc->nge_ifmedia.ifm_cur->ifm_media & IFM_GMASK)
1969 == IFM_FDX) {
1970 txcfg |= NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR;
1971 rxcfg |= NGE_RXCFG_RX_FDX;
1972 } else {
1973 txcfg &= ~(NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR);
1974 rxcfg &= ~(NGE_RXCFG_RX_FDX);
1975 }
1976
1977 txcfg |= NGE_TXCFG_AUTOPAD;
1978 CSR_WRITE_4(sc, NGE_TX_CFG, txcfg);
1979 CSR_WRITE_4(sc, NGE_RX_CFG, rxcfg);
1980 }
1981
1982 NGE_CLRBIT(sc, NGE_GPIO, NGE_GPIO_GP3_OUT);
1983
1984 return(0);
1985 }
1986
1987
1988
1989
1990 void
1991 nge_ifmedia_tbi_sts(ifp, ifmr)
1992 struct ifnet *ifp;
1993 struct ifmediareq *ifmr;
1994 {
1995 struct nge_softc *sc = ifp->if_softc;
1996 u_int32_t bmcr;
1997
1998 bmcr = CSR_READ_4(sc, NGE_TBI_BMCR);
1999
2000 if (IFM_SUBTYPE(sc->nge_ifmedia.ifm_cur->ifm_media) == IFM_AUTO) {
2001 u_int32_t bmsr = CSR_READ_4(sc, NGE_TBI_BMSR);
2002 DPRINTFN(2, ("%s: nge_ifmedia_tbi_sts bmsr=%#x, bmcr=%#x\n",
2003 sc->sc_dv.dv_xname, bmsr, bmcr));
2004
2005 if (!(bmsr & NGE_TBIBMSR_ANEG_DONE)) {
2006 ifmr->ifm_active = IFM_ETHER|IFM_NONE;
2007 ifmr->ifm_status = IFM_AVALID;
2008 return;
2009 }
2010 } else {
2011 DPRINTFN(2, ("%s: nge_ifmedia_tbi_sts bmcr=%#x\n",
2012 sc->sc_dv.dv_xname, bmcr));
2013 }
2014
2015 ifmr->ifm_status = IFM_AVALID|IFM_ACTIVE;
2016 ifmr->ifm_active = IFM_ETHER|IFM_1000_SX;
2017
2018 if (bmcr & NGE_TBIBMCR_LOOPBACK)
2019 ifmr->ifm_active |= IFM_LOOP;
2020
2021 if (IFM_SUBTYPE(sc->nge_ifmedia.ifm_cur->ifm_media) == IFM_AUTO) {
2022 u_int32_t anlpar = CSR_READ_4(sc, NGE_TBI_ANLPAR);
2023 DPRINTFN(2, ("%s: nge_ifmedia_tbi_sts anlpar=%#x\n",
2024 sc->sc_dv.dv_xname, anlpar));
2025
2026 ifmr->ifm_active |= IFM_AUTO;
2027 if (anlpar & NGE_TBIANLPAR_FDX) {
2028 ifmr->ifm_active |= IFM_FDX;
2029 } else if (anlpar & NGE_TBIANLPAR_HDX) {
2030 ifmr->ifm_active |= IFM_HDX;
2031 } else
2032 ifmr->ifm_active |= IFM_FDX;
2033
2034 } else if ((sc->nge_ifmedia.ifm_cur->ifm_media & IFM_GMASK) == IFM_FDX)
2035 ifmr->ifm_active |= IFM_FDX;
2036 else
2037 ifmr->ifm_active |= IFM_HDX;
2038
2039 }
2040
2041 int
2042 nge_ioctl(ifp, command, data)
2043 struct ifnet *ifp;
2044 u_long command;
2045 caddr_t data;
2046 {
2047 struct nge_softc *sc = ifp->if_softc;
2048 struct ifreq *ifr = (struct ifreq *) data;
2049 struct ifaddr *ifa = (struct ifaddr *)data;
2050 struct mii_data *mii;
2051 int s, error = 0;
2052
2053 s = splnet();
2054
2055 if ((error = ether_ioctl(ifp, &sc->arpcom, command, data)) > 0) {
2056 splx(s);
2057 return (error);
2058 }
2059
2060 switch(command) {
2061 case SIOCSIFMTU:
2062 if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > ifp->if_hardmtu)
2063 error = EINVAL;
2064 else if (ifp->if_mtu != ifr->ifr_mtu)
2065 ifp->if_mtu = ifr->ifr_mtu;
2066 break;
2067 case SIOCSIFADDR:
2068 ifp->if_flags |= IFF_UP;
2069 switch (ifa->ifa_addr->sa_family) {
2070 #ifdef INET
2071 case AF_INET:
2072 nge_init(sc);
2073 arp_ifinit(&sc->arpcom, ifa);
2074 break;
2075 #endif
2076 default:
2077 nge_init(sc);
2078 break;
2079 }
2080 break;
2081 case SIOCSIFFLAGS:
2082 if (ifp->if_flags & IFF_UP) {
2083 if (ifp->if_flags & IFF_RUNNING &&
2084 ifp->if_flags & IFF_PROMISC &&
2085 !(sc->nge_if_flags & IFF_PROMISC)) {
2086 NGE_SETBIT(sc, NGE_RXFILT_CTL,
2087 NGE_RXFILTCTL_ALLPHYS|
2088 NGE_RXFILTCTL_ALLMULTI);
2089 } else if (ifp->if_flags & IFF_RUNNING &&
2090 !(ifp->if_flags & IFF_PROMISC) &&
2091 sc->nge_if_flags & IFF_PROMISC) {
2092 NGE_CLRBIT(sc, NGE_RXFILT_CTL,
2093 NGE_RXFILTCTL_ALLPHYS);
2094 if (!(ifp->if_flags & IFF_ALLMULTI))
2095 NGE_CLRBIT(sc, NGE_RXFILT_CTL,
2096 NGE_RXFILTCTL_ALLMULTI);
2097 } else {
2098 ifp->if_flags &= ~IFF_RUNNING;
2099 nge_init(sc);
2100 }
2101 } else {
2102 if (ifp->if_flags & IFF_RUNNING)
2103 nge_stop(sc);
2104 }
2105 sc->nge_if_flags = ifp->if_flags;
2106 error = 0;
2107 break;
2108 case SIOCADDMULTI:
2109 case SIOCDELMULTI:
2110 error = (command == SIOCADDMULTI)
2111 ? ether_addmulti(ifr, &sc->arpcom)
2112 : ether_delmulti(ifr, &sc->arpcom);
2113
2114 if (error == ENETRESET) {
2115 if (ifp->if_flags & IFF_RUNNING)
2116 nge_setmulti(sc);
2117 error = 0;
2118 }
2119 break;
2120 case SIOCGIFMEDIA:
2121 case SIOCSIFMEDIA:
2122 if (sc->nge_tbi) {
2123 error = ifmedia_ioctl(ifp, ifr, &sc->nge_ifmedia,
2124 command);
2125 } else {
2126 mii = &sc->nge_mii;
2127 error = ifmedia_ioctl(ifp, ifr, &mii->mii_media,
2128 command);
2129 }
2130 break;
2131 default:
2132 error = ENOTTY;
2133 break;
2134 }
2135
2136 splx(s);
2137
2138 return(error);
2139 }
2140
2141 void
2142 nge_watchdog(ifp)
2143 struct ifnet *ifp;
2144 {
2145 struct nge_softc *sc;
2146
2147 sc = ifp->if_softc;
2148
2149 ifp->if_oerrors++;
2150 printf("%s: watchdog timeout\n", sc->sc_dv.dv_xname);
2151
2152 nge_stop(sc);
2153 nge_reset(sc);
2154 ifp->if_flags &= ~IFF_RUNNING;
2155 nge_init(sc);
2156
2157 if (!IFQ_IS_EMPTY(&ifp->if_snd))
2158 nge_start(ifp);
2159 }
2160
2161
2162
2163
2164
2165 void
2166 nge_stop(sc)
2167 struct nge_softc *sc;
2168 {
2169 int i;
2170 struct ifnet *ifp;
2171 struct mii_data *mii;
2172
2173 ifp = &sc->arpcom.ac_if;
2174 ifp->if_timer = 0;
2175 if (sc->nge_tbi) {
2176 mii = NULL;
2177 } else {
2178 mii = &sc->nge_mii;
2179 }
2180
2181 timeout_del(&sc->nge_timeout);
2182
2183 ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
2184
2185 CSR_WRITE_4(sc, NGE_IER, 0);
2186 CSR_WRITE_4(sc, NGE_IMR, 0);
2187 NGE_SETBIT(sc, NGE_CSR, NGE_CSR_TX_DISABLE|NGE_CSR_RX_DISABLE);
2188 DELAY(1000);
2189 CSR_WRITE_4(sc, NGE_TX_LISTPTR, 0);
2190 CSR_WRITE_4(sc, NGE_RX_LISTPTR, 0);
2191
2192 if (!sc->nge_tbi)
2193 mii_down(mii);
2194
2195 sc->nge_link = 0;
2196
2197
2198
2199
2200 for (i = 0; i < NGE_RX_LIST_CNT; i++) {
2201 if (sc->nge_ldata->nge_rx_list[i].nge_mbuf != NULL) {
2202 m_freem(sc->nge_ldata->nge_rx_list[i].nge_mbuf);
2203 sc->nge_ldata->nge_rx_list[i].nge_mbuf = NULL;
2204 }
2205 }
2206 bzero((char *)&sc->nge_ldata->nge_rx_list,
2207 sizeof(sc->nge_ldata->nge_rx_list));
2208
2209
2210
2211
2212 for (i = 0; i < NGE_TX_LIST_CNT; i++) {
2213 if (sc->nge_ldata->nge_tx_list[i].nge_mbuf != NULL) {
2214 m_freem(sc->nge_ldata->nge_tx_list[i].nge_mbuf);
2215 sc->nge_ldata->nge_tx_list[i].nge_mbuf = NULL;
2216 }
2217 }
2218
2219 bzero((char *)&sc->nge_ldata->nge_tx_list,
2220 sizeof(sc->nge_ldata->nge_tx_list));
2221 }
2222
2223
2224
2225
2226
2227 void
2228 nge_shutdown(xsc)
2229 void *xsc;
2230 {
2231 struct nge_softc *sc = (struct nge_softc *)xsc;
2232
2233 nge_reset(sc);
2234 nge_stop(sc);
2235 }
2236
2237 struct cfattach nge_ca = {
2238 sizeof(struct nge_softc), nge_probe, nge_attach
2239 };
2240
2241 struct cfdriver nge_cd = {
2242 0, "nge", DV_IFNET
2243 };