M pc/devastar.c => pc/devastar.c +16 -11
@@ 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);
M pc/ns16552.h => pc/ns16552.h +9 -5
@@ 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++;
}
}
M port/devns16552.c => port/devns16552.c +21 -25
@@ 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