From 89027c1e9fa38152287eea6e7b7619f04a0b8fa9 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 12 Oct 2001 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2001-10-12 --- pc/devlml.c | 8 +++- pc/devusb.c | 115 ++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 86 insertions(+), 37 deletions(-) diff --git a/pc/devlml.c b/pc/devlml.c index e1731543ca382e887e2bb5a697c910feb2a95204..728a8aebe3157e70d85d9c188ab79b2f6f6df716 100644 --- a/pc/devlml.c +++ b/pc/devlml.c @@ -12,8 +12,8 @@ static void * pciPhysBaseAddr; static ulong pciBaseAddr; static Pcidev * pcidev; -#define DBGREAD 0x01 -#define DBGWRIT 0x02 +#define DBGREAD 0x01 +#define DBGWRIT 0x02 #define DBGINTR 0x04 #define DBGINTS 0x08 @@ -141,6 +141,10 @@ lmlreset(void) void *grabbuf; ulong grablen; + if(isaconfig("lml", 0, &isa) == 0) { + if (debug) print("lml not in plan9.ini\n"); + return; + } pcidev = pcimatch(nil, PCI_VENDOR_ZORAN, PCI_DEVICE_ZORAN_36067); if (pcidev == nil) { return; diff --git a/pc/devusb.c b/pc/devusb.c index aea9aec2ba1f49e88777dbb4bc68b42081ece097..a89e18722e34822d8eaf519ee7f32bf364ea515d 100644 --- a/pc/devusb.c +++ b/pc/devusb.c @@ -232,6 +232,7 @@ struct Endpt { ulong poffset; /* offset of next packet to be queued */ ulong toffset; /* offset associated with time */ vlong time; /* timeassociated with offset */ + int buffered; /* bytes captured but unread, or written but unsent */ /* end ISO stuff */ QH * epq; /* queue of TDs for this endpoint */ QLock rlock; @@ -832,6 +833,7 @@ schedendpt(Endpt *e) e->foffset = 0; e->toffset = 0; e->poffset = 0; + e->buffered = 0; td = e->td0; for(i = e->sched; i < NFRAME; i += e->pollms){ bp = e->bp0 + e->maxpkt*i/e->pollms; @@ -1086,15 +1088,24 @@ cleaniso(Endpt *e, int frnum) do { if (td->status & AnyError) iprint("usbisoerror 0x%lux\n", td->status); - e->nbytes += (td->status + 1) & 0x3ff; + n = (td->status + 1) & 0x3ff; + e->nbytes += n; if ((td->flags & IsoClean) == 0) e->nblocks++; if (e->mode == OREAD){ + e->buffered += n; e->poffset += (td->status + 1) & 0x3ff; td->offset = e->poffset; td->dev = ((e->maxpkt -1)<<21) | ((id&0x7FF)<<8) | TokIN; e->toffset = td->offset; }else{ + if ((td->flags & IsoClean) == 0){ + e->buffered -= n; + if (e->buffered < 0){ + iprint("e->buffered %d?\n", e->buffered); + e->buffered = 0; + } + } e->toffset = td->offset; n = (e->hz + e->remain)*e->pollms/1000; e->remain = (e->hz + e->remain)*e->pollms%1000; @@ -1111,23 +1122,30 @@ cleaniso(Endpt *e, int frnum) } while ((td->status & Active) == 0); e->time = todget(nil); e->xtd = td; - for (n = 2; n < 6; n++){ + for (n = 2; n < 4; n++){ i = ((frnum + n)&0x3ff); td = e->td0 + i; bp = e->bp0 + e->maxpkt*i/e->pollms; if (td->status & Active) continue; - if (td == e->etd) { - XPRINT("*"); - memset(bp+e->off, 0, e->maxpkt-e->off); - if (e->off == 0) + if (e->mode == OWRITE){ + if (td == e->etd) { + XPRINT("*"); + memset(bp+e->off, 0, e->maxpkt-e->off); + if (e->off == 0) + td->flags |= IsoClean; + else + e->buffered += (((td->dev>>21) +1) & 0x3ff) - e->off; + e->etd = nil; + }else if ((td->flags & IsoClean) == 0){ + XPRINT("-"); + memset(bp, 0, e->maxpkt); td->flags |= IsoClean; - e->etd = nil; - }else if ((td->flags & IsoClean) == 0){ - XPRINT("-"); - memset(bp, 0, e->maxpkt); - td->flags |= IsoClean; + } + } else { + /* Unread bytes are now lost */ + e->buffered -= (td->status + 1) & 0x3ff; } td->status = ErrLimit1 | Active | IsoSelect | IOC; } @@ -1708,24 +1726,32 @@ isoio(Endpt *e, void *a, long n, ulong offset, int w) if (td == nil || e->off == 0){ if (td == nil){ XPRINT("0"); - if (w) - frnum = (IN(Frnum) + 8) & 0x3ff; - else - frnum = (IN(Frnum) - 8) & 0x3ff; - td = e->etd = e->td0 +frnum; + if (w){ + frnum = (IN(Frnum) + 1) & 0x3ff; + td = e->td0 + frnum; + while(td->status & Active) + td = td->next; + }else{ + frnum = (IN(Frnum) - 4) & 0x3ff; + td = e->td0 + frnum; + while(td->next != e->xtd) + td = td->next; + } + e->etd = td; e->off = 0; - } - /* New td, make sure it's ready */ - isolock = 0; - iunlock(&activends); - while (isoready(e) == 0){ - sleep(&e->wr, isoready, e); - } - ilock(&activends); - isolock = 1; - if (e->etd == nil){ - XPRINT("!"); - continue; + }else{ + /* New td, make sure it's ready */ + isolock = 0; + iunlock(&activends); + while (isoready(e) == 0){ + sleep(&e->wr, isoready, e); + } + ilock(&activends); + isolock = 1; + if (e->etd == nil){ + XPRINT("!"); + continue; + } } if (w) e->psize = ((td->dev >> 21) + 1) & 0x7ff; @@ -1741,10 +1767,17 @@ isoio(Endpt *e, void *a, long n, ulong offset, int w) q = bp + e->off; if((i = n) >= e->psize) i = e->psize; - if (w) + if (w){ memmove(q, p, i); - else + e->buffered += i; + }else{ memmove(p, q, i); + e->buffered -= i; + if (e->buffered < 0){ + iprint("e->buffered %d?\n", e->buffered); + e->buffered = 0; + } + } p += i; n -= i; e->off += i; @@ -1823,6 +1856,22 @@ readusb(Endpt *e, void *a, long n) return p-(uchar*)a; } +int +epstatus(char *s, int n, Endpt *e, int i) +{ + int l; + + l = 0; + l += snprint(s+l, n-l, "%2d %#6.6lux %10lud bytes %10lud blocks", + i, e->csp, e->nbytes, e->nblocks); + if (e->iso && e->toffset){ + l += snprint(s+l, n-l, " %6d buffered %10lud offset %19lld time", + e->buffered, e->toffset, e->time); + } + l += snprint(s+l, n-l, "\n"); + return l; +} + long usbread(Chan *c, void *a, long n, vlong offset) { @@ -1877,11 +1926,7 @@ usbread(Chan *c, void *a, long n, vlong offset) l = snprint(s, READSTR, "%s %#6.6lux\n", devstates[d->state], d->csp); for(i=0; iep); i++) if((e = d->ep[i]) != nil){ /* TO DO: freeze e */ - l += snprint(s+l, READSTR-l, "%2d %#6.6lux %10lud bytes %10lud blocks", i, e->csp, e->nbytes, e->nblocks); - if (e->iso && e->toffset){ - l += snprint(s+l, READSTR-l, " %10lud offset %19lld time", e->toffset, e->time); - } - l += snprint(s+l, READSTR-l, "\n"); + l += epstatus(s+l, READSTR-l, e, i); } n = readstr(offset, a, n, s); poperror();