| plan 9 kernel history: overview | file list | diff list |
1994/0107/carrera/devether.c (diff list | history)
| 1993/1231/sys/src/9/carrera/devether.c:271,276 – 1994/0107/sys/src/9/carrera/devether.c:271,277 (short | long | prev | next) | ||
| 1993/0904 | */ WR(cr, Rst); | |
| 1993/0905 | WR(dcr, 0x2423); /* 5-19 Carrera manual */ | |
| 1994/0107 | WR(cr, 0); | |
| 1993/0903 | ||
| 1993/0904 | /* * Initialise the receive resource area (RRA) and | |
| 1993/1231/sys/src/9/carrera/devether.c:379,389 – 1994/0107/sys/src/9/carrera/devether.c:380,387 | ||
| 1993/0904 | WR(cdc, 1); | |
| 1993/0906 | /* | |
| 1993/1231/sys/src/9/carrera/devether.c:397,403 – 1994/0107/sys/src/9/carrera/devether.c:395,401 | ||
| 1993/0904 | * and interrupt-mask registers. * The SONIC is now initialised, but not enabled. */ | |
| 1994/0107 | WR(rcr, Brd); | |
| 1993/0904 | WR(tcr, 0); WR(imr, AllIntr); | |
| 1993/0903 | } | |
| 1993/1231/sys/src/9/carrera/devether.c:437,442 – 1994/0107/sys/src/9/carrera/devether.c:435,441 | ||
| 1993/0903 | etherintr(void) { | |
| 1993/0906 | Ether *c; | |
| 1994/0107 | ushort *s; | |
| 1993/0904 | ulong status; TXpkt *txpkt; RXpkt *rxpkt; | |
| 1993/1231/sys/src/9/carrera/devether.c:448,455 – 1994/0107/sys/src/9/carrera/devether.c:447,466 | ||
| 1993/0904 | if(status == 0) break; | |
| 1993/1219 |
| |
| 1993/0904 |
| |
| 1994/0107 | /* * Warnings that something is atoe. */ if(status & Hbl){ WR(isr, Hbl); status &= ~Hbl; print("sonic: cd heartbeat lost\n"); } if(status & Br){ WR(cr, Rst); print("sonic: bus retry occurred\n"); (*(void(*)(void))0xA001C020)(); status &= ~Br; } | |
| 1993/0904 | /* * Transmission complete, for good or bad. | |
| 1993/1231/sys/src/9/carrera/devether.c:470,475 – 1994/0107/sys/src/9/carrera/devether.c:481,487 | ||
| 1993/0906 | c->ti = NEXT(c->ti, Ntb); txpkt = &c->tda[c->ti]; | |
| 1993/0904 | } | |
| 1994/0107 | WR(isr, status & (Txdn|Txer)); | |
| 1993/0904 | status &= ~(Txdn|Txer); | |
| 1993/1212 | if(isoutbuf(c)) wakeup(&c->tr); | |
| 1993/1231/sys/src/9/carrera/devether.c:500,505 – 1994/0107/sys/src/9/carrera/devether.c:512,518 | ||
| 1993/0904 | else | |
| 1993/0906 | c->buffs++; | |
| 1993/0904 | ||
| 1994/0107 | rxpkt->status = 0; | |
| 1993/0904 | /* * Finished with this packet, it becomes the * last free packet in the ring, so give it Eol, | |
| 1993/1231/sys/src/9/carrera/devether.c:506,518 – 1994/0107/sys/src/9/carrera/devether.c:519,533 | ||
| 1993/0904 | * and take the Eol bit off the previous packet. * Move the ring index on. */ | |
| 1994/0107 | wus(&rxpkt->link, rxpkt->link|Eol); | |
| 1993/0904 | rxpkt->owner = Interface; | |
| 1993/0906 |
| |
| 1994/0107 | s = &c->rda[PREV(c->rh, Nrb)].link; wus(s, *s & ~Eol); | |
| 1993/0906 | c->rh = NEXT(c->rh, Nrb); | |
| 1993/0904 | ||
| 1993/0906 | rxpkt = &c->rda[c->rh]; | |
| 1993/0903 | } | |
| 1994/0107 | WR(isr, status & (Pktrx|Rde)); | |
| 1993/0904 | status &= ~(Pktrx|Rde); | |
| 1993/0903 | ||
| 1993/0904 | noinput: | |
| 1993/1231/sys/src/9/carrera/devether.c:520,542 – 1994/0107/sys/src/9/carrera/devether.c:535,549 | ||
| 1993/0904 | * We get a 'load CAM done' interrupt * after initialisation. Ignore it. | |
| 1993/0903 | */ | |
| 1993/0904 |
| |
| 1994/0107 | if(status & Lcd) { WR(isr, Lcd); | |
| 1993/0904 | status &= ~Lcd; | |
| 1993/1212 |
| |
| 1993/0904 |
| |
| 1993/0906 |
| |
| 1993/0904 |
| |
| 1993/0903 | } | |
| 1993/0904 |
| |
| 1993/1218 |
| |
| 1993/0904 |
| |
| 1994/0107 | if(status & AllIntr) { WR(isr, status); | |
| 1993/0906 | print("sonic #%lux\n", status); | |
| 1994/0107 | } | |
| 1993/0903 | } } | |
| 1993/1231/sys/src/9/carrera/devether.c:716,721 – 1994/0107/sys/src/9/carrera/devether.c:723,729 | ||
| 1993/0903 | etherwrite(Chan *c, void *buf, long n, ulong offset) { | |
| 1993/0906 | Pbuf *p; | |
| 1994/0107 | ushort *s; | |
| 1993/0904 | TXpkt *txpkt; Ether *ctlr = ether[0]; | |
| 1993/0903 | ||
| 1993/1231/sys/src/9/carrera/devether.c:733,738 – 1994/0107/sys/src/9/carrera/devether.c:741,747 | ||
| 1993/1202 | return n; | |
| 1993/0904 | qlock(&ctlr->tlock); | |
| 1994/0107 | ctlr->outpackets++; | |
| 1993/0918 | if(waserror()) { qunlock(&ctlr->tlock); nexterror(); | |
| 1993/1231/sys/src/9/carrera/devether.c:755,763 – 1994/0107/sys/src/9/carrera/devether.c:764,773 | ||
| 1993/0904 | txpkt = &ctlr->tda[ctlr->th]; txpkt->size = n; txpkt->fsize = n; | |
| 1994/0107 | wus(&txpkt->link, txpkt->link|Eol); | |
| 1993/0904 | txpkt->status = Interface; | |
| 1994/0107 | s = &ctlr->tda[PREV(ctlr->th, Ntb)].link; wus(s, *s & ~Eol); | |
| 1993/0904 | ctlr->th = NEXT(ctlr->th, Ntb); WR(cr, Txp); | |