From f588189a1429b77c9caec9119ebaf42789c32793 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 4 Apr 1995 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1995-04-04 --- pc/scsi.c | 20 +++++++++++++------- port/devsd.c | 33 ++++++++++++++------------------- port/portfns.h | 1 + 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/pc/scsi.c b/pc/scsi.c index be7fda0ccc88c2d26031e49f863db3be21370dee..bd927c3296d17bfe50c0d2b5720ecf5ff9ec5bbd 100644 --- a/pc/scsi.c +++ b/pc/scsi.c @@ -124,18 +124,12 @@ static void scsiprobe(Ctlr *ctlr) { Target *t; - uchar cmd[6]; int i, s, nbytes; for(i = 0; i < NTarget; i++) { t = &ctlr->target[i]; - /* - * Test unit ready - */ - memset(cmd, 0, sizeof(cmd)); - s = scsiexec(t, SCSIread, cmd, sizeof(cmd), 0, 0); - if(s < 0) + if(scsitest(t, 0) < 0) continue; /* @@ -215,6 +209,18 @@ print("devno %d = %s\n", devno, id); return -1; } + +int +scsitest(Target *t, char lun) +{ + uchar cmd[6]; + + memset(cmd, 0, sizeof(cmd)); + cmd[0] = CMDtest; + cmd[1] = lun<<5; + return scsiexec(t, SCSIread, cmd, sizeof(cmd), 0, 0); +} + int scsistart(Target *t, char lun, int s) { diff --git a/port/devsd.c b/port/devsd.c index b077b615b99e49e396cee818188a14354a2ea45d..4e97c59fb0332a7e4c481293876843f8f9ad4e9b 100644 --- a/port/devsd.c +++ b/port/devsd.c @@ -11,9 +11,11 @@ enum { TypeDA = 0x00, /* Direct Access */ + TypeSA = 0x01, /* Sequential Access */ TypeWO = 0x04, /* Worm */ TypeCD = 0x05, /* CD-ROM */ TypeMO = 0x07, /* rewriteable Magneto-Optical */ + TYpeMC = 0x08, /* Medium Changer */ }; enum @@ -59,7 +61,7 @@ static void sdrdpart(Disk*); static long sdio(Chan*, int, char*, ulong, ulong); static int types[] = { - TypeDA, TypeWO, TypeCD, TypeMO, + TypeDA, TypeCD, TypeMO, -1, }; @@ -109,14 +111,16 @@ sdinit(void) if(dev < 0) break; - if(scsistart(d->t, 0, 1) != STok) - continue; + if(scsitest(d->t, 0) < 0) + scsireqsense(d->t, 0, 0); + if(scsistart(d->t, 0, 1) < 0) + scsireqsense(d->t, 0, 0); +print("sd1|"); /* Search for other lun's */ for(i = 0; i < Nlun; i++) { d->lun = i; - - scsireqsense(d->t, d->lun, 1); +print("sd2|"); /* * A SCSI target does not support a lun if the @@ -127,35 +131,25 @@ sdinit(void) nbytes = sizeof(inq); if(scsiinquiry(d->t, d->lun, inq, &nbytes) != STok || inq[0] == 0x7F) continue; - - /* NCR Raid only seems to answer second capacity - * command if lun != 0 - */ - if(scsicap(d->t, d->lun, &s, &b) != STok) { - scsireqsense(d->t, 0, 1); - continue; - } - scsireqsense(d->t, 0, 1); +print("sd3|"); s = 0; b = 0; if(scsicap(d->t, d->lun, &s, &b) != STok) { - scsireqsense(d->t, 0, 1); + scsireqsense(d->t, 0, 0); continue; } - - if(scsireqsense(d->t, d->lun, 1) != STok) - continue; +print("sd4/%d/%d|", s, b); if(s == 0 || b == 0) continue; +print("sd5/0x%2.2ux|", d->inquire[0]); d->size = s; d->bsize = b; switch(d->inquire[0] & 0x1F){ case TypeDA: - case TypeWO: case TypeMO: sprint(d->vol, "sd%d", ndisk); break; @@ -167,6 +161,7 @@ sdinit(void) default: continue; } +print("sd6|"); if(++ndisk >= Ndisk) break; diff --git a/port/portfns.h b/port/portfns.h index 47fb04dfa53f20afbc4a39e46eb0b7cfe9d36c64..c77d7bd32a6f85fe77d5c52e37759c8b84d8ebb7 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -243,6 +243,7 @@ int scsiinquiry(Target*, char, void*, int*); int scsiinv(int, int*, Target**, uchar**, char*); int scsireqsense(Target*, char, int); int scsistart(Target*, char, int); +int scsitest(Target*, char); Target* scsiunit(int, int); long seconds(void); ulong segattach(Proc*, ulong, char *, ulong, ulong);