2 * Intel 82557 Fast Ethernet PCI Bus LAN Controller
3 * as found on the Intel EtherExpress PRO/100B. This chip is full
4 * of smarts, unfortunately they're not all in the right place.
6 * the PCI scanning code could be made common to other adapters;
7 * auto-negotiation, full-duplex;
8 * optionally use memory-mapped registers;
9 * detach for PCI reset problems (also towards loadable drivers).
12 #include "../port/lib.h"
17 #include "../port/error.h"
18 #include "../port/netif.h"
23 Nrfd = 64, /* receive frame area */
24 Ncb = 64, /* maximum control blocks queued */
26 NullPointer = 0xFFFFFFFF, /* 82557 NULL pointer */
30 Status = 0x00, /* byte or word (word includes Ack) */
31 Ack = 0x01, /* byte */
32 CommandR = 0x02, /* byte or word (word includes Interrupt) */
33 Interrupt = 0x03, /* byte */
34 General = 0x04, /* dword */
35 Port = 0x08, /* dword */
36 Fcr = 0x0C, /* Flash control register */
37 Ecr = 0x0E, /* EEPROM control register */
38 Mcr = 0x10, /* MDI control register */
39 Gstatus = 0x1D, /* General status register */
45 RUnoresources = 0x0008,
47 RUrbd = 0x0020, /* bit */
48 RUstatus = 0x003F, /* mask */
53 CUstatus = 0x00C0, /* mask */
55 StatSWI = 0x0400, /* SoftWare generated Interrupt */
56 StatMDI = 0x0800, /* MDI r/w done */
57 StatRNR = 0x1000, /* Receive unit Not Ready */
58 StatCNA = 0x2000, /* Command unit Not Active (Active->Idle) */
59 StatFR = 0x4000, /* Finished Receiving */
60 StatCX = 0x8000, /* Command eXecuted */
61 StatTNO = 0x8000, /* Transmit NOT OK */
64 enum { /* Command (byte) */
68 LoadDCA = 0x40, /* Load Dump Counters Address */
69 DumpSC = 0x50, /* Dump Statistical Counters */
70 LoadCUB = 0x60, /* Load CU Base */
71 ResetSA = 0x70, /* Dump and Reset Statistical Counters */
76 LoadHDS = 0x05, /* Load Header Data Size */
77 LoadRUB = 0x06, /* Load RU Base */
78 RBDresume = 0x07, /* Resume frame reception */
81 enum { /* Interrupt (byte) */
82 InterruptM = 0x01, /* interrupt Mask */
83 InterruptSI = 0x02, /* Software generated Interrupt */
87 EEsk = 0x01, /* serial clock */
88 EEcs = 0x02, /* chip select */
89 EEdi = 0x04, /* serial data in */
90 EEdo = 0x08, /* serial data out */
92 EEstart = 0x04, /* start bit */
93 EEread = 0x02, /* read opcode */
97 MDIread = 0x08000000, /* read opcode */
98 MDIwrite = 0x04000000, /* write opcode */
99 MDIready = 0x10000000, /* ready bit */
100 MDIie = 0x20000000, /* interrupt enable */
114 RfdCollision = 0x00000001,
115 RfdIA = 0x00000002, /* IA match */
116 RfdRxerr = 0x00000010, /* PHY character error */
117 RfdType = 0x00000020, /* Type frame */
118 RfdRunt = 0x00000080,
119 RfdOverrun = 0x00000100,
120 RfdBuffer = 0x00000200,
121 RfdAlignment = 0x00000400,
124 RfdOK = 0x00002000, /* frame received OK */
125 RfdC = 0x00008000, /* reception Complete */
126 RfdSF = 0x00080000, /* Simplified or Flexible (1) Rfd */
127 RfdH = 0x00100000, /* Header RFD */
129 RfdI = 0x20000000, /* Interrupt after completion */
130 RfdS = 0x40000000, /* Suspend after completion */
131 RfdEL = 0x80000000, /* End of List */
139 typedef struct Cb Cb;
145 uchar data[24]; /* CbIAS + CbConfigure */
162 enum { /* action command */
163 CbU = 0x1000, /* transmit underrun */
164 CbOK = 0x2000, /* DMA completed OK */
165 CbC = 0x8000, /* execution Complete */
168 CbIAS = 0x0001, /* Individual Address Setup */
169 CbConfigure = 0x0002,
170 CbMAS = 0x0003, /* Multicast Address Setup */
174 CbCommand = 0x0007, /* mask */
176 CbSF = 0x0008, /* Flexible-mode CbTransmit */
178 CbI = 0x2000, /* Interrupt after completion */
179 CbS = 0x4000, /* Suspend after completion */
180 CbEL = 0x8000, /* End of List */
183 enum { /* CbTransmit count */
187 typedef struct Ctlr Ctlr;
188 typedef struct Ctlr {
189 Lock slock; /* attach */
197 int eepromsz; /* address size in bits */
204 Lock rlock; /* registers */
205 int command; /* last command issued */
207 Block* rfdhead; /* receive side */
211 Lock cblock; /* transmit side */
214 uchar configdata[24];
224 Lock dlock; /* dump statistical counters */
228 static Ctlr* ctlrhead;
229 static Ctlr* ctlrtail;
231 static uchar configdata[24] = {
232 0x16, /* byte count */
233 0x08, /* Rx/Tx FIFO limit */
234 0x00, /* adaptive IFS */
236 0x00, /* Rx DMA maximum byte count */
237 // 0x80, /* Tx DMA maximum byte count */
238 0x00, /* Tx DMA maximum byte count */
239 0x32, /* !late SCB, CNA interrupts */
240 0x03, /* discard short Rx frames */
244 0x2E, /* normal operation, NSAI */
245 0x00, /* linear priority */
246 0x60, /* inter-frame spacing */
249 0xC8, /* 503, promiscuous mode off */
252 0xF3, /* transmit padding enable */
253 0x80, /* full duplex pin enable */
254 0x3F, /* no Multi IA */
255 0x05, /* no Multi Cast ALL */
258 #define csr8r(c, r) (inb((c)->port+(r)))
259 #define csr16r(c, r) (ins((c)->port+(r)))
260 #define csr32r(c, r) (inl((c)->port+(r)))
261 #define csr8w(c, r, b) (outb((c)->port+(r), (int)(b)))
262 #define csr16w(c, r, w) (outs((c)->port+(r), (ushort)(w)))
263 #define csr32w(c, r, l) (outl((c)->port+(r), (ulong)(l)))
266 command(Ctlr* ctlr, int c, int v)
273 * Only back-to-back CUresume can be done
274 * without waiting for any previous command to complete.
275 * This should be the common case.
276 * Unfortunately there's a chip errata where back-to-back
277 * CUresumes can be lost, the fix is to always wait.
278 if(c == CUresume && ctlr->command == CUresume){
279 csr8w(ctlr, CommandR, c);
280 iunlock(&ctlr->rlock);
285 for(timeo = 0; timeo < 100; timeo++){
286 if(!csr8r(ctlr, CommandR))
292 iunlock(&ctlr->rlock);
293 iprint("i82557: command %#ux %#ux timeout\n", c, v);
305 csr32w(ctlr, General, v);
319 csr8w(ctlr, CommandR, c);
322 iunlock(&ctlr->rlock);
331 if(bp = iallocb(sizeof(Rfd))){
335 rfd->rbd = NullPointer;
337 rfd->size = sizeof(Etherpkt);
348 static void txstart(Ether*);
354 tsleep(&up->sleep, return0, 0, 4000);
357 * Hmmm. This doesn't seem right. Currently
358 * the device can't be disabled but it may be in
362 if(ctlr == nil || ctlr->state == 0)
365 ilock(&ctlr->cblock);
367 ctlr->action = CbMAS;
370 iunlock(&ctlr->cblock);
372 print("%s: exiting\n", up->text);
373 pexit("disabled", 1);
384 if(ctlr->state == 0){
386 csr8w(ctlr, Interrupt, 0);
387 iunlock(&ctlr->rlock);
388 command(ctlr, RUstart, PADDR(ctlr->rfdhead->rp));
392 * Start the watchdog timer for the receive lockup errata
393 * unless the EEPROM compatibility word indicates it may be
396 if((ctlr->eeprom[0x03] & 0x0003) != 0x0003){
397 snprint(name, KNAMELEN, "#l%dwatchdog", ether->ctlrno);
398 kproc(name, watchdog, ether);
401 unlock(&ctlr->slock);
405 ifstat(Ether* ether, void* a, long n, ulong offset)
415 unlock(&ctlr->dlock);
420 * Start the command then
421 * wait for completion status,
425 command(ctlr, DumpSC, 0);
426 for(i = 0; i < 1000 && ctlr->dump[16] == 0; i++)
429 error("command timeout");
431 memmove(dump, ctlr->dump, sizeof(dump));
433 ether->oerrs = dump[1]+dump[2]+dump[3];
434 ether->crcs = dump[10];
435 ether->frames = dump[11];
436 ether->buffs = dump[12]+dump[15];
437 ether->overflows = dump[13];
440 unlock(&ctlr->dlock);
445 p = smalloc(READSTR);
446 len = snprint(p, READSTR, "transmit good frames: %lud\n", dump[0]);
447 len += snprint(p+len, READSTR-len, "transmit maximum collisions errors: %lud\n", dump[1]);
448 len += snprint(p+len, READSTR-len, "transmit late collisions errors: %lud\n", dump[2]);
449 len += snprint(p+len, READSTR-len, "transmit underrun errors: %lud\n", dump[3]);
450 len += snprint(p+len, READSTR-len, "transmit lost carrier sense: %lud\n", dump[4]);
451 len += snprint(p+len, READSTR-len, "transmit deferred: %lud\n", dump[5]);
452 len += snprint(p+len, READSTR-len, "transmit single collisions: %lud\n", dump[6]);
453 len += snprint(p+len, READSTR-len, "transmit multiple collisions: %lud\n", dump[7]);
454 len += snprint(p+len, READSTR-len, "transmit total collisions: %lud\n", dump[8]);
455 len += snprint(p+len, READSTR-len, "receive good frames: %lud\n", dump[9]);
456 len += snprint(p+len, READSTR-len, "receive CRC errors: %lud\n", dump[10]);
457 len += snprint(p+len, READSTR-len, "receive alignment errors: %lud\n", dump[11]);
458 len += snprint(p+len, READSTR-len, "receive resource errors: %lud\n", dump[12]);
459 len += snprint(p+len, READSTR-len, "receive overrun errors: %lud\n", dump[13]);
460 len += snprint(p+len, READSTR-len, "receive collision detect errors: %lud\n", dump[14]);
461 len += snprint(p+len, READSTR-len, "receive short frame errors: %lud\n", dump[15]);
462 len += snprint(p+len, READSTR-len, "nop: %d\n", ctlr->nop);
463 if(ctlr->cbqmax > ctlr->cbqmaxhw)
464 ctlr->cbqmaxhw = ctlr->cbqmax;
465 len += snprint(p+len, READSTR-len, "cbqmax: %d\n", ctlr->cbqmax);
467 len += snprint(p+len, READSTR-len, "threshold: %d\n", ctlr->threshold);
469 len += snprint(p+len, READSTR-len, "eeprom:");
470 for(i = 0; i < (1<<ctlr->eepromsz); i++){
471 if(i && ((i & 0x07) == 0))
472 len += snprint(p+len, READSTR-len, "\n ");
473 len += snprint(p+len, READSTR-len, " %4.4ux", ctlr->eeprom[i]);
476 if((ctlr->eeprom[6] & 0x1F00) && !(ctlr->eeprom[6] & 0x8000)){
477 phyaddr = ctlr->eeprom[6] & 0x00FF;
478 len += snprint(p+len, READSTR-len, "\nphy %2d:", phyaddr);
479 for(i = 0; i < 6; i++){
480 static int miir(Ctlr*, int, int);
482 len += snprint(p+len, READSTR-len, " %4.4ux",
483 miir(ctlr, phyaddr, i));
487 snprint(p+len, READSTR-len, "\n");
488 n = readstr(offset, a, n, p);
495 txstart(Ether* ether)
502 while(ctlr->cbq < (ctlr->ncb-1)){
503 cb = ctlr->cbhead->next;
504 if(ctlr->action == 0){
505 bp = qget(ether->oq);
509 cb->command = CbS|CbSF|CbTransmit;
510 cb->tbd = PADDR(&cb->tba);
512 cb->threshold = ctlr->threshold;
514 cb->tba = PADDR(bp->rp);
516 cb->tbasz = BLEN(bp);
518 else if(ctlr->action == CbConfigure){
519 cb->command = CbS|CbConfigure;
520 memmove(cb->data, ctlr->configdata, sizeof(ctlr->configdata));
523 else if(ctlr->action == CbIAS){
524 cb->command = CbS|CbIAS;
525 memmove(cb->data, ether->ea, Eaddrlen);
528 else if(ctlr->action == CbMAS){
529 cb->command = CbS|CbMAS;
530 memset(cb->data, 0, sizeof(cb->data));
534 print("#l%d: action %#ux\n", ether->ctlrno, ctlr->action);
541 ctlr->cbhead->command &= ~CbS;
547 * Workaround for some broken HUB chips
548 * when connected at 10Mb/s half-duplex.
551 command(ctlr, CUnop, 0);
554 command(ctlr, CUresume, 0);
556 if(ctlr->cbq > ctlr->cbqmax)
557 ctlr->cbqmax = ctlr->cbq;
561 configure(Ether* ether, int promiscuous)
566 ilock(&ctlr->cblock);
568 ctlr->configdata[6] |= 0x80; /* Save Bad Frames */
569 //ctlr->configdata[6] &= ~0x40; /* !Discard Overrun Rx Frames */
570 ctlr->configdata[7] &= ~0x01; /* !Discard Short Rx Frames */
571 ctlr->configdata[15] |= 0x01; /* Promiscuous mode */
572 ctlr->configdata[18] &= ~0x01; /* (!Padding enable?), !stripping enable */
573 ctlr->configdata[21] |= 0x08; /* Multi Cast ALL */
576 ctlr->configdata[6] &= ~0x80;
577 //ctlr->configdata[6] |= 0x40;
578 ctlr->configdata[7] |= 0x01;
579 ctlr->configdata[15] &= ~0x01;
580 ctlr->configdata[18] |= 0x01; /* 0x03? */
581 ctlr->configdata[21] &= ~0x08;
583 ctlr->action = CbConfigure;
585 iunlock(&ctlr->cblock);
589 promiscuous(void* arg, int on)
595 multicast(void* ether, uchar *addr, int add)
599 * TODO: if (add) add addr to list of mcast addrs in controller
600 * else remove addr from list of mcast addrs in controller
601 * enable multicast input (see CbMAS) instead of promiscuous mode.
608 transmit(Ether* ether)
613 ilock(&ctlr->cblock);
615 iunlock(&ctlr->cblock);
619 receive(Ether* ether)
624 Block *bp, *pbp, *xbp;
628 for(rfd = (Rfd*)bp->rp; rfd->field & RfdC; rfd = (Rfd*)bp->rp){
630 * If it's an OK receive frame
632 * 2) if it's small, try to allocate a block and copy
633 * the data, then adjust the necessary fields for reuse;
634 * 3) if it's big, try to allocate a new Rfd and if
636 * adjust the received buffer pointers for the
637 * actual data received;
638 * initialise the replacement buffer to point to
639 * the next in the ring;
640 * initialise bp to point to the replacement;
641 * 4) if there's a good packet, pass it on for disposal.
643 if(rfd->field & RfdOK){
645 count = rfd->count & 0x3FFF;
646 if((count < ETHERMAXTU/4) && (pbp = iallocb(count))){
647 memmove(pbp->rp, bp->rp+offsetof(Rfd, data[0]), count);
648 pbp->wp = pbp->rp + count;
653 else if(xbp = rfdalloc(rfd->link)){
654 bp->rp += offsetof(Rfd, data[0]);
655 bp->wp = bp->rp + count;
657 xbp->next = bp->next;
664 etheriq(ether, pbp, 1);
672 * The ring tail pointer follows the head with with one
673 * unused buffer in between to defeat hardware prefetch;
674 * once the tail pointer has been bumped on to the next
675 * and the new tail has the Suspend bit set, it can be
676 * removed from the old tail buffer.
677 * As a replacement for the current head buffer may have
678 * been allocated above, ensure that the new tail points
679 * to it (next and link).
681 rfd = (Rfd*)ctlr->rfdtail->rp;
682 ctlr->rfdtail = ctlr->rfdtail->next;
683 ctlr->rfdtail->next = bp;
684 ((Rfd*)ctlr->rfdtail->rp)->link = PADDR(bp->rp);
685 ((Rfd*)ctlr->rfdtail->rp)->field |= RfdS;
690 * Finally done with the current (possibly replaced)
691 * head, move on to the next and maintain the sentinel
692 * between tail and head.
694 ctlr->rfdhead = bp->next;
700 interrupt(Ureg*, void* arg)
712 status = csr16r(ctlr, Status);
713 csr8w(ctlr, Ack, (status>>8) & 0xFF);
714 iunlock(&ctlr->rlock);
716 if(!(status & (StatCX|StatFR|StatCNA|StatRNR|StatMDI|StatSWI)))
720 * If the watchdog timer for the receiver lockup errata is running,
721 * let it know the receiver is active.
723 if(status & (StatFR|StatRNR)){
724 ilock(&ctlr->cblock);
726 iunlock(&ctlr->cblock);
734 if(status & StatRNR){
735 command(ctlr, RUresume, 0);
739 if(status & StatCNA){
740 ilock(&ctlr->cblock);
744 if(!(cb->status & CbC))
750 if((cb->status & CbU) && ctlr->threshold < 0xE0)
759 iunlock(&ctlr->cblock);
764 if(status & (StatCX|StatFR|StatCNA|StatRNR|StatMDI|StatSWI))
765 panic("#l%d: status %#ux", ether->ctlrno, status);
778 * Create the Receive Frame Area (RFA) as a ring of allocated
780 * A sentinel buffer is maintained between the last buffer in
781 * the ring (marked with RfdS) and the head buffer to defeat the
782 * hardware prefetch of the next RFD and allow dynamic buffer
786 for(i = 0; i < Nrfd; i++){
789 panic("i82557: can't allocate rfd buffer");
790 if(ctlr->rfdhead == nil)
792 bp->next = ctlr->rfdhead;
794 link = PADDR(bp->rp);
796 ctlr->rfdtail->next = ctlr->rfdhead;
797 rfd = (Rfd*)ctlr->rfdtail->rp;
798 rfd->link = PADDR(ctlr->rfdhead->rp);
800 ctlr->rfdhead = ctlr->rfdhead->next;
803 * Create a ring of control blocks for the
806 ilock(&ctlr->cblock);
807 ctlr->cbr = malloc(ctlr->ncb*sizeof(Cb));
809 panic("i82557: can't allocate cbr");
810 for(i = 0; i < ctlr->ncb; i++){
811 ctlr->cbr[i].status = CbC|CbOK;
812 ctlr->cbr[i].command = CbS|CbNOP;
813 ctlr->cbr[i].link = PADDR(&ctlr->cbr[NEXT(i, ctlr->ncb)].status);
814 ctlr->cbr[i].next = &ctlr->cbr[NEXT(i, ctlr->ncb)];
816 ctlr->cbhead = ctlr->cbr;
817 ctlr->cbtail = ctlr->cbr;
820 memmove(ctlr->configdata, configdata, sizeof(configdata));
821 ctlr->threshold = 80;
824 iunlock(&ctlr->cblock);
828 miir(Ctlr* ctlr, int phyadd, int regadd)
832 lock(&ctlr->miilock);
833 csr32w(ctlr, Mcr, MDIread|(phyadd<<21)|(regadd<<16));
835 for(timo = 64; timo; timo--){
836 mcr = csr32r(ctlr, Mcr);
841 unlock(&ctlr->miilock);
850 miiw(Ctlr* ctlr, int phyadd, int regadd, int data)
854 lock(&ctlr->miilock);
855 csr32w(ctlr, Mcr, MDIwrite|(phyadd<<21)|(regadd<<16)|(data & 0xFFFF));
857 for(timo = 64; timo; timo--){
858 mcr = csr32r(ctlr, Mcr);
863 unlock(&ctlr->miilock);
872 hy93c46r(Ctlr* ctlr, int r)
874 int data, i, op, size;
877 * Hyundai HY93C46 or equivalent serial EEPROM.
878 * This sequence for reading a 16-bit register 'r'
879 * in the EEPROM is taken straight from Section
880 * 3.3.4.2 of the Intel 82557 User's Guide.
883 csr16w(ctlr, Ecr, EEcs);
885 for(i = 2; i >= 0; i--){
886 data = (((op>>i) & 0x01)<<2)|EEcs;
887 csr16w(ctlr, Ecr, data);
888 csr16w(ctlr, Ecr, data|EEsk);
890 csr16w(ctlr, Ecr, data);
895 * First time through must work out the EEPROM size.
897 if((size = ctlr->eepromsz) == 0)
900 for(size = size-1; size >= 0; size--){
901 data = (((r>>size) & 0x01)<<2)|EEcs;
902 csr16w(ctlr, Ecr, data);
903 csr16w(ctlr, Ecr, data|EEsk);
905 csr16w(ctlr, Ecr, data);
907 if(!(csr16r(ctlr, Ecr) & EEdo))
912 for(i = 15; i >= 0; i--){
913 csr16w(ctlr, Ecr, EEcs|EEsk);
915 if(csr16r(ctlr, Ecr) & EEdo)
917 csr16w(ctlr, Ecr, EEcs);
921 csr16w(ctlr, Ecr, 0);
923 if(ctlr->eepromsz == 0){
924 ctlr->eepromsz = 8-size;
925 ctlr->eeprom = malloc((1<<ctlr->eepromsz)*sizeof(ushort));
926 if(ctlr->eeprom == nil)
927 panic("i82557: can't allocate eeprom");
943 while(p = pcimatch(p, 0x8086, 0)){
947 case 0x1031: /* Intel 82562EM */
948 case 0x103B: /* Intel 82562EM */
949 case 0x103C: /* Intel 82562EM */
950 case 0x1050: /* Intel 82562EZ */
951 case 0x1039: /* Intel 82801BD PRO/100 VE */
952 case 0x103A: /* Intel 82562 PRO/100 VE */
953 case 0x103D: /* Intel 82562 PRO/100 VE */
954 case 0x1064: /* Intel 82562 PRO/100 VE */
955 case 0x2449: /* Intel 82562ET */
956 case 0x27DC: /* Intel 82801G PRO/100 VE */
959 case 0x1209: /* Intel 82559ER */
960 case 0x1229: /* Intel 8255[789] */
961 case 0x1030: /* Intel 82559 InBusiness 10/100 */
965 if(pcigetpms(p) > 0){
968 for(i = 0; i < 6; i++)
969 pcicfgw32(p, PciBAR0+i*4, p->mem[i].bar);
970 pcicfgw8(p, PciINTL, p->intl);
971 pcicfgw8(p, PciLTR, p->ltr);
972 pcicfgw8(p, PciCLS, p->cls);
973 pcicfgw16(p, PciPCR, p->pcr);
977 * bar[0] is the memory-mapped register address (4KB),
978 * bar[1] is the I/O port register address (32 bytes) and
979 * bar[2] is for the flash ROM (1MB).
981 port = p->mem[1].bar & ~0x01;
982 if(ioalloc(port, p->mem[1].size, 0, "i82557") < 0){
983 print("i82557: port %#ux in use\n", port);
987 ctlr = malloc(sizeof(Ctlr));
989 print("i82557: can't allocate memory\n");
998 ctlrtail->next = ctlr;
1007 static char* mediatable[9] = {
1008 "10BASE-T", /* TP */
1009 "10BASE-2", /* BNC */
1010 "10BASE-5", /* AUI */
1024 for(i = 0; i < 32; i++){
1025 if((oui = miir(ctlr, i, 2)) == -1 || oui == 0 || oui == 0xFFFF)
1028 x = miir(ctlr, i, 3);
1030 //print("phy%d: oui %#ux reg1 %#ux\n", i, oui, miir(ctlr, i, 1));
1032 ctlr->eeprom[6] = i;
1034 ctlr->eeprom[6] |= 0x07<<8;
1035 else if(oui == 0x80017){
1037 ctlr->eeprom[6] |= 0x0A<<8;
1039 ctlr->eeprom[6] |= 0x04<<8;
1047 shutdown(Ether* ether)
1049 Ctlr *ctlr = ether->ctlr;
1051 print("ether82557 shutting down\n");
1052 csr32w(ctlr, Port, 0);
1054 csr8w(ctlr, Interrupt, InterruptM);
1061 int anar, anlpar, bmcr, bmsr, i, k, medium, phyaddr, x;
1070 * Any adapter matches if no ether->port is supplied,
1071 * otherwise the ports must match.
1073 for(ctlr = ctlrhead; ctlr != nil; ctlr = ctlr->next){
1076 if(ether->port == 0 || ether->port == ctlr->port){
1085 * Initialise the Ctlr structure.
1086 * Perform a software reset after which should ensure busmastering
1087 * is still enabled. The EtherExpress PRO/100B appears to leave
1088 * the PCI configuration alone (see the 'To do' list above) so punt
1090 * Load the RUB and CUB registers for linear addressing (0).
1093 ether->port = ctlr->port;
1094 ether->irq = ctlr->pcidev->intl;
1095 ether->tbdf = ctlr->pcidev->tbdf;
1097 ilock(&ctlr->rlock);
1098 csr32w(ctlr, Port, 0);
1100 csr8w(ctlr, Interrupt, InterruptM);
1101 iunlock(&ctlr->rlock);
1103 command(ctlr, LoadRUB, 0);
1104 command(ctlr, LoadCUB, 0);
1105 command(ctlr, LoadDCA, PADDR(ctlr->dump));
1108 * Initialise the receive frame, transmit ring and configuration areas.
1115 * Do a dummy read first to get the size
1116 * and allocate ctlr->eeprom.
1120 for(i = 0; i < (1<<ctlr->eepromsz); i++){
1121 x = hy93c46r(ctlr, i);
1122 ctlr->eeprom[i] = x;
1126 print("#l%d: EEPROM checksum - %#4.4ux\n", ether->ctlrno, sum);
1129 * Eeprom[6] indicates whether there is a PHY and whether
1130 * it's not 10Mb-only, in which case use the given PHY address
1131 * to set any PHY specific options and determine the speed.
1132 * Unfortunately, sometimes the EEPROM is blank except for
1133 * the ether address and checksum; in this case look at the
1134 * controller type and if it's am 82558 or 82559 it has an
1135 * embedded PHY so scan for that.
1136 * If no PHY, assume 82503 (serial) operation.
1138 if((ctlr->eeprom[6] & 0x1F00) && !(ctlr->eeprom[6] & 0x8000))
1139 phyaddr = ctlr->eeprom[6] & 0x00FF;
1141 switch(ctlr->pcidev->rid){
1142 case 0x01: /* 82557 A-step */
1143 case 0x02: /* 82557 B-step */
1144 case 0x03: /* 82557 C-step */
1148 case 0x04: /* 82558 A-step */
1149 case 0x05: /* 82558 B-step */
1150 case 0x06: /* 82559 A-step */
1151 case 0x07: /* 82559 B-step */
1152 case 0x08: /* 82559 C-step */
1153 case 0x09: /* 82559ER A-step */
1154 phyaddr = scanphy(ctlr);
1159 * Resolve the highest common ability of the two
1160 * link partners. In descending order:
1161 * 0x0100 100BASE-TX Full Duplex
1164 * 0x0040 10BASE-T Full Duplex
1167 anar = miir(ctlr, phyaddr, 0x04);
1168 anlpar = miir(ctlr, phyaddr, 0x05) & 0x03E0;
1176 switch((ctlr->eeprom[6]>>8) & 0x001F){
1178 case 0x04: /* DP83840 */
1179 case 0x0A: /* DP83840A */
1181 * The DP83840[A] requires some tweaking for
1182 * reliable operation.
1183 * The manual says bit 10 should be unconditionally
1184 * set although it supposedly only affects full-duplex
1185 * operation (an & 0x0140).
1187 x = miir(ctlr, phyaddr, 0x17) & ~0x0520;
1189 for(i = 0; i < ether->nopt; i++){
1190 if(cistrcmp(ether->opt[i], "congestioncontrol"))
1195 miiw(ctlr, phyaddr, 0x17, x);
1198 * If the link partner can't autonegotiate, determine
1199 * the speed from elsewhere.
1202 miir(ctlr, phyaddr, 0x01);
1203 bmsr = miir(ctlr, phyaddr, 0x01);
1204 x = miir(ctlr, phyaddr, 0x19);
1205 if((bmsr & 0x0004) && !(x & 0x0040))
1210 case 0x07: /* Intel 82555 */
1212 * Auto-negotiation may fail if the other end is
1213 * a DP83840A and the cable is short.
1215 miir(ctlr, phyaddr, 0x01);
1216 bmsr = miir(ctlr, phyaddr, 0x01);
1217 if((miir(ctlr, phyaddr, 0) & 0x1000) && (bmsr & 0x0020))
1219 miiw(ctlr, phyaddr, 0x1A, 0x2010);
1220 x = miir(ctlr, phyaddr, 0);
1221 miiw(ctlr, phyaddr, 0, 0x1200|x);
1222 for(i = 0; i < 3000; i++){
1224 if(miir(ctlr, phyaddr, 0x01) & 0x0020)
1227 miiw(ctlr, phyaddr, 0x1A, 0x2000);
1229 anar = miir(ctlr, phyaddr, 0x04);
1230 anlpar = miir(ctlr, phyaddr, 0x05) & 0x03E0;
1241 * Force speed and duplex if no auto-negotiation.
1245 for(i = 0; i < ether->nopt; i++){
1246 for(k = 0; k < nelem(mediatable); k++){
1247 if(cistrcmp(mediatable[k], ether->opt[i]))
1257 case 0x00: /* 10BASE-T */
1258 case 0x01: /* 10BASE-2 */
1259 case 0x02: /* 10BASE-5 */
1260 bmcr &= ~(0x2000|0x0100);
1261 ctlr->configdata[19] &= ~0x40;
1264 case 0x03: /* 100BASE-TX */
1265 case 0x06: /* 100BASE-T4 */
1266 case 0x07: /* 100BASE-FX */
1267 ctlr->configdata[19] &= ~0x40;
1271 case 0x04: /* 10BASE-TFD */
1272 bmcr = (bmcr & ~0x2000)|0x0100;
1273 ctlr->configdata[19] |= 0x40;
1276 case 0x05: /* 100BASE-TXFD */
1277 case 0x08: /* 100BASE-FXFD */
1278 bmcr |= 0x2000|0x0100;
1279 ctlr->configdata[19] |= 0x40;
1284 miiw(ctlr, phyaddr, 0x00, bmcr);
1290 ctlr->configdata[8] = 1;
1291 ctlr->configdata[15] &= ~0x80;
1294 ctlr->configdata[8] = 0;
1295 ctlr->configdata[15] |= 0x80;
1299 * Workaround for some broken HUB chips when connected at 10Mb/s
1301 * This is a band-aid, but as there's no dynamic auto-negotiation
1302 * code at the moment, only deactivate the workaround code in txstart
1303 * if the link is 100Mb/s.
1305 if(ether->mbps != 10)
1309 * Load the chip configuration and start it off.
1312 ether->oq = qopen(256*1024, Qmsg, 0, 0);
1313 configure(ether, 0);
1314 command(ctlr, CUstart, PADDR(&ctlr->cbr->status));
1317 * Check if the adapter's station address is to be overridden.
1318 * If not, read it from the EEPROM and set in ether->ea prior to loading
1319 * the station address with the Individual Address Setup command.
1321 memset(ea, 0, Eaddrlen);
1322 if(memcmp(ea, ether->ea, Eaddrlen) == 0){
1323 for(i = 0; i < Eaddrlen/2; i++){
1324 x = ctlr->eeprom[i];
1326 ether->ea[2*i+1] = x>>8;
1330 ilock(&ctlr->cblock);
1331 ctlr->action = CbIAS;
1333 iunlock(&ctlr->cblock);
1336 * Linkage to the generic ethernet driver.
1338 ether->attach = attach;
1339 ether->transmit = transmit;
1340 ether->interrupt = interrupt;
1341 ether->ifstat = ifstat;
1342 ether->shutdown = shutdown;
1344 ether->promiscuous = promiscuous;
1345 ether->multicast = multicast;
1352 ether82557link(void)
1354 addethercard("i82557", reset);