From 5d25f6bafd84edd38c148f42afb0e6ef292b9a7a Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Mon, 3 Apr 1995 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1995-04-03 --- pc/ether509.c | 2 +- pc/scsi.c | 21 +++++++++++++-------- port/devsd.c | 39 +++++++++++++++++++++++++++++++++++++-- port/portfns.h | 2 +- 4 files changed, 52 insertions(+), 12 deletions(-) diff --git a/pc/ether509.c b/pc/ether509.c index 24185f45021700f950e519ec2544417502c6bbdf..9f5db085c60527ac9fed16fe90478c885fcfab9a 100644 --- a/pc/ether509.c +++ b/pc/ether509.c @@ -581,7 +581,7 @@ ether509reset(Ether *ether) } } if(strcmp(ether->type, "3C589") == 0) - port = ether->card.port; + port = ether->port; if(port == 0) port = tcm579(ether); if(port == 0) diff --git a/pc/scsi.c b/pc/scsi.c index 7b2f2c4906590c9b4bb9fa8225b7ed60a0f0c4e8..be7fda0ccc88c2d26031e49f863db3be21370dee 100644 --- a/pc/scsi.c +++ b/pc/scsi.c @@ -158,7 +158,7 @@ scsiprobe(Ctlr *ctlr) print("scsi%d: unit %d inquire failed, status %d\n", t->ctlrno, i, s); continue; } - print("scsi%d: unit %d %s\n", t->ctlrno, i, t->inq+8); + print("scsi%d: unit %d:%2.2ux: %s\n", t->ctlrno, i, t->inq[0], t->inq+8); t->ok = 1; } } @@ -185,10 +185,10 @@ inventory(void) } int -scsiinv(int devno, int type, Target **rt, uchar **inq, char *id) +scsiinv(int devno, int *type, Target **rt, uchar **inq, char *id) { Target *t; - int ctlr, unit; + int ctlr, *i, unit; inventory(); @@ -200,11 +200,16 @@ scsiinv(int devno, int type, Target **rt, uchar **inq, char *id) t = &scsi[ctlr]->target[unit]; devno++; - if(t->ok && (t->inq[0]&0x1F) == type){ - *rt = t; - *inq = t->inq; - sprint(id, "scsi%d: unit %d", ctlr, unit); - return devno; + if(t->ok){ + for(i = type; *i >= 0; i++){ + if((t->inq[0]&0x1F) != *i) + continue; + *rt = t; + *inq = t->inq; + sprint(id, "scsi%d: unit %d", ctlr, unit); +print("devno %d = %s\n", devno, id); + return devno; + } } } return -1; diff --git a/port/devsd.c b/port/devsd.c index 92ca00a1cd93b52a081352147f2d2266c7291e8b..b077b615b99e49e396cee818188a14354a2ea45d 100644 --- a/port/devsd.c +++ b/port/devsd.c @@ -9,6 +9,13 @@ #include "../port/error.h" #include "devtab.h" +enum { + TypeDA = 0x00, /* Direct Access */ + TypeWO = 0x04, /* Worm */ + TypeCD = 0x05, /* CD-ROM */ + TypeMO = 0x07, /* rewriteable Magneto-Optical */ +}; + enum { LogNpart = 4, @@ -51,6 +58,11 @@ Disk disk[Ndisk]; static void sdrdpart(Disk*); static long sdio(Chan*, int, char*, ulong, ulong); +static int types[] = { + TypeDA, TypeWO, TypeCD, TypeMO, + -1, +}; + static int sdgen(Chan *c, Dirtab*, long, long s, Dir *dirp) { @@ -93,7 +105,7 @@ sdinit(void) dev = 0; for(;;) { d = &disk[ndisk]; - dev = scsiinv(dev, 0, &d->t, &d->inquire, d->id); + dev = scsiinv(dev, types, &d->t, &d->inquire, d->id); if(dev < 0) break; @@ -140,7 +152,21 @@ sdinit(void) d->size = s; d->bsize = b; - sprint(d->vol, "sd%d", ndisk); + switch(d->inquire[0] & 0x1F){ + + case TypeDA: + case TypeWO: + case TypeMO: + sprint(d->vol, "sd%d", ndisk); + break; + + case TypeCD: + sprint(d->vol, "cd%d", ndisk); + break; + + default: + continue; + } if(++ndisk >= Ndisk) break; @@ -278,6 +304,12 @@ sdrdpart(Disk *d) p++; d->npart = 2; + if((d->inquire[0] & 0x1F) == TypeCD){ + scsifree(b); + qunlock(d); + return; + } + scsibio(d->t, d->lun, SCSIread, b, 1, d->bsize, d->table[0].end-1); b[d->bsize-1] = '\0'; @@ -320,6 +352,9 @@ sdio(Chan *c, int write, char *a, ulong len, ulong offset) d = &disk[DRIVE(c->qid)]; p = &d->table[PART(c->qid)]; + if(write && (d->inquire[0] & 0x1F) == TypeCD) + error(Eperm); + block = (offset / d->bsize) + p->beg; n = (offset + len + d->bsize - 1) / d->bsize + p->beg - block; max = SCSImaxxfer / d->bsize; diff --git a/port/portfns.h b/port/portfns.h index 0b6e62a405cff34e65fa9c890861962b035638a7..47fb04dfa53f20afbc4a39e46eb0b7cfe9d36c64 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -240,7 +240,7 @@ int scsicap(Target*, char, ulong*, ulong*); int scsiexec(Target*, int, uchar*, int, void*, int*); #define scsifree(p) free(p) int scsiinquiry(Target*, char, void*, int*); -int scsiinv(int, int, Target**, uchar**, char*); +int scsiinv(int, int*, Target**, uchar**, char*); int scsireqsense(Target*, char, int); int scsistart(Target*, char, int); Target* scsiunit(int, int);