From 636853ae729d934b047b1761c308cdc024e2c46e Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 17 Oct 1995 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1995-10-17 --- pc/devi82365.c | 53 ++++++++++++++++++++++++++++++++++---------------- port/qlock.c | 2 +- 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/pc/devi82365.c b/pc/devi82365.c index 6fc7f9230d3ba15d86c4b3f283cceb433d73b354..57cf3ae82470f145a0a3e62bd90fbb015aa64051 100644 --- a/pc/devi82365.c +++ b/pc/devi82365.c @@ -538,12 +538,12 @@ i82386probe(int x, int d, int dev) outb(x, Rchipinfo + (dev<<7)); outb(d, 0); c = inb(d); - if((c & 0xdf) == 0xdc){ - c = inb(d); - if((c & 0xdf) != 0x0c) - break; - } - if(c & 0x40){ + if((c & 0xc0) != 0xc0) + break; + c = inb(d); + if((c & 0xc0) != 0x00) + break; + if(c & 0x20){ cp->type = Tpd6720; } else { cp->type = Tpd6710; @@ -907,7 +907,7 @@ pcmio(int slotno, ISAConf *isa) { uchar we, x, *p; Slot *pp; - Conftab *ct; + Conftab *ct, *et, *t; PCMmap *m; int irq; @@ -922,19 +922,38 @@ pcmio(int slotno, ISAConf *isa) if(!pp->occupied) return -1; - /* find a configuration with the right port */ - for(ct = pp->ctab; ct < &pp->ctab[pp->nctab]; ct++){ - if(ct->nioregs && ct->port == isa->port && ((1<irqs)) - break; - } + et = &pp->ctab[pp->nctab]; - /* if non found, settle for one with the some ioregs */ - if(ct == &pp->ctab[pp->nctab]) - for(ct = pp->ctab; ct < &pp->ctab[pp->nctab]; ct++) - if(ct->nioregs && ((1<irqs)) + /* assume default is right */ + if(pp->def) + ct = pp->def; + else + ct = pp->ctab; + + /* try for best match */ + if(ct->nioregs == 0 || ct->port != isa->port || ((1<irqs) == 0){ + for(t = pp->ctab; t < et; t++) + if(t->nioregs && t->port == isa->port && ((1<irqs)){ + ct = t; break; + } + } + if(ct->nioregs == 0 || ((1<irqs) == 0){ + for(t = pp->ctab; t < et; t++) + if(t->nioregs && ((1<irqs)){ + ct = t; + break; + } + } + if(ct->nioregs == 0){ + for(t = pp->ctab; t < et; t++) + if(t->nioregs){ + ct = t; + break; + } + } - if(ct == &pp->ctab[pp->nctab]) + if(ct == et || ct->nioregs == 0) return -1; /* route interrupts */ diff --git a/port/qlock.c b/port/qlock.c index 7b7fbab557decc94227e4225425f5b2d6e409af0..bb1e1aaeca933b2f38c7467cc083e0d394695ba6 100644 --- a/port/qlock.c +++ b/port/qlock.c @@ -92,6 +92,6 @@ wlock(RWlock *l) void wunlock(RWlock *l) { - qunlock(&l->x); qunlock(&l->k); + qunlock(&l->x); }