~kris/9p

9hist

aaff5a02d49b2cb5a2057d1d964763e2bf137866 — David du Colombier 31 years ago 5d3cbbb
Plan 9 from Bell Labs 1995-07-23
1 files changed, 90 insertions(+), 24 deletions(-)

M pc/scsi.c
M pc/scsi.c => pc/scsi.c +90 -24
@@ 30,7 30,7 @@ typedef struct
	Target	target[NTarget];
} Ctlr;

static Ctlr *scsi[MaxScsi];
static	Ctlr*	scsi[MaxScsi];

typedef struct Link Link;
typedef struct Link


@@ 260,16 260,17 @@ scsicap(Target *t, char lun, ulong *size, ulong *bsize)
	cmd[0] = 0x25;
	cmd[1] = lun<<5;

	d = malloc(8);
	nbytes = 8;
	d = scsialloc(nbytes);
	if(d == 0)
		return -1;
		error(Enomem);

	nbytes = 8;
	if((s = scsiexec(t, SCSIread, cmd, sizeof(cmd), d, &nbytes)) == STok){
	s = scsiexec(t, SCSIread, cmd, sizeof(cmd), d, &nbytes);
	if(s == STok) {
		*size  = (d[0]<<24)|(d[1]<<16)|(d[2]<<8)|(d[3]<<0);
		*bsize = (d[4]<<24)|(d[5]<<16)|(d[6]<<8)|(d[7]<<0);
	}
	free(d);
	scsifree(d);
	return s;
}



@@ 394,26 395,25 @@ scsireqsense(Target *t, char lun, void *data, int *nbytes, int quiet)
int
scsidiskinfo(Target *t, char lun, uchar *data)
{
	int s, nbytes, try;
	uchar cmd[10];

	for(try=0; try<3; try++) {
	int s, nbytes;
	uchar cmd[10], *d;

		nbytes = 4;
	nbytes = 4;

		memset(cmd, 0, sizeof(cmd));
		cmd[0] = 0x43;
		cmd[1] = lun<<5;
		cmd[7] = nbytes>>8;
		cmd[8] = nbytes>>0;
	memset(cmd, 0, sizeof(cmd));
	cmd[0] = 0x43;
	cmd[1] = lun<<5;
	cmd[7] = nbytes>>8;
	cmd[8] = nbytes>>0;

		s = scsiexec(t, SCSIread, cmd, sizeof(cmd), data, &nbytes);
		if(s == STok)
			break;
	d = scsialloc(nbytes);
	if(d == 0)
		error(Enomem);

		nbytes = Nscratch;
		scsireqsense(t, lun, t->scratch, &nbytes, 0);
	}
	memset(d, 0, nbytes);
	s = scsiexec(t, SCSIread, cmd, sizeof(cmd), d, &nbytes);
	memmove(data, d, 4);
	scsifree(d);
	return s;
}



@@ 421,7 421,7 @@ int
scsitrackinfo(Target *t, char lun, int track, uchar *data)
{
	int s, nbytes;
	uchar cmd[10];
	uchar cmd[10], *d;

	nbytes = 12;



@@ 432,6 432,72 @@ scsitrackinfo(Target *t, char lun, int track, uchar *data)
	cmd[7] = nbytes>>8;
	cmd[8] = nbytes>>0;

	s = scsiexec(t, SCSIread, cmd, sizeof(cmd), data, &nbytes);
	d = scsialloc(nbytes);
	if(d == 0)
		error(Enomem);

	memset(d, 0, nbytes);
	s = scsiexec(t, SCSIread, cmd, sizeof(cmd), d, &nbytes);
	memmove(data, d, 12);
	scsifree(d);

	return s;
}

int
scsibufsize(Target *t, char lun, int size)
{
	int s, nbytes;
	uchar cmd[6], *d;


	nbytes = 12;

	memset(cmd, 0, sizeof(cmd));
	cmd[0] = 0x15;
	cmd[1] = lun<<5;
	cmd[4] = nbytes;

	d = scsialloc(nbytes);
	if(d == 0)
		error(Enomem);

	memset(d, 0, nbytes);
	d[3] = 8;
	d[9] = size>>16;
	d[10] = size>>8;
	d[11] = size>>0;

	s = scsiexec(t, SCSIwrite, cmd, sizeof(cmd), d, &nbytes);
	scsifree(d);
	return s;
}

int
scsireadcdda(Target *t, char lun, void *b, long n, long bsize, long bno)
{
	uchar cmd[10];
	int s, nbytes;

	memset(cmd, 0, sizeof(cmd));

	cmd[0] = 0xd8;
	cmd[1] = (lun<<5);
	cmd[2] = bno >> 24;
	cmd[3] = bno >> 16;
	cmd[4] = bno >> 8;
	cmd[5] = bno;
	cmd[6] = n>>24;
	cmd[7] = n>>16;
	cmd[8] = n>>8;
	cmd[9] = n;

	nbytes = n*bsize;
	s = scsiexec(t, SCSIread, cmd, sizeof(cmd), b, &nbytes);
	if(s < 0) {
		nbytes = Nscratch;
		scsireqsense(t, lun, t->scratch, &nbytes, 0);
		return -1;
	}
	return nbytes;
}