From b204deb3b3899cd044956f6e351fd2175ee7b518 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 29 May 1999 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1999-05-29 --- ip/il.c | 2 +- ip/tcp.c | 29 ++++++++++++++++++++--------- pc/devlml.c | 22 ++++++++++++---------- pc/devlml.h | 10 +++++++--- pc/fns.h | 1 + pc/trap.c | 41 ++++++++++++++++++++++++++++++++++++++++- 6 files changed, 81 insertions(+), 24 deletions(-) diff --git a/ip/il.c b/ip/il.c index 3a390ea6d669027dfeebd27108d2cc26107cc90f..2946aedd2d8bc655b054e12833570f45738c89b5 100644 --- a/ip/il.c +++ b/ip/il.c @@ -56,7 +56,7 @@ enum Seconds = 1000, Iltickms = 50, /* time base */ AckDelay = 2*Iltickms, /* max time twixt message rcvd & ack sent */ - MaxTimeout = 4*Seconds, /* max time between rexmit */ + MaxTimeout = 30*Seconds, /* max time between rexmit */ QueryTime = 10*Seconds, /* time between subsequent queries */ DeathTime = 5*QueryTime, diff --git a/ip/tcp.c b/ip/tcp.c index 28b88b932fa5f521246e2a60b598b827bdf46a6f..a47801a79d287fc949a830af11740fabdf2103b0 100644 --- a/ip/tcp.c +++ b/ip/tcp.c @@ -31,14 +31,14 @@ enum EOLOPT = 0, NOOPOPT = 1, - MAXBACKOFF = 20, + MAXBACKMS = 30000, /* longest backoff time (ms) before hangup */ MSSOPT = 2, MSS_LENGTH = 4, /* Mean segment size */ MSL2 = 10, MSPTICK = 50, /* Milliseconds per timer tick */ DEF_MSS = 1460, /* Default mean segment */ DEF_RTT = 1000, /* Default round trip */ - DEF_KAT = 10000, /* Default keep alive trip in ms */ + DEF_KAT = 10000, /* Default time ms) between keep alives */ TCP_LISTEN = 0, /* Listen connection */ TCP_CONNECT = 1, /* Outgoing connection */ @@ -249,6 +249,7 @@ void tcpsndsyn(Tcpctl*); void tcprcvwin(Conv*); void tcpacktimer(void*); void tcpkeepalive(void*); +void tcpsetkacounter(Tcpctl*); void tcprxmit(Conv*, int); void @@ -1285,7 +1286,9 @@ tcpiput(Proto *tcp, uchar*, Block *bp) qunlock(tcp); if(tcb->kacounter > 0) - tcb->kacounter = MAXBACKOFF; + tcb->kacounter = MAXBACKMS / (tcb->katimer.start*MSPTICK); + if(tcb->kacounter < 3) + tcb->kacounter = 3; switch(tcb->state) { case Closed: @@ -1411,7 +1414,7 @@ tcpiput(Proto *tcp, uchar*, Block *bp) if(tcb->sndcnt == 0){ tcphalt(tpriv, &tcb->rtt_timer); tcphalt(tpriv, &tcb->acktimer); - tcb->kacounter = MAXBACKOFF; + tcpsetkacounter(tcb); tcpsetstate(s, Finwait2); tcb->katimer.start = MSL2 * (1000 / MSPTICK); tcpgo(tpriv, &tcb->katimer); @@ -1816,6 +1819,13 @@ tcpsendka(Conv *s) * otherwise, send a keepalive and restart the timer */ void +tcpsetkacounter(Tcpctl *tcb) +{ + tcb->kacounter = MAXBACKMS / (tcb->katimer.start*MSPTICK);; + if(tcb->kacounter < 3) + tcb->kacounter = 3; +} +void tcpkeepalive(void *v) { Tcpctl *tcb; @@ -1848,7 +1858,7 @@ tcpstartka(Conv *s, char **f, int n) if(x >= MSPTICK) tcb->katimer.start = x/MSPTICK; } - tcb->kacounter = MAXBACKOFF; + tcpsetkacounter(tcb); tcpgo(s->p->priv, &tcb->katimer); return nil; @@ -1892,7 +1902,7 @@ tcptimeout(void *arg) { Conv *s; Tcpctl *tcb; - int maxback; + int back, maxback; Tcppriv *tpriv; s = (Conv*)arg; @@ -1904,10 +1914,11 @@ tcptimeout(void *arg) default: tcb->backoff++; if(tcb->state == Syn_sent) - maxback = (3*MAXBACKOFF)/4; + maxback = MAXBACKMS/2; else - maxback = MAXBACKOFF; - if(tcb->backoff >= maxback) { + maxback = MAXBACKMS; + back = backoff(tcb->backoff) * (tcb->mdev + (tcb->srtt>>LOGAGAIN)); + if(back >= maxback) { localclose(s, Etimedout); break; } diff --git a/pc/devlml.c b/pc/devlml.c index 45c16c0442c3aa8b8f04b9189b48f0a89141d842..8b983595c78ed4e5b7bdf05a909c3db8f4bd09b7 100644 --- a/pc/devlml.c +++ b/pc/devlml.c @@ -267,7 +267,7 @@ lmlreset(void) Physseg seggrab; ulong regpa; ulong cdsize; - ulong *grabpa; + void *grabbuf; ulong grablen; int i; @@ -275,28 +275,30 @@ lmlreset(void) if (pcidev == nil) { return; } - cdsize = (sizeof(CodeData) + BY2PG - 1) & ~(BY2PG - 1); + cdsize = CODEDATASIZE; codeData = (CodeData*)xspanalloc(cdsize, BY2PG, 0); if (codeData == nil) { print("devlml: xspanalloc(%lux, %ux, 0)\n", cdsize, BY2PG); return; } - grablen = (720 * 480 * 2 * 2 + BY2PG - 1) & ~(BY2PG - 1); - grabpa = (ulong *)xspanalloc(grablen, BY2PG, 0); - if (grabpa == nil) { + grablen = GRABDATASIZE; + grabbuf = xspanalloc(grablen, BY2PG, 0); + if (grabbuf == nil) { print("devlml: xspanalloc(%lux, %ux, 0)\n", grablen, BY2PG); return; } - *grabpa = PADDR(grabpa); + + memset(grabbuf, 0x33, grablen); print("Installing Motion JPEG driver %s\n", MJPG_VERSION); print("MJPG buffer at 0x%.8lux, size 0x%.8lux\n", codeData, cdsize); - print("Grab buffer at 0x%.8lux, size 0x%.8lux\n", grabpa, grablen); + print("Grab buffer at 0x%.8lux, size 0x%.8lux\n", grabbuf, grablen); // Get access to DMA memory buffer memset(codeData, 0xAA, sizeof(CodeData)); - codeData->physaddr = PADDR(codeData->statCom); + codeData->pamjpg = PADDR(codeData->statCom); + codeData->pagrab = PADDR(grabbuf); for (i = 0; i < NBUF; i++) { codeData->statCom[i] = PADDR(&(codeData->fragdesc[i])); codeData->fragdesc[i].addr = PADDR(&(codeData->frag[i])); @@ -347,13 +349,13 @@ lmlreset(void) seggrab.attr = SG_PHYSICAL; seggrab.name = smalloc(NAMELEN); snprint(seggrab.name, NAMELEN, "lmlgrab"); - seggrab.pa = (ulong)PADDR(grabpa); + seggrab.pa = PADDR(grabbuf); seggrab.size = grablen; if (addphysseg(&seggrab) == -1) { print("lml: physsegment: lmlgrab\n"); return; } - return; + return; } static Chan* diff --git a/pc/devlml.h b/pc/devlml.h index d796c46ea1d37b45d260769f7ba13ebd5fad23fd..a1ef7a18e877deab42c9cdf3a19b972b2b5e8df8 100644 --- a/pc/devlml.h +++ b/pc/devlml.h @@ -91,7 +91,7 @@ struct FrameHeader { // Don't modify this struct, used by h/w ulong frameSeqNo; }; -#define FRAGSIZE ((MB-0x100)/NBUF) +#define FRAGSIZE (128*1024) union Fragment { FrameHeader fh; @@ -104,12 +104,16 @@ struct FragmentTable { // Don't modify this struct, used by h/w }; struct CodeData { // Don't modify this struct, used by h/w - ulong physaddr; // Physical addr of statCom[0] - ulong statCom[4]; // Physical address + ulong pamjpg; // Physical addr of statCom[0] + ulong pagrab; // Physical addr of grab buffer + ulong statCom[4]; // Physical addresses of fragdescs FragmentTable fragdesc[4]; Fragment frag[4]; }; +#define CODEDATASIZE ((sizeof(CodeData) + BY2PG - 1) & ~(BY2PG - 1)) +#define GRABDATASIZE ((720 * 480 * 2 * 2 + BY2PG - 1) & ~(BY2PG - 1)) + #define POST_OFFICE 0x200 #define POST_PEND 0x02000000 #define POST_TIME 0x01000000 diff --git a/pc/fns.h b/pc/fns.h index e09aa4bd2cb9312e7468a209ad58b0cb235ade81..2aa9baa6ae59b814f065aae075464127a2307147 100644 --- a/pc/fns.h +++ b/pc/fns.h @@ -95,6 +95,7 @@ void procsetup(Proc*); void putcr3(ulong); void putcr4(ulong); void rdmsr(int, vlong*); +long readintrts(void*, int); void screeninit(void); int screenprint(char*, ...); /* debugging */ void (*screenputs)(char*, int); diff --git a/pc/trap.c b/pc/trap.c index 0377fa2293e0008f39b5292729311c8e45e85b71..5142b7fb08345ed0779c1fc76d36e8c1a5a57eaa 100644 --- a/pc/trap.c +++ b/pc/trap.c @@ -15,7 +15,16 @@ static void fault386(Ureg*, void*); static Lock vctllock; static Vctl *vctl[256]; -uvlong intrts; +/* interrupt timestamps, l.s knows fills intrts each interupt */ + uvlong intrts; +static struct { + Lock; + int vno; /* vector to save timestamps for */ + int n; /* number of valid timestamps in ts[] */ + uvlong ts[128]; /* time stamps */ +} tsalloc; + +static void savets(void); void intrenable(int irq, void (*f)(Ureg*, void*), void* a, int tbdf) @@ -32,6 +41,8 @@ intrenable(int irq, void (*f)(Ureg*, void*), void* a, int tbdf) ilock(&vctllock); vno = arch->intrenable(v); + if(irq == IrqUART0) + tsalloc.vno = vno; if(vno == -1){ iunlock(&vctllock); print("intrenable: couldn't enable irq %d, tbdf 0x%uX\n", @@ -181,6 +192,8 @@ trap(Ureg* ureg) } vno = ureg->trap; + if(vno == tsalloc.vno) + savets(); if(ctl = vctl[vno]){ if(ctl->isintr){ m->intr++; @@ -739,3 +752,29 @@ dbgpc(Proc *p) return ureg->pc; } + +/* called with interrupts off */ +static void +savets(void) +{ + lock(&tsalloc); + if(tsalloc.n < nelem(tsalloc.ts)) + tsalloc.ts[tsalloc.n++] = intrts; + unlock(&tsalloc); +} + +/* read interrupt timestamps */ +long +readintrts(void *buf, int n) +{ + n /= sizeof(uvlong); + if(n <= 0) + return 0; + ilock(&tsalloc); + if(n > tsalloc.n) + n = tsalloc.n; + memmove(buf, tsalloc.ts, n*sizeof(uvlong)); + tsalloc.n = 0; + iunlock(&tsalloc); + return n*sizeof(uvlong); +}