From a81ae850244b93768e3abea9a699043e9cd7e10a Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 18 Nov 1994 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1994-11-18 --- pc/devastar.c | 27 ++++++++++++++++----------- pc/ns16552.h | 14 +++++++++----- port/devns16552.c | 46 +++++++++++++++++++++------------------------- 3 files changed, 46 insertions(+), 41 deletions(-) diff --git a/pc/devastar.c b/pc/devastar.c index 72a2ce6841db4841bc54cd8be455141d227031f1..2fa4dafd52126004886c448fa490e3e855926bd7 100644 --- a/pc/devastar.c +++ b/pc/devastar.c @@ -344,17 +344,17 @@ astargen(Chan *c, Dirtab *tab, int ntab, int i, Dir *db) t = i%3; switch(t){ case 0: - sprint(db->name, "eia%d%2.2d", dev, ch+1); + sprint(db->name, "eia%d%2.2d", dev, ch); db->mode = astar[dev]->c[ch].perm; db->qid.path = QID(dev, ch, Qdata); break; case 1: - sprint(db->name, "eia%d%2.2dctl", dev, ch+1); + sprint(db->name, "eia%d%2.2dctl", dev, ch); db->mode = astar[dev]->c[ch].perm; db->qid.path = QID(dev, ch, Qctl); break; case 2: - sprint(db->name, "eia%d%2.2dstat", dev, ch+1); + sprint(db->name, "eia%d%2.2dstat", dev, ch); db->mode = 0444; db->qid.path = QID(dev, ch, Qstat); break; @@ -391,26 +391,24 @@ astarreset(void) if(isaconfig("serial", i, a) == 0){ xfree(a); astar[nastar] = 0; - break; + continue; } if(strcmp(a->type, "a100i") == 0 || strcmp(a->type,"A100I") == 0) a->ramsize = 16*1024; else if(strcmp(a->type, "a200i") == 0 || strcmp(a->type,"A200I") == 0) a->ramsize = 256*1024; - else + else { + xfree(a); + astar[nastar] = 0; continue; - - c = inb(a->port+ISActl1); - outb(a->port+ISActl1, c | ISAnotdl); - a->memsize = a->ramsize; + } if(a->mem == 0) a->mem = 0xD4000; if(a->irq == 0) a->irq = 15; a->id = i; - a->page = -1; if(astarsetup(a) < 0){ xfree(a); @@ -421,7 +419,13 @@ astarreset(void) a->addr, a->irq); nastar++; - setvec(Int0vec + a->irq, astarintr, a); + c = inb(a->port+ISActl1); + outb(a->port+ISActl1, c & ~ISAnotdl); + a->memsize = Pramsize; + + c = inb(a->port+ISActl2); + outb(a->port+ISActl2, c & ~ISAmen); + a->page = -1; } } @@ -790,6 +794,7 @@ startcp(Astar *a) } /* enable control program interrupt generation */ + setvec(Int0vec + a->irq, astarintr, a); LOCKPAGE(a, 0); a->gcb->cmd2 = LEUS(Gintack); UNLOCKPAGE(a); diff --git a/pc/ns16552.h b/pc/ns16552.h index 2efab0289a835c5c1da12df9aa892c1320ad7ac7..5ac5eeabafbc75c8afd66141d82825fde6e2a9ac 100644 --- a/pc/ns16552.h +++ b/pc/ns16552.h @@ -84,7 +84,7 @@ mp008intr(Ureg *ur, void *arg) void ns16552install(void) { - int i, j, port; + int i, j, port, nscard; char *p; Scard *sc; char name[NAMELEN]; @@ -106,11 +106,13 @@ ns16552install(void) ns16552special(atoi(p), 9600, &kbdq, &printq, kbdcr2nl); /* the rest come out of plan9.ini */ + nscard = 0; for(i = 0; i < Maxcard; i++){ - sc = scard[i] = xalloc(sizeof(Scard)); + sc = scard[nscard] = xalloc(sizeof(Scard)); if(isaconfig("serial", i, sc) == 0){ xfree(sc); - break; + scard[nscard] = 0; + continue; } if(strcmp(sc->type, "MP008") == 0 || strcmp(sc->type, "mp008") == 0){ @@ -129,7 +131,7 @@ ns16552install(void) setvec(Int0vec+sc->irq, mp008intr, sc); port = sc->port; for(j=0; j < sc->size; j++){ - sprint(name, "eia%d%2.2d", i, j); + sprint(name, "eia%d%2.2d", nscard, j); ns16552setup(port, sc->freq, name); port += 8; } @@ -141,10 +143,12 @@ ns16552install(void) */ if(sc->freq == 0) sc->freq = UartFREQ; - sprint(name, "eia%d00", i); + sprint(name, "eia%d00", nscard); ns16552setup(sc->port, sc->freq, name); setvec(Int0vec+sc->irq, ns16552intrx, (void*)(nuart-1)); } + + nscard++; } } diff --git a/port/devns16552.c b/port/devns16552.c index f5585871cfd6031a9be1d0ed35e454f4a4542210..fc839b633c57e64b08b217eef5aabb0835e52779 100644 --- a/port/devns16552.c +++ b/port/devns16552.c @@ -319,7 +319,6 @@ ns16552enable(Uart *p) */ ns16552dtr(p, 1); ns16552rts(p, 1); - ns16552setbaud(p, 9600); /* * assume we can send @@ -532,18 +531,12 @@ void ns16552intr(int dev) { uchar ch; - int s, l, loops, shakes; + int s, l, loops; Uart *p = uart[dev]; - shakes = 0; for(loops = 0;; loops++){ p->istat = s = uartrdreg(p, Istat); - if(loops > 100000){ - if(shakes++ < 3){ - /* try resetting the interface */ - ns16552shake(p); - continue; - } + if(loops > 10000000){ print("lstat %ux mstat %ux istat %ux iena %ux ferr %d oerr %d", uartrdreg(p, Lstat), uartrdreg(p, Mstat), s, uartrdreg(p, Iena), p->frame, p->overrun); @@ -744,11 +737,13 @@ ns16552open(Chan *c, int omode) case Ndataqid: p = uart[NETID(c->qid.path)]; qlock(p); - p->opens++; - ns16552enable(p); - qreopen(p->iq); - qreopen(p->oq); + if(p->opens++ == 0){ + ns16552enable(p); + qreopen(p->iq); + qreopen(p->oq); + } qunlock(p); + break; } return c; @@ -768,21 +763,22 @@ ns16552close(Chan *c) if(c->qid.path & CHDIR) return; - if(NETTYPE(c->qid.path) == Nstatqid) - return; if((c->flag & COPEN) == 0) return; - - p = uart[NETID(c->qid.path)]; - qlock(p); - p->opens--; - if(p->opens == 0){ - ns16552disable(p); - qclose(p->iq); - qclose(p->oq); - p->ip = p->istage; + switch(NETTYPE(c->qid.path)){ + case Ndataqid: + case Nctlqid: + p = uart[NETID(c->qid.path)]; + qlock(p); + if(--(p->opens) == 0){ + ns16552disable(p); + qclose(p->iq); + qclose(p->oq); + p->ip = p->istage; + } + qunlock(p); + break; } - qunlock(p); } static long