| plan 9 kernel history: overview | file list | diff list |
1990/1231/port/devlance.c (diff list | history)
| 1990/1229/sys/src/9/port/devlance.c:6,25 – 1990/1231/sys/src/9/port/devlance.c:6,20 (short | long | prev | next) | ||
| 1990/0227 | #include "io.h" #include "errno.h" #include "devtab.h" | |
| 1990/1231 | ||
| 1990/0227 | enum { Ntypes= 8, /* max number of ethernet packet types */ | |
| 1990/0911 | Ndir= Ntypes+2, /* entries in top level directory */ | |
| 1990/0227 |
| |
| 1990/0409 | Ndpkt= 200, /* number of debug packets */ | |
| 1990/1231 | Maxrb= 128, /* max buffers in a ring */ | |
| 1990/0227 | }; | |
| 1990/1231 | #define RSUCC(x) (((x)+1)%l.nrrb) #define TSUCC(x) (((x)+1)%l.ntrb) | |
| 1990/0227 | ||
| 1990/0707 | #define NOW (MACHP(0)->ticks*MS2HZ) | |
| 1990/03042 | ||
| 1990/1229/sys/src/9/port/devlance.c:40,46 – 1990/1231/sys/src/9/port/devlance.c:35,41 | ||
| 1990/0227 | /* * lance memory map */ | |
| 1990/0911 |
| |
| 1990/1231 | struct Lancemem | |
| 1990/0227 | { /* * initialization block | |
| 1990/1229/sys/src/9/port/devlance.c:57,65 – 1990/1231/sys/src/9/port/devlance.c:52,60 | ||
| 1990/0911 | * ring buffers * first receive, then transmit | |
| 1990/0227 | */ | |
| 1990/1231 | Msg rmr[Maxrb]; /* recieve message ring */ Msg tmr[Maxrb]; /* transmit message ring */ }; | |
| 1990/0227 | /* * Some macros for dealing with lance memory addresses. The lance splits | |
| 1990/1229/sys/src/9/port/devlance.c:116,130 – 1990/1231/sys/src/9/port/devlance.c:111,120 | ||
| 1990/0227 | typedef struct { QLock; | |
| 1990/1231 | Lance; /* host dependent lance params */ | |
| 1990/0227 | int inited; | |
| 1990/0911 |
| |
| 1990/0227 | Rendez rr; /* rendezvous for an input buffer */ ushort rl; /* first rcv Message belonging to Lance */ | |
| 1990/1229/sys/src/9/port/devlance.c:140,150 – 1990/1231/sys/src/9/port/devlance.c:130,135 | ||
| 1990/0227 | int kstarted; Debqueue dq; | |
| 1990/0911 | ||
| 1990/1229 |
| |
| 1990/0911 |
| |
| 1990/1229/sys/src/9/port/devlance.c:154,161 – 1990/1231/sys/src/9/port/devlance.c:139,146 | ||
| 1990/0911 | int frames; /* framing errors */ int overflows; /* packet overflows */ int buffs; /* buffering errors */ | |
| 1990/0227 |
| |
| 1990/1231 | } SoftLance; static SoftLance l; | |
| 1990/0227 | /* * mode bits in the lance initialization block | |
| 1990/1229/sys/src/9/port/devlance.c:431,438 – 1990/1231/sys/src/9/port/devlance.c:416,425 | ||
| 1990/1229 | ushort *lanceaddr; ushort *hostaddr; | |
| 1990/0227 | ||
| 1990/1229 |
| |
| 1990/1231 | if(already == 0){ already = 1; lancesetup(&l); } | |
| 1990/1229 | ||
| 1990/0227 | /* | |
| 1990/1228 | * stop the lance | |
| 1990/1229/sys/src/9/port/devlance.c:439,475 – 1990/1231/sys/src/9/port/devlance.c:426,431 | ||
| 1990/0227 | */ | |
| 1990/1228 | *l.rap = 0; *l.rdp = STOP; | |
| 1990/0227 | ||
| 1990/0911 |
| |
| 1990/0912 | ||
| 1990/1229 |
| |
| 1990/0911 |
| |
| 1990/0227 | } /* | |
| 1990/1229/sys/src/9/port/devlance.c:512,518 – 1990/1231/sys/src/9/port/devlance.c:468,474 | ||
| 1990/0227 | * set up rcv message ring */ | |
| 1990/0911 | m = lm->rmr; | |
| 1990/1231 | for(i = 0; i < l.nrrb; i++, m++){ | |
| 1990/1228 | MPs(m->size) = -sizeof(Etherpkt); | |
| 1990/0911 | MPus(m->cntflags) = 0; | |
| 1990/1229 | MPus(m->laddr) = LADDR(&l.lrp[i]); | |
| 1990/1229/sys/src/9/port/devlance.c:519,531 – 1990/1231/sys/src/9/port/devlance.c:475,487 | ||
| 1990/1229 | MPus(m->flags) = HADDR(&l.lrp[i]); | |
| 1990/0227 | } | |
| 1990/0911 | MPus(lm->rdralow) = LADDR(l.lm->rmr); | |
| 1990/1231 | MPus(lm->rdrahigh) = (l.lognrrb<<13)|HADDR(l.lm->rmr); | |
| 1990/0227 | ||
| 1990/0911 | ||
| 1990/0227 | /* * give the lance all the rcv buffers except one (as a sentinel) */ | |
| 1990/1231 | l.rc = l.nrrb - 1; | |
| 1990/0911 | m = lm->rmr; for(i = 0; i < l.rc; i++, m++) MPus(m->flags) |= OWN; | |
| 1990/1229/sys/src/9/port/devlance.c:534,540 – 1990/1231/sys/src/9/port/devlance.c:490,496 | ||
| 1990/0227 | * set up xmit message ring */ | |
| 1990/0911 | m = lm->tmr; | |
| 1990/1231 | for(i = 0; i < l.ntrb; i++, m++){ | |
| 1990/0911 | MPs(m->size) = 0; MPus(m->cntflags) = 0; | |
| 1990/1229 | MPus(m->laddr) = LADDR(&l.ltp[i]); | |
| 1990/1229/sys/src/9/port/devlance.c:541,547 – 1990/1231/sys/src/9/port/devlance.c:497,503 | ||
| 1990/1229 | MPus(m->flags) = HADDR(&l.ltp[i]); | |
| 1990/0227 | } | |
| 1990/0911 | MPus(lm->tdralow) = LADDR(l.lm->tmr); | |
| 1990/1231 | MPus(lm->tdrahigh) = (l.logntrb<<13)|HADDR(l.lm->tmr); | |
| 1990/0227 | /* * point lance to the initialization block | |
| 1990/1229/sys/src/9/port/devlance.c:563,570 – 1990/1231/sys/src/9/port/devlance.c:519,528 | ||
| 1990/0227 | * initialize lance, turn on interrupts, turn on transmit and rcv. */ | |
| 1990/1229 | wbflush(); | |
| 1990/1231 | print("starting lance\n"); | |
| 1990/0227 | *l.rap = 0; *l.rdp = INEA|INIT|STRT; /**/ | |
| 1990/1231 | print("lance started\n"); | |
| 1990/0227 | } /* | |
| 1990/1229/sys/src/9/port/devlance.c:781,788 – 1990/1231/sys/src/9/port/devlance.c:739,748 | ||
| 1990/0227 | if(csr & (BABL|MISS|MERR)) print("lance err %ux\n", csr); | |
| 1990/1231 | if(csr & IDON){ print("lance inited\n"); | |
| 1990/0227 | l.inited = 1; | |
| 1990/1231 | } | |
| 1990/0227 | /* * look for rcv'd packets, just wakeup the input process | |