From dfb91144781f2f3acc2b73ec1b888878a807cdf4 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 5 May 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-05-05 --- pc/devether.c | 29 ++++++++++++++++++++++------- port/devmnt.c | 9 +-------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/pc/devether.c b/pc/devether.c index 582f538894ef8d6e0a137a41eb6690fff8769d89..6e45bb423fb2097fe39816e7d1e5a035af523ac0 100644 --- a/pc/devether.c +++ b/pc/devether.c @@ -83,12 +83,11 @@ struct Ctlr { uchar ba[6]; /* broadcast address */ Rendez rr; /* rendezvous for a receive buffer */ - QLock rlock; /* semaphore on rc */ ushort rh; /* first receive buffer belonging to host */ ushort ri; /* first receive buffer belonging to interface */ Rendez tr; /* rendezvous for a transmit buffer */ - QLock tlock; /* semaphore on tc */ + QLock tlock; /* semaphore on th */ ushort th; /* first transmit buffer belonging to host */ ushort ti; /* first transmit buffer belonging to interface */ @@ -333,6 +332,7 @@ etherstclose(Queue *q) tp->prom = 0; tp->inuse = 0; netdisown(&tp->ctlr->net, tp - tp->ctlr->type); + tp->ctlr = 0; qunlock(tp); } @@ -456,7 +456,7 @@ etherkproc(void *arg) } cp->kproc = 1; for(;;){ - qlock(&cp->rlock); + sleep(&cp->rr, isinput, cp); /* * process any internal loopback packets @@ -477,9 +477,6 @@ etherkproc(void *arg) rb->owner = Interface; cp->rh = NEXT(cp->rh, cp->nrb); } - - qunlock(&cp->rlock); - sleep(&cp->rr, isinput, cp); } } @@ -629,6 +626,18 @@ wd8013reset(Ctlr *cp) setvec(Ethervec, hw->intr); } +static void +dp8390rinit(Ctlr *cp) +{ + Hw *hw = cp->hw; + + OUT(hw, w.cr, 0x21); /* Page0|RD2|STP */ + OUT(hw, w.bnry, hw->pstart); + OUT(hw, w.cr, 0x61); /* Page1|RD2|STP */ + OUT(hw, curr, hw->pstart+1); + OUT(hw, w.cr, 0x22); /* Page0|RD2|STA */ +} + /* * we leave the chip idling on internal loopback * and pointing to Page0. @@ -705,7 +714,13 @@ wd8013receive(Ctlr *cp) break; cp->inpackets++; p = &((Ring*)hw->ram)[next]; - len = (p->len1<<8)|p->len0-4; + len = ((p->len1<<8)|p->len0)-4; + if(p->next < hw->pstart || p->next >= hw->pstop || len < 60){ + print("%d: #%2.2ux #%2.2ux #%2.2ux #%2.2ux\n", next, + p->status, p->next, p->len0, p->len1); + dp8390rinit(cp); + return; + } rb = &cp->rb[cp->ri]; if(rb->owner == Interface){ diff --git a/port/devmnt.c b/port/devmnt.c index e2074f14999daec584e2549cca83ff0c9925e643..2015d8abaaae40d080f7d14a1f6e1df0d99a71ce 100644 --- a/port/devmnt.c +++ b/port/devmnt.c @@ -568,7 +568,6 @@ mountio(Mnt *m, Mntrpc *r) unlock(m); /* Transmit a file system rpc */ -memset(r->rpc, 0x55, 2048); n = convS2M(&r->request, r->rpc); if(waserror()) { if(!m->mux) @@ -625,7 +624,7 @@ void mntrpcread(Mnt *m, Mntrpc *r) { int n; -int i; + for(;;) { if(waserror()) { if(!m->mux) @@ -649,12 +648,6 @@ int i; poperror(); if(n == 0) continue; -if(n > 2048) -for(i = 0; i < 256;) { -print("%.2ux ", r->rpc[i] & 0xff); -i++; -if((i%16) == 0) { print("\n"); prflush(); } -} if(convM2S(r->rpc, &r->reply, n) != 0) return;