3 * Intel RS-82543GC Gigabit Ethernet PCI Controllers
4 * as found on the Intel PRO/1000[FT] Server Adapter.
5 * The older non-[FT] cards use the 82542 (LSI L2A1157) chip; no attempt
6 * is made to handle the older chip although it should be possible.
8 * updated just enough to cope with the
9 * Intel 8254[0347]NN Gigabit Ethernet Controller
10 * as found on the Intel PRO/1000 series of adapters:
11 * 82540EM Intel PRO/1000 MT
12 * 82543GC Intel PRO/1000 T
13 * 82544EI Intel PRO/1000 XT
16 * The datasheet is not very clear about running on a big-endian system
17 * and this driver assumes little-endian throughout.
20 * check recovery from receive no buffers condition
21 * automatic ett adjustment
34 Debug = 0, /* mostly for X60 debugging */
37 i82542 = (0x1000<<16)|0x8086,
38 i82543gc = (0x1004<<16)|0x8086,
39 i82544ei = (0x1008<<16)|0x8086,
40 i82544eif = (0x1009<<16)|0x8086,
41 i82544gc = (0x100d<<16)|0x8086,
42 i82540em = (0x100E<<16)|0x8086,
43 i82540eplp = (0x101E<<16)|0x8086,
44 i82545em = (0x100F<<16)|0x8086,
45 i82545gmc = (0x1026<<16)|0x8086,
46 i82547ei = (0x1019<<16)|0x8086,
47 i82547gi = (0x1075<<16)|0x8086,
48 i82541ei = (0x1013<<16)|0x8086,
49 i82541gi = (0x1076<<16)|0x8086,
50 i82541gi2 = (0x1077<<16)|0x8086,
51 i82541pi = (0x107c<<16)|0x8086,
52 i82546gb = (0x1079<<16)|0x8086,
53 i82546eb = (0x1010<<16)|0x8086,
56 /* compatibility with cpu kernels */
57 #define iallocb allocb
59 #define CACHELINESZ 32 /* pentium & later */
64 { /* command register (pcidev->pcr) */
73 Ctrl = 0x00000000, /* Device Control */
74 Status = 0x00000008, /* Device Status */
75 Eecd = 0x00000010, /* EEPROM/Flash Control/Data */
76 Ctrlext = 0x00000018, /* Extended Device Control */
77 Mdic = 0x00000020, /* MDI Control */
78 Fcal = 0x00000028, /* Flow Control Address Low */
79 Fcah = 0x0000002C, /* Flow Control Address High */
80 Fct = 0x00000030, /* Flow Control Type */
81 Icr = 0x000000C0, /* Interrupt Cause Read */
82 Ics = 0x000000C8, /* Interrupt Cause Set */
83 Ims = 0x000000D0, /* Interrupt Mask Set/Read */
84 Imc = 0x000000D8, /* Interrupt mask Clear */
85 Rctl = 0x00000100, /* Receive Control */
86 Fcttv = 0x00000170, /* Flow Control Transmit Timer Value */
87 Txcw = 0x00000178, /* Transmit Configuration Word */
88 Tctl = 0x00000400, /* Transmit Control */
89 Tipg = 0x00000410, /* Transmit IPG */
90 Tbt = 0x00000448, /* Transmit Burst Timer */
91 Ait = 0x00000458, /* Adaptive IFS Throttle */
92 Fcrtl = 0x00002160, /* Flow Control RX Threshold Low */
93 Fcrth = 0x00002168, /* Flow Control Rx Threshold High */
94 Rdbal = 0x00002800, /* Rdesc Base Address Low */
95 Rdbah = 0x00002804, /* Rdesc Base Address High */
96 Rdlen = 0x00002808, /* Receive Descriptor Length */
97 Rdh = 0x00002810, /* Receive Descriptor Head */
98 Rdt = 0x00002818, /* Receive Descriptor Tail */
99 Rdtr = 0x00002820, /* Receive Descriptor Timer Ring */
100 Rxdctl = 0x00002828, /* Receive Descriptor Control */
101 Radv = 0x0000282C, /* Receive Interrupt Absolute Delay Timer */
102 Txdmac = 0x00003000, /* Transfer DMA Control */
103 Ett = 0x00003008, /* Early Transmit Control */
104 Tdbal = 0x00003800, /* Tdesc Base Address Low */
105 Tdbah = 0x00003804, /* Tdesc Base Address High */
106 Tdlen = 0x00003808, /* Transmit Descriptor Length */
107 Tdh = 0x00003810, /* Transmit Descriptor Head */
108 Tdt = 0x00003818, /* Transmit Descriptor Tail */
109 Tidv = 0x00003820, /* Transmit Interrupt Delay Value */
110 Txdctl = 0x00003828, /* Transmit Descriptor Control */
111 Tadv = 0x0000382C, /* Transmit Interrupt Absolute Delay Timer */
113 Statistics = 0x00004000, /* Start of Statistics Area */
114 Gorcl = 0x88/4, /* Good Octets Received Count */
115 Gotcl = 0x90/4, /* Good Octets Transmitted Count */
116 Torl = 0xC0/4, /* Total Octets Received */
117 Totl = 0xC8/4, /* Total Octets Transmitted */
120 Rxcsum = 0x00005000, /* Receive Checksum Control */
121 Mta = 0x00005200, /* Multicast Table Array */
122 Ral = 0x00005400, /* Receive Address Low */
123 Rah = 0x00005404, /* Receive Address High */
124 Manc = 0x00005820, /* Management Control */
128 Bem = 0x00000002, /* Big Endian Mode */
129 Prior = 0x00000004, /* Priority on the PCI bus */
130 Lrst = 0x00000008, /* Link Reset */
131 Asde = 0x00000020, /* Auto-Speed Detection Enable */
132 Slu = 0x00000040, /* Set Link Up */
133 Ilos = 0x00000080, /* Invert Loss of Signal (LOS) */
134 SspeedMASK = 0x00000300, /* Speed Selection */
136 Sspeed10 = 0x00000000, /* 10Mb/s */
137 Sspeed100 = 0x00000100, /* 100Mb/s */
138 Sspeed1000 = 0x00000200, /* 1000Mb/s */
139 Frcspd = 0x00000800, /* Force Speed */
140 Frcdplx = 0x00001000, /* Force Duplex */
141 SwdpinsloMASK = 0x003C0000, /* Software Defined Pins - lo nibble */
143 SwdpioloMASK = 0x03C00000, /* Software Defined Pins - I or O */
145 Devrst = 0x04000000, /* Device Reset */
146 Rfce = 0x08000000, /* Receive Flow Control Enable */
147 Tfce = 0x10000000, /* Transmit Flow Control Enable */
148 Vme = 0x40000000, /* VLAN Mode Enable */
152 * can't find Tckok nor Rbcok in any Intel docs,
153 * but even 82543gc docs define Lanid.
156 Lu = 0x00000002, /* Link Up */
157 Lanid = 0x0000000C, /* mask for Lan ID. (function id) */
158 // Tckok = 0x00000004, /* Transmit clock is running */
159 // Rbcok = 0x00000008, /* Receive clock is running */
160 Txoff = 0x00000010, /* Transmission Paused */
161 Tbimode = 0x00000020, /* TBI Mode Indication */
162 SpeedMASK = 0x000000C0,
163 Speed10 = 0x00000000, /* 10Mb/s */
164 Speed100 = 0x00000040, /* 100Mb/s */
165 Speed1000 = 0x00000080, /* 1000Mb/s */
166 Mtxckok = 0x00000400, /* MTX clock is running */
167 Pci66 = 0x00000800, /* PCI Bus speed indication */
168 Bus64 = 0x00001000, /* PCI Bus width indication */
171 enum { /* Ctrl and Status */
172 Fd = 0x00000001, /* Full-Duplex */
173 AsdvMASK = 0x00000300,
174 Asdv10 = 0x00000000, /* 10Mb/s */
175 Asdv100 = 0x00000100, /* 100Mb/s */
176 Asdv1000 = 0x00000200, /* 1000Mb/s */
180 Sk = 0x00000001, /* Clock input to the EEPROM */
181 Cs = 0x00000002, /* Chip Select */
182 Di = 0x00000004, /* Data Input to the EEPROM */
183 Do = 0x00000008, /* Data Output from the EEPROM */
184 Areq = 0x00000040, /* EEPROM Access Request */
185 Agnt = 0x00000080, /* EEPROM Access Grant */
186 Eepresent = 0x00000100, /* EEPROM Present */
187 Eesz256 = 0x00000200, /* EEPROM is 256 words not 64 */
188 Eeszaddr = 0x00000400, /* EEPROM size for 8254[17] */
189 Spi = 0x00002000, /* EEPROM is SPI not Microwire */
193 Gpien = 0x0000000F, /* General Purpose Interrupt Enables */
194 SwdpinshiMASK = 0x000000F0, /* Software Defined Pins - hi nibble */
196 SwdpiohiMASK = 0x00000F00, /* Software Defined Pins - I or O */
198 Asdchk = 0x00001000, /* ASD Check */
199 Eerst = 0x00002000, /* EEPROM Reset */
200 Ips = 0x00004000, /* Invert Power State */
201 Spdbyps = 0x00008000, /* Speed Select Bypass */
204 enum { /* EEPROM content offsets */
205 Ea = 0x00, /* Ethernet Address */
206 Cf = 0x03, /* Compatibility Field */
207 Pba = 0x08, /* Printed Board Assembly number */
208 Icw1 = 0x0A, /* Initialization Control Word 1 */
209 Sid = 0x0B, /* Subsystem ID */
210 Svid = 0x0C, /* Subsystem Vendor ID */
211 Did = 0x0D, /* Device ID */
212 Vid = 0x0E, /* Vendor ID */
213 Icw2 = 0x0F, /* Initialization Control Word 2 */
217 MDIdMASK = 0x0000FFFF, /* Data */
219 MDIrMASK = 0x001F0000, /* PHY Register Address */
221 MDIpMASK = 0x03E00000, /* PHY Address */
223 MDIwop = 0x04000000, /* Write Operation */
224 MDIrop = 0x08000000, /* Read Operation */
225 MDIready = 0x10000000, /* End of Transaction */
226 MDIie = 0x20000000, /* Interrupt Enable */
227 MDIe = 0x40000000, /* Error */
230 enum { /* Icr, Ics, Ims, Imc */
231 Txdw = 0x00000001, /* Transmit Descriptor Written Back */
232 Txqe = 0x00000002, /* Transmit Queue Empty */
233 Lsc = 0x00000004, /* Link Status Change */
234 Rxseq = 0x00000008, /* Receive Sequence Error */
235 Rxdmt0 = 0x00000010, /* Rdesc Minimum Threshold Reached */
236 Rxo = 0x00000040, /* Receiver Overrun */
237 Rxt0 = 0x00000080, /* Receiver Timer Interrupt */
238 Mdac = 0x00000200, /* MDIO Access Completed */
239 Rxcfg = 0x00000400, /* Receiving /C/ ordered sets */
240 Gpi0 = 0x00000800, /* General Purpose Interrupts */
247 * The Mdic register isn't implemented on the 82543GC,
248 * the software defined pins are used instead.
249 * These definitions work for the Intel PRO/1000 T Server Adapter.
250 * The direction pin bits are read from the EEPROM.
253 Mdd = ((1<<2)<<SwdpinsloSHIFT), /* data */
254 Mddo = ((1<<2)<<SwdpioloSHIFT), /* pin direction */
255 Mdc = ((1<<3)<<SwdpinsloSHIFT), /* clock */
256 Mdco = ((1<<3)<<SwdpioloSHIFT), /* pin direction */
257 Mdr = ((1<<0)<<SwdpinshiSHIFT), /* reset */
258 Mdro = ((1<<0)<<SwdpiohiSHIFT), /* pin direction */
262 TxcwFd = 0x00000020, /* Full Duplex */
263 TxcwHd = 0x00000040, /* Half Duplex */
264 TxcwPauseMASK = 0x00000180, /* Pause */
266 TxcwPs = (1<<TxcwPauseSHIFT), /* Pause Supported */
267 TxcwAs = (2<<TxcwPauseSHIFT), /* Asymmetric FC desired */
268 TxcwRfiMASK = 0x00003000, /* Remote Fault Indication */
270 TxcwNpr = 0x00008000, /* Next Page Request */
271 TxcwConfig = 0x40000000, /* Transmit COnfig Control */
272 TxcwAne = 0x80000000, /* Auto-Negotiation Enable */
276 Rrst = 0x00000001, /* Receiver Software Reset */
277 Ren = 0x00000002, /* Receiver Enable */
278 Sbp = 0x00000004, /* Store Bad Packets */
279 Upe = 0x00000008, /* Unicast Promiscuous Enable */
280 Mpe = 0x00000010, /* Multicast Promiscuous Enable */
281 Lpe = 0x00000020, /* Long Packet Reception Enable */
282 LbmMASK = 0x000000C0, /* Loopback Mode */
283 LbmOFF = 0x00000000, /* No Loopback */
284 LbmTBI = 0x00000040, /* TBI Loopback */
285 LbmMII = 0x00000080, /* GMII/MII Loopback */
286 LbmXCVR = 0x000000C0, /* Transceiver Loopback */
287 RdtmsMASK = 0x00000300, /* Rdesc Minimum Threshold Size */
288 RdtmsHALF = 0x00000000, /* Threshold is 1/2 Rdlen */
289 RdtmsQUARTER = 0x00000100, /* Threshold is 1/4 Rdlen */
290 RdtmsEIGHTH = 0x00000200, /* Threshold is 1/8 Rdlen */
291 MoMASK = 0x00003000, /* Multicast Offset */
292 Bam = 0x00008000, /* Broadcast Accept Mode */
293 BsizeMASK = 0x00030000, /* Receive Buffer Size */
294 Bsize2048 = 0x00000000,
295 Bsize1024 = 0x00010000,
296 Bsize512 = 0x00020000,
297 Bsize256 = 0x00030000,
298 Vfe = 0x00040000, /* VLAN Filter Enable */
299 Cfien = 0x00080000, /* Canonical Form Indicator Enable */
300 Cfi = 0x00100000, /* Canonical Form Indicator value */
301 Dpf = 0x00400000, /* Discard Pause Frames */
302 Pmcf = 0x00800000, /* Pass MAC Control Frames */
303 Bsex = 0x02000000, /* Buffer Size Extension */
304 Secrc = 0x04000000, /* Strip CRC from incoming packet */
308 Trst = 0x00000001, /* Transmitter Software Reset */
309 Ten = 0x00000002, /* Transmit Enable */
310 Psp = 0x00000008, /* Pad Short Packets */
311 CtMASK = 0x00000FF0, /* Collision Threshold */
313 ColdMASK = 0x003FF000, /* Collision Distance */
315 Swxoff = 0x00400000, /* Sofware XOFF Transmission */
316 Pbe = 0x00800000, /* Packet Burst Enable */
317 Rtlc = 0x01000000, /* Re-transmit on Late Collision */
318 Nrtu = 0x02000000, /* No Re-transmit on Underrrun */
321 enum { /* [RT]xdctl */
322 PthreshMASK = 0x0000003F, /* Prefetch Threshold */
324 HthreshMASK = 0x00003F00, /* Host Threshold */
326 WthreshMASK = 0x003F0000, /* Writebacj Threshold */
328 Gran = 0x01000000, /* Granularity */
332 PcssMASK = 0x000000FF, /* Packet Checksum Start */
334 Ipofl = 0x00000100, /* IP Checksum Off-load Enable */
335 Tuofl = 0x00000200, /* TCP/UDP Checksum Off-load Enable */
339 Arpen = 0x00002000, /* Enable ARP Request Filtering */
342 typedef struct Rdesc { /* Receive Descriptor */
351 enum { /* Rdesc status */
352 Rdd = 0x01, /* Descriptor Done */
353 Reop = 0x02, /* End of Packet */
354 Ixsm = 0x04, /* Ignore Checksum Indication */
355 Vp = 0x08, /* Packet is 802.1Q (matched VET) */
356 Tcpcs = 0x20, /* TCP Checksum Calculated on Packet */
357 Ipcs = 0x40, /* IP Checksum Calculated on Packet */
358 Pif = 0x80, /* Passed in-exact filter */
361 enum { /* Rdesc errors */
362 Ce = 0x01, /* CRC Error or Alignment Error */
363 Se = 0x02, /* Symbol Error */
364 Seq = 0x04, /* Sequence Error */
365 Cxe = 0x10, /* Carrier Extension Error */
366 Tcpe = 0x20, /* TCP/UDP Checksum Error */
367 Ipe = 0x40, /* IP Checksum Error */
368 Rxe = 0x80, /* RX Data Error */
371 typedef struct Tdesc { /* Legacy+Normal Transmit Descriptor */
373 uint control; /* varies with descriptor type */
374 uint status; /* varies with descriptor type */
377 enum { /* Tdesc control */
378 LenMASK = 0x000FFFFF, /* Data/Packet Length Field */
380 DtypeCD = 0x00000000, /* Data Type 'Context Descriptor' */
381 DtypeDD = 0x00100000, /* Data Type 'Data Descriptor' */
382 PtypeTCP = 0x01000000, /* TCP/UDP Packet Type (CD) */
383 Teop = 0x01000000, /* End of Packet (DD) */
384 PtypeIP = 0x02000000, /* IP Packet Type (CD) */
385 Ifcs = 0x02000000, /* Insert FCS (DD) */
386 Tse = 0x04000000, /* TCP Segmentation Enable */
387 Rs = 0x08000000, /* Report Status */
388 Rps = 0x10000000, /* Report Status Sent */
389 Dext = 0x20000000, /* Descriptor Extension */
390 Vle = 0x40000000, /* VLAN Packet Enable */
391 Ide = 0x80000000, /* Interrupt Delay Enable */
394 enum { /* Tdesc status */
395 Tdd = 0x00000001, /* Descriptor Done */
396 Ec = 0x00000002, /* Excess Collisions */
397 Lc = 0x00000004, /* Late Collision */
398 Tu = 0x00000008, /* Transmit Underrun */
399 CssMASK = 0x0000FF00, /* Checksum Start Field */
404 Nrdesc = 32, /* multiple of 8 */
405 Ntdesc = 8, /* multiple of 8 */
408 typedef struct Ctlr Ctlr;
409 typedef struct Ctlr {
420 int im; /* interrupt mask */
425 uint statistics[Nstatistics];
427 uchar ra[Eaddrlen]; /* receive address */
428 ulong mta[128]; /* multicast table array */
430 Rdesc* rdba; /* receive descriptor base address */
431 Block** rb; /* receive buffers */
432 int rdh; /* receive descriptor head */
433 int rdt; /* receive descriptor tail */
435 Tdesc* tdba; /* transmit descriptor base address */
437 Block** tb; /* transmit buffers */
438 int tdh; /* transmit descriptor head */
439 int tdt; /* transmit descriptor tail */
440 int ett; /* early transmit threshold */
447 Block* bqhead; /* transmission queue */
451 static Ctlr* ctlrhead;
452 static Ctlr* ctlrtail;
454 #define csr32r(c, r) (*((c)->nic+((r)/4)))
455 #define csr32w(c, r, v) (*((c)->nic+((r)/4)) = (v))
458 igbeim(Ctlr* ctlr, int im)
460 ilock(&ctlr->imlock);
462 csr32w(ctlr, Ims, ctlr->im);
463 iunlock(&ctlr->imlock);
467 igbeattach(Ether* edev)
475 * start off a kproc for link status change:
476 * adjust queue length depending on speed;
478 * more needed here...
482 ctl = csr32r(ctlr, Rctl)|Ren;
483 csr32w(ctlr, Rctl, ctl);
484 ctl = csr32r(ctlr, Tctl)|Ten;
485 csr32w(ctlr, Tctl, ctl);
488 static char* statistics[Nstatistics] = {
495 "Excessive Collisions",
496 "Multiple Collision",
504 "Carrier Extension Error",
505 "Receive Error Length",
511 "FC Received Unsupported",
512 "Packets Received (64 Bytes)",
513 "Packets Received (65-127 Bytes)",
514 "Packets Received (128-255 Bytes)",
515 "Packets Received (256-511 Bytes)",
516 "Packets Received (512-1023 Bytes)",
517 "Packets Received (1024-1522 Bytes)",
518 "Good Packets Received",
519 "Broadcast Packets Received",
520 "Multicast Packets Received",
521 "Good Packets Transmitted",
523 "Good Octets Received",
525 "Good Octets Transmitted",
529 "Receive No Buffers",
537 "Total Octets Received",
539 "Total Octets Transmitted",
541 "Total Packets Received",
542 "Total Packets Transmitted",
543 "Packets Transmitted (64 Bytes)",
544 "Packets Transmitted (65-127 Bytes)",
545 "Packets Transmitted (128-255 Bytes)",
546 "Packets Transmitted (256-511 Bytes)",
547 "Packets Transmitted (512-1023 Bytes)",
548 "Packets Transmitted (1024-1522 Bytes)",
549 "Multicast Packets Transmitted",
550 "Broadcast Packets Transmitted",
551 "TCP Segmentation Context Transmitted",
552 "TCP Segmentation Context Fail",
558 int tdh, tdt, len, olen;
559 Ctlr *ctlr = edev->ctlr;
564 * Try to fill the ring back up, moving buffers from the transmit q.
566 tdh = PREV(ctlr->tdh, Ntdesc);
567 for(tdt = ctlr->tdt; tdt != tdh; tdt = NEXT(tdt, Ntdesc)){
568 /* pull off the head of the transmission queue */
569 if((bp = ctlr->bqhead) == nil) /* was qget(edev->oq) */
571 ctlr->bqhead = bp->next;
572 if (ctlr->bqtail == bp)
574 len = olen = BLEN(bp);
577 * if packet is too short, make it longer rather than relying
578 * on ethernet interface to pad it and complain so the caller
579 * will get fixed. I don't think Psp is working right, or it's
582 if (len < ETHERMINTU) {
583 if (bp->rp + ETHERMINTU <= bp->lim)
584 bp->wp = bp->rp + ETHERMINTU;
588 print("txstart: extended short pkt %d -> %d bytes\n",
592 /* set up a descriptor for it */
593 tdesc = &ctlr->tdba[tdt];
594 tdesc->addr[0] = PCIWADDR(bp->rp);
596 tdesc->control = /* Ide| */ Rs|Dext|Ifcs|Teop|DtypeDD|len;
602 csr32w(ctlr, Tdt, tdt);
607 fromringbuf(Ether *ether)
609 RingBuf *tb = ðer->tb[ether->ti];
610 Block *bp = allocb(tb->len);
612 memmove(bp->wp, tb->pkt, tb->len);
613 memmove(bp->wp+Eaddrlen, ether->ea, Eaddrlen);
619 igbetransmit(Ether* edev)
628 * For now there are no smarts here. Tuning comes later.
631 ilock(&ctlr->tdlock);
634 * Free any completed packets
635 * - try to get the soft tdh to catch the tdt;
636 * - if the packet had an underrun bump the threshold
637 * - the Tu bit doesn't seem to ever be set, perhaps
638 * because Rs mode is used?
642 tdesc = &ctlr->tdba[tdh];
643 if(!(tdesc->status & Tdd))
645 if(tdesc->status & Tu){
647 csr32w(ctlr, Ett, ctlr->ett);
650 if(ctlr->tb[tdh] != nil){
651 freeb(ctlr->tb[tdh]);
654 tdh = NEXT(tdh, Ntdesc);
658 /* copy packets from the software RingBuf to the transmission q */
659 /* from boot ether83815.c */
660 while((tb = &edev->tb[edev->ti])->owner == Interface){
661 bp = fromringbuf(edev);
663 /* put the buffer on the transmit queue */
665 ctlr->bqtail->next = bp;
670 txstart(edev); /* kick transmitter */
671 tb->owner = Host; /* give descriptor back */
673 edev->ti = NEXT(edev->ti, edev->ntb);
676 iunlock(&ctlr->tdlock);
680 igbereplenish(Ctlr* ctlr)
687 while(NEXT(rdt, Nrdesc) != ctlr->rdh){
688 rdesc = &ctlr->rdba[rdt];
689 if(ctlr->rb[rdt] != nil){
692 else if((bp = iallocb(2048)) != nil){
694 rdesc->addr[0] = PCIWADDR(bp->rp);
701 rdt = NEXT(rdt, Nrdesc);
704 csr32w(ctlr, Rdt, rdt);
708 toringbuf(Ether *ether, Block *bp)
710 RingBuf *rb = ðer->rb[ether->ri];
712 if (rb->owner == Interface) {
714 memmove(rb->pkt, bp->rp, rb->len);
716 ether->ri = NEXT(ether->ri, ether->nrb);
718 /* else no one is expecting packets from the network */
722 igbeinterrupt(Ureg*, void* arg)
728 int icr, im, rdh, txdw = 0;
733 ilock(&ctlr->imlock);
734 csr32w(ctlr, Imc, ~0);
737 for(icr = csr32r(ctlr, Icr); icr & ctlr->im; icr = csr32r(ctlr, Icr)){
739 * Link status changed.
741 if(icr & (Rxseq|Lsc)){
743 * should be more here...
748 * Process any received packets.
752 rdesc = &ctlr->rdba[rdh];
753 if(!(rdesc->status & Rdd))
755 if ((rdesc->status & Reop) && rdesc->errors == 0) {
759 * it appears that the original 82543 needed
760 * to have the Ethernet CRC excluded, but that
761 * the newer chips do not?
763 bp->wp += rdesc->length /* -4 */;
766 } else if ((rdesc->status & Reop) && rdesc->errors)
767 print("igbe: input packet error 0x%ux\n",
770 rdh = NEXT(rdh, Nrdesc);
783 csr32w(ctlr, Ims, im);
784 iunlock(&ctlr->imlock);
791 igbeinit(Ether* edev)
800 * Set up the receive addresses.
801 * There are 16 addresses. The first should be the MAC address.
802 * The others are cleared and not marked valid (MS bit of Rah).
804 csr = (edev->ea[3]<<24)|(edev->ea[2]<<16)|(edev->ea[1]<<8)|edev->ea[0];
805 csr32w(ctlr, Ral, csr);
806 csr = 0x80000000|(edev->ea[5]<<8)|edev->ea[4];
807 csr32w(ctlr, Rah, csr);
808 for(i = 1; i < 16; i++){
809 csr32w(ctlr, Ral+i*8, 0);
810 csr32w(ctlr, Rah+i*8, 0);
814 * Clear the Multicast Table Array.
815 * It's a 4096 bit vector accessed as 128 32-bit registers.
817 for(i = 0; i < 128; i++)
818 csr32w(ctlr, Mta+i*4, 0);
821 * Receive initialisation.
822 * Mostly defaults from the datasheet, will
823 * need some tuning for performance:
824 * Rctl descriptor mimimum threshold size
825 * discard pause frames
827 * Rdtr interrupt delay
828 * Rxdctl all the thresholds
830 csr32w(ctlr, Rctl, 0);
833 * Allocate the descriptor ring and load its
834 * address and length into the NIC.
836 ctlr->rdba = xspanalloc(Nrdesc*sizeof(Rdesc), 128 /* was 16 */, 0);
837 csr32w(ctlr, Rdbal, PCIWADDR(ctlr->rdba));
838 csr32w(ctlr, Rdbah, 0);
839 csr32w(ctlr, Rdlen, Nrdesc*sizeof(Rdesc));
842 * Initialise the ring head and tail pointers and
843 * populate the ring with Blocks.
844 * The datasheet says the tail pointer is set to beyond the last
845 * descriptor hardware can process, which implies the initial
846 * condition is Rdh == Rdt. However, experience shows Rdt must
847 * always be 'behind' Rdh; the replenish routine ensures this.
850 csr32w(ctlr, Rdh, ctlr->rdh);
852 csr32w(ctlr, Rdt, ctlr->rdt);
853 ctlr->rb = malloc(sizeof(Block*)*Nrdesc);
857 * Set up Rctl but don't enable receiver (yet).
859 csr32w(ctlr, Rdtr, 0);
871 csr32w(ctlr, Radv, 64);
874 csr32w(ctlr, Rxdctl, (8<<WthreshSHIFT)|(8<<HthreshSHIFT)|4);
876 * Enable checksum offload.
878 csr32w(ctlr, Rxcsum, Tuofl|Ipofl|(ETHERHDRSIZE<<PcssSHIFT));
880 csr32w(ctlr, Rctl, Dpf|Bsize2048|Bam|RdtmsHALF);
881 igbeim(ctlr, Rxt0|Rxo|Rxdmt0|Rxseq);
884 * Transmit initialisation.
885 * Mostly defaults from the datasheet, will
886 * need some tuning for performance. The normal mode will
887 * be full-duplex and things to tune for half-duplex are
888 * Tctl re-transmit on late collision
891 * Ait adaptive IFS throttle
893 * Txdmac packet prefetching
894 * Ett transmit early threshold
895 * Tidv interrupt delay value
896 * Txdctl all the thresholds
898 csr32w(ctlr, Tctl, (0x0F<<CtSHIFT)|Psp|(66<<ColdSHIFT)); /* Fd */
922 csr32w(ctlr, Tipg, (6<<20)|(8<<10)|r);
923 csr32w(ctlr, Ait, 0);
924 csr32w(ctlr, Txdmac, 0);
925 csr32w(ctlr, Tidv, 128);
928 * Allocate the descriptor ring and load its
929 * address and length into the NIC.
931 ctlr->tdba = xspanalloc(Ntdesc*sizeof(Tdesc), 128 /* was 16 */, 0);
932 csr32w(ctlr, Tdbal, PCIWADDR(ctlr->tdba));
933 csr32w(ctlr, Tdbah, 0);
934 csr32w(ctlr, Tdlen, Ntdesc*sizeof(Tdesc));
937 * Initialise the ring head and tail pointers.
940 csr32w(ctlr, Tdh, ctlr->tdh);
942 csr32w(ctlr, Tdt, ctlr->tdt);
943 ctlr->tb = malloc(sizeof(Block*)*Ntdesc);
944 // ctlr->im |= Txqe|Txdw;
946 r = (4<<WthreshSHIFT)|(4<<HthreshSHIFT)|(8<<PthreshSHIFT);
960 r = csr32r(ctlr, Txdctl);
962 r |= Gran|(4<<WthreshSHIFT);
964 csr32w(ctlr, Tadv, 64);
967 csr32w(ctlr, Txdctl, r);
969 r = csr32r(ctlr, Tctl);
971 csr32w(ctlr, Tctl, r);
973 if(ctlr->mii == nil || ctlr->mii->curphy == nil) {
974 print("igbe: no mii (yet)\n");
977 /* wait for the link to come up */
978 if (miistatus(ctlr->mii) < 0)
980 print("igbe: phy: ");
981 phy = ctlr->mii->curphy;
983 print("full duplex");
985 print("half duplex");
986 print(", %d Mb/s\n", phy->speed);
991 ctrl = csr32r(ctlr, Ctrl);
996 csr32w(ctlr, Ctrl, ctrl);
1002 i82543mdior(Ctlr* ctlr, int n)
1004 int ctrl, data, i, r;
1007 * Read n bits from the Management Data I/O Interface.
1009 ctrl = csr32r(ctlr, Ctrl);
1010 r = (ctrl & ~Mddo)|Mdco;
1012 for(i = n-1; i >= 0; i--){
1013 if(csr32r(ctlr, Ctrl) & Mdd)
1015 csr32w(ctlr, Ctrl, Mdc|r);
1016 csr32w(ctlr, Ctrl, r);
1018 csr32w(ctlr, Ctrl, ctrl);
1024 i82543mdiow(Ctlr* ctlr, int bits, int n)
1029 * Write n bits to the Management Data I/O Interface.
1031 ctrl = csr32r(ctlr, Ctrl);
1033 for(i = n-1; i >= 0; i--){
1038 csr32w(ctlr, Ctrl, Mdc|r);
1039 csr32w(ctlr, Ctrl, r);
1041 csr32w(ctlr, Ctrl, ctrl);
1047 i82543miimir(Mii* mii, int pa, int ra)
1055 * MII Management Interface Read.
1058 * ST+OP+PHYAD+REGAD;
1059 * TA + 16 data bits.
1061 i82543mdiow(ctlr, 0xFFFFFFFF, 32);
1062 i82543mdiow(ctlr, 0x1800|(pa<<5)|ra, 14);
1063 data = i82543mdior(ctlr, 18);
1068 return data & 0xFFFF;
1072 i82543miimiw(Mii* mii, int pa, int ra, int data)
1079 * MII Management Interface Write.
1082 * ST+OP+PHYAD+REGAD+TA + 16 data bits;
1085 i82543mdiow(ctlr, 0xFFFFFFFF, 32);
1087 data |= (0x05<<(5+5+2+16))|(pa<<(5+2+16))|(ra<<(2+16))|(0x02<<16);
1088 i82543mdiow(ctlr, data, 32);
1094 igbemiimir(Mii* mii, int pa, int ra)
1101 csr32w(ctlr, Mdic, MDIrop|(pa<<MDIpSHIFT)|(ra<<MDIrSHIFT));
1103 for(timo = 64; timo; timo--){
1104 mdic = csr32r(ctlr, Mdic);
1105 if(mdic & (MDIe|MDIready))
1110 if((mdic & (MDIe|MDIready)) == MDIready)
1111 return mdic & 0xFFFF;
1116 igbemiimiw(Mii* mii, int pa, int ra, int data)
1124 csr32w(ctlr, Mdic, MDIwop|(pa<<MDIpSHIFT)|(ra<<MDIrSHIFT)|data);
1126 for(timo = 64; timo; timo--){
1127 mdic = csr32r(ctlr, Mdic);
1128 if(mdic & (MDIe|MDIready))
1132 if((mdic & (MDIe|MDIready)) == MDIready)
1140 MiiPhy *phy = (MiiPhy *)1;
1144 r = csr32r(ctlr, Status);
1147 if((ctlr->mii = malloc(sizeof(Mii))) == nil)
1149 ctlr->mii->ctlr = ctlr;
1151 ctrl = csr32r(ctlr, Ctrl);
1156 ctrl |= Frcdplx|Frcspd;
1157 csr32w(ctlr, Ctrl, ctrl);
1160 * The reset pin direction (Mdro) should already
1161 * be set from the EEPROM load.
1162 * If it's not set this configuration is unexpected
1165 r = csr32r(ctlr, Ctrlext);
1168 csr32w(ctlr, Ctrlext, r);
1170 r = csr32r(ctlr, Ctrlext);
1172 csr32w(ctlr, Ctrlext, r);
1174 r = csr32r(ctlr, Ctrlext);
1176 csr32w(ctlr, Ctrlext, r);
1179 ctlr->mii->mir = i82543miimir;
1180 ctlr->mii->miw = i82543miimiw;
1196 ctrl &= ~(Frcdplx|Frcspd);
1197 csr32w(ctlr, Ctrl, ctrl);
1198 ctlr->mii->mir = igbemiimir;
1199 ctlr->mii->miw = igbemiimiw;
1207 if(mii(ctlr->mii, ~0) == 0 || (phy = ctlr->mii->curphy) == nil){
1209 print("phy trouble: phy = 0x%lux\n", (ulong)phy);
1215 print("oui %X phyno %d\n", phy->oui, phy->phyno);
1220 * 8254X-specific PHY registers not in 802.3:
1221 * 0x10 PHY specific control
1222 * 0x14 extended PHY specific control
1223 * Set appropriate values then reset the PHY to have
1237 r = miimir(ctlr->mii, 16);
1238 r |= 0x0800; /* assert CRS on Tx */
1239 r |= 0x0060; /* auto-crossover all speeds */
1240 r |= 0x0002; /* polarity reversal enabled */
1241 miimiw(ctlr->mii, 16, r);
1243 r = miimir(ctlr->mii, 20);
1244 r |= 0x0070; /* +25MHz clock */
1246 r |= 0x0100; /* 1x downshift */
1247 miimiw(ctlr->mii, 20, r);
1249 miireset(ctlr->mii);
1253 if(ctlr->txcw & TxcwPs)
1255 if(ctlr->txcw & TxcwAs)
1257 miiane(ctlr->mii, ~0, p, ~0);
1263 at93c46io(Ctlr* ctlr, char* op, int data)
1266 int i, loop, eecd, r;
1268 eecd = csr32r(ctlr, Eecd);
1273 for(p = op; *p != '\0'; p++){
1279 case ':': /* start of loop */
1280 loop = strtol(p+1, &lp, 0)-1;
1286 case ';': /* end of loop */
1295 case 'C': /* assert clock */
1298 case 'c': /* deassert clock */
1301 case 'D': /* next bit in 'data' byte */
1304 if(data & (1<<loop))
1309 case 'O': /* collect data output */
1310 i = (csr32r(ctlr, Eecd) & Do) != 0;
1316 case 'I': /* assert data input */
1319 case 'i': /* deassert data input */
1322 case 'S': /* enable chip select */
1325 case 's': /* disable chip select */
1329 csr32w(ctlr, Eecd, eecd);
1338 at93c46r(Ctlr* ctlr)
1342 int addr, areq, bits, data, eecd, i;
1344 eecd = csr32r(ctlr, Eecd);
1346 print("igbe: SPI EEPROM access not implemented\n");
1349 if(eecd & (Eeszaddr|Eesz256))
1372 csr32w(ctlr, Eecd, eecd|Areq);
1373 for(i = 0; i < 1000; i++){
1374 if((eecd = csr32r(ctlr, Eecd)) & Agnt)
1379 print("igbe: not granted EEPROM access\n");
1384 snprint(rop, sizeof(rop), "S :%dDCc;", bits+3);
1386 for(addr = 0; addr < 0x40; addr++){
1388 * Read a word at address 'addr' from the Atmel AT93C46
1389 * 3-Wire Serial EEPROM or compatible. The EEPROM access is
1390 * controlled by 4 bits in Eecd. See the AT93C46 datasheet
1391 * for protocol details.
1393 if(at93c46io(ctlr, rop, (0x06<<bits)|addr) != 0){
1394 print("igbe: can't set EEPROM address 0x%2.2X\n", addr);
1397 data = at93c46io(ctlr, ":16COc;", 0);
1398 at93c46io(ctlr, "sic", 0);
1399 ctlr->eeprom[addr] = data;
1402 if(addr && ((addr & 0x07) == 0))
1404 print(" %4.4ux", data);
1411 csr32w(ctlr, Eecd, eecd & ~Areq);
1421 * Perform a device reset to get the chip back to the
1422 * power-on state, followed by an EEPROM reset to read
1423 * the defaults for some internal registers.
1425 csr32w(ctlr, Imc, ~0);
1426 csr32w(ctlr, Rctl, 0);
1427 csr32w(ctlr, Tctl, 0);
1431 csr32w(ctlr, Ctrl, Devrst);
1432 /* apparently needed on multi-GHz processors to avoid infinite loops */
1434 while(csr32r(ctlr, Ctrl) & Devrst)
1437 csr32w(ctlr, Ctrlext, Eerst | csr32r(ctlr, Ctrlext));
1439 while(csr32r(ctlr, Ctrlext) & Eerst)
1455 r = csr32r(ctlr, Manc);
1457 csr32w(ctlr, Manc, r);
1461 csr32w(ctlr, Imc, ~0);
1463 while(csr32r(ctlr, Icr))
1468 igbedetach(Ether *edev)
1474 igbeshutdown(Ether* ether)
1476 print("igbeshutdown\n");
1481 igbereset(Ctlr* ctlr)
1483 int ctrl, i, pause, r, swdpio, txcw;
1488 * Read the EEPROM, validate the checksum
1489 * then get the device back to a power-on state.
1492 /* zero return means no SPI EEPROM access */
1493 if (r != 0 && r != 0xBABA){
1494 print("igbe: bad EEPROM checksum - 0x%4.4uX\n", r);
1499 * Snarf and set up the receive addresses.
1500 * There are 16 addresses. The first should be the MAC address.
1501 * The others are cleared and not marked valid (MS bit of Rah).
1503 if ((ctlr->id == i82546gb || ctlr->id == i82546eb) &&
1504 BUSFNO(ctlr->pcidev->tbdf) == 1)
1505 ctlr->eeprom[Ea+2] += 0x100; /* second interface */
1506 for(i = Ea; i < Eaddrlen/2; i++){
1507 ctlr->ra[2*i] = ctlr->eeprom[i];
1508 ctlr->ra[2*i+1] = ctlr->eeprom[i]>>8;
1510 /* lan id seems to vary on 82543gc; don't use it */
1511 if (ctlr->id != i82543gc) {
1512 r = (csr32r(ctlr, Status) & Lanid) >> 2;
1513 ctlr->ra[5] += r; /* ea ctlr[1] = ea ctlr[0]+1 */
1515 r = (ctlr->ra[3]<<24)|(ctlr->ra[2]<<16)|(ctlr->ra[1]<<8)|ctlr->ra[0];
1516 csr32w(ctlr, Ral, r);
1517 r = 0x80000000|(ctlr->ra[5]<<8)|ctlr->ra[4];
1518 csr32w(ctlr, Rah, r);
1519 for(i = 1; i < 16; i++){
1520 csr32w(ctlr, Ral+i*8, 0);
1521 csr32w(ctlr, Rah+i*8, 0);
1525 * Clear the Multicast Table Array.
1526 * It's a 4096 bit vector accessed as 128 32-bit registers.
1528 memset(ctlr->mta, 0, sizeof(ctlr->mta));
1529 for(i = 0; i < 128; i++)
1530 csr32w(ctlr, Mta+i*4, 0);
1533 * Just in case the Eerst didn't load the defaults
1534 * (doesn't appear to fully on the 8243GC), do it manually.
1536 if (ctlr->id == i82543gc) {
1537 txcw = csr32r(ctlr, Txcw);
1538 txcw &= ~(TxcwAne|TxcwPauseMASK|TxcwFd);
1539 ctrl = csr32r(ctlr, Ctrl);
1540 ctrl &= ~(SwdpioloMASK|Frcspd|Ilos|Lrst|Fd);
1542 if(ctlr->eeprom[Icw1] & 0x0400){
1546 if(ctlr->eeprom[Icw1] & 0x0200)
1548 if(ctlr->eeprom[Icw1] & 0x0010)
1550 if(ctlr->eeprom[Icw1] & 0x0800)
1552 swdpio = (ctlr->eeprom[Icw1] & 0x01E0)>>5;
1553 ctrl |= swdpio<<SwdpioloSHIFT;
1554 csr32w(ctlr, Ctrl, ctrl);
1556 ctrl = csr32r(ctlr, Ctrlext);
1557 ctrl &= ~(Ips|SwdpiohiMASK);
1558 swdpio = (ctlr->eeprom[Icw2] & 0x00F0)>>4;
1559 if(ctlr->eeprom[Icw1] & 0x1000)
1561 ctrl |= swdpio<<SwdpiohiSHIFT;
1562 csr32w(ctlr, Ctrlext, ctrl);
1564 if(ctlr->eeprom[Icw2] & 0x0800)
1566 pause = (ctlr->eeprom[Icw2] & 0x3000)>>12;
1567 txcw |= pause<<TxcwPauseSHIFT;
1570 ctlr->fcrtl = 0x00002000;
1571 ctlr->fcrth = 0x00004000;
1572 txcw |= TxcwAs|TxcwPs;
1575 ctlr->fcrtl = 0x00002000;
1576 ctlr->fcrth = 0x00004000;
1585 csr32w(ctlr, Txcw, txcw);
1588 * Flow control - values from the datasheet.
1590 csr32w(ctlr, Fcal, 0x00C28001);
1591 csr32w(ctlr, Fcah, 0x00000100);
1592 csr32w(ctlr, Fct, 0x00008808);
1593 csr32w(ctlr, Fcttv, 0x00000100);
1595 csr32w(ctlr, Fcrtl, ctlr->fcrtl);
1596 csr32w(ctlr, Fcrth, ctlr->fcrth);
1598 ilock(&ctlr->imlock);
1599 csr32w(ctlr, Imc, ~0);
1600 ctlr->im = 0; /* was = Lsc, which hangs some controllers */
1601 csr32w(ctlr, Ims, ctlr->im);
1602 iunlock(&ctlr->imlock);
1604 if(!(csr32r(ctlr, Status) & Tbimode) && igbemii(ctlr) < 0) {
1605 print("igbe: igbemii failed\n");
1618 static int first = 1;
1626 while(p = pcimatch(p, 0, 0)){
1627 if(p->ccrb != 0x02 || p->ccru != 0)
1630 switch((p->did<<16)|p->vid){
1635 case (0x1001<<16)|0x8086: /* Intel PRO/1000 F */
1656 /* the 82547EI is on the CSA bus, whatever that is */
1657 port = upamalloc(p->mem[0].bar & ~0x0F, p->mem[0].size, 0);
1659 print("igbe: can't map %d @ 0x%8.8luX\n",
1660 p->mem[0].size, p->mem[0].bar);
1665 * from etherga620.c:
1666 * If PCI Write-and-Invalidate is enabled set the max write DMA
1667 * value to the host cache-line size (32 on Pentium or later).
1669 if(p->pcr & MemWrInv){
1670 cls = pcicfgr8(p, PciCLS) * 4;
1671 if(cls != CACHELINESZ)
1672 pcicfgw8(p, PciCLS, CACHELINESZ/4);
1675 cls = pcicfgr8(p, PciCLS);
1678 print("igbe: unexpected CLS - %d bytes\n",
1683 /* alphapc 164lx returns 0 */
1684 print("igbe: unusable PciCLS: %d, using %d longs\n",
1685 cls, CACHELINESZ/sizeof(long));
1686 cls = CACHELINESZ/sizeof(long);
1687 pcicfgw8(p, PciCLS, cls);
1694 ctlr = malloc(sizeof(Ctlr));
1697 ctlr->id = (p->did<<16)|p->vid;
1699 ctlr->nic = KADDR(ctlr->port);
1701 print("status0 %8.8uX\n", csr32r(ctlr, Status));
1702 if(igbereset(ctlr)){
1707 print("status1 %8.8uX\n", csr32r(ctlr, Status));
1711 ctlrtail->next = ctlr;
1719 igbepnp(Ether* edev)
1729 * Any adapter matches if no edev->port is supplied,
1730 * otherwise the ports must match.
1732 for(ctlr = ctlrhead; ctlr != nil; ctlr = ctlr->next){
1735 if(edev->port == 0 || edev->port == ctlr->port){
1744 edev->port = ctlr->port;
1745 edev->irq = ctlr->pcidev->intl;
1746 edev->tbdf = ctlr->pcidev->tbdf;
1747 // edev->mbps = 1000;
1750 * Check if the adapter's station address is to be overridden.
1751 * If not, read it from the EEPROM and set in ether->ea prior to
1752 * loading the station address in the hardware.
1754 memset(ea, 0, Eaddrlen);
1755 if(memcmp(ea, edev->ea, Eaddrlen) == 0){
1756 for(i = 0; i < Eaddrlen/2; i++){
1757 edev->ea[2*i] = ctlr->eeprom[i];
1758 edev->ea[2*i+1] = ctlr->eeprom[i]>>8;
1764 * Linkage to the generic ethernet driver.
1766 edev->attach = igbeattach;
1767 edev->transmit = igbetransmit;
1768 edev->interrupt = igbeinterrupt;
1769 edev->detach = igbedetach;