~kris/9p

9hist

f588189a1429b77c9caec9119ebaf42789c32793 — David du Colombier 31 years ago 5d25f6b
Plan 9 from Bell Labs 1995-04-04
3 files changed, 28 insertions(+), 26 deletions(-)

M pc/scsi.c
M port/devsd.c
M port/portfns.h
M pc/scsi.c => pc/scsi.c +13 -7
@@ 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)
{

M port/devsd.c => port/devsd.c +14 -19
@@ 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;

M port/portfns.h => port/portfns.h +1 -0
@@ 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);