From bb55d7f834e107d918ed8bf365f6333c6aa69887 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 1 Dec 2001 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2001-12-01 --- pc/devusb.c | 38 +++++++++++++++++++++++++++++++------- pc/pcmciamodem.c | 4 +++- pc/uarti8250.c | 5 +++++ 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/pc/devusb.c b/pc/devusb.c index a3d3af8f287c5a5b2a015a7ca172da4cbdccb5a7..514472216d40cddb70482ad771790b63391cfc60 100644 --- a/pc/devusb.c +++ b/pc/devusb.c @@ -958,6 +958,7 @@ devendpt(Udev *d, int id, int add) lock(d); if((e = *p) != nil){ incref(e); + XPRINT("incref(0x%p) in devendpt, new value %ld\n", e, e->ref); unlock(d); return e; } @@ -980,6 +981,7 @@ devendpt(Udev *d, int id, int add) lock(d); if(*p != nil){ incref(*p); + XPRINT("incref(0x%p) in devendpt, new value %ld\n", *p, (*p)->ref); unlock(d); free(e); return *p; @@ -991,7 +993,7 @@ devendpt(Udev *d, int id, int add) return e; } -static void +static int freept(Endpt *e) { if(e != nil && decref(e) == 0){ @@ -1002,7 +1004,10 @@ freept(Endpt *e) if(e->epq != nil) freeqh(&ubus, e->epq); free(e); + return 1; } + if (e) XPRINT("decref(0x%p) in freept, new value %ld\n", e, e->ref); + return 0; } static void @@ -1015,17 +1020,28 @@ usbdevreset(Udev *d) } static void -freedev(Udev *d) +freedev(Udev *d, int ept) { int i; + Endpt *e; if(d != nil && decref(d) == 0){ + XPRINT("freedev 0x%p, 0\n", d); for(i=0; iep); i++) freept(d->ep[i]); if(d->x >= 0) usbdev[d->x] = nil; free(d); - } + } else { + if(ept >= 0 && ept < nelem(d->ep)){ + e = d->ep[ept]; + XPRINT("freedev, freept 0x%p\n", e); + if(e != nil){ + eptdeactivate(e); + unschedendpt(e); + } + } + } } static void @@ -1329,6 +1345,7 @@ usbnewdevice(void) d->x = i; d->id = (ubus.idgen << 8) | i; d->state = Enabled; + XPRINT("calling devendpt in usbnewdevice\n"); e = devendpt(d, 0, 1); /* always provide control endpoint 0 */ e->mode = ORDWR; e->iso = 0; @@ -1678,6 +1695,7 @@ void usbclose(Chan *c) { Udev *d; + int ept; if(c->qid.type == QTDIR || QID(c->qid) < Q3rd) return; @@ -1689,9 +1707,11 @@ usbclose(Chan *c) d = usbdevice(c); if(QID(c->qid) == Qctl) d->busy = 0; + XPRINT("usbclose: dev 0x%p\n", d); if(c->flag & COPEN){ + ept = (QID(c->qid) != Qctl) ? QID(c->qid) - Qep0 : -1; XPRINT("usbclose: freedev 0x%p\n", d); - freedev(d); + freedev(d, ept); } poperror(); qunlock(&usbstate); @@ -1819,7 +1839,7 @@ isoio(Endpt *e, void *a, long n, ulong offset, int w) memmove(p, q, i); e->buffered -= i; if (e->buffered < 0){ - iprint("e->buffered %d?\n", e->buffered); + XPRINT("e->buffered %d?\n", e->buffered); e->buffered = 0; } } @@ -2121,8 +2141,10 @@ usbwrite(Chan *c, void *a, long n, vlong offset) cmderror(cb, Ebadusbmsg); if (i == 0) d->csp = strtoul(cb->f[3], nil, 0); - if(d->ep[i] == nil) + if(d->ep[i] == nil){ + XPRINT("calling devendpt in usbwrite (CMclass)\n"); d->ep[i] = devendpt(d, i, 1); + } d->ep[i]->csp = strtoul(cb->f[3], nil, 0); break; case CMdata: @@ -2169,8 +2191,10 @@ usbwrite(Chan *c, void *a, long n, vlong offset) XPRINT("field 1: 0 <= %d < %d\n", i, nelem(d->ep)); error(Ebadarg); } - if((e = d->ep[i]) == nil) + if((e = d->ep[i]) == nil){ + XPRINT("calling devendpt in usbwrite (CMep)\n"); e = devendpt(d, i, 1); + } qlock(&usbstate); if(waserror()){ freept(e); diff --git a/pc/pcmciamodem.c b/pc/pcmciamodem.c index 26c654b4b83aba3e2ba63000e59f68edf3fe3000..0d6a7d84b4db9dbf8bea07f2ccfcf2c78c86bedf 100644 --- a/pc/pcmciamodem.c +++ b/pc/pcmciamodem.c @@ -21,7 +21,7 @@ enum { static char* modems[] = { "IBM 33.6 Data/Fax/Voice Modem", - "CM-56G", /* Xircom CreditCard Modem 56 - GlobalACCESS */ + "CM-56G", /* Xircom CreditCard Modem 56 - GlobalACCESS */ "KeepInTouch", "CEM56", 0, @@ -58,6 +58,8 @@ pcmciamodemlink(void) slot = pcmspecial(modems[j], &isa); if(slot >= 0){ + if(ioalloc(isa.port, 8, 0, modems[j]) < 0) + print("%s port %lux already in use\n", modems[j], isa.port); print("%s in pcmcia slot %d port 0x%lux irq %lud\n", modems[j], slot, isa.port, isa.irq); } diff --git a/pc/uarti8250.c b/pc/uarti8250.c index b68e3e0dd4c9aefc1754dce1755297ecb8f084fb..4a2bd2faae8032cf9391f36f363f0e4e02a11d1e 100644 --- a/pc/uarti8250.c +++ b/pc/uarti8250.c @@ -446,6 +446,7 @@ i8250interrupt(Ureg*, void* arg) Ctlr *ctlr; Uart *uart; int iir, lsr, old, r; +int nin; uart = arg; @@ -487,6 +488,7 @@ i8250interrupt(Ureg*, void* arg) * overrun is an indication that something has * already been tossed. */ +nin = 0; while((lsr = csr8r(ctlr, Lsr)) & Dr){ if(lsr & Oe) uart->oerr++; @@ -497,8 +499,11 @@ i8250interrupt(Ureg*, void* arg) r = csr8r(ctlr, Rbr); if(!(lsr & (Bi|Fe|Pe))) uartrecv(uart, r); + nin++; } +if(nin == 0) print("%ux but no data\n", iir); break; + default: iprint("weird uart interrupt 0x%2.2uX\n", iir); break;