This source file includes following definitions.
- lge_eeprom_getword
- lge_read_eeprom
- lge_miibus_readreg
- lge_miibus_writereg
- lge_miibus_statchg
- lge_setmulti
- lge_reset
- lge_probe
- lge_attach
- lge_list_tx_init
- lge_list_rx_init
- lge_newbuf
- lge_alloc_jumbo_mem
- lge_jalloc
- lge_jfree
- lge_rxeof
- lge_txeof
- lge_tick
- lge_intr
- lge_encap
- lge_start
- lge_init
- lge_ifmedia_upd
- lge_ifmedia_sts
- lge_ioctl
- lge_watchdog
- lge_stop
- lge_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 #include "bpfilter.h"
78
79 #include <sys/param.h>
80 #include <sys/systm.h>
81 #include <sys/sockio.h>
82 #include <sys/mbuf.h>
83 #include <sys/malloc.h>
84 #include <sys/kernel.h>
85 #include <sys/device.h>
86 #include <sys/socket.h>
87
88 #include <net/if.h>
89 #include <net/if_dl.h>
90 #include <net/if_media.h>
91
92 #ifdef INET
93 #include <netinet/in.h>
94 #include <netinet/in_systm.h>
95 #include <netinet/in_var.h>
96 #include <netinet/ip.h>
97 #include <netinet/if_ether.h>
98 #endif
99
100 #if NBPFILTER > 0
101 #include <net/bpf.h>
102 #endif
103
104 #include <uvm/uvm_extern.h>
105 #define VTOPHYS(v) vtophys((vaddr_t)(v))
106
107 #include <dev/pci/pcireg.h>
108 #include <dev/pci/pcivar.h>
109 #include <dev/pci/pcidevs.h>
110
111 #include <dev/mii/mii.h>
112 #include <dev/mii/miivar.h>
113
114 #define LGE_USEIOSPACE
115
116 #include <dev/pci/if_lgereg.h>
117
118 int lge_probe(struct device *, void *, void *);
119 void lge_attach(struct device *, struct device *, void *);
120
121 struct cfattach lge_ca = {
122 sizeof(struct lge_softc), lge_probe, lge_attach
123 };
124
125 struct cfdriver lge_cd = {
126 0, "lge", DV_IFNET
127 };
128
129 int lge_alloc_jumbo_mem(struct lge_softc *);
130 void *lge_jalloc(struct lge_softc *);
131 void lge_jfree(caddr_t, u_int, void *);
132
133 int lge_newbuf(struct lge_softc *, struct lge_rx_desc *,
134 struct mbuf *);
135 int lge_encap(struct lge_softc *, struct mbuf *, u_int32_t *);
136 void lge_rxeof(struct lge_softc *, int);
137 void lge_txeof(struct lge_softc *);
138 int lge_intr(void *);
139 void lge_tick(void *);
140 void lge_start(struct ifnet *);
141 int lge_ioctl(struct ifnet *, u_long, caddr_t);
142 void lge_init(void *);
143 void lge_stop(struct lge_softc *);
144 void lge_watchdog(struct ifnet *);
145 void lge_shutdown(void *);
146 int lge_ifmedia_upd(struct ifnet *);
147 void lge_ifmedia_sts(struct ifnet *, struct ifmediareq *);
148
149 void lge_eeprom_getword(struct lge_softc *, int, u_int16_t *);
150 void lge_read_eeprom(struct lge_softc *, caddr_t, int, int, int);
151
152 int lge_miibus_readreg(struct device *, int, int);
153 void lge_miibus_writereg(struct device *, int, int, int);
154 void lge_miibus_statchg(struct device *);
155
156 void lge_setmulti(struct lge_softc *);
157 void lge_reset(struct lge_softc *);
158 int lge_list_rx_init(struct lge_softc *);
159 int lge_list_tx_init(struct lge_softc *);
160
161 #ifdef LGE_DEBUG
162 #define DPRINTF(x) if (lgedebug) printf x
163 #define DPRINTFN(n,x) if (lgedebug >= (n)) printf x
164 int lgedebug = 0;
165 #else
166 #define DPRINTF(x)
167 #define DPRINTFN(n,x)
168 #endif
169
170 const struct pci_matchid lge_devices[] = {
171 { PCI_VENDOR_LEVEL1, PCI_PRODUCT_LEVEL1_LXT1001 }
172 };
173
174 #define LGE_SETBIT(sc, reg, x) \
175 CSR_WRITE_4(sc, reg, \
176 CSR_READ_4(sc, reg) | (x))
177
178 #define LGE_CLRBIT(sc, reg, x) \
179 CSR_WRITE_4(sc, reg, \
180 CSR_READ_4(sc, reg) & ~(x))
181
182 #define SIO_SET(x) \
183 CSR_WRITE_4(sc, LGE_MEAR, CSR_READ_4(sc, LGE_MEAR) | x)
184
185 #define SIO_CLR(x) \
186 CSR_WRITE_4(sc, LGE_MEAR, CSR_READ_4(sc, LGE_MEAR) & ~x)
187
188
189
190
191 void
192 lge_eeprom_getword(struct lge_softc *sc, int addr, u_int16_t *dest)
193 {
194 int i;
195 u_int32_t val;
196
197 CSR_WRITE_4(sc, LGE_EECTL, LGE_EECTL_CMD_READ|
198 LGE_EECTL_SINGLEACCESS|((addr >> 1) << 8));
199
200 for (i = 0; i < LGE_TIMEOUT; i++)
201 if (!(CSR_READ_4(sc, LGE_EECTL) & LGE_EECTL_CMD_READ))
202 break;
203
204 if (i == LGE_TIMEOUT) {
205 printf("%s: EEPROM read timed out\n", sc->sc_dv.dv_xname);
206 return;
207 }
208
209 val = CSR_READ_4(sc, LGE_EEDATA);
210
211 if (addr & 1)
212 *dest = (val >> 16) & 0xFFFF;
213 else
214 *dest = val & 0xFFFF;
215 }
216
217
218
219
220 void
221 lge_read_eeprom(struct lge_softc *sc, caddr_t dest, int off,
222 int cnt, int swap)
223 {
224 int i;
225 u_int16_t word = 0, *ptr;
226
227 for (i = 0; i < cnt; i++) {
228 lge_eeprom_getword(sc, off + i, &word);
229 ptr = (u_int16_t *)(dest + (i * 2));
230 if (swap)
231 *ptr = ntohs(word);
232 else
233 *ptr = word;
234 }
235 }
236
237 int
238 lge_miibus_readreg(struct device *dev, int phy, int reg)
239 {
240 struct lge_softc *sc = (struct lge_softc *)dev;
241 int i;
242
243
244
245
246
247
248 if (sc->lge_pcs == 0 && phy == 0)
249 return (0);
250
251 CSR_WRITE_4(sc, LGE_GMIICTL, (phy << 8) | reg | LGE_GMIICMD_READ);
252
253 for (i = 0; i < LGE_TIMEOUT; i++)
254 if (!(CSR_READ_4(sc, LGE_GMIICTL) & LGE_GMIICTL_CMDBUSY))
255 break;
256
257 if (i == LGE_TIMEOUT) {
258 printf("%s: PHY read timed out\n", sc->sc_dv.dv_xname);
259 return (0);
260 }
261
262 return (CSR_READ_4(sc, LGE_GMIICTL) >> 16);
263 }
264
265 void
266 lge_miibus_writereg(struct device *dev, int phy, int reg, int data)
267 {
268 struct lge_softc *sc = (struct lge_softc *)dev;
269 int i;
270
271 CSR_WRITE_4(sc, LGE_GMIICTL,
272 (data << 16) | (phy << 8) | reg | LGE_GMIICMD_WRITE);
273
274 for (i = 0; i < LGE_TIMEOUT; i++)
275 if (!(CSR_READ_4(sc, LGE_GMIICTL) & LGE_GMIICTL_CMDBUSY))
276 break;
277
278 if (i == LGE_TIMEOUT) {
279 printf("%s: PHY write timed out\n", sc->sc_dv.dv_xname);
280 }
281 }
282
283 void
284 lge_miibus_statchg(struct device *dev)
285 {
286 struct lge_softc *sc = (struct lge_softc *)dev;
287 struct mii_data *mii = &sc->lge_mii;
288
289 LGE_CLRBIT(sc, LGE_GMIIMODE, LGE_GMIIMODE_SPEED);
290 switch (IFM_SUBTYPE(mii->mii_media_active)) {
291 case IFM_1000_T:
292 case IFM_1000_SX:
293 LGE_SETBIT(sc, LGE_GMIIMODE, LGE_SPEED_1000);
294 break;
295 case IFM_100_TX:
296 LGE_SETBIT(sc, LGE_GMIIMODE, LGE_SPEED_100);
297 break;
298 case IFM_10_T:
299 LGE_SETBIT(sc, LGE_GMIIMODE, LGE_SPEED_10);
300 break;
301 default:
302
303
304
305
306
307 LGE_SETBIT(sc, LGE_GMIIMODE, LGE_SPEED_1000);
308 break;
309 }
310
311 if ((mii->mii_media_active & IFM_GMASK) == IFM_FDX) {
312 LGE_SETBIT(sc, LGE_GMIIMODE, LGE_GMIIMODE_FDX);
313 } else {
314 LGE_CLRBIT(sc, LGE_GMIIMODE, LGE_GMIIMODE_FDX);
315 }
316 }
317
318 void
319 lge_setmulti(struct lge_softc *sc)
320 {
321 struct arpcom *ac = &sc->arpcom;
322 struct ifnet *ifp = &ac->ac_if;
323 struct ether_multi *enm;
324 struct ether_multistep step;
325 u_int32_t h = 0, hashes[2] = { 0, 0 };
326
327
328 CSR_WRITE_4(sc, LGE_MODE1, LGE_MODE1_SETRST_CTL1|LGE_MODE1_RX_MCAST);
329
330 allmulti:
331 if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) {
332 CSR_WRITE_4(sc, LGE_MAR0, 0xFFFFFFFF);
333 CSR_WRITE_4(sc, LGE_MAR1, 0xFFFFFFFF);
334 return;
335 }
336
337
338 CSR_WRITE_4(sc, LGE_MAR0, 0);
339 CSR_WRITE_4(sc, LGE_MAR1, 0);
340
341
342 ETHER_FIRST_MULTI(step, ac, enm);
343 while (enm != NULL) {
344 if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
345 ifp->if_flags |= IFF_ALLMULTI;
346 goto allmulti;
347 }
348 h = (ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN) >> 26) &
349 0x0000003F;
350 if (h < 32)
351 hashes[0] |= (1 << h);
352 else
353 hashes[1] |= (1 << (h - 32));
354 ETHER_NEXT_MULTI(step, enm);
355 }
356
357 CSR_WRITE_4(sc, LGE_MAR0, hashes[0]);
358 CSR_WRITE_4(sc, LGE_MAR1, hashes[1]);
359 }
360
361 void
362 lge_reset(struct lge_softc *sc)
363 {
364 int i;
365
366 LGE_SETBIT(sc, LGE_MODE1, LGE_MODE1_SETRST_CTL0|LGE_MODE1_SOFTRST);
367
368 for (i = 0; i < LGE_TIMEOUT; i++) {
369 if (!(CSR_READ_4(sc, LGE_MODE1) & LGE_MODE1_SOFTRST))
370 break;
371 }
372
373 if (i == LGE_TIMEOUT)
374 printf("%s: reset never completed\n", sc->sc_dv.dv_xname);
375
376
377 DELAY(1000);
378 }
379
380
381
382
383
384 int
385 lge_probe(struct device *parent, void *match, void *aux)
386 {
387 return (pci_matchbyid((struct pci_attach_args *)aux, lge_devices,
388 sizeof(lge_devices)/sizeof(lge_devices[0])));
389 }
390
391
392
393
394
395 void
396 lge_attach(struct device *parent, struct device *self, void *aux)
397 {
398 struct lge_softc *sc = (struct lge_softc *)self;
399 struct pci_attach_args *pa = aux;
400 pci_chipset_tag_t pc = pa->pa_pc;
401 pci_intr_handle_t ih;
402 const char *intrstr = NULL;
403 bus_size_t size;
404 bus_dma_segment_t seg;
405 bus_dmamap_t dmamap;
406 int rseg;
407 u_char eaddr[ETHER_ADDR_LEN];
408 pcireg_t command;
409 #ifndef LGE_USEIOSPACE
410 pcireg_t memtype;
411 #endif
412 struct ifnet *ifp;
413 caddr_t kva;
414
415
416
417
418 DPRINTFN(5, ("Preparing for conf read\n"));
419 command = pci_conf_read(pc, pa->pa_tag, LGE_PCI_CAPID) & 0x000000FF;
420 if (command == 0x01) {
421 command = pci_conf_read(pc, pa->pa_tag, LGE_PCI_PWRMGMTCTRL);
422 if (command & LGE_PSTATE_MASK) {
423 pcireg_t iobase, membase, irq;
424
425
426 iobase = pci_conf_read(pc, pa->pa_tag, LGE_PCI_LOIO);
427 membase = pci_conf_read(pc, pa->pa_tag, LGE_PCI_LOMEM);
428 irq = pci_conf_read(pc, pa->pa_tag, LGE_PCI_INTLINE);
429
430
431 printf("%s: chip is in D%d power mode "
432 "-- setting to D0\n", sc->sc_dv.dv_xname,
433 command & LGE_PSTATE_MASK);
434 command &= 0xFFFFFFFC;
435 pci_conf_write(pc, pa->pa_tag,
436 LGE_PCI_PWRMGMTCTRL, command);
437
438
439 pci_conf_write(pc, pa->pa_tag, LGE_PCI_LOIO, iobase);
440 pci_conf_write(pc, pa->pa_tag, LGE_PCI_LOMEM, membase);
441 pci_conf_write(pc, pa->pa_tag, LGE_PCI_INTLINE, irq);
442 }
443 }
444
445
446
447
448 DPRINTFN(5, ("Map control/status regs\n"));
449
450 DPRINTFN(5, ("pci_mapreg_map\n"));
451 #ifdef LGE_USEIOSPACE
452 if (pci_mapreg_map(pa, LGE_PCI_LOIO, PCI_MAPREG_TYPE_IO, 0,
453 &sc->lge_btag, &sc->lge_bhandle, NULL, &size, 0)) {
454 printf(": can't map i/o space\n");
455 return;
456 }
457 #else
458 memtype = pci_mapreg_type(pc, pa->pa_tag, LGE_PCI_LOMEM);
459 switch (memtype) {
460 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT:
461 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT:
462 if (pci_mapreg_map(pa, LGE_PCI_LOMEM,
463 memtype, 0, &sc->lge_btag, &sc->lge_bhandle,
464 NULL, &size, 0) == 0)
465 break;
466 default:
467 printf(": can't map mem space\n");
468 return;
469 }
470 #endif
471
472 DPRINTFN(5, ("pci_intr_map\n"));
473 if (pci_intr_map(pa, &ih)) {
474 printf(": couldn't map interrupt\n");
475 goto fail_1;
476 }
477
478 DPRINTFN(5, ("pci_intr_string\n"));
479 intrstr = pci_intr_string(pc, ih);
480 DPRINTFN(5, ("pci_intr_establish\n"));
481 sc->lge_intrhand = pci_intr_establish(pc, ih, IPL_NET, lge_intr, sc,
482 sc->sc_dv.dv_xname);
483 if (sc->lge_intrhand == NULL) {
484 printf(": couldn't establish interrupt");
485 if (intrstr != NULL)
486 printf(" at %s", intrstr);
487 printf("\n");
488 goto fail_1;
489 }
490 printf(": %s", intrstr);
491
492
493 DPRINTFN(5, ("lge_reset\n"));
494 lge_reset(sc);
495
496
497
498
499 DPRINTFN(5, ("lge_read_eeprom\n"));
500 lge_read_eeprom(sc, (caddr_t)&eaddr[0], LGE_EE_NODEADDR_0, 1, 0);
501 lge_read_eeprom(sc, (caddr_t)&eaddr[2], LGE_EE_NODEADDR_1, 1, 0);
502 lge_read_eeprom(sc, (caddr_t)&eaddr[4], LGE_EE_NODEADDR_2, 1, 0);
503
504
505
506
507 printf(", address %s\n", ether_sprintf(eaddr));
508
509 bcopy(eaddr, (char *)&sc->arpcom.ac_enaddr, ETHER_ADDR_LEN);
510
511 sc->sc_dmatag = pa->pa_dmat;
512 DPRINTFN(5, ("bus_dmamem_alloc\n"));
513 if (bus_dmamem_alloc(sc->sc_dmatag, sizeof(struct lge_list_data),
514 PAGE_SIZE, 0, &seg, 1, &rseg, BUS_DMA_NOWAIT)) {
515 printf("%s: can't alloc rx buffers\n", sc->sc_dv.dv_xname);
516 goto fail_2;
517 }
518 DPRINTFN(5, ("bus_dmamem_map\n"));
519 if (bus_dmamem_map(sc->sc_dmatag, &seg, rseg,
520 sizeof(struct lge_list_data), &kva,
521 BUS_DMA_NOWAIT)) {
522 printf("%s: can't map dma buffers (%d bytes)\n",
523 sc->sc_dv.dv_xname, sizeof(struct lge_list_data));
524 goto fail_3;
525 }
526 DPRINTFN(5, ("bus_dmamem_create\n"));
527 if (bus_dmamap_create(sc->sc_dmatag, sizeof(struct lge_list_data), 1,
528 sizeof(struct lge_list_data), 0,
529 BUS_DMA_NOWAIT, &dmamap)) {
530 printf("%s: can't create dma map\n", sc->sc_dv.dv_xname);
531 goto fail_4;
532 }
533 DPRINTFN(5, ("bus_dmamem_load\n"));
534 if (bus_dmamap_load(sc->sc_dmatag, dmamap, kva,
535 sizeof(struct lge_list_data), NULL,
536 BUS_DMA_NOWAIT)) {
537 goto fail_5;
538 }
539
540 DPRINTFN(5, ("bzero\n"));
541 sc->lge_ldata = (struct lge_list_data *)kva;
542 bzero(sc->lge_ldata, sizeof(struct lge_list_data));
543
544
545 DPRINTFN(5, ("lge_alloc_jumbo_mem\n"));
546 if (lge_alloc_jumbo_mem(sc)) {
547 printf("%s: jumbo buffer allocation failed\n",
548 sc->sc_dv.dv_xname);
549 goto fail_5;
550 }
551
552 ifp = &sc->arpcom.ac_if;
553 ifp->if_softc = sc;
554 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
555 ifp->if_ioctl = lge_ioctl;
556 ifp->if_start = lge_start;
557 ifp->if_watchdog = lge_watchdog;
558 ifp->if_baudrate = 1000000000;
559 ifp->if_hardmtu = LGE_JUMBO_MTU;
560 IFQ_SET_MAXLEN(&ifp->if_snd, LGE_TX_LIST_CNT - 1);
561 IFQ_SET_READY(&ifp->if_snd);
562 DPRINTFN(5, ("bcopy\n"));
563 bcopy(sc->sc_dv.dv_xname, ifp->if_xname, IFNAMSIZ);
564
565 ifp->if_capabilities = IFCAP_VLAN_MTU;
566
567 if (CSR_READ_4(sc, LGE_GMIIMODE) & LGE_GMIIMODE_PCSENH)
568 sc->lge_pcs = 1;
569 else
570 sc->lge_pcs = 0;
571
572
573
574
575 DPRINTFN(5, ("mii setup\n"));
576 sc->lge_mii.mii_ifp = ifp;
577 sc->lge_mii.mii_readreg = lge_miibus_readreg;
578 sc->lge_mii.mii_writereg = lge_miibus_writereg;
579 sc->lge_mii.mii_statchg = lge_miibus_statchg;
580 ifmedia_init(&sc->lge_mii.mii_media, 0, lge_ifmedia_upd,
581 lge_ifmedia_sts);
582 mii_attach(&sc->sc_dv, &sc->lge_mii, 0xffffffff, MII_PHY_ANY,
583 MII_OFFSET_ANY, 0);
584
585 if (LIST_FIRST(&sc->lge_mii.mii_phys) == NULL) {
586 printf("%s: no PHY found!\n", sc->sc_dv.dv_xname);
587 ifmedia_add(&sc->lge_mii.mii_media, IFM_ETHER|IFM_MANUAL,
588 0, NULL);
589 ifmedia_set(&sc->lge_mii.mii_media, IFM_ETHER|IFM_MANUAL);
590 } else {
591 DPRINTFN(5, ("ifmedia_set\n"));
592 ifmedia_set(&sc->lge_mii.mii_media, IFM_ETHER|IFM_AUTO);
593 }
594
595
596
597
598 DPRINTFN(5, ("if_attach\n"));
599 if_attach(ifp);
600 DPRINTFN(5, ("ether_ifattach\n"));
601 ether_ifattach(ifp);
602 DPRINTFN(5, ("timeout_set\n"));
603 timeout_set(&sc->lge_timeout, lge_tick, sc);
604 timeout_add(&sc->lge_timeout, hz);
605 return;
606
607 fail_5:
608 bus_dmamap_destroy(sc->sc_dmatag, dmamap);
609
610 fail_4:
611 bus_dmamem_unmap(sc->sc_dmatag, kva,
612 sizeof(struct lge_list_data));
613
614 fail_3:
615 bus_dmamem_free(sc->sc_dmatag, &seg, rseg);
616
617 fail_2:
618 pci_intr_disestablish(pc, sc->lge_intrhand);
619
620 fail_1:
621 bus_space_unmap(sc->lge_btag, sc->lge_bhandle, size);
622 }
623
624
625
626
627 int
628 lge_list_tx_init(struct lge_softc *sc)
629 {
630 struct lge_list_data *ld;
631 struct lge_ring_data *cd;
632 int i;
633
634 cd = &sc->lge_cdata;
635 ld = sc->lge_ldata;
636 for (i = 0; i < LGE_TX_LIST_CNT; i++) {
637 ld->lge_tx_list[i].lge_mbuf = NULL;
638 ld->lge_tx_list[i].lge_ctl = 0;
639 }
640
641 cd->lge_tx_prod = cd->lge_tx_cons = 0;
642
643 return (0);
644 }
645
646
647
648
649
650
651
652 int
653 lge_list_rx_init(struct lge_softc *sc)
654 {
655 struct lge_list_data *ld;
656 struct lge_ring_data *cd;
657 int i;
658
659 ld = sc->lge_ldata;
660 cd = &sc->lge_cdata;
661
662 cd->lge_rx_prod = cd->lge_rx_cons = 0;
663
664 CSR_WRITE_4(sc, LGE_RXDESC_ADDR_HI, 0);
665
666 for (i = 0; i < LGE_RX_LIST_CNT; i++) {
667 if (CSR_READ_1(sc, LGE_RXCMDFREE_8BIT) == 0)
668 break;
669 if (lge_newbuf(sc, &ld->lge_rx_list[i], NULL) == ENOBUFS)
670 return (ENOBUFS);
671 }
672
673
674 CSR_READ_4(sc, LGE_ISR);
675
676 return (0);
677 }
678
679
680
681
682 int
683 lge_newbuf(struct lge_softc *sc, struct lge_rx_desc *c, struct mbuf *m)
684 {
685 struct mbuf *m_new = NULL;
686
687 if (m == NULL) {
688 caddr_t buf = NULL;
689
690 MGETHDR(m_new, M_DONTWAIT, MT_DATA);
691 if (m_new == NULL)
692 return (ENOBUFS);
693
694
695 buf = lge_jalloc(sc);
696 if (buf == NULL) {
697 m_freem(m_new);
698 return (ENOBUFS);
699 }
700
701
702 m_new->m_len = m_new->m_pkthdr.len = LGE_JLEN;
703 MEXTADD(m_new, buf, LGE_JLEN, 0, lge_jfree, sc);
704 } else {
705
706
707
708
709
710 m_new = m;
711 m_new->m_len = m_new->m_pkthdr.len = LGE_JLEN;
712 m_new->m_data = m_new->m_ext.ext_buf;
713 }
714
715
716
717
718
719
720 m_adj(m_new, ETHER_ALIGN);
721
722 c->lge_mbuf = m_new;
723 c->lge_fragptr_hi = 0;
724 c->lge_fragptr_lo = VTOPHYS(mtod(m_new, caddr_t));
725 c->lge_fraglen = m_new->m_len;
726 c->lge_ctl = m_new->m_len | LGE_RXCTL_WANTINTR | LGE_FRAGCNT(1);
727 c->lge_sts = 0;
728
729
730
731
732
733
734
735
736
737
738
739
740 CSR_WRITE_4(sc, LGE_RXDESC_ADDR_LO, VTOPHYS(c));
741 LGE_INC(sc->lge_cdata.lge_rx_prod, LGE_RX_LIST_CNT);
742
743 return (0);
744 }
745
746 int
747 lge_alloc_jumbo_mem(struct lge_softc *sc)
748 {
749 caddr_t ptr, kva;
750 bus_dma_segment_t seg;
751 bus_dmamap_t dmamap;
752 int i, rseg, state, error;
753 struct lge_jpool_entry *entry;
754
755 state = error = 0;
756
757
758 if (bus_dmamem_alloc(sc->sc_dmatag, LGE_JMEM, PAGE_SIZE, 0,
759 &seg, 1, &rseg, BUS_DMA_NOWAIT)) {
760 printf("%s: can't alloc rx buffers\n", sc->sc_dv.dv_xname);
761 return (ENOBUFS);
762 }
763
764 state = 1;
765 if (bus_dmamem_map(sc->sc_dmatag, &seg, rseg, LGE_JMEM, &kva,
766 BUS_DMA_NOWAIT)) {
767 printf("%s: can't map dma buffers (%d bytes)\n",
768 sc->sc_dv.dv_xname, LGE_JMEM);
769 error = ENOBUFS;
770 goto out;
771 }
772
773 state = 2;
774 if (bus_dmamap_create(sc->sc_dmatag, LGE_JMEM, 1,
775 LGE_JMEM, 0, BUS_DMA_NOWAIT, &dmamap)) {
776 printf("%s: can't create dma map\n", sc->sc_dv.dv_xname);
777 error = ENOBUFS;
778 goto out;
779 }
780
781 state = 3;
782 if (bus_dmamap_load(sc->sc_dmatag, dmamap, kva, LGE_JMEM,
783 NULL, BUS_DMA_NOWAIT)) {
784 printf("%s: can't load dma map\n", sc->sc_dv.dv_xname);
785 error = ENOBUFS;
786 goto out;
787 }
788
789 state = 4;
790 sc->lge_cdata.lge_jumbo_buf = (caddr_t)kva;
791 DPRINTFN(1,("lge_jumbo_buf = 0x%08X\n", sc->lge_cdata.lge_jumbo_buf));
792 DPRINTFN(1,("LGE_JLEN = 0x%08X\n", LGE_JLEN));
793
794 LIST_INIT(&sc->lge_jfree_listhead);
795 LIST_INIT(&sc->lge_jinuse_listhead);
796
797
798
799
800
801 ptr = sc->lge_cdata.lge_jumbo_buf;
802 for (i = 0; i < LGE_JSLOTS; i++) {
803 sc->lge_cdata.lge_jslots[i] = ptr;
804 ptr += LGE_JLEN;
805 entry = malloc(sizeof(struct lge_jpool_entry),
806 M_DEVBUF, M_NOWAIT);
807 if (entry == NULL) {
808 sc->lge_cdata.lge_jumbo_buf = NULL;
809 printf("%s: no memory for jumbo buffer queue!\n",
810 sc->sc_dv.dv_xname);
811 error = ENOBUFS;
812 goto out;
813 }
814 entry->slot = i;
815 LIST_INSERT_HEAD(&sc->lge_jfree_listhead,
816 entry, jpool_entries);
817 }
818 out:
819 if (error != 0) {
820 switch (state) {
821 case 4:
822 bus_dmamap_unload(sc->sc_dmatag, dmamap);
823 case 3:
824 bus_dmamap_destroy(sc->sc_dmatag, dmamap);
825 case 2:
826 bus_dmamem_unmap(sc->sc_dmatag, kva, LGE_JMEM);
827 case 1:
828 bus_dmamem_free(sc->sc_dmatag, &seg, rseg);
829 break;
830 default:
831 break;
832 }
833 }
834
835 return (error);
836 }
837
838
839
840
841 void *
842 lge_jalloc(struct lge_softc *sc)
843 {
844 struct lge_jpool_entry *entry;
845
846 entry = LIST_FIRST(&sc->lge_jfree_listhead);
847
848 if (entry == NULL)
849 return (NULL);
850
851 LIST_REMOVE(entry, jpool_entries);
852 LIST_INSERT_HEAD(&sc->lge_jinuse_listhead, entry, jpool_entries);
853 return (sc->lge_cdata.lge_jslots[entry->slot]);
854 }
855
856
857
858
859 void
860 lge_jfree(caddr_t buf, u_int size, void *arg)
861 {
862 struct lge_softc *sc;
863 int i;
864 struct lge_jpool_entry *entry;
865
866
867 sc = (struct lge_softc *)arg;
868
869 if (sc == NULL)
870 panic("lge_jfree: can't find softc pointer!");
871
872
873 i = ((vaddr_t)buf - (vaddr_t)sc->lge_cdata.lge_jumbo_buf) / LGE_JLEN;
874
875 if ((i < 0) || (i >= LGE_JSLOTS))
876 panic("lge_jfree: asked to free buffer that we don't manage!");
877
878 entry = LIST_FIRST(&sc->lge_jinuse_listhead);
879 if (entry == NULL)
880 panic("lge_jfree: buffer not in use!");
881 entry->slot = i;
882 LIST_REMOVE(entry, jpool_entries);
883 LIST_INSERT_HEAD(&sc->lge_jfree_listhead, entry, jpool_entries);
884 }
885
886
887
888
889
890 void
891 lge_rxeof(struct lge_softc *sc, int cnt)
892 {
893 struct mbuf *m;
894 struct ifnet *ifp;
895 struct lge_rx_desc *cur_rx;
896 int c, i, total_len = 0;
897 u_int32_t rxsts, rxctl;
898
899 ifp = &sc->arpcom.ac_if;
900
901
902 c = cnt;
903 i = sc->lge_cdata.lge_rx_cons;
904
905
906 while(c) {
907 struct mbuf *m0 = NULL;
908
909 cur_rx = &sc->lge_ldata->lge_rx_list[i];
910 rxctl = cur_rx->lge_ctl;
911 rxsts = cur_rx->lge_sts;
912 m = cur_rx->lge_mbuf;
913 cur_rx->lge_mbuf = NULL;
914 total_len = LGE_RXBYTES(cur_rx);
915 LGE_INC(i, LGE_RX_LIST_CNT);
916 c--;
917
918
919
920
921
922
923
924 if (rxctl & LGE_RXCTL_ERRMASK) {
925 ifp->if_ierrors++;
926 lge_newbuf(sc, &LGE_RXTAIL(sc), m);
927 continue;
928 }
929
930 if (lge_newbuf(sc, &LGE_RXTAIL(sc), NULL) == ENOBUFS) {
931 m0 = m_devget(mtod(m, char *), total_len, ETHER_ALIGN,
932 ifp, NULL);
933 lge_newbuf(sc, &LGE_RXTAIL(sc), m);
934 if (m0 == NULL) {
935 ifp->if_ierrors++;
936 continue;
937 }
938 m = m0;
939 } else {
940 m->m_pkthdr.rcvif = ifp;
941 m->m_pkthdr.len = m->m_len = total_len;
942 }
943
944 ifp->if_ipackets++;
945
946 #if NBPFILTER > 0
947
948
949
950 if (ifp->if_bpf)
951 bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_IN);
952 #endif
953
954
955 if (rxsts & LGE_RXSTS_ISIP) {
956 if (!(rxsts & LGE_RXSTS_IPCSUMERR))
957 m->m_pkthdr.csum_flags |= M_IPV4_CSUM_IN_OK;
958 }
959 if (rxsts & LGE_RXSTS_ISTCP) {
960 if (!(rxsts & LGE_RXSTS_TCPCSUMERR))
961 m->m_pkthdr.csum_flags |= M_TCP_CSUM_IN_OK;
962 }
963 if (rxsts & LGE_RXSTS_ISUDP) {
964 if (!(rxsts & LGE_RXSTS_UDPCSUMERR))
965 m->m_pkthdr.csum_flags |= M_UDP_CSUM_IN_OK;
966 }
967
968 ether_input_mbuf(ifp, m);
969 }
970
971 sc->lge_cdata.lge_rx_cons = i;
972 }
973
974
975
976
977
978
979 void
980 lge_txeof(struct lge_softc *sc)
981 {
982 struct lge_tx_desc *cur_tx = NULL;
983 struct ifnet *ifp;
984 u_int32_t idx, txdone;
985
986 ifp = &sc->arpcom.ac_if;
987
988
989 ifp->if_timer = 0;
990
991
992
993
994
995 idx = sc->lge_cdata.lge_tx_cons;
996 txdone = CSR_READ_1(sc, LGE_TXDMADONE_8BIT);
997
998 while (idx != sc->lge_cdata.lge_tx_prod && txdone) {
999 cur_tx = &sc->lge_ldata->lge_tx_list[idx];
1000
1001 ifp->if_opackets++;
1002 if (cur_tx->lge_mbuf != NULL) {
1003 m_freem(cur_tx->lge_mbuf);
1004 cur_tx->lge_mbuf = NULL;
1005 }
1006 cur_tx->lge_ctl = 0;
1007
1008 txdone--;
1009 LGE_INC(idx, LGE_TX_LIST_CNT);
1010 ifp->if_timer = 0;
1011 }
1012
1013 sc->lge_cdata.lge_tx_cons = idx;
1014
1015 if (cur_tx != NULL)
1016 ifp->if_flags &= ~IFF_OACTIVE;
1017 }
1018
1019 void
1020 lge_tick(void *xsc)
1021 {
1022 struct lge_softc *sc = xsc;
1023 struct mii_data *mii = &sc->lge_mii;
1024 struct ifnet *ifp = &sc->arpcom.ac_if;
1025 int s;
1026
1027 s = splnet();
1028
1029 CSR_WRITE_4(sc, LGE_STATSIDX, LGE_STATS_SINGLE_COLL_PKTS);
1030 ifp->if_collisions += CSR_READ_4(sc, LGE_STATSVAL);
1031 CSR_WRITE_4(sc, LGE_STATSIDX, LGE_STATS_MULTI_COLL_PKTS);
1032 ifp->if_collisions += CSR_READ_4(sc, LGE_STATSVAL);
1033
1034 if (!sc->lge_link) {
1035 mii_tick(mii);
1036 if (mii->mii_media_status & IFM_ACTIVE &&
1037 IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
1038 sc->lge_link++;
1039 if (!IFQ_IS_EMPTY(&ifp->if_snd))
1040 lge_start(ifp);
1041 }
1042 }
1043
1044 timeout_add(&sc->lge_timeout, hz);
1045
1046 splx(s);
1047 }
1048
1049 int
1050 lge_intr(void *arg)
1051 {
1052 struct lge_softc *sc;
1053 struct ifnet *ifp;
1054 u_int32_t status;
1055 int claimed = 0;
1056
1057 sc = arg;
1058 ifp = &sc->arpcom.ac_if;
1059
1060
1061 if (!(ifp->if_flags & IFF_UP)) {
1062 lge_stop(sc);
1063 return (0);
1064 }
1065
1066 for (;;) {
1067
1068
1069
1070
1071
1072 status = CSR_READ_4(sc, LGE_ISR);
1073
1074 if ((status & LGE_INTRS) == 0)
1075 break;
1076
1077 claimed = 1;
1078
1079 if ((status & (LGE_ISR_TXCMDFIFO_EMPTY|LGE_ISR_TXDMA_DONE)))
1080 lge_txeof(sc);
1081
1082 if (status & LGE_ISR_RXDMA_DONE)
1083 lge_rxeof(sc, LGE_RX_DMACNT(status));
1084
1085 if (status & LGE_ISR_RXCMDFIFO_EMPTY)
1086 lge_init(sc);
1087
1088 if (status & LGE_ISR_PHY_INTR) {
1089 sc->lge_link = 0;
1090 timeout_del(&sc->lge_timeout);
1091 lge_tick(sc);
1092 }
1093 }
1094
1095
1096 CSR_WRITE_4(sc, LGE_IMR, LGE_IMR_SETRST_CTL0|LGE_IMR_INTR_ENB);
1097
1098 if (!IFQ_IS_EMPTY(&ifp->if_snd))
1099 lge_start(ifp);
1100
1101 return (claimed);
1102 }
1103
1104
1105
1106
1107
1108 int
1109 lge_encap(struct lge_softc *sc, struct mbuf *m_head, u_int32_t *txidx)
1110 {
1111 struct lge_frag *f = NULL;
1112 struct lge_tx_desc *cur_tx;
1113 struct mbuf *m;
1114 int frag = 0, tot_len = 0;
1115
1116
1117
1118
1119
1120
1121 m = m_head;
1122 cur_tx = &sc->lge_ldata->lge_tx_list[*txidx];
1123 frag = 0;
1124
1125 for (m = m_head; m != NULL; m = m->m_next) {
1126 if (m->m_len != 0) {
1127 tot_len += m->m_len;
1128 f = &cur_tx->lge_frags[frag];
1129 f->lge_fraglen = m->m_len;
1130 f->lge_fragptr_lo = VTOPHYS(mtod(m, vaddr_t));
1131 f->lge_fragptr_hi = 0;
1132 frag++;
1133 }
1134 }
1135
1136 if (m != NULL)
1137 return (ENOBUFS);
1138
1139 cur_tx->lge_mbuf = m_head;
1140 cur_tx->lge_ctl = LGE_TXCTL_WANTINTR|LGE_FRAGCNT(frag)|tot_len;
1141 LGE_INC((*txidx), LGE_TX_LIST_CNT);
1142
1143
1144 CSR_WRITE_4(sc, LGE_TXDESC_ADDR_LO, VTOPHYS(cur_tx));
1145
1146 return (0);
1147 }
1148
1149
1150
1151
1152
1153
1154
1155
1156 void
1157 lge_start(struct ifnet *ifp)
1158 {
1159 struct lge_softc *sc;
1160 struct mbuf *m_head = NULL;
1161 u_int32_t idx;
1162 int pkts = 0;
1163
1164 sc = ifp->if_softc;
1165
1166 if (!sc->lge_link)
1167 return;
1168
1169 idx = sc->lge_cdata.lge_tx_prod;
1170
1171 if (ifp->if_flags & IFF_OACTIVE)
1172 return;
1173
1174 while(sc->lge_ldata->lge_tx_list[idx].lge_mbuf == NULL) {
1175 if (CSR_READ_1(sc, LGE_TXCMDFREE_8BIT) == 0)
1176 break;
1177
1178 IFQ_POLL(&ifp->if_snd, m_head);
1179 if (m_head == NULL)
1180 break;
1181
1182 if (lge_encap(sc, m_head, &idx)) {
1183 ifp->if_flags |= IFF_OACTIVE;
1184 break;
1185 }
1186
1187
1188 IFQ_DEQUEUE(&ifp->if_snd, m_head);
1189 pkts++;
1190
1191 #if NBPFILTER > 0
1192
1193
1194
1195
1196 if (ifp->if_bpf)
1197 bpf_mtap(ifp->if_bpf, m_head, BPF_DIRECTION_OUT);
1198 #endif
1199 }
1200 if (pkts == 0)
1201 return;
1202
1203 sc->lge_cdata.lge_tx_prod = idx;
1204
1205
1206
1207
1208 ifp->if_timer = 5;
1209 }
1210
1211 void
1212 lge_init(void *xsc)
1213 {
1214 struct lge_softc *sc = xsc;
1215 struct ifnet *ifp = &sc->arpcom.ac_if;
1216 int s;
1217
1218 s = splnet();
1219
1220
1221
1222
1223 lge_stop(sc);
1224 lge_reset(sc);
1225
1226
1227 CSR_WRITE_4(sc, LGE_PAR0, *(u_int32_t *)(&sc->arpcom.ac_enaddr[0]));
1228 CSR_WRITE_4(sc, LGE_PAR1, *(u_int32_t *)(&sc->arpcom.ac_enaddr[4]));
1229
1230
1231 if (lge_list_rx_init(sc) == ENOBUFS) {
1232 printf("%s: initialization failed: no "
1233 "memory for rx buffers\n", sc->sc_dv.dv_xname);
1234 lge_stop(sc);
1235 splx(s);
1236 return;
1237 }
1238
1239
1240
1241
1242 lge_list_tx_init(sc);
1243
1244
1245 CSR_WRITE_4(sc, LGE_MODE1, LGE_MODE1_RX_UCAST|
1246 LGE_MODE1_TX_CRC|LGE_MODE1_TXPAD|
1247 LGE_MODE1_RX_FLOWCTL|LGE_MODE1_SETRST_CTL0|
1248 LGE_MODE1_SETRST_CTL1|LGE_MODE1_SETRST_CTL2);
1249
1250
1251 if (ifp->if_flags & IFF_PROMISC) {
1252 CSR_WRITE_4(sc, LGE_MODE1,
1253 LGE_MODE1_SETRST_CTL1|LGE_MODE1_RX_PROMISC);
1254 } else {
1255 CSR_WRITE_4(sc, LGE_MODE1, LGE_MODE1_RX_PROMISC);
1256 }
1257
1258
1259
1260
1261 if (ifp->if_flags & IFF_BROADCAST) {
1262 CSR_WRITE_4(sc, LGE_MODE1,
1263 LGE_MODE1_SETRST_CTL1|LGE_MODE1_RX_BCAST);
1264 } else {
1265 CSR_WRITE_4(sc, LGE_MODE1, LGE_MODE1_RX_BCAST);
1266 }
1267
1268
1269 CSR_WRITE_4(sc, LGE_MODE1, LGE_MODE1_SETRST_CTL1|LGE_MODE1_RMVPAD);
1270
1271
1272 CSR_WRITE_4(sc, LGE_MODE1, LGE_MODE1_RX_ERRPKTS);
1273
1274
1275 CSR_WRITE_4(sc, LGE_MODE1, LGE_MODE1_SETRST_CTL1|LGE_MODE1_RX_GIANTS);
1276
1277
1278 CSR_WRITE_4(sc, LGE_MODE1, LGE_MODE1_TX_FLOWCTL);
1279 CSR_WRITE_4(sc, LGE_MODE1, LGE_MODE1_RX_FLOWCTL);
1280
1281
1282 CSR_WRITE_4(sc, LGE_MODE1, LGE_MODE1_RX_CRC);
1283
1284
1285 CSR_WRITE_4(sc, LGE_MODE1, LGE_MODE1_MPACK_ENB);
1286
1287
1288 CSR_WRITE_4(sc, LGE_MODE1, LGE_MODE1_VLAN_RX|LGE_MODE1_VLAN_TX|
1289 LGE_MODE1_VLAN_STRIP|LGE_MODE1_VLAN_INSERT);
1290
1291
1292 CSR_WRITE_2(sc, LGE_RXFIFO_HIWAT, 0x3FFF);
1293 CSR_WRITE_4(sc, LGE_IMR, LGE_IMR_SETRST_CTL1|LGE_IMR_RXFIFO_WAT);
1294
1295
1296
1297
1298 lge_setmulti(sc);
1299
1300
1301
1302
1303
1304 CSR_WRITE_4(sc, LGE_MODE2, LGE_MODE2_RX_IPCSUM|
1305 LGE_MODE2_RX_TCPCSUM|LGE_MODE2_RX_UDPCSUM|
1306 LGE_MODE2_RX_ERRCSUM);
1307
1308
1309
1310
1311
1312 CSR_WRITE_4(sc, LGE_MODE1, LGE_MODE1_SETRST_CTL0|LGE_MODE1_GMIIPOLL);
1313
1314
1315 CSR_WRITE_4(sc, LGE_RXDESC_ADDR_HI, 0);
1316 CSR_WRITE_4(sc, LGE_MODE1, LGE_MODE1_SETRST_CTL1|LGE_MODE1_RX_ENB);
1317
1318 CSR_WRITE_4(sc, LGE_TXDESC_ADDR_HI, 0);
1319 CSR_WRITE_4(sc, LGE_MODE1, LGE_MODE1_SETRST_CTL1|LGE_MODE1_TX_ENB);
1320
1321
1322
1323
1324 CSR_WRITE_4(sc, LGE_IMR, LGE_IMR_SETRST_CTL0|
1325 LGE_IMR_SETRST_CTL1|LGE_IMR_INTR_ENB|LGE_INTRS);
1326
1327 lge_ifmedia_upd(ifp);
1328
1329 ifp->if_flags |= IFF_RUNNING;
1330 ifp->if_flags &= ~IFF_OACTIVE;
1331
1332 splx(s);
1333
1334 timeout_add(&sc->lge_timeout, hz);
1335 }
1336
1337
1338
1339
1340 int
1341 lge_ifmedia_upd(struct ifnet *ifp)
1342 {
1343 struct lge_softc *sc = ifp->if_softc;
1344 struct mii_data *mii = &sc->lge_mii;
1345
1346 sc->lge_link = 0;
1347 if (mii->mii_instance) {
1348 struct mii_softc *miisc;
1349 LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
1350 mii_phy_reset(miisc);
1351 }
1352 mii_mediachg(mii);
1353
1354 return (0);
1355 }
1356
1357
1358
1359
1360 void
1361 lge_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
1362 {
1363 struct lge_softc *sc = ifp->if_softc;
1364 struct mii_data *mii = &sc->lge_mii;
1365
1366 mii_pollstat(mii);
1367 ifmr->ifm_active = mii->mii_media_active;
1368 ifmr->ifm_status = mii->mii_media_status;
1369 }
1370
1371 int
1372 lge_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
1373 {
1374 struct lge_softc *sc = ifp->if_softc;
1375 struct ifreq *ifr = (struct ifreq *) data;
1376 struct ifaddr *ifa = (struct ifaddr *)data;
1377 struct mii_data *mii;
1378 int s, error = 0;
1379
1380 s = splnet();
1381
1382 switch(command) {
1383 case SIOCSIFADDR:
1384 ifp->if_flags |= IFF_UP;
1385 if (!(ifp->if_flags & IFF_RUNNING))
1386 lge_init(sc);
1387 #ifdef INET
1388 if (ifa->ifa_addr->sa_family == AF_INET)
1389 arp_ifinit(&sc->arpcom, ifa);
1390 #endif
1391 break;
1392 case SIOCSIFMTU:
1393 if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > ifp->if_hardmtu)
1394 error = EINVAL;
1395 else if (ifp->if_mtu != ifr->ifr_mtu)
1396 ifp->if_mtu = ifr->ifr_mtu;
1397 break;
1398 case SIOCSIFFLAGS:
1399 if (ifp->if_flags & IFF_UP) {
1400 if (ifp->if_flags & IFF_RUNNING &&
1401 ifp->if_flags & IFF_PROMISC &&
1402 !(sc->lge_if_flags & IFF_PROMISC)) {
1403 CSR_WRITE_4(sc, LGE_MODE1,
1404 LGE_MODE1_SETRST_CTL1|
1405 LGE_MODE1_RX_PROMISC);
1406 lge_setmulti(sc);
1407 } else if (ifp->if_flags & IFF_RUNNING &&
1408 !(ifp->if_flags & IFF_PROMISC) &&
1409 sc->lge_if_flags & IFF_PROMISC) {
1410 CSR_WRITE_4(sc, LGE_MODE1,
1411 LGE_MODE1_RX_PROMISC);
1412 lge_setmulti(sc);
1413 } else if (ifp->if_flags & IFF_RUNNING &&
1414 (ifp->if_flags ^ sc->lge_if_flags) & IFF_ALLMULTI) {
1415 lge_setmulti(sc);
1416 } else {
1417 if (!(ifp->if_flags & IFF_RUNNING))
1418 lge_init(sc);
1419 }
1420 } else {
1421 if (ifp->if_flags & IFF_RUNNING)
1422 lge_stop(sc);
1423 }
1424 sc->lge_if_flags = ifp->if_flags;
1425 break;
1426 case SIOCADDMULTI:
1427 case SIOCDELMULTI:
1428 error = (command == SIOCADDMULTI)
1429 ? ether_addmulti(ifr, &sc->arpcom)
1430 : ether_delmulti(ifr, &sc->arpcom);
1431
1432 if (error == ENETRESET) {
1433 if (ifp->if_flags & IFF_RUNNING)
1434 lge_setmulti(sc);
1435 error = 0;
1436 }
1437 break;
1438 case SIOCGIFMEDIA:
1439 case SIOCSIFMEDIA:
1440 mii = &sc->lge_mii;
1441 error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command);
1442 break;
1443 default:
1444 error = ENOTTY;
1445 break;
1446 }
1447
1448 splx(s);
1449
1450 return (error);
1451 }
1452
1453 void
1454 lge_watchdog(struct ifnet *ifp)
1455 {
1456 struct lge_softc *sc;
1457
1458 sc = ifp->if_softc;
1459
1460 ifp->if_oerrors++;
1461 printf("%s: watchdog timeout\n", sc->sc_dv.dv_xname);
1462
1463 lge_stop(sc);
1464 lge_reset(sc);
1465 lge_init(sc);
1466
1467 if (!IFQ_IS_EMPTY(&ifp->if_snd))
1468 lge_start(ifp);
1469 }
1470
1471
1472
1473
1474
1475 void
1476 lge_stop(struct lge_softc *sc)
1477 {
1478 int i;
1479 struct ifnet *ifp;
1480
1481 ifp = &sc->arpcom.ac_if;
1482 ifp->if_timer = 0;
1483 timeout_del(&sc->lge_timeout);
1484
1485 ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
1486
1487 CSR_WRITE_4(sc, LGE_IMR, LGE_IMR_INTR_ENB);
1488
1489
1490 CSR_WRITE_4(sc, LGE_MODE1, LGE_MODE1_RX_ENB|LGE_MODE1_TX_ENB);
1491 sc->lge_link = 0;
1492
1493
1494
1495
1496 for (i = 0; i < LGE_RX_LIST_CNT; i++) {
1497 if (sc->lge_ldata->lge_rx_list[i].lge_mbuf != NULL) {
1498 m_freem(sc->lge_ldata->lge_rx_list[i].lge_mbuf);
1499 sc->lge_ldata->lge_rx_list[i].lge_mbuf = NULL;
1500 }
1501 }
1502 bzero((char *)&sc->lge_ldata->lge_rx_list,
1503 sizeof(sc->lge_ldata->lge_rx_list));
1504
1505
1506
1507
1508 for (i = 0; i < LGE_TX_LIST_CNT; i++) {
1509 if (sc->lge_ldata->lge_tx_list[i].lge_mbuf != NULL) {
1510 m_freem(sc->lge_ldata->lge_tx_list[i].lge_mbuf);
1511 sc->lge_ldata->lge_tx_list[i].lge_mbuf = NULL;
1512 }
1513 }
1514
1515 bzero((char *)&sc->lge_ldata->lge_tx_list,
1516 sizeof(sc->lge_ldata->lge_tx_list));
1517 }
1518
1519
1520
1521
1522
1523 void
1524 lge_shutdown(void *xsc)
1525 {
1526 struct lge_softc *sc = (struct lge_softc *)xsc;
1527
1528 lge_reset(sc);
1529 lge_stop(sc);
1530 }