This source file includes following definitions.
- vge_eeprom_getword
- vge_read_eeprom
- vge_miipoll_stop
- vge_miipoll_start
- vge_miibus_readreg
- vge_miibus_writereg
- vge_cam_clear
- vge_cam_set
- vge_setmulti
- vge_reset
- vge_probe
- vge_allocmem
- vge_attach
- vge_newbuf
- vge_tx_list_init
- vge_rx_list_init
- vge_rxeof
- vge_txeof
- vge_tick
- vge_intr
- vge_encap
- vge_start
- vge_init
- vge_ifmedia_upd
- vge_ifmedia_sts
- vge_miibus_statchg
- vge_ioctl
- vge_watchdog
- vge_stop
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 #include "bpfilter.h"
85 #include "vlan.h"
86
87 #include <sys/param.h>
88 #include <sys/endian.h>
89 #include <sys/systm.h>
90 #include <sys/sockio.h>
91 #include <sys/mbuf.h>
92 #include <sys/malloc.h>
93 #include <sys/kernel.h>
94 #include <sys/device.h>
95 #include <sys/timeout.h>
96 #include <sys/socket.h>
97
98 #include <net/if.h>
99 #include <net/if_dl.h>
100 #include <net/if_media.h>
101
102 #ifdef INET
103 #include <netinet/in.h>
104 #include <netinet/in_systm.h>
105 #include <netinet/in_var.h>
106 #include <netinet/ip.h>
107 #include <netinet/if_ether.h>
108 #endif
109
110 #if NVLAN > 0
111 #include <net/if_types.h>
112 #include <net/if_vlan_var.h>
113 #endif
114
115 #if NBPFILTER > 0
116 #include <net/bpf.h>
117 #endif
118
119 #include <dev/mii/mii.h>
120 #include <dev/mii/miivar.h>
121
122 #include <dev/pci/pcireg.h>
123 #include <dev/pci/pcivar.h>
124 #include <dev/pci/pcidevs.h>
125
126 #include <dev/pci/if_vgereg.h>
127 #include <dev/pci/if_vgevar.h>
128
129 int vge_probe (struct device *, void *, void *);
130 void vge_attach (struct device *, struct device *, void *);
131
132 int vge_encap (struct vge_softc *, struct mbuf *, int);
133
134 int vge_allocmem (struct vge_softc *);
135 int vge_newbuf (struct vge_softc *, int, struct mbuf *);
136 int vge_rx_list_init (struct vge_softc *);
137 int vge_tx_list_init (struct vge_softc *);
138 void vge_rxeof (struct vge_softc *);
139 void vge_txeof (struct vge_softc *);
140 int vge_intr (void *);
141 void vge_tick (void *);
142 void vge_start (struct ifnet *);
143 int vge_ioctl (struct ifnet *, u_long, caddr_t);
144 int vge_init (struct ifnet *);
145 void vge_stop (struct vge_softc *);
146 void vge_watchdog (struct ifnet *);
147 int vge_ifmedia_upd (struct ifnet *);
148 void vge_ifmedia_sts (struct ifnet *, struct ifmediareq *);
149
150 #ifdef VGE_EEPROM
151 void vge_eeprom_getword (struct vge_softc *, int, u_int16_t *);
152 #endif
153 void vge_read_eeprom (struct vge_softc *, caddr_t, int, int, int);
154
155 void vge_miipoll_start (struct vge_softc *);
156 void vge_miipoll_stop (struct vge_softc *);
157 int vge_miibus_readreg (struct device *, int, int);
158 void vge_miibus_writereg (struct device *, int, int, int);
159 void vge_miibus_statchg (struct device *);
160
161 void vge_cam_clear (struct vge_softc *);
162 int vge_cam_set (struct vge_softc *, uint8_t *);
163 void vge_setmulti (struct vge_softc *);
164 void vge_reset (struct vge_softc *);
165
166 struct cfattach vge_ca = {
167 sizeof(struct vge_softc), vge_probe, vge_attach
168 };
169
170 struct cfdriver vge_cd = {
171 0, "vge", DV_IFNET
172 };
173
174 #define VGE_PCI_LOIO 0x10
175 #define VGE_PCI_LOMEM 0x14
176
177 int vge_debug = 0;
178 #define DPRINTF(x) if (vge_debug) printf x
179 #define DPRINTFN(n, x) if (vge_debug >= (n)) printf x
180
181 const struct pci_matchid vge_devices[] = {
182 { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_VT612x },
183 };
184
185 #ifdef VGE_EEPROM
186
187
188
189 void
190 vge_eeprom_getword(struct vge_softc *sc, int addr, u_int16_t *dest)
191 {
192 int i;
193 u_int16_t word = 0;
194
195
196
197
198
199
200 CSR_SETBIT_1(sc, VGE_CHIPCFG2, VGE_CHIPCFG2_EELOAD);
201 CSR_SETBIT_1(sc, VGE_EECSR, VGE_EECSR_EMBP);
202
203
204 CSR_WRITE_1(sc, VGE_EEADDR, addr);
205
206
207 CSR_SETBIT_1(sc, VGE_EECMD, VGE_EECMD_ERD);
208
209
210 for (i = 0; i < VGE_TIMEOUT; i++) {
211 if (CSR_READ_1(sc, VGE_EECMD) & VGE_EECMD_EDONE)
212 break;
213 }
214
215 if (i == VGE_TIMEOUT) {
216 printf("%s: EEPROM read timed out\n", sc->vge_dev.dv_xname);
217 *dest = 0;
218 return;
219 }
220
221
222 word = CSR_READ_2(sc, VGE_EERDDAT);
223
224
225 CSR_CLRBIT_1(sc, VGE_EECSR, VGE_EECSR_EMBP);
226 CSR_CLRBIT_1(sc, VGE_CHIPCFG2, VGE_CHIPCFG2_EELOAD);
227
228 *dest = word;
229 }
230 #endif
231
232
233
234
235 void
236 vge_read_eeprom(struct vge_softc *sc, caddr_t dest, int off, int cnt,
237 int swap)
238 {
239 int i;
240 #ifdef VGE_EEPROM
241 u_int16_t word = 0, *ptr;
242
243 for (i = 0; i < cnt; i++) {
244 vge_eeprom_getword(sc, off + i, &word);
245 ptr = (u_int16_t *)(dest + (i * 2));
246 if (swap)
247 *ptr = ntohs(word);
248 else
249 *ptr = word;
250 }
251 #else
252 for (i = 0; i < ETHER_ADDR_LEN; i++)
253 dest[i] = CSR_READ_1(sc, VGE_PAR0 + i);
254 #endif
255 }
256
257 void
258 vge_miipoll_stop(struct vge_softc *sc)
259 {
260 int i;
261
262 CSR_WRITE_1(sc, VGE_MIICMD, 0);
263
264 for (i = 0; i < VGE_TIMEOUT; i++) {
265 DELAY(1);
266 if (CSR_READ_1(sc, VGE_MIISTS) & VGE_MIISTS_IIDL)
267 break;
268 }
269
270 if (i == VGE_TIMEOUT)
271 printf("%s: failed to idle MII autopoll\n", sc->vge_dev.dv_xname);
272 }
273
274 void
275 vge_miipoll_start(struct vge_softc *sc)
276 {
277 int i;
278
279
280
281 CSR_WRITE_1(sc, VGE_MIICMD, 0);
282 CSR_WRITE_1(sc, VGE_MIIADDR, VGE_MIIADDR_SWMPL);
283
284 for (i = 0; i < VGE_TIMEOUT; i++) {
285 DELAY(1);
286 if (CSR_READ_1(sc, VGE_MIISTS) & VGE_MIISTS_IIDL)
287 break;
288 }
289
290 if (i == VGE_TIMEOUT) {
291 printf("%s: failed to idle MII autopoll\n", sc->vge_dev.dv_xname);
292 return;
293 }
294
295
296
297 CSR_WRITE_1(sc, VGE_MIICMD, VGE_MIICMD_MAUTO);
298
299
300
301 for (i = 0; i < VGE_TIMEOUT; i++) {
302 DELAY(1);
303 if ((CSR_READ_1(sc, VGE_MIISTS) & VGE_MIISTS_IIDL) == 0)
304 break;
305 }
306
307 if (i == VGE_TIMEOUT)
308 printf("%s: failed to start MII autopoll\n", sc->vge_dev.dv_xname);
309 }
310
311 int
312 vge_miibus_readreg(struct device *dev, int phy, int reg)
313 {
314 struct vge_softc *sc = (struct vge_softc *)dev;
315 int i, s;
316 u_int16_t rval = 0;
317
318 if (phy != (CSR_READ_1(sc, VGE_MIICFG) & 0x1F))
319 return(0);
320
321 s = splnet();
322
323 vge_miipoll_stop(sc);
324
325
326 CSR_WRITE_1(sc, VGE_MIIADDR, reg);
327
328
329 CSR_SETBIT_1(sc, VGE_MIICMD, VGE_MIICMD_RCMD);
330
331
332 for (i = 0; i < VGE_TIMEOUT; i++) {
333 DELAY(1);
334 if ((CSR_READ_1(sc, VGE_MIICMD) & VGE_MIICMD_RCMD) == 0)
335 break;
336 }
337
338 if (i == VGE_TIMEOUT)
339 printf("%s: MII read timed out\n", sc->vge_dev.dv_xname);
340 else
341 rval = CSR_READ_2(sc, VGE_MIIDATA);
342
343 vge_miipoll_start(sc);
344 splx(s);
345
346 return (rval);
347 }
348
349 void
350 vge_miibus_writereg(struct device *dev, int phy, int reg, int data)
351 {
352 struct vge_softc *sc = (struct vge_softc *)dev;
353 int i, s;
354
355 if (phy != (CSR_READ_1(sc, VGE_MIICFG) & 0x1F))
356 return;
357
358 s = splnet();
359 vge_miipoll_stop(sc);
360
361
362 CSR_WRITE_1(sc, VGE_MIIADDR, reg);
363
364
365 CSR_WRITE_2(sc, VGE_MIIDATA, data);
366
367
368 CSR_SETBIT_1(sc, VGE_MIICMD, VGE_MIICMD_WCMD);
369
370
371 for (i = 0; i < VGE_TIMEOUT; i++) {
372 DELAY(1);
373 if ((CSR_READ_1(sc, VGE_MIICMD) & VGE_MIICMD_WCMD) == 0)
374 break;
375 }
376
377 if (i == VGE_TIMEOUT) {
378 printf("%s: MII write timed out\n", sc->vge_dev.dv_xname);
379 }
380
381 vge_miipoll_start(sc);
382 splx(s);
383 }
384
385 void
386 vge_cam_clear(struct vge_softc *sc)
387 {
388 int i;
389
390
391
392
393
394
395
396 CSR_CLRBIT_1(sc, VGE_CAMCTL, VGE_CAMCTL_PAGESEL);
397 CSR_SETBIT_1(sc, VGE_CAMCTL, VGE_PAGESEL_CAMMASK);
398 CSR_WRITE_1(sc, VGE_CAMADDR, VGE_CAMADDR_ENABLE);
399 for (i = 0; i < 8; i++)
400 CSR_WRITE_1(sc, VGE_CAM0 + i, 0);
401
402
403
404 CSR_WRITE_1(sc, VGE_CAMADDR, VGE_CAMADDR_ENABLE|VGE_CAMADDR_AVSEL|0);
405 for (i = 0; i < 8; i++)
406 CSR_WRITE_1(sc, VGE_CAM0 + i, 0);
407
408 CSR_WRITE_1(sc, VGE_CAMADDR, 0);
409 CSR_CLRBIT_1(sc, VGE_CAMCTL, VGE_CAMCTL_PAGESEL);
410 CSR_SETBIT_1(sc, VGE_CAMCTL, VGE_PAGESEL_MAR);
411
412 sc->vge_camidx = 0;
413 }
414
415 int
416 vge_cam_set(struct vge_softc *sc, uint8_t *addr)
417 {
418 int i, error = 0;
419
420 if (sc->vge_camidx == VGE_CAM_MAXADDRS)
421 return(ENOSPC);
422
423
424 CSR_CLRBIT_1(sc, VGE_CAMCTL, VGE_CAMCTL_PAGESEL);
425 CSR_SETBIT_1(sc, VGE_CAMCTL, VGE_PAGESEL_CAMDATA);
426
427
428 CSR_WRITE_1(sc, VGE_CAMADDR, VGE_CAMADDR_ENABLE|sc->vge_camidx);
429
430
431 for (i = 0; i < ETHER_ADDR_LEN; i++)
432 CSR_WRITE_1(sc, VGE_CAM0 + i, addr[i]);
433
434
435 CSR_SETBIT_1(sc, VGE_CAMCTL, VGE_CAMCTL_WRITE);
436
437
438 for (i = 0; i < VGE_TIMEOUT; i++) {
439 DELAY(1);
440 if ((CSR_READ_1(sc, VGE_CAMCTL) & VGE_CAMCTL_WRITE) == 0)
441 break;
442 }
443
444 if (i == VGE_TIMEOUT) {
445 printf("%s: setting CAM filter failed\n", sc->vge_dev.dv_xname);
446 error = EIO;
447 goto fail;
448 }
449
450
451 CSR_CLRBIT_1(sc, VGE_CAMCTL, VGE_CAMCTL_PAGESEL);
452 CSR_SETBIT_1(sc, VGE_CAMCTL, VGE_PAGESEL_CAMMASK);
453
454
455 CSR_SETBIT_1(sc, VGE_CAM0 + (sc->vge_camidx/8),
456 1<<(sc->vge_camidx & 7));
457
458 sc->vge_camidx++;
459
460 fail:
461
462 CSR_WRITE_1(sc, VGE_CAMADDR, 0);
463 CSR_CLRBIT_1(sc, VGE_CAMCTL, VGE_CAMCTL_PAGESEL);
464 CSR_SETBIT_1(sc, VGE_CAMCTL, VGE_PAGESEL_MAR);
465
466 return (error);
467 }
468
469
470
471
472
473
474 void
475 vge_setmulti(struct vge_softc *sc)
476 {
477 struct arpcom *ac = &sc->arpcom;
478 struct ifnet *ifp = &ac->ac_if;
479 struct ether_multi *enm;
480 struct ether_multistep step;
481 int error;
482 u_int32_t h = 0, hashes[2] = { 0, 0 };
483
484
485 vge_cam_clear(sc);
486 CSR_WRITE_4(sc, VGE_MAR0, 0);
487 CSR_WRITE_4(sc, VGE_MAR1, 0);
488 ifp->if_flags &= ~IFF_ALLMULTI;
489
490
491
492
493
494 if (ifp->if_flags & IFF_PROMISC) {
495 allmulti:
496 CSR_WRITE_4(sc, VGE_MAR0, 0xFFFFFFFF);
497 CSR_WRITE_4(sc, VGE_MAR1, 0xFFFFFFFF);
498 ifp->if_flags |= IFF_ALLMULTI;
499 return;
500 }
501
502
503 ETHER_FIRST_MULTI(step, ac, enm);
504 while (enm != NULL) {
505 if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN))
506 goto allmulti;
507
508 error = vge_cam_set(sc, enm->enm_addrlo);
509 if (error)
510 break;
511
512 ETHER_NEXT_MULTI(step, enm);
513 }
514
515
516 if (error) {
517 vge_cam_clear(sc);
518
519 ETHER_FIRST_MULTI(step, ac, enm);
520 while (enm != NULL) {
521 h = ether_crc32_be(enm->enm_addrlo,
522 ETHER_ADDR_LEN) >> 26;
523 hashes[h >> 5] |= 1 << (h & 0x1f);
524
525 ETHER_NEXT_MULTI(step, enm);
526 }
527
528 CSR_WRITE_4(sc, VGE_MAR0, hashes[0]);
529 CSR_WRITE_4(sc, VGE_MAR1, hashes[1]);
530 }
531 }
532
533 void
534 vge_reset(struct vge_softc *sc)
535 {
536 int i;
537
538 CSR_WRITE_1(sc, VGE_CRS1, VGE_CR1_SOFTRESET);
539
540 for (i = 0; i < VGE_TIMEOUT; i++) {
541 DELAY(5);
542 if ((CSR_READ_1(sc, VGE_CRS1) & VGE_CR1_SOFTRESET) == 0)
543 break;
544 }
545
546 if (i == VGE_TIMEOUT) {
547 printf("%s: soft reset timed out", sc->vge_dev.dv_xname);
548 CSR_WRITE_1(sc, VGE_CRS3, VGE_CR3_STOP_FORCE);
549 DELAY(2000);
550 }
551
552 DELAY(5000);
553
554 CSR_SETBIT_1(sc, VGE_EECSR, VGE_EECSR_RELOAD);
555
556 for (i = 0; i < VGE_TIMEOUT; i++) {
557 DELAY(5);
558 if ((CSR_READ_1(sc, VGE_EECSR) & VGE_EECSR_RELOAD) == 0)
559 break;
560 }
561
562 if (i == VGE_TIMEOUT) {
563 printf("%s: EEPROM reload timed out\n", sc->vge_dev.dv_xname);
564 return;
565 }
566
567 CSR_CLRBIT_1(sc, VGE_CHIPCFG0, VGE_CHIPCFG0_PACPI);
568 }
569
570
571
572
573
574 int
575 vge_probe(struct device *dev, void *match, void *aux)
576 {
577 return (pci_matchbyid((struct pci_attach_args *)aux, vge_devices,
578 sizeof(vge_devices)/sizeof(vge_devices[0])));
579 }
580
581
582
583
584 int
585 vge_allocmem(struct vge_softc *sc)
586 {
587 int nseg, rseg;
588 int i, error;
589
590 nseg = 32;
591
592
593
594 error = bus_dmamap_create(sc->sc_dmat, VGE_TX_LIST_SZ, 1,
595 VGE_TX_LIST_SZ, 0, BUS_DMA_ALLOCNOW,
596 &sc->vge_ldata.vge_tx_list_map);
597 if (error)
598 return (ENOMEM);
599 error = bus_dmamem_alloc(sc->sc_dmat, VGE_TX_LIST_SZ,
600 ETHER_ALIGN, 0,
601 &sc->vge_ldata.vge_tx_listseg, 1, &rseg, BUS_DMA_NOWAIT);
602 if (error) {
603 printf("%s: can't alloc TX list\n", sc->vge_dev.dv_xname);
604 return (ENOMEM);
605 }
606
607
608 error = bus_dmamem_map(sc->sc_dmat, &sc->vge_ldata.vge_tx_listseg,
609 1, VGE_TX_LIST_SZ,
610 (caddr_t *)&sc->vge_ldata.vge_tx_list, BUS_DMA_NOWAIT);
611 memset(sc->vge_ldata.vge_tx_list, 0, VGE_TX_LIST_SZ);
612 if (error) {
613 printf("%s: can't map TX dma buffers\n",
614 sc->vge_dev.dv_xname);
615 bus_dmamem_free(sc->sc_dmat, &sc->vge_ldata.vge_tx_listseg, rseg);
616 return (ENOMEM);
617 }
618
619 error = bus_dmamap_load(sc->sc_dmat, sc->vge_ldata.vge_tx_list_map,
620 sc->vge_ldata.vge_tx_list, VGE_TX_LIST_SZ, NULL, BUS_DMA_NOWAIT);
621 if (error) {
622 printf("%s: can't load TX dma map\n", sc->vge_dev.dv_xname);
623 bus_dmamap_destroy(sc->sc_dmat, sc->vge_ldata.vge_tx_list_map);
624 bus_dmamem_unmap(sc->sc_dmat, (caddr_t)sc->vge_ldata.vge_tx_list,
625 VGE_TX_LIST_SZ);
626 bus_dmamem_free(sc->sc_dmat, &sc->vge_ldata.vge_tx_listseg, rseg);
627 return (ENOMEM);
628 }
629
630
631
632 for (i = 0; i < VGE_TX_DESC_CNT; i++) {
633 error = bus_dmamap_create(sc->sc_dmat, MCLBYTES * nseg, nseg,
634 MCLBYTES, 0, BUS_DMA_ALLOCNOW,
635 &sc->vge_ldata.vge_tx_dmamap[i]);
636 if (error) {
637 printf("%s: can't create DMA map for TX\n",
638 sc->vge_dev.dv_xname);
639 return (ENOMEM);
640 }
641 }
642
643
644
645 error = bus_dmamap_create(sc->sc_dmat, VGE_RX_LIST_SZ, 1,
646 VGE_RX_LIST_SZ, 0, BUS_DMA_ALLOCNOW,
647 &sc->vge_ldata.vge_rx_list_map);
648 if (error)
649 return (ENOMEM);
650 error = bus_dmamem_alloc(sc->sc_dmat, VGE_RX_LIST_SZ, VGE_RING_ALIGN,
651 0, &sc->vge_ldata.vge_rx_listseg, 1, &rseg, BUS_DMA_NOWAIT);
652 if (error) {
653 printf("%s: can't alloc RX list\n", sc->vge_dev.dv_xname);
654 return (ENOMEM);
655 }
656
657
658
659 error = bus_dmamem_map(sc->sc_dmat, &sc->vge_ldata.vge_rx_listseg,
660 1, VGE_RX_LIST_SZ,
661 (caddr_t *)&sc->vge_ldata.vge_rx_list, BUS_DMA_NOWAIT);
662 memset(sc->vge_ldata.vge_rx_list, 0, VGE_RX_LIST_SZ);
663 if (error) {
664 printf("%s: can't map RX dma buffers\n",
665 sc->vge_dev.dv_xname);
666 bus_dmamem_free(sc->sc_dmat, &sc->vge_ldata.vge_rx_listseg, rseg);
667 return (ENOMEM);
668 }
669 error = bus_dmamap_load(sc->sc_dmat, sc->vge_ldata.vge_rx_list_map,
670 sc->vge_ldata.vge_rx_list, VGE_RX_LIST_SZ, NULL, BUS_DMA_NOWAIT);
671 if (error) {
672 printf("%s: can't load RX dma map\n", sc->vge_dev.dv_xname);
673 bus_dmamap_destroy(sc->sc_dmat, sc->vge_ldata.vge_rx_list_map);
674 bus_dmamem_unmap(sc->sc_dmat, (caddr_t)sc->vge_ldata.vge_rx_list,
675 VGE_RX_LIST_SZ);
676 bus_dmamem_free(sc->sc_dmat, &sc->vge_ldata.vge_rx_listseg, rseg);
677 return (ENOMEM);
678 }
679
680
681
682 for (i = 0; i < VGE_RX_DESC_CNT; i++) {
683 error = bus_dmamap_create(sc->sc_dmat, MCLBYTES * nseg, nseg,
684 MCLBYTES, 0, BUS_DMA_ALLOCNOW,
685 &sc->vge_ldata.vge_rx_dmamap[i]);
686 if (error) {
687 printf("%s: can't create DMA map for RX\n",
688 sc->vge_dev.dv_xname);
689 return (ENOMEM);
690 }
691 }
692
693 return (0);
694 }
695
696
697
698
699
700 void
701 vge_attach(struct device *parent, struct device *self, void *aux)
702 {
703 u_char eaddr[ETHER_ADDR_LEN];
704 u_int16_t as[3];
705 struct vge_softc *sc = (struct vge_softc *)self;
706 struct pci_attach_args *pa = aux;
707 pci_chipset_tag_t pc = pa->pa_pc;
708 pci_intr_handle_t ih;
709 const char *intrstr = NULL;
710 struct ifnet *ifp;
711 int error = 0, i;
712 bus_size_t iosize;
713
714
715
716
717 if (pci_mapreg_map(pa, VGE_PCI_LOMEM, PCI_MAPREG_TYPE_MEM, 0,
718 &sc->vge_btag, &sc->vge_bhandle, NULL, &iosize, 0)) {
719 if (pci_mapreg_map(pa, VGE_PCI_LOIO, PCI_MAPREG_TYPE_IO, 0,
720 &sc->vge_btag, &sc->vge_bhandle, NULL, &iosize, 0)) {
721 printf(": can't map mem or i/o space\n");
722 return;
723 }
724 }
725
726
727 if (pci_intr_map(pa, &ih)) {
728 printf(": couldn't map interrupt\n");
729 return;
730 }
731 intrstr = pci_intr_string(pc, ih);
732 sc->vge_intrhand = pci_intr_establish(pc, ih, IPL_NET, vge_intr, sc,
733 sc->vge_dev.dv_xname);
734 if (sc->vge_intrhand == NULL) {
735 printf(": couldn't establish interrupt");
736 if (intrstr != NULL)
737 printf(" at %s", intrstr);
738 return;
739 }
740 printf(": %s", intrstr);
741
742 sc->sc_dmat = pa->pa_dmat;
743
744
745 vge_reset(sc);
746
747
748
749
750 vge_read_eeprom(sc, (caddr_t)as, VGE_EE_EADDR, 3, 0);
751 for (i = 0; i < 3; i++) {
752 eaddr[(i * 2) + 0] = as[i] & 0xff;
753 eaddr[(i * 2) + 1] = as[i] >> 8;
754 }
755
756 bcopy(eaddr, (char *)&sc->arpcom.ac_enaddr, ETHER_ADDR_LEN);
757
758 printf(", address %s\n",
759 ether_sprintf(sc->arpcom.ac_enaddr));
760
761 error = vge_allocmem(sc);
762
763 if (error)
764 return;
765
766 ifp = &sc->arpcom.ac_if;
767 ifp->if_softc = sc;
768 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
769 ifp->if_ioctl = vge_ioctl;
770 ifp->if_start = vge_start;
771 ifp->if_watchdog = vge_watchdog;
772 ifp->if_init = vge_init;
773 ifp->if_baudrate = 1000000000;
774 #ifdef VGE_JUMBO
775 ifp->if_hardmtu = VGE_JUMBO_MTU;
776 #endif
777 IFQ_SET_MAXLEN(&ifp->if_snd, VGE_IFQ_MAXLEN);
778 IFQ_SET_READY(&ifp->if_snd);
779
780 ifp->if_capabilities = IFCAP_VLAN_MTU | IFCAP_CSUM_IPv4 |
781 IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4;
782
783 #ifdef VGE_VLAN
784 ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING;
785 #endif
786
787
788 strlcpy(ifp->if_xname, sc->vge_dev.dv_xname, IFNAMSIZ);
789
790
791 sc->sc_mii.mii_ifp = ifp;
792 sc->sc_mii.mii_readreg = vge_miibus_readreg;
793 sc->sc_mii.mii_writereg = vge_miibus_writereg;
794 sc->sc_mii.mii_statchg = vge_miibus_statchg;
795 ifmedia_init(&sc->sc_mii.mii_media, 0,
796 vge_ifmedia_upd, vge_ifmedia_sts);
797 mii_attach(self, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
798 MII_OFFSET_ANY, 0);
799 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) {
800 printf("%s: no PHY found!\n", sc->vge_dev.dv_xname);
801 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|IFM_MANUAL,
802 0, NULL);
803 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_MANUAL);
804 } else
805 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO);
806
807 timeout_set(&sc->timer_handle, vge_tick, sc);
808
809
810
811
812 if_attach(ifp);
813 ether_ifattach(ifp);
814 }
815
816 int
817 vge_newbuf(struct vge_softc *sc, int idx, struct mbuf *m)
818 {
819 struct mbuf *m_new = NULL;
820 struct vge_rx_desc *r;
821 bus_dmamap_t rxmap = sc->vge_ldata.vge_rx_dmamap[idx];
822 int i;
823
824 if (m == NULL) {
825
826 MGETHDR(m_new, M_DONTWAIT, MT_DATA);
827 if (m_new == NULL)
828 return (ENOBUFS);
829
830
831 MCLGET(m_new, M_DONTWAIT);
832 if (!(m_new->m_flags & M_EXT)) {
833 m_freem(m_new);
834 return (ENOBUFS);
835 }
836 } else
837 m_new->m_data = m_new->m_ext.ext_buf;
838
839 m_new->m_len = m_new->m_pkthdr.len = MCLBYTES;
840
841
842
843 if (bus_dmamap_load_mbuf(sc->sc_dmat, rxmap, m_new, BUS_DMA_NOWAIT))
844 return (ENOBUFS);
845
846 if (rxmap->dm_nsegs > 1)
847 goto out;
848
849
850 r = &sc->vge_ldata.vge_rx_list[idx];
851
852 if (letoh32(r->vge_sts) & VGE_RDSTS_OWN) {
853 printf("%s: tried to map a busy RX descriptor\n",
854 sc->vge_dev.dv_xname);
855 goto out;
856 }
857 r->vge_buflen = htole16(VGE_BUFLEN(rxmap->dm_segs[0].ds_len) | VGE_RXDESC_I);
858 r->vge_addrlo = htole32(VGE_ADDR_LO(rxmap->dm_segs[0].ds_addr));
859 r->vge_addrhi = htole16(VGE_ADDR_HI(rxmap->dm_segs[0].ds_addr) & 0xFFFF);
860 r->vge_sts = htole32(0);
861 r->vge_ctl = htole32(0);
862
863
864
865
866
867
868
869
870
871 #define VGE_RXCHUNK 4
872 sc->vge_rx_consumed++;
873 if (sc->vge_rx_consumed == VGE_RXCHUNK) {
874 for (i = idx; i != idx - sc->vge_rx_consumed; i--)
875 sc->vge_ldata.vge_rx_list[i].vge_sts |=
876 htole32(VGE_RDSTS_OWN);
877 sc->vge_rx_consumed = 0;
878 }
879
880 sc->vge_ldata.vge_rx_mbuf[idx] = m_new;
881
882 bus_dmamap_sync(sc->sc_dmat, rxmap, 0,
883 rxmap->dm_mapsize, BUS_DMASYNC_PREREAD);
884
885 return (0);
886 out:
887 DPRINTF(("vge_newbuf: out of memory\n"));
888 if (m_new != NULL)
889 m_freem(m_new);
890 return (ENOMEM);
891 }
892
893 int
894 vge_tx_list_init(struct vge_softc *sc)
895 {
896 bzero ((char *)sc->vge_ldata.vge_tx_list, VGE_TX_LIST_SZ);
897 bzero ((char *)&sc->vge_ldata.vge_tx_mbuf,
898 (VGE_TX_DESC_CNT * sizeof(struct mbuf *)));
899
900 bus_dmamap_sync(sc->sc_dmat,
901 sc->vge_ldata.vge_tx_list_map, 0,
902 sc->vge_ldata.vge_tx_list_map->dm_mapsize,
903 BUS_DMASYNC_PREWRITE);
904 sc->vge_ldata.vge_tx_prodidx = 0;
905 sc->vge_ldata.vge_tx_considx = 0;
906 sc->vge_ldata.vge_tx_free = VGE_TX_DESC_CNT;
907
908 return (0);
909 }
910
911
912
913 int
914 vge_rx_list_init(struct vge_softc *sc)
915 {
916 int i;
917
918 bzero ((char *)sc->vge_ldata.vge_rx_list, VGE_RX_LIST_SZ);
919 bzero ((char *)&sc->vge_ldata.vge_rx_mbuf,
920 (VGE_RX_DESC_CNT * sizeof(struct mbuf *)));
921
922 sc->vge_rx_consumed = 0;
923
924 for (i = 0; i < VGE_RX_DESC_CNT; i++) {
925 if (vge_newbuf(sc, i, NULL) == ENOBUFS)
926 return (ENOBUFS);
927 }
928
929
930
931 bus_dmamap_sync(sc->sc_dmat,
932 sc->vge_ldata.vge_rx_list_map,
933 0, sc->vge_ldata.vge_rx_list_map->dm_mapsize,
934 BUS_DMASYNC_PREWRITE|BUS_DMASYNC_PREREAD);
935
936 sc->vge_ldata.vge_rx_prodidx = 0;
937 sc->vge_rx_consumed = 0;
938 sc->vge_head = sc->vge_tail = NULL;
939
940 return (0);
941 }
942
943
944
945
946
947 void
948 vge_rxeof(struct vge_softc *sc)
949 {
950 struct mbuf *m;
951 struct ifnet *ifp;
952 int i, total_len;
953 int lim = 0;
954 struct vge_rx_desc *cur_rx;
955 u_int32_t rxstat, rxctl;
956
957 ifp = &sc->arpcom.ac_if;
958 i = sc->vge_ldata.vge_rx_prodidx;
959
960
961
962 bus_dmamap_sync(sc->sc_dmat,
963 sc->vge_ldata.vge_rx_list_map,
964 0, sc->vge_ldata.vge_rx_list_map->dm_mapsize,
965 BUS_DMASYNC_POSTREAD);
966
967 while (!VGE_OWN(&sc->vge_ldata.vge_rx_list[i])) {
968 struct mbuf *m0 = NULL;
969
970 cur_rx = &sc->vge_ldata.vge_rx_list[i];
971 m = sc->vge_ldata.vge_rx_mbuf[i];
972 total_len = VGE_RXBYTES(cur_rx);
973 rxstat = letoh32(cur_rx->vge_sts);
974 rxctl = letoh32(cur_rx->vge_ctl);
975
976
977
978 bus_dmamap_sync(sc->sc_dmat,
979 sc->vge_ldata.vge_rx_dmamap[i],
980 0, sc->vge_ldata.vge_rx_dmamap[i]->dm_mapsize,
981 BUS_DMASYNC_POSTWRITE);
982 bus_dmamap_unload(sc->sc_dmat,
983 sc->vge_ldata.vge_rx_dmamap[i]);
984
985
986
987
988
989
990
991 if (rxstat & VGE_RXPKT_SOF) {
992 DPRINTF(("vge_rxeof: SOF\n"));
993 m->m_len = MCLBYTES;
994 if (sc->vge_head == NULL)
995 sc->vge_head = sc->vge_tail = m;
996 else {
997 m->m_flags &= ~M_PKTHDR;
998 sc->vge_tail->m_next = m;
999 sc->vge_tail = m;
1000 }
1001 vge_newbuf(sc, i, NULL);
1002 VGE_RX_DESC_INC(i);
1003 continue;
1004 }
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015 if (!(rxstat & VGE_RDSTS_RXOK) && !(rxstat & VGE_RDSTS_VIDM)
1016 && !(rxstat & VGE_RDSTS_CSUMERR)) {
1017 ifp->if_ierrors++;
1018
1019
1020
1021
1022 if (sc->vge_head != NULL) {
1023 m_freem(sc->vge_head);
1024 sc->vge_head = sc->vge_tail = NULL;
1025 }
1026 vge_newbuf(sc, i, m);
1027 VGE_RX_DESC_INC(i);
1028 continue;
1029 }
1030
1031
1032
1033
1034
1035
1036 if (vge_newbuf(sc, i, NULL) == ENOBUFS) {
1037 if (sc->vge_head != NULL) {
1038 m_freem(sc->vge_head);
1039 sc->vge_head = sc->vge_tail = NULL;
1040 }
1041
1042 m0 = m_devget(mtod(m, char *) - ETHER_ALIGN,
1043 total_len - ETHER_CRC_LEN + ETHER_ALIGN,
1044 0, ifp, NULL);
1045 vge_newbuf(sc, i, m);
1046 if (m0 == NULL) {
1047 ifp->if_ierrors++;
1048 continue;
1049 }
1050 m_adj(m0, ETHER_ALIGN);
1051 m = m0;
1052
1053 VGE_RX_DESC_INC(i);
1054 continue;
1055 }
1056
1057 VGE_RX_DESC_INC(i);
1058
1059 if (sc->vge_head != NULL) {
1060 m->m_len = total_len % MCLBYTES;
1061
1062
1063
1064
1065
1066
1067 if (m->m_len <= ETHER_CRC_LEN) {
1068 sc->vge_tail->m_len -=
1069 (ETHER_CRC_LEN - m->m_len);
1070 m_freem(m);
1071 } else {
1072 m->m_len -= ETHER_CRC_LEN;
1073 m->m_flags &= ~M_PKTHDR;
1074 sc->vge_tail->m_next = m;
1075 }
1076 m = sc->vge_head;
1077 sc->vge_head = sc->vge_tail = NULL;
1078 m->m_pkthdr.len = total_len - ETHER_CRC_LEN;
1079 } else
1080 m->m_pkthdr.len = m->m_len =
1081 (total_len - ETHER_CRC_LEN);
1082
1083 #ifdef __STRICT_ALIGNMENT
1084 bcopy(m->m_data, m->m_data + ETHER_ALIGN,
1085 total_len);
1086 m->m_data += ETHER_ALIGN;
1087 #endif
1088 ifp->if_ipackets++;
1089 m->m_pkthdr.rcvif = ifp;
1090
1091
1092
1093
1094 if ((rxctl & VGE_RDCTL_IPPKT) &&
1095 (rxctl & VGE_RDCTL_IPCSUMOK))
1096 m->m_pkthdr.csum_flags |= M_IPV4_CSUM_IN_OK;
1097
1098
1099 if ((rxctl & (VGE_RDCTL_TCPPKT|VGE_RDCTL_UDPPKT)) &&
1100 (rxctl & VGE_RDCTL_PROTOCSUMOK))
1101 m->m_pkthdr.csum_flags |= M_TCP_CSUM_IN_OK | M_UDP_CSUM_IN_OK;
1102
1103 #if NBPFILTER > 0
1104 if (ifp->if_bpf)
1105 bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_IN);
1106 #endif
1107 ether_input_mbuf(ifp, m);
1108
1109 lim++;
1110 if (lim == VGE_RX_DESC_CNT)
1111 break;
1112 }
1113
1114
1115 bus_dmamap_sync(sc->sc_dmat,
1116 sc->vge_ldata.vge_rx_list_map,
1117 0, sc->vge_ldata.vge_rx_list_map->dm_mapsize,
1118 BUS_DMASYNC_PREWRITE|BUS_DMASYNC_PREREAD);
1119
1120 sc->vge_ldata.vge_rx_prodidx = i;
1121 CSR_WRITE_2(sc, VGE_RXDESC_RESIDUECNT, lim);
1122 }
1123
1124 void
1125 vge_txeof(struct vge_softc *sc)
1126 {
1127 struct ifnet *ifp;
1128 u_int32_t txstat;
1129 int idx;
1130
1131 ifp = &sc->arpcom.ac_if;
1132 idx = sc->vge_ldata.vge_tx_considx;
1133
1134
1135
1136 bus_dmamap_sync(sc->sc_dmat,
1137 sc->vge_ldata.vge_tx_list_map,
1138 0, sc->vge_ldata.vge_tx_list_map->dm_mapsize,
1139 BUS_DMASYNC_POSTREAD);
1140
1141
1142 while (idx != sc->vge_ldata.vge_tx_prodidx) {
1143 txstat = letoh32(sc->vge_ldata.vge_tx_list[idx].vge_sts);
1144 if (txstat & VGE_TDSTS_OWN)
1145 break;
1146
1147 m_freem(sc->vge_ldata.vge_tx_mbuf[idx]);
1148 sc->vge_ldata.vge_tx_mbuf[idx] = NULL;
1149 bus_dmamap_unload(sc->sc_dmat,
1150 sc->vge_ldata.vge_tx_dmamap[idx]);
1151 if (txstat & (VGE_TDSTS_EXCESSCOLL|VGE_TDSTS_COLL))
1152 ifp->if_collisions++;
1153 if (txstat & VGE_TDSTS_TXERR)
1154 ifp->if_oerrors++;
1155 else
1156 ifp->if_opackets++;
1157
1158 sc->vge_ldata.vge_tx_free++;
1159 VGE_TX_DESC_INC(idx);
1160 }
1161
1162
1163
1164 if (idx != sc->vge_ldata.vge_tx_considx) {
1165 sc->vge_ldata.vge_tx_considx = idx;
1166 ifp->if_flags &= ~IFF_OACTIVE;
1167 ifp->if_timer = 0;
1168 }
1169
1170
1171
1172
1173
1174
1175
1176 if (sc->vge_ldata.vge_tx_free != VGE_TX_DESC_CNT)
1177 CSR_WRITE_1(sc, VGE_CRS1, VGE_CR1_TIMER0_ENABLE);
1178 }
1179
1180 void
1181 vge_tick(void *xsc)
1182 {
1183 struct vge_softc *sc = xsc;
1184 struct ifnet *ifp = &sc->arpcom.ac_if;
1185 struct mii_data *mii = &sc->sc_mii;
1186 int s;
1187
1188 s = splnet();
1189
1190 mii_tick(mii);
1191
1192 if (sc->vge_link) {
1193 if (!(mii->mii_media_status & IFM_ACTIVE)) {
1194 sc->vge_link = 0;
1195 ifp->if_link_state = LINK_STATE_DOWN;
1196 if_link_state_change(ifp);
1197 }
1198 } else {
1199 if (mii->mii_media_status & IFM_ACTIVE &&
1200 IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
1201 sc->vge_link = 1;
1202 if (mii->mii_media_status & IFM_FDX)
1203 ifp->if_link_state = LINK_STATE_FULL_DUPLEX;
1204 else if (mii->mii_media_status & IFM_HDX)
1205 ifp->if_link_state = LINK_STATE_HALF_DUPLEX;
1206 else
1207 ifp->if_link_state = LINK_STATE_UP;
1208 if_link_state_change(ifp);
1209 if (!IFQ_IS_EMPTY(&ifp->if_snd))
1210 vge_start(ifp);
1211 }
1212 }
1213 timeout_add(&sc->timer_handle, hz);
1214 splx(s);
1215 }
1216
1217 int
1218 vge_intr(void *arg)
1219 {
1220 struct vge_softc *sc = arg;
1221 struct ifnet *ifp;
1222 u_int32_t status;
1223 int claimed = 0;
1224
1225 ifp = &sc->arpcom.ac_if;
1226
1227 if (!(ifp->if_flags & IFF_UP))
1228 return 0;
1229
1230
1231 CSR_WRITE_1(sc, VGE_CRC3, VGE_CR3_INT_GMSK);
1232
1233 for (;;) {
1234 status = CSR_READ_4(sc, VGE_ISR);
1235 DPRINTFN(3, ("vge_intr: status=%#x\n", status));
1236
1237
1238 if (status == 0xFFFFFFFF)
1239 break;
1240
1241 if (status) {
1242 CSR_WRITE_4(sc, VGE_ISR, status);
1243 }
1244
1245 if ((status & VGE_INTRS) == 0)
1246 break;
1247
1248 claimed = 1;
1249
1250 if (status & (VGE_ISR_RXOK|VGE_ISR_RXOK_HIPRIO))
1251 vge_rxeof(sc);
1252
1253 if (status & (VGE_ISR_RXOFLOW|VGE_ISR_RXNODESC)) {
1254 DPRINTFN(2, ("vge_intr: RX error, recovering\n"));
1255 vge_rxeof(sc);
1256 CSR_WRITE_1(sc, VGE_RXQCSRS, VGE_RXQCSR_RUN);
1257 CSR_WRITE_1(sc, VGE_RXQCSRS, VGE_RXQCSR_WAK);
1258 }
1259
1260 if (status & (VGE_ISR_TXOK0|VGE_ISR_TIMER0))
1261 vge_txeof(sc);
1262
1263 if (status & (VGE_ISR_TXDMA_STALL|VGE_ISR_RXDMA_STALL)) {
1264 DPRINTFN(2, ("DMA_STALL\n"));
1265 vge_init(ifp);
1266 }
1267
1268 if (status & VGE_ISR_LINKSTS) {
1269 timeout_del(&sc->timer_handle);
1270 vge_tick(sc);
1271 }
1272 }
1273
1274
1275 CSR_WRITE_1(sc, VGE_CRS3, VGE_CR3_INT_GMSK);
1276
1277 if (!IFQ_IS_EMPTY(&ifp->if_snd))
1278 vge_start(ifp);
1279
1280 return (claimed);
1281 }
1282
1283
1284
1285
1286
1287 int
1288 vge_encap(struct vge_softc *sc, struct mbuf *m_head, int idx)
1289 {
1290 struct ifnet *ifp = &sc->arpcom.ac_if;
1291 bus_dmamap_t txmap;
1292 struct vge_tx_desc *d = NULL;
1293 struct vge_tx_frag *f;
1294 struct mbuf *mnew = NULL;
1295 int error, frag;
1296 u_int32_t vge_flags;
1297 #if NVLAN > 0
1298 struct ifvlan *ifv = NULL;
1299
1300 if ((m_head->m_flags & (M_PROTO1|M_PKTHDR)) == (M_PROTO1|M_PKTHDR) &&
1301 m_head->m_pkthdr.rcvif != NULL)
1302 ifv = m_head->m_pkthdr.rcvif->if_softc;
1303 #endif
1304
1305 vge_flags = 0;
1306
1307 if (m_head->m_pkthdr.csum_flags & M_IPV4_CSUM_OUT)
1308 vge_flags |= VGE_TDCTL_IPCSUM;
1309 if (m_head->m_pkthdr.csum_flags & M_TCPV4_CSUM_OUT)
1310 vge_flags |= VGE_TDCTL_TCPCSUM;
1311 if (m_head->m_pkthdr.csum_flags & M_UDPV4_CSUM_OUT)
1312 vge_flags |= VGE_TDCTL_UDPCSUM;
1313
1314 txmap = sc->vge_ldata.vge_tx_dmamap[idx];
1315 repack:
1316 error = bus_dmamap_load_mbuf(sc->sc_dmat, txmap,
1317 m_head, BUS_DMA_NOWAIT);
1318 if (error) {
1319 printf("%s: can't map mbuf (error %d)\n",
1320 sc->vge_dev.dv_xname, error);
1321 return (ENOBUFS);
1322 }
1323
1324 d = &sc->vge_ldata.vge_tx_list[idx];
1325
1326 if (letoh32(d->vge_sts) & VGE_TDSTS_OWN)
1327 return (ENOBUFS);
1328
1329 for (frag = 0; frag < txmap->dm_nsegs; frag++) {
1330
1331 if (frag == VGE_TX_FRAGS)
1332 break;
1333 f = &d->vge_frag[frag];
1334 f->vge_buflen = htole16(VGE_BUFLEN(txmap->dm_segs[frag].ds_len));
1335 f->vge_addrlo = htole32(VGE_ADDR_LO(txmap->dm_segs[frag].ds_addr));
1336 f->vge_addrhi = htole16(VGE_ADDR_HI(txmap->dm_segs[frag].ds_addr) & 0xFFFF);
1337 }
1338
1339
1340
1341
1342
1343 if (frag == VGE_TX_FRAGS) {
1344 MGETHDR(mnew, M_DONTWAIT, MT_DATA);
1345 if (mnew == NULL)
1346 return (ENOBUFS);
1347
1348 if (m_head->m_pkthdr.len > MHLEN) {
1349 MCLGET(mnew, M_DONTWAIT);
1350 if (!(mnew->m_flags & M_EXT)) {
1351 m_freem(mnew);
1352 return (ENOBUFS);
1353 }
1354 }
1355 m_copydata(m_head, 0, m_head->m_pkthdr.len,
1356 mtod(mnew, caddr_t));
1357 mnew->m_pkthdr.len = mnew->m_len = m_head->m_pkthdr.len;
1358 IFQ_DEQUEUE(&ifp->if_snd, m_head);
1359 m_freem(m_head);
1360 m_head = mnew;
1361 goto repack;
1362 }
1363
1364
1365 if (m_head->m_pkthdr.len < VGE_MIN_FRAMELEN) {
1366 f = &d->vge_frag[frag];
1367
1368 f->vge_buflen = htole16(VGE_BUFLEN(VGE_MIN_FRAMELEN -
1369 m_head->m_pkthdr.len));
1370 f->vge_addrlo = htole32(VGE_ADDR_LO(txmap->dm_segs[0].ds_addr));
1371 f->vge_addrhi = htole16(VGE_ADDR_HI(txmap->dm_segs[0].ds_addr) & 0xFFFF);
1372 m_head->m_pkthdr.len = VGE_MIN_FRAMELEN;
1373 frag++;
1374 }
1375
1376 frag++;
1377
1378 bus_dmamap_sync(sc->sc_dmat, txmap, 0, txmap->dm_mapsize,
1379 BUS_DMASYNC_PREWRITE);
1380
1381 d->vge_sts = htole32(m_head->m_pkthdr.len << 16);
1382 d->vge_ctl = htole32(vge_flags|(frag << 28) | VGE_TD_LS_NORM);
1383
1384 if (m_head->m_pkthdr.len > ETHERMTU + ETHER_HDR_LEN)
1385 d->vge_ctl |= htole32(VGE_TDCTL_JUMBO);
1386
1387 sc->vge_ldata.vge_tx_dmamap[idx] = txmap;
1388 sc->vge_ldata.vge_tx_mbuf[idx] = m_head;
1389 sc->vge_ldata.vge_tx_free--;
1390 sc->vge_ldata.vge_tx_list[idx].vge_sts |= htole32(VGE_TDSTS_OWN);
1391
1392
1393
1394
1395 #if NVLAN > 0
1396 if (ifv != NULL) {
1397 sc->vge_ldata.vge_tx_list[idx].vge_ctl |=
1398 htole32(htons(ifv->ifv_tag) | VGE_TDCTL_VTAG);
1399 }
1400 #endif
1401
1402 idx++;
1403 if (mnew == NULL) {
1404
1405 IFQ_DEQUEUE(&ifp->if_snd, m_head);
1406 }
1407 return (0);
1408 }
1409
1410
1411
1412
1413 void
1414 vge_start(struct ifnet *ifp)
1415 {
1416 struct vge_softc *sc;
1417 struct mbuf *m_head = NULL;
1418 int idx, pidx = 0;
1419
1420 sc = ifp->if_softc;
1421
1422 if (!sc->vge_link || ifp->if_flags & IFF_OACTIVE)
1423 return;
1424
1425 if (IFQ_IS_EMPTY(&ifp->if_snd))
1426 return;
1427
1428 idx = sc->vge_ldata.vge_tx_prodidx;
1429
1430 pidx = idx - 1;
1431 if (pidx < 0)
1432 pidx = VGE_TX_DESC_CNT - 1;
1433
1434 while (sc->vge_ldata.vge_tx_mbuf[idx] == NULL) {
1435 IFQ_POLL(&ifp->if_snd, m_head);
1436 if (m_head == NULL)
1437 break;
1438
1439
1440
1441
1442
1443 #if NBPFILTER > 0
1444 if (ifp->if_bpf)
1445 bpf_mtap(ifp->if_bpf, m_head, BPF_DIRECTION_OUT);
1446 #endif
1447
1448 if (vge_encap(sc, m_head, idx)) {
1449 ifp->if_flags |= IFF_OACTIVE;
1450 break;
1451 }
1452
1453 sc->vge_ldata.vge_tx_list[pidx].vge_frag[0].vge_buflen |=
1454 htole16(VGE_TXDESC_Q);
1455
1456 pidx = idx;
1457 VGE_TX_DESC_INC(idx);
1458 }
1459
1460 if (idx == sc->vge_ldata.vge_tx_prodidx) {
1461 return;
1462 }
1463
1464
1465
1466 bus_dmamap_sync(sc->sc_dmat,
1467 sc->vge_ldata.vge_tx_list_map,
1468 0, sc->vge_ldata.vge_tx_list_map->dm_mapsize,
1469 BUS_DMASYNC_PREWRITE|BUS_DMASYNC_PREREAD);
1470
1471
1472 CSR_WRITE_2(sc, VGE_TXQCSRS, VGE_TXQCSR_WAK0);
1473
1474 sc->vge_ldata.vge_tx_prodidx = idx;
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485 CSR_WRITE_1(sc, VGE_CRS1, VGE_CR1_TIMER0_ENABLE);
1486
1487
1488
1489
1490 ifp->if_timer = 5;
1491 }
1492
1493 int
1494 vge_init(struct ifnet *ifp)
1495 {
1496 struct vge_softc *sc = ifp->if_softc;
1497 int i;
1498
1499
1500
1501
1502 vge_stop(sc);
1503 vge_reset(sc);
1504
1505
1506 if (vge_rx_list_init(sc) == ENOBUFS) {
1507 printf("%s: init failed: no memory for RX buffers\n",
1508 sc->vge_dev.dv_xname);
1509 vge_stop(sc);
1510 return (ENOBUFS);
1511 }
1512
1513 if (vge_tx_list_init(sc) == ENOBUFS) {
1514 printf("%s: init failed: no memory for TX buffers\n",
1515 sc->vge_dev.dv_xname);
1516 vge_stop(sc);
1517 return (ENOBUFS);
1518 }
1519
1520
1521 for (i = 0; i < ETHER_ADDR_LEN; i++)
1522 CSR_WRITE_1(sc, VGE_PAR0 + i, sc->arpcom.ac_enaddr[i]);
1523
1524
1525
1526
1527
1528 CSR_CLRBIT_1(sc, VGE_RXCFG, VGE_RXCFG_FIFO_THR|VGE_RXCFG_VTAGOPT);
1529 CSR_SETBIT_1(sc, VGE_RXCFG, VGE_RXFIFOTHR_128BYTES|VGE_VTAG_OPT2);
1530
1531
1532 CSR_CLRBIT_1(sc, VGE_DMACFG0, VGE_DMACFG0_BURSTLEN);
1533 CSR_SETBIT_1(sc, VGE_DMACFG0, VGE_DMABURST_128);
1534
1535 CSR_SETBIT_1(sc, VGE_TXCFG, VGE_TXCFG_ARB_PRIO|VGE_TXCFG_NONBLK);
1536
1537
1538 CSR_CLRBIT_1(sc, VGE_CHIPCFG1, VGE_CHIPCFG1_CRANDOM|
1539 VGE_CHIPCFG1_CAP|VGE_CHIPCFG1_MBA|VGE_CHIPCFG1_BAKOPT);
1540 CSR_SETBIT_1(sc, VGE_CHIPCFG1, VGE_CHIPCFG1_OFSET);
1541
1542
1543 CSR_SETBIT_1(sc, VGE_DIAGCTL, VGE_DIAGCTL_LPSEL_DIS);
1544
1545
1546
1547
1548
1549
1550 CSR_WRITE_4(sc, VGE_TXDESC_ADDR_LO0,
1551 VGE_ADDR_LO(sc->vge_ldata.vge_tx_listseg.ds_addr));
1552 CSR_WRITE_2(sc, VGE_TXDESCNUM, VGE_TX_DESC_CNT - 1);
1553
1554 CSR_WRITE_4(sc, VGE_RXDESC_ADDR_LO,
1555 VGE_ADDR_LO(sc->vge_ldata.vge_rx_listseg.ds_addr));
1556 CSR_WRITE_2(sc, VGE_RXDESCNUM, VGE_RX_DESC_CNT - 1);
1557 CSR_WRITE_2(sc, VGE_RXDESC_RESIDUECNT, VGE_RX_DESC_CNT);
1558
1559
1560 CSR_WRITE_1(sc, VGE_RXQCSRS, VGE_RXQCSR_RUN);
1561 CSR_WRITE_1(sc, VGE_RXQCSRS, VGE_RXQCSR_WAK);
1562
1563
1564 CSR_WRITE_2(sc, VGE_TXQCSRS, VGE_TXQCSR_RUN0);
1565
1566
1567 CSR_WRITE_1(sc, VGE_RXCTL, VGE_RXCTL_RX_UCAST|VGE_RXCTL_RX_GIANT);
1568
1569
1570 if (ifp->if_flags & IFF_PROMISC) {
1571 CSR_SETBIT_1(sc, VGE_RXCTL, VGE_RXCTL_RX_PROMISC);
1572 }
1573
1574
1575 if (ifp->if_flags & IFF_BROADCAST) {
1576 CSR_SETBIT_1(sc, VGE_RXCTL, VGE_RXCTL_RX_BCAST);
1577 }
1578
1579
1580 if (ifp->if_flags & IFF_MULTICAST) {
1581 CSR_SETBIT_1(sc, VGE_RXCTL, VGE_RXCTL_RX_MCAST);
1582 }
1583
1584
1585 vge_cam_clear(sc);
1586
1587
1588 vge_setmulti(sc);
1589
1590
1591
1592 CSR_WRITE_1(sc, VGE_CRS2, 0x8B);
1593
1594
1595
1596
1597 CSR_WRITE_1(sc, VGE_CRC0, VGE_CR0_STOP);
1598 CSR_WRITE_1(sc, VGE_CRS1, VGE_CR1_NOPOLL);
1599 CSR_WRITE_1(sc, VGE_CRS0,
1600 VGE_CR0_TX_ENABLE|VGE_CR0_RX_ENABLE|VGE_CR0_START);
1601
1602
1603
1604
1605
1606 CSR_SETBIT_1(sc, VGE_DIAGCTL, VGE_DIAGCTL_TIMER0_RES);
1607 CSR_WRITE_2(sc, VGE_SSTIMER, 400);
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617 #ifdef notyet
1618 CSR_WRITE_1(sc, VGE_INTCTL1, VGE_INTCTL_TXINTSUP_DISABLE);
1619
1620 CSR_CLRBIT_1(sc, VGE_CAMCTL, VGE_CAMCTL_PAGESEL);
1621 CSR_SETBIT_1(sc, VGE_CAMCTL, VGE_PAGESEL_INTHLDOFF);
1622 CSR_WRITE_1(sc, VGE_INTHOLDOFF, 10);
1623
1624
1625 CSR_WRITE_1(sc, VGE_CRS3, VGE_CR3_INT_HOLDOFF);
1626 CSR_WRITE_1(sc, VGE_INTCTL1, VGE_INTCTL_SC_RELOAD);
1627
1628
1629 CSR_CLRBIT_1(sc, VGE_CAMCTL, VGE_CAMCTL_PAGESEL);
1630 CSR_SETBIT_1(sc, VGE_CAMCTL, VGE_PAGESEL_RXSUPPTHR);
1631 CSR_WRITE_1(sc, VGE_RXSUPPTHR, 64);
1632
1633
1634 CSR_CLRBIT_1(sc, VGE_CAMCTL, VGE_CAMCTL_PAGESEL);
1635 CSR_SETBIT_1(sc, VGE_CAMCTL, VGE_PAGESEL_MAR);
1636 #endif
1637
1638
1639
1640
1641 CSR_WRITE_4(sc, VGE_IMR, VGE_INTRS);
1642 CSR_WRITE_4(sc, VGE_ISR, 0);
1643 CSR_WRITE_1(sc, VGE_CRS3, VGE_CR3_INT_GMSK);
1644
1645
1646 mii_mediachg(&sc->sc_mii);
1647
1648 ifp->if_flags |= IFF_RUNNING;
1649 ifp->if_flags &= ~IFF_OACTIVE;
1650
1651 sc->vge_if_flags = 0;
1652 sc->vge_link = 0;
1653
1654 if (!timeout_pending(&sc->timer_handle))
1655 timeout_add(&sc->timer_handle, hz);
1656
1657 return (0);
1658 }
1659
1660
1661
1662
1663 int
1664 vge_ifmedia_upd(struct ifnet *ifp)
1665 {
1666 struct vge_softc *sc = ifp->if_softc;
1667
1668 return (mii_mediachg(&sc->sc_mii));
1669 }
1670
1671
1672
1673
1674 void
1675 vge_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
1676 {
1677 struct vge_softc *sc = ifp->if_softc;
1678
1679 mii_pollstat(&sc->sc_mii);
1680 ifmr->ifm_active = sc->sc_mii.mii_media_active;
1681 ifmr->ifm_status = sc->sc_mii.mii_media_status;
1682 }
1683
1684 void
1685 vge_miibus_statchg(struct device *dev)
1686 {
1687 struct vge_softc *sc = (struct vge_softc *)dev;
1688 struct mii_data *mii;
1689 struct ifmedia_entry *ife;
1690
1691 mii = &sc->sc_mii;
1692 ife = mii->mii_media.ifm_cur;
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705 switch (IFM_SUBTYPE(ife->ifm_media)) {
1706 case IFM_AUTO:
1707 CSR_CLRBIT_1(sc, VGE_DIAGCTL, VGE_DIAGCTL_MACFORCE);
1708 CSR_CLRBIT_1(sc, VGE_DIAGCTL, VGE_DIAGCTL_FDXFORCE);
1709 break;
1710 case IFM_1000_T:
1711 CSR_SETBIT_1(sc, VGE_DIAGCTL, VGE_DIAGCTL_MACFORCE);
1712 CSR_CLRBIT_1(sc, VGE_DIAGCTL, VGE_DIAGCTL_FDXFORCE);
1713 break;
1714 case IFM_100_TX:
1715 case IFM_10_T:
1716 CSR_SETBIT_1(sc, VGE_DIAGCTL, VGE_DIAGCTL_MACFORCE);
1717 if ((ife->ifm_media & IFM_GMASK) == IFM_FDX) {
1718 CSR_SETBIT_1(sc, VGE_DIAGCTL, VGE_DIAGCTL_FDXFORCE);
1719 } else {
1720 CSR_CLRBIT_1(sc, VGE_DIAGCTL, VGE_DIAGCTL_FDXFORCE);
1721 }
1722 break;
1723 default:
1724 printf("%s: unknown media type: %x\n",
1725 sc->vge_dev.dv_xname, IFM_SUBTYPE(ife->ifm_media));
1726 break;
1727 }
1728 }
1729
1730 int
1731 vge_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
1732 {
1733 struct vge_softc *sc = ifp->if_softc;
1734 struct ifreq *ifr = (struct ifreq *) data;
1735 struct ifaddr *ifa = (struct ifaddr *) data;
1736 int s, error = 0;
1737
1738 s = splnet();
1739
1740 if ((error = ether_ioctl(ifp, &sc->arpcom, command, data)) > 0) {
1741 splx(s);
1742 return (error);
1743 }
1744
1745 switch (command) {
1746 case SIOCSIFADDR:
1747 ifp->if_flags |= IFF_UP;
1748 switch (ifa->ifa_addr->sa_family) {
1749 #ifdef INET
1750 case AF_INET:
1751 vge_init(ifp);
1752 arp_ifinit(&sc->arpcom, ifa);
1753 break;
1754 #endif
1755 default:
1756 vge_init(ifp);
1757 break;
1758 }
1759 break;
1760 case SIOCSIFMTU:
1761 if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > ifp->if_hardmtu)
1762 error = EINVAL;
1763 else if (ifp->if_mtu != ifr->ifr_mtu)
1764 ifp->if_mtu = ifr->ifr_mtu;
1765 break;
1766 case SIOCSIFFLAGS:
1767 if (ifp->if_flags & IFF_UP) {
1768 if (ifp->if_flags & IFF_RUNNING &&
1769 ifp->if_flags & IFF_PROMISC &&
1770 !(sc->vge_if_flags & IFF_PROMISC)) {
1771 CSR_SETBIT_1(sc, VGE_RXCTL,
1772 VGE_RXCTL_RX_PROMISC);
1773 vge_setmulti(sc);
1774 } else if (ifp->if_flags & IFF_RUNNING &&
1775 !(ifp->if_flags & IFF_PROMISC) &&
1776 sc->vge_if_flags & IFF_PROMISC) {
1777 CSR_CLRBIT_1(sc, VGE_RXCTL,
1778 VGE_RXCTL_RX_PROMISC);
1779 vge_setmulti(sc);
1780 } else
1781 vge_init(ifp);
1782 } else {
1783 if (ifp->if_flags & IFF_RUNNING)
1784 vge_stop(sc);
1785 }
1786 sc->vge_if_flags = ifp->if_flags;
1787 break;
1788 case SIOCADDMULTI:
1789 case SIOCDELMULTI:
1790 error = (command == SIOCADDMULTI) ?
1791 ether_addmulti(ifr, &sc->arpcom) :
1792 ether_delmulti(ifr, &sc->arpcom);
1793
1794 if (error == ENETRESET) {
1795 if (ifp->if_flags & IFF_RUNNING)
1796 vge_setmulti(sc);
1797 error = 0;
1798 }
1799 break;
1800 case SIOCGIFMEDIA:
1801 case SIOCSIFMEDIA:
1802 error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, command);
1803 break;
1804 default:
1805 error = ENOTTY;
1806 break;
1807 }
1808
1809 splx(s);
1810 return (error);
1811 }
1812
1813 void
1814 vge_watchdog(struct ifnet *ifp)
1815 {
1816 struct vge_softc *sc = ifp->if_softc;
1817 int s;
1818
1819 s = splnet();
1820 printf("%s: watchdog timeout\n", sc->vge_dev.dv_xname);
1821 ifp->if_oerrors++;
1822
1823 vge_txeof(sc);
1824 vge_rxeof(sc);
1825
1826 vge_init(ifp);
1827
1828 splx(s);
1829 }
1830
1831
1832
1833
1834
1835 void
1836 vge_stop(struct vge_softc *sc)
1837 {
1838 int i;
1839 struct ifnet *ifp;
1840
1841 ifp = &sc->arpcom.ac_if;
1842 ifp->if_timer = 0;
1843 if (timeout_pending(&sc->timer_handle))
1844 timeout_del(&sc->timer_handle);
1845
1846 ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
1847
1848 CSR_WRITE_1(sc, VGE_CRC3, VGE_CR3_INT_GMSK);
1849 CSR_WRITE_1(sc, VGE_CRS0, VGE_CR0_STOP);
1850 CSR_WRITE_4(sc, VGE_ISR, 0xFFFFFFFF);
1851 CSR_WRITE_2(sc, VGE_TXQCSRC, 0xFFFF);
1852 CSR_WRITE_1(sc, VGE_RXQCSRC, 0xFF);
1853 CSR_WRITE_4(sc, VGE_RXDESC_ADDR_LO, 0);
1854
1855 if (sc->vge_head != NULL) {
1856 m_freem(sc->vge_head);
1857 sc->vge_head = sc->vge_tail = NULL;
1858 }
1859
1860
1861 for (i = 0; i < VGE_TX_DESC_CNT; i++) {
1862 if (sc->vge_ldata.vge_tx_mbuf[i] != NULL) {
1863 bus_dmamap_unload(sc->sc_dmat,
1864 sc->vge_ldata.vge_tx_dmamap[i]);
1865 m_freem(sc->vge_ldata.vge_tx_mbuf[i]);
1866 sc->vge_ldata.vge_tx_mbuf[i] = NULL;
1867 }
1868 }
1869
1870
1871 for (i = 0; i < VGE_RX_DESC_CNT; i++) {
1872 if (sc->vge_ldata.vge_rx_mbuf[i] != NULL) {
1873 bus_dmamap_unload(sc->sc_dmat,
1874 sc->vge_ldata.vge_rx_dmamap[i]);
1875 m_freem(sc->vge_ldata.vge_rx_mbuf[i]);
1876 sc->vge_ldata.vge_rx_mbuf[i] = NULL;
1877 }
1878 }
1879 }