From cc1412aaa6949f4080fc9b1cfb6e79242d977424 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 28 Mar 1995 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1995-03-28 --- pc/devi82365.c | 41 +++++++++++++++++++++++------------------ pc/fns.h | 6 +++++- pc/scsi.c | 41 +++++++++++++++++++++++++++-------------- 3 files changed, 55 insertions(+), 33 deletions(-) diff --git a/pc/devi82365.c b/pc/devi82365.c index 8d6e419c614b7f42608a0ccb42db33a884961bb7..980572d2c6836f68f625c958522e15376f6a48a6 100644 --- a/pc/devi82365.c +++ b/pc/devi82365.c @@ -559,6 +559,19 @@ i82386probe(int x, int d, int dev) return cp; } +static void +i82365dump(Slot *pp) +{ + int i; + + for(i = 0; i < 0x40; i++){ + if((i&0x7) == 0) + print("\n%ux: ", i); + print("%ux ", rdreg(pp, i)); + } + print("\n"); +} + /* * set up for slot cards */ @@ -593,7 +606,10 @@ i82365reset(void) pp->memlen = 64*MB; pp->base = (cp->dev<<7) | (j<<6); pp->cp = cp; +if(pp == slot)i82365dump(pp); +/* slotdis(pp); +*/ /* interrupt on status change */ wrreg(pp, Rcscic, ((PCMCIAvec-Int0vec)<<4) | Fchangeena); @@ -780,18 +796,6 @@ i82365read(Chan *c, void *a, long n, ulong offset) if(pp->busy) cp += sprint(cp, "busy\n"); cp += sprint(cp, "battery lvl %d\n", pp->battery); -{ - int i; - - cp += sprint(cp, "x %x d %x b %x\n", pp->cp->xreg, pp->cp->dreg, pp->base); - for(i = 0; i < 0x40; i++){ - cp += sprint(cp, "%2.2ux ", rdreg(pp, i)); - if((i%8) == 7) - cp += sprint(cp, "\n"); - } - if(i%8) - cp += sprint(cp, "\n"); -} *cp = 0; return readstr(offset, a, n, buf); default: @@ -934,21 +938,21 @@ pcmio(int slotno, ISAConf *isa) /* Reset adapter */ m = pcmmap(slotno, pp->caddr + Rconfig, 1, 1); p = (uchar*)(KZERO|(m->isa + pp->caddr + Rconfig - m->ca)); +if(strstr(pp->verstr, "KeepInTouch") == 0){ *p = Creset; delay(5); *p = 0; delay(5); - - /* - * Set level sensitive (not pulsed) interrupts and - * configuration number 1. - * Setting the configuration number enables IO port access. - */ +} + + /* set configuration */ +if(strstr(pp->verstr, "KeepInTouch") == 0){ if(isa->irq > 7) *p = Clevel | ct->index; else *p = ct->index; delay(5); +} else i82365dump(pp); pcmunmap(slotno, m); } return 0; @@ -1306,3 +1310,4 @@ tvers1(Slot *pp, int ttype) } pp->verstr[i] = 0; } + diff --git a/pc/fns.h b/pc/fns.h index 6133ab7f81b0417fb56652c72ae1ef14f9a951e1..e3663aa0792c82acf28941719a32dc1c6de380a3 100644 --- a/pc/fns.h +++ b/pc/fns.h @@ -2,7 +2,7 @@ void aamloop(int); void addconf(char*, char*); -void addscsicard(char*, Scsiio (*)(int, ISAConf*)); +void addscsilink(char*, Scsiio (*)(int, ISAConf*)); void bbinit(void); void bigcursor(void); void bootargs(ulong); @@ -125,3 +125,7 @@ ulong ifunroute(ulong); void parseip(char*, char*); #define dcflush(a, b) + +int scsibtissue(int, int, uchar*, int, uchar*, int); +Scsiio scsibt24(int, int, ISAConf*); +Scsiio scsibt32(int, int, ISAConf*); diff --git a/pc/scsi.c b/pc/scsi.c index d9e8d256e74678169d4d3ba48c5035b993205ef1..f09e6a43b407a35df7761ab4ab306746b5f1a2ef 100644 --- a/pc/scsi.c +++ b/pc/scsi.c @@ -25,28 +25,38 @@ typedef struct { static Ctlr *scsi[MaxScsi]; -static struct { +typedef struct Link Link; +typedef struct Link { char *type; Scsiio (*reset)(int, ISAConf*); -} cards[MaxScsi+1]; + + Link* link; +} Link; + +static Link *link; +static int linkcount; void -addscsicard(char *t, Scsiio (*r)(int, ISAConf*)) +addscsilink(char *t, Scsiio (*r)(int, ISAConf*)) { - static int ncard; + Link *lp; + + if((lp = xalloc(sizeof(Link))) == 0) + return; + lp->type = t; + lp->reset = r; - if(ncard == MaxScsi) - panic("too many scsi cards\n"); - cards[ncard].type = t; - cards[ncard].reset = r; - ncard++; + lp->link = link; + link = lp; + linkcount++; } void scsireset(void) { Ctlr *ctlr; - int ctlrno, n, t; + int ctlrno, t; + Link *lp; for(ctlr = 0, ctlrno = 0; ctlrno < MaxScsi; ctlrno++){ if(ctlr == 0) @@ -54,15 +64,18 @@ scsireset(void) memset(ctlr, 0, sizeof(Ctlr)); if(isaconfig("scsi", ctlrno, ctlr) == 0) continue; - for(n = 0; cards[n].type; n++){ - if(strcmp(cards[n].type, ctlr->type)) + for(lp = link; lp; lp = lp->link){ + if(strcmp(lp->type, ctlr->type)) continue; - if((ctlr->io = (*cards[n].reset)(ctlrno, ctlr)) == 0) + if((ctlr->io = (*lp->reset)(ctlrno, ctlr)) == 0) break; - print("scsi%d: %s: port %lux irq %d addr %lux size %d\n", + print("scsi%d: %s: port %lux irq %d", ctlrno, ctlr->type, ctlr->port, ctlr->irq, ctlr->mem, ctlr->size); + if(ctlr->mem) + print(" addr %lux size %d\n", ctlr->mem, ctlr->size); + print("\n"); for(t = 0; t < NTarget; t++){ ctlr->target[t].ctlrno = ctlrno;