plan 9 kernel history: overview | file list | diff list

1991/0423/port/devscsi.c (diff list | history)

1991/0419/sys/src/9/port/devscsi.c:24,301991/0423/sys/src/9/port/devscsi.c:24,31 (short | long | prev | next)
1991/0110    
#define	NSCSI	(sizeof scsidir/sizeof(Dirtab)) 
 
static Scsi	staticcmd;	/* BUG */ 
static uchar	datablk[8192];	/* BUG */ 
1991/0423    
#define	DATASIZE	(8*1024) 
static uchar	datablk[DATASIZE];	/* BUG */ 
1991/0110    
 
static int	debugs[8]; 
static int	isscsi; 
1991/0419/sys/src/9/port/devscsi.c:120,1261991/0423/sys/src/9/port/devscsi.c:121,138
1991/0110    
 
void 
scsiclose(Chan *c) 
{} 
1991/0423    
{ 
	Scsi *cmd = &staticcmd; 
	 
	if((c->qid.path & CHDIR) || c->qid.path==1) 
		return; 
	if((c->qid.path & 0xf) == Qcmd){ 
		if(canqlock(cmd) || cmd->pid == u->p->pid){ 
			cmd->pid = 0; 
			qunlock(cmd); 
		} 
	} 
} 
1991/0110    
 
long 
1991/0411    
scsiread(Chan *c, char *a, long n, ulong offset) 
1991/0419/sys/src/9/port/devscsi.c:132,1371991/0423/sys/src/9/port/devscsi.c:144,150
1991/0110    
		return devdirread(c, a, n, 0, 0, scsigen); 
	if(c->qid.path==1){ 
1991/0411    
		if(offset == 0){ 
1991/0423    
			/*void scsidump(void); scsidump();*/ 
1991/0110    
			*a = ownid; 
			n = 1; 
		}else 
1991/0419/sys/src/9/port/devscsi.c:140,1561991/0423/sys/src/9/port/devscsi.c:153,178
1991/0110    
	case Qcmd: 
		if (n < 4) 
			error(Ebadarg); 
		/*if(canqlock(cmd)){ 
1991/0423    
		if(canqlock(cmd)){ 
1991/0110    
			qunlock(cmd); 
			error(Egreg); 
		}*/ 
1991/0423    
		} 
		if(cmd->pid != u->p->pid) 
			error(Egreg); 
1991/0110    
		n = 4; 
		*a++ = cmd->state>>8; *a++ = cmd->state; 
1991/0423    
		*a++ = 0; *a++ = 0; 
1991/0110    
		*a++ = cmd->status>>8; *a = cmd->status; 
		/*qunlock(cmd);*/ 
1991/0423    
		cmd->pid = 0; 
		qunlock(cmd); 
1991/0110    
		break; 
	case Qdata: 
		if (n > sizeof datablk) 
1991/0423    
		if(canqlock(cmd)){ 
			qunlock(cmd); 
			error(Egreg); 
		} 
		if(cmd->pid != u->p->pid) 
			error(Egreg); 
		if (n > DATASIZE) 
1991/0110    
			error(Ebadarg); 
		cmd->data.base = datablk; 
		cmd->data.lim = cmd->data.base + n; 
1991/0419/sys/src/9/port/devscsi.c:181,1871991/0423/sys/src/9/port/devscsi.c:203,209
1991/0411    
		if(offset == 0){ 
1991/0110    
			n = 1; 
			ownid=*a; 
			scsiinit(); 
1991/0423    
			scsireset(); 
1991/0110    
		}else 
			n = 0; 
	}else switch ((int)c->qid.path & 0xf){ 
1991/0419/sys/src/9/port/devscsi.c:188,1941991/0423/sys/src/9/port/devscsi.c:210,217
1991/0110    
	case Qcmd: 
		if (n < 6 || n > sizeof cmd->cmdblk) 
			error(Ebadarg); 
		/*qlock(cmd);*/ 
1991/0423    
		qlock(cmd); 
		cmd->pid = u->p->pid; 
1991/0110    
		cmd->cmd.base = cmd->cmdblk; 
1991/0318    
		memmove(cmd->cmd.base, a, n); 
1991/0110    
		cmd->cmd.lim = cmd->cmd.base + n; 
1991/0419/sys/src/9/port/devscsi.c:195,2051991/0423/sys/src/9/port/devscsi.c:218,233
1991/0110    
		cmd->cmd.ptr = cmd->cmd.base; 
		cmd->target = (c->qid.path>>4)&7; 
		cmd->lun = (a[1]>>5)&7; 
		cmd->state = 0; 
		cmd->status = 0xFFFF; 
		break; 
	case Qdata: 
		if (n > sizeof datablk) 
1991/0423    
		if(canqlock(cmd)){ 
			qunlock(cmd); 
			error(Egreg); 
		} 
		if(cmd->pid != u->p->pid) 
			error(Egreg); 
		if (n > DATASIZE) 
1991/0110    
			error(Ebadarg); 
		cmd->data.base = datablk; 
		cmd->data.lim = cmd->data.base + n; 
1991/0419/sys/src/9/port/devscsi.c:234,2511991/0423/sys/src/9/port/devscsi.c:262,282
1991/0110    
	error(Eperm); 
} 
 
void 
scsicmd(Scsi *cmd, int dev, int cmdbyte, uchar *buf, long size) 
1991/0423    
Scsi * 
scsicmd(int dev, int cmdbyte, long size) 
1991/0110    
{ 
1991/0423    
	Scsi *cmd = &staticcmd; 
 
	if(size > DATASIZE) 
		panic("scsicmd %d", size); 
1991/0110    
	qlock(cmd); 
	cmd->target = dev>>3; 
	cmd->lun = dev&7; 
	cmd->cmd.base = cmd->cmdblk; 
	cmd->data.base = buf; 
	cmd->cmd.ptr = cmd->cmd.base; 
	memset(cmd->cmdblk, 0, sizeof cmd->cmdblk); 
	cmd->cmdblk[0] = cmdbyte; 
	switch (cmdbyte>>5) { 
1991/0423    
	switch(cmdbyte>>5){ 
1991/0110    
	case 0: 
		cmd->cmd.lim = &cmd->cmdblk[6]; break; 
	case 1: 
1991/0419/sys/src/9/port/devscsi.c:253,2591991/0423/sys/src/9/port/devscsi.c:284,290
1991/0110    
	default: 
		cmd->cmd.lim = &cmd->cmdblk[12]; break; 
	} 
	switch (cmdbyte) { 
1991/0423    
	switch(cmdbyte){ 
1991/0110    
	case 0x00:	/* test unit ready */ 
		break; 
	case 0x03:	/* read sense data */ 
1991/0419/sys/src/9/port/devscsi.c:262,2801991/0423/sys/src/9/port/devscsi.c:293,313
1991/0110    
	case 0x25:	/* read capacity */ 
		break; 
	} 
1991/0423    
	cmd->data.base = datablk; 
1991/0110    
	cmd->data.lim = cmd->data.base + size; 
	cmd->data.ptr = cmd->data.base; 
	cmd->save = cmd->data.base; 
1991/0423    
	return cmd; 
1991/0110    
} 
 
int 
scsiready(int dev) 
{ 
	static Scsi cmd; 
1991/0423    
	Scsi *cmd = scsicmd(dev, 0x00, 0); 
1991/0110    
	int status; 
	scsicmd(&cmd, dev, 0x00, 0, 0); 
	status = scsiexec(&cmd, 0); 
	qunlock(&cmd); 
1991/0423    
 
	status = scsiexec(cmd, 0); 
	qunlock(cmd); 
1991/0110    
	if ((status&0xff00) != 0x6000) 
		error(Eio); 
	return status&0xff; 
1991/0419/sys/src/9/port/devscsi.c:281,2951991/0423/sys/src/9/port/devscsi.c:314,327
1991/0110    
} 
 
int 
scsisense(int dev, uchar *p) 
1991/0423    
scsisense(int dev, void *p) 
1991/0110    
{ 
	static Scsi cmd; 
	static uchar buf[18]; 
1991/0423    
	Scsi *cmd = scsicmd(dev, 0x03, 18); 
1991/0110    
	int status; 
	scsicmd(&cmd, dev, 0x03, buf, sizeof buf); 
	status = scsiexec(&cmd, 1); 
1991/0318    
	memmove(p, buf, sizeof buf); 
1991/0110    
	qunlock(&cmd); 
1991/0423    
 
	status = scsiexec(cmd, 1); 
	memmove(p, cmd->data.base, 18); 
	qunlock(cmd); 
1991/0110    
	if ((status&0xff00) != 0x6000) 
		error(Eio); 
	return status&0xff; 
1991/0419/sys/src/9/port/devscsi.c:296,3101991/0423/sys/src/9/port/devscsi.c:328,341
1991/0110    
} 
 
int 
scsicap(int dev, uchar *p) 
1991/0423    
scsicap(int dev, void *p) 
1991/0110    
{ 
	static Scsi cmd; 
	static uchar buf[8]; 
1991/0423    
	Scsi *cmd = scsicmd(dev, 0x25, 8); 
1991/0110    
	int status; 
	scsicmd(&cmd, dev, 0x25, buf, sizeof buf); 
	status = scsiexec(&cmd, 1); 
1991/0318    
	memmove(p, buf, sizeof buf); 
1991/0110    
	qunlock(&cmd); 
1991/0423    
 
	status = scsiexec(cmd, 1); 
	memmove(p, cmd->data.base, 8); 
	qunlock(cmd); 
1991/0110    
	if ((status&0xff00) != 0x6000) 
		error(Eio); 
	return status&0xff; 
1991/0419/sys/src/9/port/devscsi.c:381,3861991/0423/sys/src/9/port/devscsi.c:412,418
1991/0110    
		nexterror(); 
	} 
	scsirflag = rflag; 
1991/0423    
	p->rflag = rflag; 
1991/0110    
	datap = p->data.base; 
	if ((ownid & 0x08) && rflag) 
		PUT(Dest_id, 0x40|p->target); 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)