| plan 9 kernel history: overview | file list | diff list |
1990/1229/port/devlance.c (diff list | history)
| 1990/1228/sys/src/9/port/devlance.c:23,28 – 1990/1229/sys/src/9/port/devlance.c:23,30 (short | long | prev | next) | ||
|
Created.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/0227 | ||
| 1990/0707 | #define NOW (MACHP(0)->ticks*MS2HZ) | |
| 1990/03042 | ||
| 1990/1229 | int plance; | |
| 1990/0227 | /* * Communication with the lance is via a transmit and receive ring of * message descriptors. The Initblock contains pointers to and sizes of | |
| 1990/1228/sys/src/9/port/devlance.c:57,68 – 1990/1229/sys/src/9/port/devlance.c:59,64 | ||
| 1990/0227 | */ Msg rmr[Nrrb]; /* recieve message ring */ Msg tmr[Ntrb]; /* transmit message ring */ | |
| 1990/1228 |
| |
| 1990/0227 |
| |
| 1990/1228 |
| |
| 1990/0227 | } Lancemem; /* | |
| 1990/1228/sys/src/9/port/devlance.c:128,134 – 1990/1229/sys/src/9/port/devlance.c:124,129 | ||
| 1990/0911 | int sep; /* separaqtion between shorts in lance ram as seen by host */ ushort *lanceram; /* start of lance ram as seen by host */ | |
| 1990/0227 | Rendez rr; /* rendezvous for an input buffer */ | |
| 1990/1228/sys/src/9/port/devlance.c:145,154 – 1990/1229/sys/src/9/port/devlance.c:140,149 | ||
| 1990/0227 | int kstarted; Debqueue dq; | |
| 1990/0911 | ||
| 1990/1228 |
| |
| 1990/0911 |
| |
| 1990/1229 | Etherpkt *rp; /* receive buffers (host address) */ Etherpkt *tp; /* transmit buffers (host address) */ Etherpkt *lrp; /* receive buffers (lance address) */ Etherpkt *ltp; /* transmit buffers (lance address) */ | |
| 1990/0911 | /* sadistics */ | |
| 1990/1228/sys/src/9/port/devlance.c:266,272 – 1990/1229/sys/src/9/port/devlance.c:261,267 | ||
| 1990/03042 | memcpy(&(t->p), p, sizeof(Dpkt)); | |
| 1990/0227 | l.dq.next = (l.dq.next+1) % Ndpkt; unlock(&l.dq); | |
| 1990/0427 |
| |
| 1990/1229 | if(plance){ | |
| 1990/0427 | char buf[1024]; if(p->d[0] != 0xff){ sprintpacket(buf, t); | |
| 1990/1228/sys/src/9/port/devlance.c:405,414 – 1990/1229/sys/src/9/port/devlance.c:400,410 | ||
| 1990/0227 | m = &(LANCEMEM->tmr[l.tc]); | |
| 1990/0911 | MPs(m->size) = -len; MPus(m->cntflags) = 0; | |
| 1990/1229 | MPus(m->laddr) = LADDR(&l.ltp[l.tc]); MPus(m->flags) = OWN|STP|ENP|HADDR(&l.ltp[l.tc]); | |
| 1990/0227 | l.tc = TSUCC(l.tc); *l.rdp = INEA|TDMD; /**/ | |
| 1990/1229 | wbflush(); | |
| 1990/0227 | qunlock(&l.tlock); } | |
| 1990/1228/sys/src/9/port/devlance.c:423,447 – 1990/1229/sys/src/9/port/devlance.c:419,427 | ||
| 1990/03042 | Dirtab lancedir[Ndir]; | |
| 1990/0227 | /* | |
| 1990/1228 |
| |
| 1990/1229 | * stop the lance and allocate buffers | |
| 1990/1228 | */ void | |
| 1990/0227 |
| |
| 1990/1228/sys/src/9/port/devlance.c:448,454 – 1990/1229/sys/src/9/port/devlance.c:428,439 | ||
| 1990/0911 | ulong x; int index; static int already; | |
| 1990/1229 | ushort *lanceaddr; ushort *hostaddr; | |
| 1990/0227 | ||
| 1990/1229 | l.rap = LANCERAP; l.rdp = LANCERDP; | |
| 1990/0227 | /* | |
| 1990/1228 | * stop the lance | |
| 1990/0227 | */ | |
| 1990/1228/sys/src/9/port/devlance.c:457,494 – 1990/1229/sys/src/9/port/devlance.c:442,473 | ||
| 1990/0227 | ||
| 1990/0911 | if(already == 0){ already = 1; | |
| 1990/0912 | ||
| 1990/1228 |
| |
| 1990/0911 |
| |
| 1990/1228 |
| |
| 1990/0911 |
| |
| 1990/1229 | /* * lance ethernet address */ lanceeaddr(l.ea); /* * lance init block and descriptor rings */ lancectlmem(&hostaddr, &lanceaddr, &l.sep, sizeof(Lancemem)); l.lanceram = hostaddr; l.lm = (Lancemem*)lanceaddr; /* * lance receive buffers */ lancepktmem(&hostaddr, &lanceaddr, Nrrb*sizeof(Etherpkt)); l.rp = (Etherpkt*)hostaddr; l.lrp = (Etherpkt*)lanceaddr; /* * lance xmt buffers */ lancepktmem(&hostaddr, &lanceaddr, Ntrb*sizeof(Etherpkt)); l.tp = (Etherpkt*)hostaddr; l.ltp = (Etherpkt*)lanceaddr; | |
| 1990/0911 | } | |
| 1990/0227 | } | |
| 1990/1228/sys/src/9/port/devlance.c:536,543 – 1990/1229/sys/src/9/port/devlance.c:515,522 | ||
| 1990/0911 | for(i = 0; i < 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]); MPus(m->flags) = HADDR(&l.lrp[i]); | |
| 1990/0227 | } | |
| 1990/0911 | MPus(lm->rdralow) = LADDR(l.lm->rmr); MPus(lm->rdrahigh) = (LogNrrb<<13)|HADDR(l.lm->rmr); | |
| 1990/1228/sys/src/9/port/devlance.c:558,565 – 1990/1229/sys/src/9/port/devlance.c:537,544 | ||
| 1990/0911 | for(i = 0; i < Ntrb; i++, m++){ MPs(m->size) = 0; MPus(m->cntflags) = 0; | |
| 1990/1229 | MPus(m->laddr) = LADDR(&l.ltp[i]); MPus(m->flags) = HADDR(&l.ltp[i]); | |
| 1990/0227 | } | |
| 1990/0911 | MPus(lm->tdralow) = LADDR(l.lm->tmr); MPus(lm->tdrahigh) = (LogNtrb<<13)|HADDR(l.lm->tmr); | |
| 1990/1228/sys/src/9/port/devlance.c:583,588 – 1990/1229/sys/src/9/port/devlance.c:562,568 | ||
| 1990/0227 | /* * initialize lance, turn on interrupts, turn on transmit and rcv. */ | |
| 1990/1229 | wbflush(); | |
| 1990/0227 | *l.rap = 0; *l.rdp = INEA|INIT|STRT; /**/ } | |
| 1990/1228/sys/src/9/port/devlance.c:807,814 – 1990/1229/sys/src/9/port/devlance.c:787,795 | ||
| 1990/0227 | /* * look for rcv'd packets, just wakeup the input process */ | |
| 1990/0911 |
| |
| 1990/1229 | if(l.rl!=l.rc && (MPus(lm->rmr[l.rl].flags) & OWN)==0){ | |
| 1990/0227 | wakeup(&l.rr); | |
| 1990/1229 | } | |
| 1990/0227 | /* * look for xmitt'd packets, wake any process waiting for a | |
| 1990/1228/sys/src/9/port/devlance.c:907,924 – 1990/1229/sys/src/9/port/devlance.c:888,903 | ||
| 1990/0227 | m = &(lm->rmr[l.rc]); | |
| 1990/1228 | MPs(m->size) = -sizeof(Etherpkt); | |
| 1990/0911 | MPus(m->cntflags) = 0; | |
| 1990/1229 | MPus(m->laddr) = LADDR(&l.lrp[l.rc]); MPus(m->flags) = OWN|HADDR(&l.lrp[l.rc]); | |
| 1990/0227 | l.rc = RSUCC(l.rc); | |
| 1990/1229 | wbflush(); | |
| 1990/0227 | } sleep(&l.rr, isinput, 0); } } | |
| 1990/1229 | lancetoggle() | |
| 1990/0227 | { | |
| 1990/1229 | plance ^= 1; | |
| 1990/0826 | } | |