Annotation of sys/dev/ic/re.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: re.c,v 1.74 2007/07/16 19:15:01 millert Exp $ */
2: /* $FreeBSD: if_re.c,v 1.31 2004/09/04 07:54:05 ru Exp $ */
3: /*
4: * Copyright (c) 1997, 1998-2003
5: * Bill Paul <wpaul@windriver.com>. All rights reserved.
6: *
7: * Redistribution and use in source and binary forms, with or without
8: * modification, are permitted provided that the following conditions
9: * are met:
10: * 1. Redistributions of source code must retain the above copyright
11: * notice, this list of conditions and the following disclaimer.
12: * 2. Redistributions in binary form must reproduce the above copyright
13: * notice, this list of conditions and the following disclaimer in the
14: * documentation and/or other materials provided with the distribution.
15: * 3. All advertising materials mentioning features or use of this software
16: * must display the following acknowledgement:
17: * This product includes software developed by Bill Paul.
18: * 4. Neither the name of the author nor the names of any co-contributors
19: * may be used to endorse or promote products derived from this software
20: * without specific prior written permission.
21: *
22: * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
23: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25: * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
26: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
32: * THE POSSIBILITY OF SUCH DAMAGE.
33: */
34:
35: /*
36: * RealTek 8139C+/8169/8169S/8110S PCI NIC driver
37: *
38: * Written by Bill Paul <wpaul@windriver.com>
39: * Senior Networking Software Engineer
40: * Wind River Systems
41: */
42:
43: /*
44: * This driver is designed to support RealTek's next generation of
45: * 10/100 and 10/100/1000 PCI ethernet controllers. There are currently
46: * seven devices in this family: the RTL8139C+, the RTL8169, the RTL8169S,
47: * RTL8110S, the RTL8168, the RTL8111 and the RTL8101E.
48: *
49: * The 8139C+ is a 10/100 ethernet chip. It is backwards compatible
50: * with the older 8139 family, however it also supports a special
51: * C+ mode of operation that provides several new performance enhancing
52: * features. These include:
53: *
54: * o Descriptor based DMA mechanism. Each descriptor represents
55: * a single packet fragment. Data buffers may be aligned on
56: * any byte boundary.
57: *
58: * o 64-bit DMA
59: *
60: * o TCP/IP checksum offload for both RX and TX
61: *
62: * o High and normal priority transmit DMA rings
63: *
64: * o VLAN tag insertion and extraction
65: *
66: * o TCP large send (segmentation offload)
67: *
68: * Like the 8139, the 8139C+ also has a built-in 10/100 PHY. The C+
69: * programming API is fairly straightforward. The RX filtering, EEPROM
70: * access and PHY access is the same as it is on the older 8139 series
71: * chips.
72: *
73: * The 8169 is a 64-bit 10/100/1000 gigabit ethernet MAC. It has almost the
74: * same programming API and feature set as the 8139C+ with the following
75: * differences and additions:
76: *
77: * o 1000Mbps mode
78: *
79: * o Jumbo frames
80: *
81: * o GMII and TBI ports/registers for interfacing with copper
82: * or fiber PHYs
83: *
84: * o RX and TX DMA rings can have up to 1024 descriptors
85: * (the 8139C+ allows a maximum of 64)
86: *
87: * o Slight differences in register layout from the 8139C+
88: *
89: * The TX start and timer interrupt registers are at different locations
90: * on the 8169 than they are on the 8139C+. Also, the status word in the
91: * RX descriptor has a slightly different bit layout. The 8169 does not
92: * have a built-in PHY. Most reference boards use a Marvell 88E1000 'Alaska'
93: * copper gigE PHY.
94: *
95: * The 8169S/8110S 10/100/1000 devices have built-in copper gigE PHYs
96: * (the 'S' stands for 'single-chip'). These devices have the same
97: * programming API as the older 8169, but also have some vendor-specific
98: * registers for the on-board PHY. The 8110S is a LAN-on-motherboard
99: * part designed to be pin-compatible with the RealTek 8100 10/100 chip.
100: *
101: * This driver takes advantage of the RX and TX checksum offload and
102: * VLAN tag insertion/extraction features. It also implements TX
103: * interrupt moderation using the timer interrupt registers, which
104: * significantly reduces TX interrupt load. There is also support
105: * for jumbo frames, however the 8169/8169S/8110S can not transmit
106: * jumbo frames larger than 7440, so the max MTU possible with this
107: * driver is 7422 bytes.
108: */
109:
110: #include "bpfilter.h"
111: #include "vlan.h"
112:
113: #include <sys/param.h>
114: #include <sys/endian.h>
115: #include <sys/systm.h>
116: #include <sys/sockio.h>
117: #include <sys/mbuf.h>
118: #include <sys/malloc.h>
119: #include <sys/kernel.h>
120: #include <sys/device.h>
121: #include <sys/timeout.h>
122: #include <sys/socket.h>
123:
124: #include <net/if.h>
125: #include <net/if_dl.h>
126: #include <net/if_media.h>
127:
128: #ifdef INET
129: #include <netinet/in.h>
130: #include <netinet/in_systm.h>
131: #include <netinet/in_var.h>
132: #include <netinet/ip.h>
133: #include <netinet/if_ether.h>
134: #endif
135:
136: #if NVLAN > 0
137: #include <net/if_types.h>
138: #include <net/if_vlan_var.h>
139: #endif
140:
141: #if NBPFILTER > 0
142: #include <net/bpf.h>
143: #endif
144:
145: #include <dev/mii/mii.h>
146: #include <dev/mii/miivar.h>
147:
148: #include <dev/pci/pcireg.h>
149: #include <dev/pci/pcivar.h>
150:
151: #include <dev/ic/rtl81x9reg.h>
152: #include <dev/ic/revar.h>
153:
154: #ifdef RE_DEBUG
155: int redebug = 0;
156: #define DPRINTF(x) do { if (redebug) printf x; } while (0)
157: #else
158: #define DPRINTF(x)
159: #endif
160:
161: static inline void re_set_bufaddr(struct rl_desc *, bus_addr_t);
162:
163: int re_encap(struct rl_softc *, struct mbuf *, int *);
164:
165: int re_newbuf(struct rl_softc *, int, struct mbuf *);
166: int re_rx_list_init(struct rl_softc *);
167: int re_tx_list_init(struct rl_softc *);
168: void re_rxeof(struct rl_softc *);
169: void re_txeof(struct rl_softc *);
170: void re_tick(void *);
171: void re_start(struct ifnet *);
172: int re_ioctl(struct ifnet *, u_long, caddr_t);
173: void re_watchdog(struct ifnet *);
174: int re_ifmedia_upd(struct ifnet *);
175: void re_ifmedia_sts(struct ifnet *, struct ifmediareq *);
176:
177: void re_eeprom_putbyte(struct rl_softc *, int);
178: void re_eeprom_getword(struct rl_softc *, int, u_int16_t *);
179: void re_read_eeprom(struct rl_softc *, caddr_t, int, int);
180:
181: int re_gmii_readreg(struct device *, int, int);
182: void re_gmii_writereg(struct device *, int, int, int);
183:
184: int re_miibus_readreg(struct device *, int, int);
185: void re_miibus_writereg(struct device *, int, int, int);
186: void re_miibus_statchg(struct device *);
187:
188: void re_setmulti(struct rl_softc *);
189: void re_setpromisc(struct rl_softc *);
190: void re_reset(struct rl_softc *);
191:
192: #ifdef RE_DIAG
193: int re_diag(struct rl_softc *);
194: #endif
195:
196: struct cfdriver re_cd = {
197: 0, "re", DV_IFNET
198: };
199:
200: #define EE_SET(x) \
201: CSR_WRITE_1(sc, RL_EECMD, \
202: CSR_READ_1(sc, RL_EECMD) | x)
203:
204: #define EE_CLR(x) \
205: CSR_WRITE_1(sc, RL_EECMD, \
206: CSR_READ_1(sc, RL_EECMD) & ~x)
207:
208: static const struct re_revision {
209: u_int32_t re_chipid;
210: const char *re_name;
211: } re_revisions[] = {
212: { RL_HWREV_8169, "RTL8169" },
213: { RL_HWREV_8110S, "RTL8110S" },
214: { RL_HWREV_8169S, "RTL8169S" },
215: { RL_HWREV_8169_8110SB, "RTL8169/8110SB" },
216: { RL_HWREV_8169_8110SCd, "RTL8169/8110SCd" },
217: { RL_HWREV_8168_SPIN1, "RTL8168 1" },
218: { RL_HWREV_8100E_SPIN1, "RTL8100E 1" },
219: { RL_HWREV_8101E, "RTL8101E" },
220: { RL_HWREV_8168_SPIN2, "RTL8168 2" },
221: { RL_HWREV_8168_SPIN3, "RTL8168 3" },
222: { RL_HWREV_8100E_SPIN2, "RTL8100E 2" },
223: { RL_HWREV_8139CPLUS, "RTL8139C+" },
224: { RL_HWREV_8101, "RTL8101" },
225: { RL_HWREV_8100, "RTL8100" },
226: { RL_HWREV_8169_8110SCe, "RTL8169/8110SCe" },
227:
228: { 0, NULL }
229: };
230:
231:
232: static inline void
233: re_set_bufaddr(struct rl_desc *d, bus_addr_t addr)
234: {
235: d->rl_bufaddr_lo = htole32((uint32_t)addr);
236: if (sizeof(bus_addr_t) == sizeof(uint64_t))
237: d->rl_bufaddr_hi = htole32((uint64_t)addr >> 32);
238: else
239: d->rl_bufaddr_hi = 0;
240: }
241:
242: /*
243: * Send a read command and address to the EEPROM, check for ACK.
244: */
245: void
246: re_eeprom_putbyte(struct rl_softc *sc, int addr)
247: {
248: int d, i;
249:
250: d = addr | (RL_9346_READ << sc->rl_eewidth);
251:
252: /*
253: * Feed in each bit and strobe the clock.
254: */
255:
256: for (i = 1 << (sc->rl_eewidth + 3); i; i >>= 1) {
257: if (d & i)
258: EE_SET(RL_EE_DATAIN);
259: else
260: EE_CLR(RL_EE_DATAIN);
261: DELAY(100);
262: EE_SET(RL_EE_CLK);
263: DELAY(150);
264: EE_CLR(RL_EE_CLK);
265: DELAY(100);
266: }
267: }
268:
269: /*
270: * Read a word of data stored in the EEPROM at address 'addr.'
271: */
272: void
273: re_eeprom_getword(struct rl_softc *sc, int addr, u_int16_t *dest)
274: {
275: int i;
276: u_int16_t word = 0;
277:
278: /*
279: * Send address of word we want to read.
280: */
281: re_eeprom_putbyte(sc, addr);
282:
283: /*
284: * Start reading bits from EEPROM.
285: */
286: for (i = 0x8000; i; i >>= 1) {
287: EE_SET(RL_EE_CLK);
288: DELAY(100);
289: if (CSR_READ_1(sc, RL_EECMD) & RL_EE_DATAOUT)
290: word |= i;
291: EE_CLR(RL_EE_CLK);
292: DELAY(100);
293: }
294:
295: *dest = word;
296: }
297:
298: /*
299: * Read a sequence of words from the EEPROM.
300: */
301: void
302: re_read_eeprom(struct rl_softc *sc, caddr_t dest, int off, int cnt)
303: {
304: int i;
305: u_int16_t word = 0, *ptr;
306:
307: CSR_SETBIT_1(sc, RL_EECMD, RL_EEMODE_PROGRAM);
308:
309: DELAY(100);
310:
311: for (i = 0; i < cnt; i++) {
312: CSR_SETBIT_1(sc, RL_EECMD, RL_EE_SEL);
313: re_eeprom_getword(sc, off + i, &word);
314: CSR_CLRBIT_1(sc, RL_EECMD, RL_EE_SEL);
315: ptr = (u_int16_t *)(dest + (i * 2));
316: *ptr = word;
317: }
318:
319: CSR_CLRBIT_1(sc, RL_EECMD, RL_EEMODE_PROGRAM);
320: }
321:
322: int
323: re_gmii_readreg(struct device *self, int phy, int reg)
324: {
325: struct rl_softc *sc = (struct rl_softc *)self;
326: u_int32_t rval;
327: int i;
328:
329: if (phy != 7)
330: return (0);
331:
332: /* Let the rgephy driver read the GMEDIASTAT register */
333:
334: if (reg == RL_GMEDIASTAT) {
335: rval = CSR_READ_1(sc, RL_GMEDIASTAT);
336: return (rval);
337: }
338:
339: CSR_WRITE_4(sc, RL_PHYAR, reg << 16);
340: DELAY(1000);
341:
342: for (i = 0; i < RL_TIMEOUT; i++) {
343: rval = CSR_READ_4(sc, RL_PHYAR);
344: if (rval & RL_PHYAR_BUSY)
345: break;
346: DELAY(100);
347: }
348:
349: if (i == RL_TIMEOUT) {
350: printf ("%s: PHY read failed\n", sc->sc_dev.dv_xname);
351: return (0);
352: }
353:
354: return (rval & RL_PHYAR_PHYDATA);
355: }
356:
357: void
358: re_gmii_writereg(struct device *dev, int phy, int reg, int data)
359: {
360: struct rl_softc *sc = (struct rl_softc *)dev;
361: u_int32_t rval;
362: int i;
363:
364: CSR_WRITE_4(sc, RL_PHYAR, (reg << 16) |
365: (data & RL_PHYAR_PHYDATA) | RL_PHYAR_BUSY);
366: DELAY(1000);
367:
368: for (i = 0; i < RL_TIMEOUT; i++) {
369: rval = CSR_READ_4(sc, RL_PHYAR);
370: if (!(rval & RL_PHYAR_BUSY))
371: break;
372: DELAY(100);
373: }
374:
375: if (i == RL_TIMEOUT)
376: printf ("%s: PHY write failed\n", sc->sc_dev.dv_xname);
377: }
378:
379: int
380: re_miibus_readreg(struct device *dev, int phy, int reg)
381: {
382: struct rl_softc *sc = (struct rl_softc *)dev;
383: u_int16_t rval = 0;
384: u_int16_t re8139_reg = 0;
385: int s;
386:
387: s = splnet();
388:
389: if (sc->rl_type == RL_8169) {
390: rval = re_gmii_readreg(dev, phy, reg);
391: splx(s);
392: return (rval);
393: }
394:
395: /* Pretend the internal PHY is only at address 0 */
396: if (phy) {
397: splx(s);
398: return (0);
399: }
400: switch(reg) {
401: case MII_BMCR:
402: re8139_reg = RL_BMCR;
403: break;
404: case MII_BMSR:
405: re8139_reg = RL_BMSR;
406: break;
407: case MII_ANAR:
408: re8139_reg = RL_ANAR;
409: break;
410: case MII_ANER:
411: re8139_reg = RL_ANER;
412: break;
413: case MII_ANLPAR:
414: re8139_reg = RL_LPAR;
415: break;
416: case MII_PHYIDR1:
417: case MII_PHYIDR2:
418: splx(s);
419: return (0);
420: /*
421: * Allow the rlphy driver to read the media status
422: * register. If we have a link partner which does not
423: * support NWAY, this is the register which will tell
424: * us the results of parallel detection.
425: */
426: case RL_MEDIASTAT:
427: rval = CSR_READ_1(sc, RL_MEDIASTAT);
428: splx(s);
429: return (rval);
430: default:
431: printf("%s: bad phy register %x\n", sc->sc_dev.dv_xname, reg);
432: splx(s);
433: return (0);
434: }
435: rval = CSR_READ_2(sc, re8139_reg);
436: if (sc->rl_type == RL_8139CPLUS && re8139_reg == RL_BMCR) {
437: /* 8139C+ has different bit layout. */
438: rval &= ~(BMCR_LOOP | BMCR_ISO);
439: }
440: splx(s);
441: return (rval);
442: }
443:
444: void
445: re_miibus_writereg(struct device *dev, int phy, int reg, int data)
446: {
447: struct rl_softc *sc = (struct rl_softc *)dev;
448: u_int16_t re8139_reg = 0;
449: int s;
450:
451: s = splnet();
452:
453: if (sc->rl_type == RL_8169) {
454: re_gmii_writereg(dev, phy, reg, data);
455: splx(s);
456: return;
457: }
458:
459: /* Pretend the internal PHY is only at address 0 */
460: if (phy) {
461: splx(s);
462: return;
463: }
464: switch(reg) {
465: case MII_BMCR:
466: re8139_reg = RL_BMCR;
467: if (sc->rl_type == RL_8139CPLUS) {
468: /* 8139C+ has different bit layout. */
469: data &= ~(BMCR_LOOP | BMCR_ISO);
470: }
471: break;
472: case MII_BMSR:
473: re8139_reg = RL_BMSR;
474: break;
475: case MII_ANAR:
476: re8139_reg = RL_ANAR;
477: break;
478: case MII_ANER:
479: re8139_reg = RL_ANER;
480: break;
481: case MII_ANLPAR:
482: re8139_reg = RL_LPAR;
483: break;
484: case MII_PHYIDR1:
485: case MII_PHYIDR2:
486: splx(s);
487: return;
488: break;
489: default:
490: printf("%s: bad phy register %x\n", sc->sc_dev.dv_xname, reg);
491: splx(s);
492: return;
493: }
494: CSR_WRITE_2(sc, re8139_reg, data);
495: splx(s);
496: }
497:
498: void
499: re_miibus_statchg(struct device *dev)
500: {
501: }
502:
503: /*
504: * Program the 64-bit multicast hash filter.
505: */
506: void
507: re_setmulti(struct rl_softc *sc)
508: {
509: struct ifnet *ifp;
510: int h = 0;
511: u_int32_t hashes[2] = { 0, 0 };
512: u_int32_t hwrev, rxfilt;
513: int mcnt = 0;
514: struct arpcom *ac = &sc->sc_arpcom;
515: struct ether_multi *enm;
516: struct ether_multistep step;
517:
518: ifp = &sc->sc_arpcom.ac_if;
519:
520: rxfilt = CSR_READ_4(sc, RL_RXCFG);
521:
522: if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) {
523: rxfilt |= RL_RXCFG_RX_MULTI;
524: CSR_WRITE_4(sc, RL_RXCFG, rxfilt);
525: CSR_WRITE_4(sc, RL_MAR0, 0xFFFFFFFF);
526: CSR_WRITE_4(sc, RL_MAR4, 0xFFFFFFFF);
527: return;
528: }
529:
530: /* first, zot all the existing hash bits */
531: CSR_WRITE_4(sc, RL_MAR0, 0);
532: CSR_WRITE_4(sc, RL_MAR4, 0);
533:
534: /* now program new ones */
535: ETHER_FIRST_MULTI(step, ac, enm);
536: while (enm != NULL) {
537: if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
538: ifp->if_flags |= IFF_ALLMULTI;
539: mcnt = MAX_NUM_MULTICAST_ADDRESSES;
540: }
541: if (mcnt == MAX_NUM_MULTICAST_ADDRESSES)
542: break;
543:
544: h = (ether_crc32_be(enm->enm_addrlo,
545: ETHER_ADDR_LEN) >> 26) & 0x0000003F;
546: if (h < 32)
547: hashes[0] |= (1 << h);
548: else
549: hashes[1] |= (1 << (h - 32));
550: mcnt++;
551: ETHER_NEXT_MULTI(step, enm);
552: }
553:
554: if (mcnt)
555: rxfilt |= RL_RXCFG_RX_MULTI;
556: else
557: rxfilt &= ~RL_RXCFG_RX_MULTI;
558:
559: CSR_WRITE_4(sc, RL_RXCFG, rxfilt);
560:
561: /*
562: * For some unfathomable reason, RealTek decided to reverse
563: * the order of the multicast hash registers in the PCI Express
564: * parts. This means we have to write the hash pattern in reverse
565: * order for those devices.
566: */
567: hwrev = CSR_READ_4(sc, RL_TXCFG) & RL_TXCFG_HWREV;
568: if (hwrev == RL_HWREV_8100E_SPIN1 || hwrev == RL_HWREV_8100E_SPIN2 ||
569: hwrev == RL_HWREV_8101E || hwrev == RL_HWREV_8168_SPIN1 ||
570: hwrev == RL_HWREV_8168_SPIN2) {
571: CSR_WRITE_4(sc, RL_MAR0, swap32(hashes[1]));
572: CSR_WRITE_4(sc, RL_MAR4, swap32(hashes[0]));
573: } else {
574: CSR_WRITE_4(sc, RL_MAR0, hashes[0]);
575: CSR_WRITE_4(sc, RL_MAR4, hashes[1]);
576: }
577: }
578:
579: void
580: re_setpromisc(struct rl_softc *sc)
581: {
582: struct ifnet *ifp;
583: u_int32_t rxcfg = 0;
584:
585: ifp = &sc->sc_arpcom.ac_if;
586:
587: rxcfg = CSR_READ_4(sc, RL_RXCFG);
588: if (ifp->if_flags & IFF_PROMISC)
589: rxcfg |= RL_RXCFG_RX_ALLPHYS;
590: else
591: rxcfg &= ~RL_RXCFG_RX_ALLPHYS;
592: CSR_WRITE_4(sc, RL_RXCFG, rxcfg);
593: }
594:
595: void
596: re_reset(struct rl_softc *sc)
597: {
598: int i;
599:
600: CSR_WRITE_1(sc, RL_COMMAND, RL_CMD_RESET);
601:
602: for (i = 0; i < RL_TIMEOUT; i++) {
603: DELAY(10);
604: if (!(CSR_READ_1(sc, RL_COMMAND) & RL_CMD_RESET))
605: break;
606: }
607: if (i == RL_TIMEOUT)
608: printf("%s: reset never completed!\n", sc->sc_dev.dv_xname);
609:
610: CSR_WRITE_1(sc, 0x82, 1);
611: }
612:
613: #ifdef RE_DIAG
614:
615: /*
616: * The following routine is designed to test for a defect on some
617: * 32-bit 8169 cards. Some of these NICs have the REQ64# and ACK64#
618: * lines connected to the bus, however for a 32-bit only card, they
619: * should be pulled high. The result of this defect is that the
620: * NIC will not work right if you plug it into a 64-bit slot: DMA
621: * operations will be done with 64-bit transfers, which will fail
622: * because the 64-bit data lines aren't connected.
623: *
624: * There's no way to work around this (short of talking a soldering
625: * iron to the board), however we can detect it. The method we use
626: * here is to put the NIC into digital loopback mode, set the receiver
627: * to promiscuous mode, and then try to send a frame. We then compare
628: * the frame data we sent to what was received. If the data matches,
629: * then the NIC is working correctly, otherwise we know the user has
630: * a defective NIC which has been mistakenly plugged into a 64-bit PCI
631: * slot. In the latter case, there's no way the NIC can work correctly,
632: * so we print out a message on the console and abort the device attach.
633: */
634:
635: int
636: re_diag(struct rl_softc *sc)
637: {
638: struct ifnet *ifp = &sc->sc_arpcom.ac_if;
639: struct mbuf *m0;
640: struct ether_header *eh;
641: struct rl_rxsoft *rxs;
642: struct rl_desc *cur_rx;
643: bus_dmamap_t dmamap;
644: u_int16_t status;
645: u_int32_t rxstat;
646: int total_len, i, s, error = 0, phyaddr;
647: u_int8_t dst[] = { 0x00, 'h', 'e', 'l', 'l', 'o' };
648: u_int8_t src[] = { 0x00, 'w', 'o', 'r', 'l', 'd' };
649:
650: DPRINTF(("inside re_diag\n"));
651: /* Allocate a single mbuf */
652:
653: MGETHDR(m0, M_DONTWAIT, MT_DATA);
654: if (m0 == NULL)
655: return (ENOBUFS);
656:
657: /*
658: * Initialize the NIC in test mode. This sets the chip up
659: * so that it can send and receive frames, but performs the
660: * following special functions:
661: * - Puts receiver in promiscuous mode
662: * - Enables digital loopback mode
663: * - Leaves interrupts turned off
664: */
665:
666: ifp->if_flags |= IFF_PROMISC;
667: sc->rl_testmode = 1;
668: re_reset(sc);
669: re_init(ifp);
670: sc->rl_link = 1;
671: if (sc->rl_type == RL_8169)
672: phyaddr = 1;
673: else
674: phyaddr = 0;
675:
676: re_miibus_writereg((struct device *)sc, phyaddr, MII_BMCR,
677: BMCR_RESET);
678: for (i = 0; i < RL_TIMEOUT; i++) {
679: status = re_miibus_readreg((struct device *)sc,
680: phyaddr, MII_BMCR);
681: if (!(status & BMCR_RESET))
682: break;
683: }
684:
685: re_miibus_writereg((struct device *)sc, phyaddr, MII_BMCR,
686: BMCR_LOOP);
687: CSR_WRITE_2(sc, RL_ISR, RL_INTRS);
688:
689: DELAY(100000);
690:
691: /* Put some data in the mbuf */
692:
693: eh = mtod(m0, struct ether_header *);
694: bcopy ((char *)&dst, eh->ether_dhost, ETHER_ADDR_LEN);
695: bcopy ((char *)&src, eh->ether_shost, ETHER_ADDR_LEN);
696: eh->ether_type = htons(ETHERTYPE_IP);
697: m0->m_pkthdr.len = m0->m_len = ETHER_MIN_LEN - ETHER_CRC_LEN;
698:
699: /*
700: * Queue the packet, start transmission.
701: */
702:
703: CSR_WRITE_2(sc, RL_ISR, 0xFFFF);
704: s = splnet();
705: IFQ_ENQUEUE(&ifp->if_snd, m0, NULL, error);
706: re_start(ifp);
707: splx(s);
708: m0 = NULL;
709:
710: DPRINTF(("re_diag: transmission started\n"));
711:
712: /* Wait for it to propagate through the chip */
713:
714: DELAY(100000);
715: for (i = 0; i < RL_TIMEOUT; i++) {
716: status = CSR_READ_2(sc, RL_ISR);
717: CSR_WRITE_2(sc, RL_ISR, status);
718: if ((status & (RL_ISR_TIMEOUT_EXPIRED|RL_ISR_RX_OK)) ==
719: (RL_ISR_TIMEOUT_EXPIRED|RL_ISR_RX_OK))
720: break;
721: DELAY(10);
722: }
723: if (i == RL_TIMEOUT) {
724: printf("%s: diagnostic failed, failed to receive packet "
725: "in loopback mode\n", sc->sc_dev.dv_xname);
726: error = EIO;
727: goto done;
728: }
729:
730: /*
731: * The packet should have been dumped into the first
732: * entry in the RX DMA ring. Grab it from there.
733: */
734:
735: rxs = &sc->rl_ldata.rl_rxsoft[0];
736: dmamap = rxs->rxs_dmamap;
737: bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize,
738: BUS_DMASYNC_POSTREAD);
739: bus_dmamap_unload(sc->sc_dmat, dmamap);
740:
741: m0 = rxs->rxs_mbuf;
742: rxs->rxs_mbuf = NULL;
743: eh = mtod(m0, struct ether_header *);
744:
745: RL_RXDESCSYNC(sc, 0, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
746: cur_rx = &sc->rl_ldata.rl_rx_list[0];
747: rxstat = letoh32(cur_rx->rl_cmdstat);
748: total_len = rxstat & sc->rl_rxlenmask;
749:
750: if (total_len != ETHER_MIN_LEN) {
751: printf("%s: diagnostic failed, received short packet\n",
752: sc->sc_dev.dv_xname);
753: error = EIO;
754: goto done;
755: }
756:
757: DPRINTF(("re_diag: packet received\n"));
758:
759: /* Test that the received packet data matches what we sent. */
760:
761: if (bcmp((char *)&eh->ether_dhost, (char *)&dst, ETHER_ADDR_LEN) ||
762: bcmp((char *)&eh->ether_shost, (char *)&src, ETHER_ADDR_LEN) ||
763: ntohs(eh->ether_type) != ETHERTYPE_IP) {
764: printf("%s: WARNING, DMA FAILURE!\n", sc->sc_dev.dv_xname);
765: printf("%s: expected TX data: %s",
766: sc->sc_dev.dv_xname, ether_sprintf(dst));
767: printf("/%s/0x%x\n", ether_sprintf(src), ETHERTYPE_IP);
768: printf("%s: received RX data: %s",
769: sc->sc_dev.dv_xname,
770: ether_sprintf(eh->ether_dhost));
771: printf("/%s/0x%x\n", ether_sprintf(eh->ether_shost),
772: ntohs(eh->ether_type));
773: printf("%s: You may have a defective 32-bit NIC plugged "
774: "into a 64-bit PCI slot.\n", sc->sc_dev.dv_xname);
775: printf("%s: Please re-install the NIC in a 32-bit slot "
776: "for proper operation.\n", sc->sc_dev.dv_xname);
777: printf("%s: Read the re(4) man page for more details.\n",
778: sc->sc_dev.dv_xname);
779: error = EIO;
780: }
781:
782: done:
783: /* Turn interface off, release resources */
784:
785: sc->rl_testmode = 0;
786: sc->rl_link = 0;
787: ifp->if_flags &= ~IFF_PROMISC;
788: re_stop(ifp, 1);
789: if (m0 != NULL)
790: m_freem(m0);
791: DPRINTF(("leaving re_diag\n"));
792:
793: return (error);
794: }
795:
796: #endif
797:
798: #ifdef __armish__
799: /*
800: * Thecus N2100 doesn't store the full mac address in eeprom
801: * so we read the old mac address from the device before the reset
802: * in hopes that the proper mac address is already there.
803: */
804: union {
805: u_int32_t eaddr_word[2];
806: u_char eaddr[ETHER_ADDR_LEN];
807: } boot_eaddr;
808: int boot_eaddr_valid;
809: #endif /* __armish__ */
810: /*
811: * Attach the interface. Allocate softc structures, do ifmedia
812: * setup and ethernet/BPF attach.
813: */
814: int
815: re_attach(struct rl_softc *sc, const char *intrstr)
816: {
817: u_char eaddr[ETHER_ADDR_LEN];
818: u_int16_t as[ETHER_ADDR_LEN / 2];
819: struct ifnet *ifp;
820: u_int16_t re_did = 0;
821: int error = 0, i;
822: u_int32_t hwrev;
823: const struct re_revision *rr;
824: const char *re_name = NULL;
825:
826: /* Reset the adapter. */
827: re_reset(sc);
828:
829: sc->rl_eewidth = RL_9356_ADDR_LEN;
830: re_read_eeprom(sc, (caddr_t)&re_did, 0, 1);
831: if (re_did != 0x8129)
832: sc->rl_eewidth = RL_9346_ADDR_LEN;
833:
834: /*
835: * Get station address from the EEPROM.
836: */
837: re_read_eeprom(sc, (caddr_t)as, RL_EE_EADDR, 3);
838: for (i = 0; i < ETHER_ADDR_LEN / 2; i++)
839: as[i] = letoh16(as[i]);
840: bcopy(as, eaddr, sizeof(eaddr));
841: #ifdef __armish__
842: /*
843: * On the Thecus N2100, the MAC address in the EEPROM is
844: * always 00:14:fd:10:00:00. The proper MAC address is stored
845: * in flash. Fortunately RedBoot configures the proper MAC
846: * address (for the first onboard interface) which we can read
847: * from the IDR.
848: */
849: if (eaddr[0] == 0x00 && eaddr[1] == 0x14 && eaddr[2] == 0xfd &&
850: eaddr[3] == 0x10 && eaddr[4] == 0x00 && eaddr[5] == 0x00) {
851: if (boot_eaddr_valid == 0) {
852: boot_eaddr.eaddr_word[1] = letoh32(CSR_READ_4(sc, RL_IDR4));
853: boot_eaddr.eaddr_word[0] = letoh32(CSR_READ_4(sc, RL_IDR0));
854: boot_eaddr_valid = 1;
855: }
856:
857: bcopy(boot_eaddr.eaddr, eaddr, sizeof(eaddr));
858: eaddr[5] += sc->sc_dev.dv_unit;
859: }
860: #endif
861:
862: /*
863: * Set RX length mask, TX poll request register
864: * and TX descriptor count.
865: */
866: if (sc->rl_type == RL_8169) {
867: sc->rl_rxlenmask = RL_RDESC_STAT_GFRAGLEN;
868: sc->rl_txstart = RL_GTXSTART;
869: sc->rl_ldata.rl_tx_desc_cnt = RL_TX_DESC_CNT_8169;
870: } else {
871: sc->rl_rxlenmask = RL_RDESC_STAT_FRAGLEN;
872: sc->rl_txstart = RL_TXSTART;
873: sc->rl_ldata.rl_tx_desc_cnt = RL_TX_DESC_CNT_8139;
874: }
875:
876: bcopy(eaddr, (char *)&sc->sc_arpcom.ac_enaddr, ETHER_ADDR_LEN);
877:
878: hwrev = CSR_READ_4(sc, RL_TXCFG) & RL_TXCFG_HWREV;
879: for (rr = re_revisions; rr->re_name != NULL; rr++) {
880: if (rr->re_chipid == hwrev)
881: re_name = rr->re_name;
882: }
883:
884: if (re_name == NULL)
885: printf(": unknown ASIC (0x%04x)", hwrev >> 16);
886: else
887: printf(": %s (0x%04x)", re_name, hwrev >> 16);
888:
889: printf(", %s, address %s\n", intrstr,
890: ether_sprintf(sc->sc_arpcom.ac_enaddr));
891:
892: if (sc->rl_ldata.rl_tx_desc_cnt >
893: PAGE_SIZE / sizeof(struct rl_desc)) {
894: sc->rl_ldata.rl_tx_desc_cnt =
895: PAGE_SIZE / sizeof(struct rl_desc);
896: }
897:
898: /* Allocate DMA'able memory for the TX ring */
899: if ((error = bus_dmamem_alloc(sc->sc_dmat, RL_TX_LIST_SZ(sc),
900: RL_RING_ALIGN, 0, &sc->rl_ldata.rl_tx_listseg, 1,
901: &sc->rl_ldata.rl_tx_listnseg, BUS_DMA_NOWAIT)) != 0) {
902: printf("%s: can't allocate tx listseg, error = %d\n",
903: sc->sc_dev.dv_xname, error);
904: goto fail_0;
905: }
906:
907: /* Load the map for the TX ring. */
908: if ((error = bus_dmamem_map(sc->sc_dmat, &sc->rl_ldata.rl_tx_listseg,
909: sc->rl_ldata.rl_tx_listnseg, RL_TX_LIST_SZ(sc),
910: (caddr_t *)&sc->rl_ldata.rl_tx_list,
911: BUS_DMA_COHERENT | BUS_DMA_NOWAIT)) != 0) {
912: printf("%s: can't map tx list, error = %d\n",
913: sc->sc_dev.dv_xname, error);
914: goto fail_1;
915: }
916: memset(sc->rl_ldata.rl_tx_list, 0, RL_TX_LIST_SZ(sc));
917:
918: if ((error = bus_dmamap_create(sc->sc_dmat, RL_TX_LIST_SZ(sc), 1,
919: RL_TX_LIST_SZ(sc), 0, 0,
920: &sc->rl_ldata.rl_tx_list_map)) != 0) {
921: printf("%s: can't create tx list map, error = %d\n",
922: sc->sc_dev.dv_xname, error);
923: goto fail_2;
924: }
925:
926: if ((error = bus_dmamap_load(sc->sc_dmat,
927: sc->rl_ldata.rl_tx_list_map, sc->rl_ldata.rl_tx_list,
928: RL_TX_LIST_SZ(sc), NULL, BUS_DMA_NOWAIT)) != 0) {
929: printf("%s: can't load tx list, error = %d\n",
930: sc->sc_dev.dv_xname, error);
931: goto fail_3;
932: }
933:
934: /* Create DMA maps for TX buffers */
935: for (i = 0; i < RL_TX_QLEN; i++) {
936: error = bus_dmamap_create(sc->sc_dmat,
937: RL_JUMBO_FRAMELEN,
938: RL_TX_DESC_CNT(sc) - RL_NTXDESC_RSVD, RL_TDESC_CMD_FRAGLEN,
939: 0, 0, &sc->rl_ldata.rl_txq[i].txq_dmamap);
940: if (error) {
941: printf("%s: can't create DMA map for TX\n",
942: sc->sc_dev.dv_xname);
943: goto fail_4;
944: }
945: }
946:
947: /* Allocate DMA'able memory for the RX ring */
948: if ((error = bus_dmamem_alloc(sc->sc_dmat, RL_RX_DMAMEM_SZ,
949: RL_RING_ALIGN, 0, &sc->rl_ldata.rl_rx_listseg, 1,
950: &sc->rl_ldata.rl_rx_listnseg, BUS_DMA_NOWAIT)) != 0) {
951: printf("%s: can't allocate rx listnseg, error = %d\n",
952: sc->sc_dev.dv_xname, error);
953: goto fail_4;
954: }
955:
956: /* Load the map for the RX ring. */
957: if ((error = bus_dmamem_map(sc->sc_dmat, &sc->rl_ldata.rl_rx_listseg,
958: sc->rl_ldata.rl_rx_listnseg, RL_RX_DMAMEM_SZ,
959: (caddr_t *)&sc->rl_ldata.rl_rx_list,
960: BUS_DMA_COHERENT | BUS_DMA_NOWAIT)) != 0) {
961: printf("%s: can't map rx list, error = %d\n",
962: sc->sc_dev.dv_xname, error);
963: goto fail_5;
964:
965: }
966: memset(sc->rl_ldata.rl_rx_list, 0, RL_RX_DMAMEM_SZ);
967:
968: if ((error = bus_dmamap_create(sc->sc_dmat, RL_RX_DMAMEM_SZ, 1,
969: RL_RX_DMAMEM_SZ, 0, 0,
970: &sc->rl_ldata.rl_rx_list_map)) != 0) {
971: printf("%s: can't create rx list map, error = %d\n",
972: sc->sc_dev.dv_xname, error);
973: goto fail_6;
974: }
975:
976: if ((error = bus_dmamap_load(sc->sc_dmat,
977: sc->rl_ldata.rl_rx_list_map, sc->rl_ldata.rl_rx_list,
978: RL_RX_DMAMEM_SZ, NULL, BUS_DMA_NOWAIT)) != 0) {
979: printf("%s: can't load rx list, error = %d\n",
980: sc->sc_dev.dv_xname, error);
981: goto fail_7;
982: }
983:
984: /* Create DMA maps for RX buffers */
985: for (i = 0; i < RL_RX_DESC_CNT; i++) {
986: error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, MCLBYTES,
987: 0, 0, &sc->rl_ldata.rl_rxsoft[i].rxs_dmamap);
988: if (error) {
989: printf("%s: can't create DMA map for RX\n",
990: sc->sc_dev.dv_xname);
991: goto fail_8;
992: }
993: }
994:
995: ifp = &sc->sc_arpcom.ac_if;
996: ifp->if_softc = sc;
997: strlcpy(ifp->if_xname, sc->sc_dev.dv_xname, IFNAMSIZ);
998: ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
999: ifp->if_ioctl = re_ioctl;
1000: ifp->if_start = re_start;
1001: ifp->if_watchdog = re_watchdog;
1002: ifp->if_init = re_init;
1003: if (sc->rl_type == RL_8169)
1004: ifp->if_hardmtu = RL_JUMBO_MTU;
1005: IFQ_SET_MAXLEN(&ifp->if_snd, RL_TX_QLEN);
1006: IFQ_SET_READY(&ifp->if_snd);
1007:
1008: ifp->if_capabilities = IFCAP_VLAN_MTU | IFCAP_CSUM_IPv4 |
1009: IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4;
1010:
1011: #if NVLAN > 0
1012: ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING;
1013: #endif
1014:
1015: timeout_set(&sc->timer_handle, re_tick, sc);
1016:
1017: /* Do MII setup */
1018: sc->sc_mii.mii_ifp = ifp;
1019: sc->sc_mii.mii_readreg = re_miibus_readreg;
1020: sc->sc_mii.mii_writereg = re_miibus_writereg;
1021: sc->sc_mii.mii_statchg = re_miibus_statchg;
1022: ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK, re_ifmedia_upd,
1023: re_ifmedia_sts);
1024: mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
1025: MII_OFFSET_ANY, MIIF_DOPAUSE);
1026: if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) {
1027: printf("%s: no PHY found!\n", sc->sc_dev.dv_xname);
1028: ifmedia_add(&sc->sc_mii.mii_media,
1029: IFM_ETHER|IFM_NONE, 0, NULL);
1030: ifmedia_set(&sc->sc_mii.mii_media,
1031: IFM_ETHER|IFM_NONE);
1032: } else
1033: ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO);
1034:
1035: /*
1036: * Call MI attach routine.
1037: */
1038: re_reset(sc);
1039: if_attach(ifp);
1040: ether_ifattach(ifp);
1041:
1042: #ifdef RE_DIAG
1043: /*
1044: * Perform hardware diagnostic on the original RTL8169.
1045: * Some 32-bit cards were incorrectly wired and would
1046: * malfunction if plugged into a 64-bit slot.
1047: */
1048: if (sc->rl_type == RL_8169) {
1049: error = re_diag(sc);
1050: if (error) {
1051: printf("%s: attach aborted due to hardware diag failure\n",
1052: sc->sc_dev.dv_xname);
1053: ether_ifdetach(ifp);
1054: goto fail_8;
1055: }
1056: }
1057: #endif
1058:
1059: return (0);
1060:
1061: fail_8:
1062: /* Destroy DMA maps for RX buffers. */
1063: for (i = 0; i < RL_RX_DESC_CNT; i++) {
1064: if (sc->rl_ldata.rl_rxsoft[i].rxs_dmamap != NULL)
1065: bus_dmamap_destroy(sc->sc_dmat,
1066: sc->rl_ldata.rl_rxsoft[i].rxs_dmamap);
1067: }
1068:
1069: /* Free DMA'able memory for the RX ring. */
1070: bus_dmamap_unload(sc->sc_dmat, sc->rl_ldata.rl_rx_list_map);
1071: fail_7:
1072: bus_dmamap_destroy(sc->sc_dmat, sc->rl_ldata.rl_rx_list_map);
1073: fail_6:
1074: bus_dmamem_unmap(sc->sc_dmat,
1075: (caddr_t)sc->rl_ldata.rl_rx_list, RL_RX_DMAMEM_SZ);
1076: fail_5:
1077: bus_dmamem_free(sc->sc_dmat,
1078: &sc->rl_ldata.rl_rx_listseg, sc->rl_ldata.rl_rx_listnseg);
1079:
1080: fail_4:
1081: /* Destroy DMA maps for TX buffers. */
1082: for (i = 0; i < RL_TX_QLEN; i++) {
1083: if (sc->rl_ldata.rl_txq[i].txq_dmamap != NULL)
1084: bus_dmamap_destroy(sc->sc_dmat,
1085: sc->rl_ldata.rl_txq[i].txq_dmamap);
1086: }
1087:
1088: /* Free DMA'able memory for the TX ring. */
1089: bus_dmamap_unload(sc->sc_dmat, sc->rl_ldata.rl_tx_list_map);
1090: fail_3:
1091: bus_dmamap_destroy(sc->sc_dmat, sc->rl_ldata.rl_tx_list_map);
1092: fail_2:
1093: bus_dmamem_unmap(sc->sc_dmat,
1094: (caddr_t)sc->rl_ldata.rl_tx_list, RL_TX_LIST_SZ(sc));
1095: fail_1:
1096: bus_dmamem_free(sc->sc_dmat,
1097: &sc->rl_ldata.rl_tx_listseg, sc->rl_ldata.rl_tx_listnseg);
1098: fail_0:
1099: return (1);
1100: }
1101:
1102:
1103: int
1104: re_newbuf(struct rl_softc *sc, int idx, struct mbuf *m)
1105: {
1106: struct mbuf *n = NULL;
1107: bus_dmamap_t map;
1108: struct rl_desc *d;
1109: struct rl_rxsoft *rxs;
1110: u_int32_t cmdstat;
1111: int error;
1112:
1113: if (m == NULL) {
1114: MGETHDR(n, M_DONTWAIT, MT_DATA);
1115: if (n == NULL)
1116: return (ENOBUFS);
1117:
1118: MCLGET(n, M_DONTWAIT);
1119: if (!(n->m_flags & M_EXT)) {
1120: m_freem(n);
1121: return (ENOBUFS);
1122: }
1123: m = n;
1124: } else
1125: m->m_data = m->m_ext.ext_buf;
1126:
1127: /*
1128: * Initialize mbuf length fields and fixup
1129: * alignment so that the frame payload is
1130: * longword aligned on strict alignment archs.
1131: */
1132: m->m_len = m->m_pkthdr.len = RE_RX_DESC_BUFLEN;
1133: m->m_data += RE_ETHER_ALIGN;
1134:
1135: rxs = &sc->rl_ldata.rl_rxsoft[idx];
1136: map = rxs->rxs_dmamap;
1137: error = bus_dmamap_load_mbuf(sc->sc_dmat, map, m,
1138: BUS_DMA_READ|BUS_DMA_NOWAIT);
1139:
1140: if (error)
1141: goto out;
1142:
1143: bus_dmamap_sync(sc->sc_dmat, map, 0, map->dm_mapsize,
1144: BUS_DMASYNC_PREREAD);
1145:
1146: d = &sc->rl_ldata.rl_rx_list[idx];
1147: RL_RXDESCSYNC(sc, idx, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
1148: cmdstat = letoh32(d->rl_cmdstat);
1149: RL_RXDESCSYNC(sc, idx, BUS_DMASYNC_PREREAD);
1150: if (cmdstat & RL_RDESC_STAT_OWN) {
1151: printf("%s: tried to map busy RX descriptor\n",
1152: sc->sc_dev.dv_xname);
1153: goto out;
1154: }
1155:
1156: rxs->rxs_mbuf = m;
1157:
1158: d->rl_vlanctl = 0;
1159: cmdstat = map->dm_segs[0].ds_len;
1160: if (idx == (RL_RX_DESC_CNT - 1))
1161: cmdstat |= RL_RDESC_CMD_EOR;
1162: re_set_bufaddr(d, map->dm_segs[0].ds_addr);
1163: d->rl_cmdstat = htole32(cmdstat);
1164: RL_RXDESCSYNC(sc, idx, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
1165: cmdstat |= RL_RDESC_CMD_OWN;
1166: d->rl_cmdstat = htole32(cmdstat);
1167: RL_RXDESCSYNC(sc, idx, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
1168:
1169: return (0);
1170: out:
1171: if (n != NULL)
1172: m_freem(n);
1173: return (ENOMEM);
1174: }
1175:
1176:
1177: int
1178: re_tx_list_init(struct rl_softc *sc)
1179: {
1180: int i;
1181:
1182: memset(sc->rl_ldata.rl_tx_list, 0, RL_TX_LIST_SZ(sc));
1183: for (i = 0; i < RL_TX_QLEN; i++) {
1184: sc->rl_ldata.rl_txq[i].txq_mbuf = NULL;
1185: }
1186:
1187: bus_dmamap_sync(sc->sc_dmat,
1188: sc->rl_ldata.rl_tx_list_map, 0,
1189: sc->rl_ldata.rl_tx_list_map->dm_mapsize,
1190: BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
1191: sc->rl_ldata.rl_txq_prodidx = 0;
1192: sc->rl_ldata.rl_txq_considx = 0;
1193: sc->rl_ldata.rl_tx_free = RL_TX_DESC_CNT(sc);
1194: sc->rl_ldata.rl_tx_nextfree = 0;
1195:
1196: return (0);
1197: }
1198:
1199: int
1200: re_rx_list_init(struct rl_softc *sc)
1201: {
1202: int i;
1203:
1204: memset((char *)sc->rl_ldata.rl_rx_list, 0, RL_RX_LIST_SZ);
1205:
1206: for (i = 0; i < RL_RX_DESC_CNT; i++) {
1207: if (re_newbuf(sc, i, NULL) == ENOBUFS)
1208: return (ENOBUFS);
1209: }
1210:
1211: sc->rl_ldata.rl_rx_prodidx = 0;
1212: sc->rl_head = sc->rl_tail = NULL;
1213:
1214: return (0);
1215: }
1216:
1217: /*
1218: * RX handler for C+ and 8169. For the gigE chips, we support
1219: * the reception of jumbo frames that have been fragmented
1220: * across multiple 2K mbuf cluster buffers.
1221: */
1222: void
1223: re_rxeof(struct rl_softc *sc)
1224: {
1225: struct mbuf *m;
1226: struct ifnet *ifp;
1227: int i, total_len;
1228: struct rl_desc *cur_rx;
1229: struct rl_rxsoft *rxs;
1230: u_int32_t rxstat;
1231:
1232: ifp = &sc->sc_arpcom.ac_if;
1233:
1234: for (i = sc->rl_ldata.rl_rx_prodidx;; i = RL_NEXT_RX_DESC(sc, i)) {
1235: cur_rx = &sc->rl_ldata.rl_rx_list[i];
1236: RL_RXDESCSYNC(sc, i,
1237: BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
1238: rxstat = letoh32(cur_rx->rl_cmdstat);
1239: RL_RXDESCSYNC(sc, i, BUS_DMASYNC_PREREAD);
1240: if ((rxstat & RL_RDESC_STAT_OWN) != 0)
1241: break;
1242: total_len = rxstat & sc->rl_rxlenmask;
1243: rxs = &sc->rl_ldata.rl_rxsoft[i];
1244: m = rxs->rxs_mbuf;
1245:
1246: /* Invalidate the RX mbuf and unload its map */
1247:
1248: bus_dmamap_sync(sc->sc_dmat,
1249: rxs->rxs_dmamap, 0, rxs->rxs_dmamap->dm_mapsize,
1250: BUS_DMASYNC_POSTREAD);
1251: bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap);
1252:
1253: if (!(rxstat & RL_RDESC_STAT_EOF)) {
1254: m->m_len = RE_RX_DESC_BUFLEN;
1255: if (sc->rl_head == NULL)
1256: sc->rl_head = sc->rl_tail = m;
1257: else {
1258: m->m_flags &= ~M_PKTHDR;
1259: sc->rl_tail->m_next = m;
1260: sc->rl_tail = m;
1261: }
1262: re_newbuf(sc, i, NULL);
1263: continue;
1264: }
1265:
1266: /*
1267: * NOTE: for the 8139C+, the frame length field
1268: * is always 12 bits in size, but for the gigE chips,
1269: * it is 13 bits (since the max RX frame length is 16K).
1270: * Unfortunately, all 32 bits in the status word
1271: * were already used, so to make room for the extra
1272: * length bit, RealTek took out the 'frame alignment
1273: * error' bit and shifted the other status bits
1274: * over one slot. The OWN, EOR, FS and LS bits are
1275: * still in the same places. We have already extracted
1276: * the frame length and checked the OWN bit, so rather
1277: * than using an alternate bit mapping, we shift the
1278: * status bits one space to the right so we can evaluate
1279: * them using the 8169 status as though it was in the
1280: * same format as that of the 8139C+.
1281: */
1282: if (sc->rl_type == RL_8169)
1283: rxstat >>= 1;
1284:
1285: /*
1286: * if total_len > 2^13-1, both _RXERRSUM and _GIANT will be
1287: * set, but if CRC is clear, it will still be a valid frame.
1288: */
1289: if (rxstat & RL_RDESC_STAT_RXERRSUM && !(total_len > 8191 &&
1290: (rxstat & RL_RDESC_STAT_ERRS) == RL_RDESC_STAT_GIANT)) {
1291: ifp->if_ierrors++;
1292: /*
1293: * If this is part of a multi-fragment packet,
1294: * discard all the pieces.
1295: */
1296: if (sc->rl_head != NULL) {
1297: m_freem(sc->rl_head);
1298: sc->rl_head = sc->rl_tail = NULL;
1299: }
1300: re_newbuf(sc, i, m);
1301: continue;
1302: }
1303:
1304: /*
1305: * If allocating a replacement mbuf fails,
1306: * reload the current one.
1307: */
1308:
1309: if (re_newbuf(sc, i, NULL)) {
1310: ifp->if_ierrors++;
1311: if (sc->rl_head != NULL) {
1312: m_freem(sc->rl_head);
1313: sc->rl_head = sc->rl_tail = NULL;
1314: }
1315: re_newbuf(sc, i, m);
1316: continue;
1317: }
1318:
1319: if (sc->rl_head != NULL) {
1320: m->m_len = total_len % RE_RX_DESC_BUFLEN;
1321: if (m->m_len == 0)
1322: m->m_len = RE_RX_DESC_BUFLEN;
1323: /*
1324: * Special case: if there's 4 bytes or less
1325: * in this buffer, the mbuf can be discarded:
1326: * the last 4 bytes is the CRC, which we don't
1327: * care about anyway.
1328: */
1329: if (m->m_len <= ETHER_CRC_LEN) {
1330: sc->rl_tail->m_len -=
1331: (ETHER_CRC_LEN - m->m_len);
1332: m_freem(m);
1333: } else {
1334: m->m_len -= ETHER_CRC_LEN;
1335: m->m_flags &= ~M_PKTHDR;
1336: sc->rl_tail->m_next = m;
1337: }
1338: m = sc->rl_head;
1339: sc->rl_head = sc->rl_tail = NULL;
1340: m->m_pkthdr.len = total_len - ETHER_CRC_LEN;
1341: } else
1342: m->m_pkthdr.len = m->m_len =
1343: (total_len - ETHER_CRC_LEN);
1344:
1345: ifp->if_ipackets++;
1346: m->m_pkthdr.rcvif = ifp;
1347:
1348: /* Do RX checksumming */
1349:
1350: /* Check IP header checksum */
1351: if ((rxstat & RL_RDESC_STAT_PROTOID) &&
1352: !(rxstat & RL_RDESC_STAT_IPSUMBAD))
1353: m->m_pkthdr.csum_flags |= M_IPV4_CSUM_IN_OK;
1354:
1355: /* Check TCP/UDP checksum */
1356: if ((RL_TCPPKT(rxstat) &&
1357: !(rxstat & RL_RDESC_STAT_TCPSUMBAD)) ||
1358: (RL_UDPPKT(rxstat) &&
1359: !(rxstat & RL_RDESC_STAT_UDPSUMBAD)))
1360: m->m_pkthdr.csum_flags |= M_TCP_CSUM_IN_OK | M_UDP_CSUM_IN_OK;
1361:
1362: #if NBPFILTER > 0
1363: if (ifp->if_bpf)
1364: bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_IN);
1365: #endif
1366: ether_input_mbuf(ifp, m);
1367: }
1368:
1369: sc->rl_ldata.rl_rx_prodidx = i;
1370: }
1371:
1372: void
1373: re_txeof(struct rl_softc *sc)
1374: {
1375: struct ifnet *ifp;
1376: struct rl_txq *txq;
1377: uint32_t txstat;
1378: int idx, descidx;
1379:
1380: ifp = &sc->sc_arpcom.ac_if;
1381:
1382: for (idx = sc->rl_ldata.rl_txq_considx;; idx = RL_NEXT_TXQ(sc, idx)) {
1383: txq = &sc->rl_ldata.rl_txq[idx];
1384:
1385: if (txq->txq_mbuf == NULL) {
1386: KASSERT(idx == sc->rl_ldata.rl_txq_prodidx);
1387: break;
1388: }
1389:
1390: descidx = txq->txq_descidx;
1391: RL_TXDESCSYNC(sc, descidx,
1392: BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
1393: txstat =
1394: letoh32(sc->rl_ldata.rl_tx_list[descidx].rl_cmdstat);
1395: RL_TXDESCSYNC(sc, descidx, BUS_DMASYNC_PREREAD);
1396: KASSERT((txstat & RL_TDESC_CMD_EOF) != 0);
1397: if (txstat & RL_TDESC_CMD_OWN)
1398: break;
1399:
1400: sc->rl_ldata.rl_tx_free += txq->txq_nsegs;
1401: KASSERT(sc->rl_ldata.rl_tx_free <= RL_TX_DESC_CNT(sc));
1402: bus_dmamap_sync(sc->sc_dmat, txq->txq_dmamap,
1403: 0, txq->txq_dmamap->dm_mapsize, BUS_DMASYNC_POSTWRITE);
1404: bus_dmamap_unload(sc->sc_dmat, txq->txq_dmamap);
1405: m_freem(txq->txq_mbuf);
1406: txq->txq_mbuf = NULL;
1407:
1408: if (txstat & (RL_TDESC_STAT_EXCESSCOL | RL_TDESC_STAT_COLCNT))
1409: ifp->if_collisions++;
1410: if (txstat & RL_TDESC_STAT_TXERRSUM)
1411: ifp->if_oerrors++;
1412: else
1413: ifp->if_opackets++;
1414: }
1415:
1416: sc->rl_ldata.rl_txq_considx = idx;
1417:
1418: if (sc->rl_ldata.rl_tx_free > RL_NTXDESC_RSVD)
1419: ifp->if_flags &= ~IFF_OACTIVE;
1420:
1421: if (sc->rl_ldata.rl_tx_free < RL_TX_DESC_CNT(sc)) {
1422: /*
1423: * Some chips will ignore a second TX request issued while an
1424: * existing transmission is in progress. If the transmitter goes
1425: * idle but there are still packets waiting to be sent, we need
1426: * to restart the channel here to flush them out. This only
1427: * seems to be required with the PCIe devices.
1428: */
1429: CSR_WRITE_1(sc, sc->rl_txstart, RL_TXSTART_START);
1430:
1431: /*
1432: * If not all descriptors have been released reaped yet,
1433: * reload the timer so that we will eventually get another
1434: * interrupt that will cause us to re-enter this routine.
1435: * This is done in case the transmitter has gone idle.
1436: */
1437: CSR_WRITE_4(sc, RL_TIMERCNT, 1);
1438: } else
1439: ifp->if_timer = 0;
1440: }
1441:
1442: void
1443: re_tick(void *xsc)
1444: {
1445: struct rl_softc *sc = xsc;
1446: struct mii_data *mii;
1447: struct ifnet *ifp;
1448: int s;
1449:
1450: ifp = &sc->sc_arpcom.ac_if;
1451: mii = &sc->sc_mii;
1452:
1453: s = splnet();
1454:
1455: mii_tick(mii);
1456: if (sc->rl_link) {
1457: if (!(mii->mii_media_status & IFM_ACTIVE))
1458: sc->rl_link = 0;
1459: } else {
1460: if (mii->mii_media_status & IFM_ACTIVE &&
1461: IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
1462: sc->rl_link = 1;
1463: if (!IFQ_IS_EMPTY(&ifp->if_snd))
1464: re_start(ifp);
1465: }
1466: }
1467: splx(s);
1468:
1469: timeout_add(&sc->timer_handle, hz);
1470: }
1471:
1472: int
1473: re_intr(void *arg)
1474: {
1475: struct rl_softc *sc = arg;
1476: struct ifnet *ifp;
1477: u_int16_t status;
1478: int claimed = 0;
1479:
1480: ifp = &sc->sc_arpcom.ac_if;
1481:
1482: if (!(ifp->if_flags & IFF_UP))
1483: return (0);
1484:
1485: for (;;) {
1486:
1487: status = CSR_READ_2(sc, RL_ISR);
1488: /* If the card has gone away the read returns 0xffff. */
1489: if (status == 0xffff)
1490: break;
1491: if (status)
1492: CSR_WRITE_2(sc, RL_ISR, status);
1493:
1494: if ((status & RL_INTRS_CPLUS) == 0)
1495: break;
1496:
1497: if (status & (RL_ISR_RX_OK | RL_ISR_RX_ERR)) {
1498: re_rxeof(sc);
1499: claimed = 1;
1500: }
1501:
1502: if (status & (RL_ISR_TIMEOUT_EXPIRED | RL_ISR_TX_ERR |
1503: RL_ISR_TX_DESC_UNAVAIL)) {
1504: re_txeof(sc);
1505: claimed = 1;
1506: }
1507:
1508: if (status & RL_ISR_SYSTEM_ERR) {
1509: re_reset(sc);
1510: re_init(ifp);
1511: claimed = 1;
1512: }
1513:
1514: if (status & RL_ISR_LINKCHG) {
1515: timeout_del(&sc->timer_handle);
1516: re_tick(sc);
1517: claimed = 1;
1518: }
1519: }
1520:
1521: if (claimed && !IFQ_IS_EMPTY(&ifp->if_snd))
1522: re_start(ifp);
1523:
1524: return (claimed);
1525: }
1526:
1527: int
1528: re_encap(struct rl_softc *sc, struct mbuf *m, int *idx)
1529: {
1530: bus_dmamap_t map;
1531: int error, seg, nsegs, uidx, startidx, curidx, lastidx, pad;
1532: struct rl_desc *d;
1533: u_int32_t cmdstat, rl_flags = 0;
1534: struct rl_txq *txq;
1535: #if NVLAN > 0
1536: struct ifvlan *ifv = NULL;
1537:
1538: if ((m->m_flags & (M_PROTO1|M_PKTHDR)) == (M_PROTO1|M_PKTHDR) &&
1539: m->m_pkthdr.rcvif != NULL)
1540: ifv = m->m_pkthdr.rcvif->if_softc;
1541: #endif
1542:
1543: if (sc->rl_ldata.rl_tx_free <= RL_NTXDESC_RSVD)
1544: return (EFBIG);
1545:
1546: /*
1547: * Set up checksum offload. Note: checksum offload bits must
1548: * appear in all descriptors of a multi-descriptor transmit
1549: * attempt. This is according to testing done with an 8169
1550: * chip. This is a requirement.
1551: */
1552:
1553: /*
1554: * Set RL_TDESC_CMD_IPCSUM if any checksum offloading
1555: * is requested. Otherwise, RL_TDESC_CMD_TCPCSUM/
1556: * RL_TDESC_CMD_UDPCSUM does not take affect.
1557: */
1558:
1559: if ((m->m_pkthdr.csum_flags &
1560: (M_IPV4_CSUM_OUT|M_TCPV4_CSUM_OUT|M_UDPV4_CSUM_OUT)) != 0) {
1561: rl_flags |= RL_TDESC_CMD_IPCSUM;
1562: if (m->m_pkthdr.csum_flags & M_TCPV4_CSUM_OUT)
1563: rl_flags |= RL_TDESC_CMD_TCPCSUM;
1564: if (m->m_pkthdr.csum_flags & M_UDPV4_CSUM_OUT)
1565: rl_flags |= RL_TDESC_CMD_UDPCSUM;
1566: }
1567:
1568: txq = &sc->rl_ldata.rl_txq[*idx];
1569: map = txq->txq_dmamap;
1570: error = bus_dmamap_load_mbuf(sc->sc_dmat, map, m,
1571: BUS_DMA_WRITE|BUS_DMA_NOWAIT);
1572: if (error) {
1573: /* XXX try to defrag if EFBIG? */
1574: printf("%s: can't map mbuf (error %d)\n",
1575: sc->sc_dev.dv_xname, error);
1576: return (error);
1577: }
1578:
1579: nsegs = map->dm_nsegs;
1580: pad = 0;
1581: if (m->m_pkthdr.len <= RL_IP4CSUMTX_PADLEN &&
1582: (rl_flags & RL_TDESC_CMD_IPCSUM) != 0) {
1583: pad = 1;
1584: nsegs++;
1585: }
1586:
1587: if (nsegs > sc->rl_ldata.rl_tx_free - RL_NTXDESC_RSVD) {
1588: error = EFBIG;
1589: goto fail_unload;
1590: }
1591:
1592: /*
1593: * Make sure that the caches are synchronized before we
1594: * ask the chip to start DMA for the packet data.
1595: */
1596: bus_dmamap_sync(sc->sc_dmat, map, 0, map->dm_mapsize,
1597: BUS_DMASYNC_PREWRITE);
1598:
1599: /*
1600: * Map the segment array into descriptors. Note that we set the
1601: * start-of-frame and end-of-frame markers for either TX or RX, but
1602: * they really only have meaning in the TX case. (In the RX case,
1603: * it's the chip that tells us where packets begin and end.)
1604: * We also keep track of the end of the ring and set the
1605: * end-of-ring bits as needed, and we set the ownership bits
1606: * in all except the very first descriptor. (The caller will
1607: * set this descriptor later when it start transmission or
1608: * reception.)
1609: */
1610: curidx = startidx = sc->rl_ldata.rl_tx_nextfree;
1611: lastidx = -1;
1612: for (seg = 0; seg < map->dm_nsegs;
1613: seg++, curidx = RL_NEXT_TX_DESC(sc, curidx)) {
1614: d = &sc->rl_ldata.rl_tx_list[curidx];
1615: RL_TXDESCSYNC(sc, curidx,
1616: BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
1617: cmdstat = letoh32(d->rl_cmdstat);
1618: RL_TXDESCSYNC(sc, curidx, BUS_DMASYNC_PREREAD);
1619: if (cmdstat & RL_TDESC_STAT_OWN) {
1620: printf("%s: tried to map busy TX descriptor\n",
1621: sc->sc_dev.dv_xname);
1622: for (; seg > 0; seg --) {
1623: uidx = (curidx + RL_TX_DESC_CNT(sc) - seg) %
1624: RL_TX_DESC_CNT(sc);
1625: sc->rl_ldata.rl_tx_list[uidx].rl_cmdstat = 0;
1626: RL_TXDESCSYNC(sc, uidx,
1627: BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
1628: }
1629: error = ENOBUFS;
1630: goto fail_unload;
1631: }
1632:
1633: d->rl_vlanctl = 0;
1634: re_set_bufaddr(d, map->dm_segs[seg].ds_addr);
1635: cmdstat = rl_flags | map->dm_segs[seg].ds_len;
1636: if (seg == 0)
1637: cmdstat |= RL_TDESC_CMD_SOF;
1638: else
1639: cmdstat |= RL_TDESC_CMD_OWN;
1640: if (curidx == (RL_TX_DESC_CNT(sc) - 1))
1641: cmdstat |= RL_TDESC_CMD_EOR;
1642: if (seg == nsegs - 1) {
1643: cmdstat |= RL_TDESC_CMD_EOF;
1644: lastidx = curidx;
1645: }
1646: d->rl_cmdstat = htole32(cmdstat);
1647: RL_TXDESCSYNC(sc, curidx,
1648: BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
1649: }
1650: if (pad) {
1651: bus_addr_t paddaddr;
1652:
1653: d = &sc->rl_ldata.rl_tx_list[curidx];
1654: d->rl_vlanctl = 0;
1655: paddaddr = RL_TXPADDADDR(sc);
1656: re_set_bufaddr(d, paddaddr);
1657: cmdstat = rl_flags |
1658: RL_TDESC_CMD_OWN | RL_TDESC_CMD_EOF |
1659: (RL_IP4CSUMTX_PADLEN + 1 - m->m_pkthdr.len);
1660: if (curidx == (RL_TX_DESC_CNT(sc) - 1))
1661: cmdstat |= RL_TDESC_CMD_EOR;
1662: d->rl_cmdstat = htole32(cmdstat);
1663: RL_TXDESCSYNC(sc, curidx,
1664: BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
1665: lastidx = curidx;
1666: curidx = RL_NEXT_TX_DESC(sc, curidx);
1667: }
1668: KASSERT(lastidx != -1);
1669:
1670: /*
1671: * Set up hardware VLAN tagging. Note: vlan tag info must
1672: * appear in the first descriptor of a multi-descriptor
1673: * transmission attempt.
1674: */
1675:
1676: #if NVLAN > 0
1677: if (ifv != NULL) {
1678: sc->rl_ldata.rl_tx_list[startidx].rl_vlanctl =
1679: htole32(swap16(ifv->ifv_tag) |
1680: RL_TDESC_VLANCTL_TAG);
1681: }
1682: #endif
1683:
1684: /* Transfer ownership of packet to the chip. */
1685:
1686: sc->rl_ldata.rl_tx_list[startidx].rl_cmdstat |=
1687: htole32(RL_TDESC_CMD_OWN);
1688: RL_TXDESCSYNC(sc, startidx, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
1689:
1690: /* update info of TX queue and descriptors */
1691: txq->txq_mbuf = m;
1692: txq->txq_descidx = lastidx;
1693: txq->txq_nsegs = nsegs;
1694:
1695: sc->rl_ldata.rl_tx_free -= nsegs;
1696: sc->rl_ldata.rl_tx_nextfree = curidx;
1697:
1698: *idx = RL_NEXT_TXQ(sc, *idx);
1699:
1700: return (0);
1701:
1702: fail_unload:
1703: bus_dmamap_unload(sc->sc_dmat, map);
1704:
1705: return (error);
1706: }
1707:
1708: /*
1709: * Main transmit routine for C+ and gigE NICs.
1710: */
1711:
1712: void
1713: re_start(struct ifnet *ifp)
1714: {
1715: struct rl_softc *sc;
1716: int idx, queued = 0;
1717:
1718: sc = ifp->if_softc;
1719:
1720: if (!sc->rl_link || ifp->if_flags & IFF_OACTIVE)
1721: return;
1722:
1723: idx = sc->rl_ldata.rl_txq_prodidx;
1724: for (;;) {
1725: struct mbuf *m;
1726: int error;
1727:
1728: IFQ_POLL(&ifp->if_snd, m);
1729: if (m == NULL)
1730: break;
1731:
1732: if (sc->rl_ldata.rl_txq[idx].txq_mbuf != NULL) {
1733: KASSERT(idx == sc->rl_ldata.rl_txq_considx);
1734: ifp->if_flags |= IFF_OACTIVE;
1735: break;
1736: }
1737:
1738: error = re_encap(sc, m, &idx);
1739: if (error == EFBIG &&
1740: sc->rl_ldata.rl_tx_free == RL_TX_DESC_CNT(sc)) {
1741: IFQ_DEQUEUE(&ifp->if_snd, m);
1742: m_freem(m);
1743: ifp->if_oerrors++;
1744: continue;
1745: }
1746: if (error) {
1747: ifp->if_flags |= IFF_OACTIVE;
1748: break;
1749: }
1750:
1751: IFQ_DEQUEUE(&ifp->if_snd, m);
1752: queued++;
1753:
1754: #if NBPFILTER > 0
1755: /*
1756: * If there's a BPF listener, bounce a copy of this frame
1757: * to him.
1758: */
1759: if (ifp->if_bpf)
1760: bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_OUT);
1761: #endif
1762: }
1763:
1764: if (queued == 0) {
1765: if (sc->rl_ldata.rl_tx_free != RL_TX_DESC_CNT(sc))
1766: CSR_WRITE_4(sc, RL_TIMERCNT, 1);
1767: return;
1768: }
1769:
1770: sc->rl_ldata.rl_txq_prodidx = idx;
1771:
1772: CSR_WRITE_1(sc, sc->rl_txstart, RL_TXSTART_START);
1773:
1774: /*
1775: * Use the countdown timer for interrupt moderation.
1776: * 'TX done' interrupts are disabled. Instead, we reset the
1777: * countdown timer, which will begin counting until it hits
1778: * the value in the TIMERINT register, and then trigger an
1779: * interrupt. Each time we write to the TIMERCNT register,
1780: * the timer count is reset to 0.
1781: */
1782: CSR_WRITE_4(sc, RL_TIMERCNT, 1);
1783:
1784: /*
1785: * Set a timeout in case the chip goes out to lunch.
1786: */
1787: ifp->if_timer = 5;
1788: }
1789:
1790: int
1791: re_init(struct ifnet *ifp)
1792: {
1793: struct rl_softc *sc = ifp->if_softc;
1794: u_int32_t rxcfg = 0;
1795: int s;
1796: union {
1797: u_int32_t align_dummy;
1798: u_char eaddr[ETHER_ADDR_LEN];
1799: } eaddr;
1800:
1801: s = splnet();
1802:
1803: /*
1804: * Cancel pending I/O and free all RX/TX buffers.
1805: */
1806: re_stop(ifp, 0);
1807:
1808: /*
1809: * Enable C+ RX and TX mode, as well as RX checksum offload.
1810: * We must configure the C+ register before all others.
1811: */
1812: CSR_WRITE_2(sc, RL_CPLUS_CMD, RL_CPLUSCMD_RXENB|
1813: RL_CPLUSCMD_TXENB|RL_CPLUSCMD_PCI_MRW|
1814: RL_CPLUSCMD_RXCSUM_ENB);
1815:
1816: /*
1817: * Init our MAC address. Even though the chipset
1818: * documentation doesn't mention it, we need to enter "Config
1819: * register write enable" mode to modify the ID registers.
1820: */
1821: bcopy(sc->sc_arpcom.ac_enaddr, eaddr.eaddr, ETHER_ADDR_LEN);
1822: CSR_WRITE_1(sc, RL_EECMD, RL_EEMODE_WRITECFG);
1823: CSR_WRITE_4(sc, RL_IDR4,
1824: htole32(*(u_int32_t *)(&eaddr.eaddr[4])));
1825: CSR_WRITE_4(sc, RL_IDR0,
1826: htole32(*(u_int32_t *)(&eaddr.eaddr[0])));
1827: CSR_WRITE_1(sc, RL_EECMD, RL_EEMODE_OFF);
1828:
1829: /*
1830: * For C+ mode, initialize the RX descriptors and mbufs.
1831: */
1832: re_rx_list_init(sc);
1833: re_tx_list_init(sc);
1834:
1835: /*
1836: * Load the addresses of the RX and TX lists into the chip.
1837: */
1838: CSR_WRITE_4(sc, RL_RXLIST_ADDR_HI,
1839: RL_ADDR_HI(sc->rl_ldata.rl_rx_list_map->dm_segs[0].ds_addr));
1840: CSR_WRITE_4(sc, RL_RXLIST_ADDR_LO,
1841: RL_ADDR_LO(sc->rl_ldata.rl_rx_list_map->dm_segs[0].ds_addr));
1842:
1843: CSR_WRITE_4(sc, RL_TXLIST_ADDR_HI,
1844: RL_ADDR_HI(sc->rl_ldata.rl_tx_list_map->dm_segs[0].ds_addr));
1845: CSR_WRITE_4(sc, RL_TXLIST_ADDR_LO,
1846: RL_ADDR_LO(sc->rl_ldata.rl_tx_list_map->dm_segs[0].ds_addr));
1847:
1848: /*
1849: * Enable transmit and receive.
1850: */
1851: CSR_WRITE_1(sc, RL_COMMAND, RL_CMD_TX_ENB|RL_CMD_RX_ENB);
1852:
1853: /*
1854: * Set the initial TX and RX configuration.
1855: */
1856: if (sc->rl_testmode) {
1857: if (sc->rl_type == RL_8169)
1858: CSR_WRITE_4(sc, RL_TXCFG,
1859: RL_TXCFG_CONFIG|RL_LOOPTEST_ON);
1860: else
1861: CSR_WRITE_4(sc, RL_TXCFG,
1862: RL_TXCFG_CONFIG|RL_LOOPTEST_ON_CPLUS);
1863: } else
1864: CSR_WRITE_4(sc, RL_TXCFG, RL_TXCFG_CONFIG);
1865:
1866: CSR_WRITE_1(sc, RL_EARLY_TX_THRESH, 16);
1867:
1868: CSR_WRITE_4(sc, RL_RXCFG, RL_RXCFG_CONFIG);
1869:
1870: /* Set the individual bit to receive frames for this host only. */
1871: rxcfg = CSR_READ_4(sc, RL_RXCFG);
1872: rxcfg |= RL_RXCFG_RX_INDIV;
1873:
1874: /*
1875: * Set capture broadcast bit to capture broadcast frames.
1876: */
1877: if (ifp->if_flags & IFF_BROADCAST)
1878: rxcfg |= RL_RXCFG_RX_BROAD;
1879: else
1880: rxcfg &= ~RL_RXCFG_RX_BROAD;
1881:
1882: CSR_WRITE_4(sc, RL_RXCFG, rxcfg);
1883:
1884: /* Set promiscuous mode. */
1885: re_setpromisc(sc);
1886:
1887: /*
1888: * Program the multicast filter, if necessary.
1889: */
1890: re_setmulti(sc);
1891:
1892: /*
1893: * Enable interrupts.
1894: */
1895: if (sc->rl_testmode)
1896: CSR_WRITE_2(sc, RL_IMR, 0);
1897: else
1898: CSR_WRITE_2(sc, RL_IMR, RL_INTRS_CPLUS);
1899: CSR_WRITE_2(sc, RL_ISR, RL_INTRS_CPLUS);
1900:
1901: /* Start RX/TX process. */
1902: CSR_WRITE_4(sc, RL_MISSEDPKT, 0);
1903: #ifdef notdef
1904: /* Enable receiver and transmitter. */
1905: CSR_WRITE_1(sc, RL_COMMAND, RL_CMD_TX_ENB|RL_CMD_RX_ENB);
1906: #endif
1907:
1908: /*
1909: * Initialize the timer interrupt register so that
1910: * a timer interrupt will be generated once the timer
1911: * reaches a certain number of ticks. The timer is
1912: * reloaded on each transmit. This gives us TX interrupt
1913: * moderation, which dramatically improves TX frame rate.
1914: */
1915: if (sc->rl_type == RL_8169)
1916: CSR_WRITE_4(sc, RL_TIMERINT_8169, 0x800);
1917: else
1918: CSR_WRITE_4(sc, RL_TIMERINT, 0x400);
1919:
1920: /*
1921: * For 8169 gigE NICs, set the max allowed RX packet
1922: * size so we can receive jumbo frames.
1923: */
1924: if (sc->rl_type == RL_8169)
1925: CSR_WRITE_2(sc, RL_MAXRXPKTLEN, 16383);
1926:
1927: if (sc->rl_testmode)
1928: return (0);
1929:
1930: mii_mediachg(&sc->sc_mii);
1931:
1932: CSR_WRITE_1(sc, RL_CFG1, CSR_READ_1(sc, RL_CFG1) | RL_CFG1_DRVLOAD);
1933:
1934: ifp->if_flags |= IFF_RUNNING;
1935: ifp->if_flags &= ~IFF_OACTIVE;
1936:
1937: splx(s);
1938:
1939: sc->rl_link = 0;
1940:
1941: timeout_add(&sc->timer_handle, hz);
1942:
1943: return (0);
1944: }
1945:
1946: /*
1947: * Set media options.
1948: */
1949: int
1950: re_ifmedia_upd(struct ifnet *ifp)
1951: {
1952: struct rl_softc *sc;
1953:
1954: sc = ifp->if_softc;
1955:
1956: return (mii_mediachg(&sc->sc_mii));
1957: }
1958:
1959: /*
1960: * Report current media status.
1961: */
1962: void
1963: re_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
1964: {
1965: struct rl_softc *sc;
1966:
1967: sc = ifp->if_softc;
1968:
1969: mii_pollstat(&sc->sc_mii);
1970: ifmr->ifm_active = sc->sc_mii.mii_media_active;
1971: ifmr->ifm_status = sc->sc_mii.mii_media_status;
1972: }
1973:
1974: int
1975: re_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
1976: {
1977: struct rl_softc *sc = ifp->if_softc;
1978: struct ifreq *ifr = (struct ifreq *) data;
1979: struct ifaddr *ifa = (struct ifaddr *)data;
1980: int s, error = 0;
1981:
1982: s = splnet();
1983:
1984: if ((error = ether_ioctl(ifp, &sc->sc_arpcom, command,
1985: data)) > 0) {
1986: splx(s);
1987: return (error);
1988: }
1989:
1990: switch(command) {
1991: case SIOCSIFADDR:
1992: ifp->if_flags |= IFF_UP;
1993: if (!(ifp->if_flags & IFF_RUNNING))
1994: re_init(ifp);
1995: #ifdef INET
1996: if (ifa->ifa_addr->sa_family == AF_INET)
1997: arp_ifinit(&sc->sc_arpcom, ifa);
1998: #endif /* INET */
1999: break;
2000: case SIOCSIFMTU:
2001: if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > ifp->if_hardmtu)
2002: error = EINVAL;
2003: else if (ifp->if_mtu != ifr->ifr_mtu)
2004: ifp->if_mtu = ifr->ifr_mtu;
2005: break;
2006: case SIOCSIFFLAGS:
2007: if (ifp->if_flags & IFF_UP) {
2008: if (ifp->if_flags & IFF_RUNNING &&
2009: ((ifp->if_flags ^ sc->if_flags) &
2010: IFF_PROMISC)) {
2011: re_setpromisc(sc);
2012: } else {
2013: if (!(ifp->if_flags & IFF_RUNNING))
2014: re_init(ifp);
2015: }
2016: } else {
2017: if (ifp->if_flags & IFF_RUNNING)
2018: re_stop(ifp, 1);
2019: }
2020: sc->if_flags = ifp->if_flags;
2021: break;
2022: case SIOCADDMULTI:
2023: case SIOCDELMULTI:
2024: error = (command == SIOCADDMULTI) ?
2025: ether_addmulti(ifr, &sc->sc_arpcom) :
2026: ether_delmulti(ifr, &sc->sc_arpcom);
2027: if (error == ENETRESET) {
2028: /*
2029: * Multicast list has changed; set the hardware
2030: * filter accordingly.
2031: */
2032: if (ifp->if_flags & IFF_RUNNING)
2033: re_setmulti(sc);
2034: error = 0;
2035: }
2036: break;
2037: case SIOCGIFMEDIA:
2038: case SIOCSIFMEDIA:
2039: error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, command);
2040: break;
2041: default:
2042: error = EINVAL;
2043: break;
2044: }
2045:
2046: splx(s);
2047:
2048: return (error);
2049: }
2050:
2051: void
2052: re_watchdog(struct ifnet *ifp)
2053: {
2054: struct rl_softc *sc;
2055: int s;
2056:
2057: sc = ifp->if_softc;
2058: s = splnet();
2059: printf("%s: watchdog timeout\n", sc->sc_dev.dv_xname);
2060: ifp->if_oerrors++;
2061:
2062: re_txeof(sc);
2063: re_rxeof(sc);
2064:
2065: re_init(ifp);
2066:
2067: splx(s);
2068: }
2069:
2070: /*
2071: * Stop the adapter and free any mbufs allocated to the
2072: * RX and TX lists.
2073: */
2074: void
2075: re_stop(struct ifnet *ifp, int disable)
2076: {
2077: struct rl_softc *sc;
2078: int i;
2079:
2080: sc = ifp->if_softc;
2081:
2082: ifp->if_timer = 0;
2083: sc->rl_link = 0;
2084:
2085: timeout_del(&sc->timer_handle);
2086: ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
2087:
2088: mii_down(&sc->sc_mii);
2089:
2090: CSR_WRITE_1(sc, RL_COMMAND, 0x00);
2091: CSR_WRITE_2(sc, RL_IMR, 0x0000);
2092: CSR_WRITE_2(sc, RL_ISR, 0xFFFF);
2093:
2094: if (sc->rl_head != NULL) {
2095: m_freem(sc->rl_head);
2096: sc->rl_head = sc->rl_tail = NULL;
2097: }
2098:
2099: /* Free the TX list buffers. */
2100: for (i = 0; i < RL_TX_QLEN; i++) {
2101: if (sc->rl_ldata.rl_txq[i].txq_mbuf != NULL) {
2102: bus_dmamap_unload(sc->sc_dmat,
2103: sc->rl_ldata.rl_txq[i].txq_dmamap);
2104: m_freem(sc->rl_ldata.rl_txq[i].txq_mbuf);
2105: sc->rl_ldata.rl_txq[i].txq_mbuf = NULL;
2106: }
2107: }
2108:
2109: /* Free the RX list buffers. */
2110: for (i = 0; i < RL_RX_DESC_CNT; i++) {
2111: if (sc->rl_ldata.rl_rxsoft[i].rxs_mbuf != NULL) {
2112: bus_dmamap_unload(sc->sc_dmat,
2113: sc->rl_ldata.rl_rxsoft[i].rxs_dmamap);
2114: m_freem(sc->rl_ldata.rl_rxsoft[i].rxs_mbuf);
2115: sc->rl_ldata.rl_rxsoft[i].rxs_mbuf = NULL;
2116: }
2117: }
2118: }
CVSweb