227 lines · 4.2 KB · C
RawDownload
/*  * This file is part of the UCB release of Plan 9. It is subject to the license * terms in the LICENSE file found in the top-level directory of this * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No * part of the UCB release of Plan 9, including this file, may be copied, * modified, propagated, or distributed except according to the terms contained * in the LICENSE file. */ #include <u.h>#include <libc.h>#include <disk.h>#include "scsireq.h" longSRblank(ScsiReq *rp, uchar type, uchar track){	uchar cmd[12]; 	memset(cmd, 0, sizeof(cmd));	cmd[0] = ScmdBlank;	cmd[1] = type;	cmd[2] = track>>24;	cmd[3] = track>>16;	cmd[4] = track>>8;	cmd[5] = track;	rp->cmd.p = cmd;	rp->cmd.count = sizeof(cmd);	rp->data.p = cmd;	rp->data.count = 0;	rp->data.write = 1;	return SRrequest(rp);} longSRsynccache(ScsiReq *rp){	uchar cmd[10]; 	memset(cmd, 0, sizeof(cmd));	cmd[0] = ScmdSynccache;	rp->cmd.p = cmd;	rp->cmd.count = sizeof(cmd);	rp->data.p = cmd;	rp->data.count = 0;	rp->data.write = 1;	return SRrequest(rp);} longSRTOC(ScsiReq *rp, void *data, int nbytes, uchar format, uchar track){	uchar cmd[10]; 	memset(cmd, 0, sizeof(cmd));	cmd[0] = ScmdRTOC;	cmd[2] = format;	cmd[6] = track;	cmd[7] = nbytes>>8;	cmd[8] = nbytes;	rp->cmd.p = cmd;	rp->cmd.count = sizeof(cmd);	rp->data.p = data;	rp->data.count = nbytes;	rp->data.write = 0;	return SRrequest(rp);} longSRrdiscinfo(ScsiReq *rp, void *data, int nbytes){	uchar cmd[10]; 	memset(cmd, 0, sizeof(cmd));	cmd[0] = ScmdRdiscinfo;	cmd[7] = nbytes>>8;	cmd[8] = nbytes;	rp->cmd.p = cmd;	rp->cmd.count = sizeof(cmd);	rp->data.p = data;	rp->data.count = nbytes;	rp->data.write = 0;	return SRrequest(rp);} longSRrtrackinfo(ScsiReq *rp, void *data, int nbytes, int track){	uchar cmd[10]; 	memset(cmd, 0, sizeof(cmd));	cmd[0] = ScmdRtrackinfo;	cmd[1] = 0x01;	cmd[2] = track>>24;	cmd[3] = track>>16;	cmd[4] = track>>8;	cmd[5] = track;	cmd[7] = nbytes>>8;	cmd[8] = nbytes;	rp->cmd.p = cmd;	rp->cmd.count = sizeof(cmd);	rp->data.p = data;	rp->data.count = nbytes;	rp->data.write = 0;	return SRrequest(rp);} longSRfwaddr(ScsiReq *rp, uchar track, uchar mode, uchar npa, uchar *data){	uchar cmd[10]; 	memset(cmd, 0, sizeof(cmd));	cmd[0] = ScmdFwaddr;	cmd[2] = track;	cmd[3] = mode;	cmd[7] = npa;	rp->cmd.p = cmd;	rp->cmd.count = sizeof(cmd);	rp->data.p = data;	rp->data.count = MaxDirData;	rp->data.write = 0;	return SRrequest(rp);} longSRtreserve(ScsiReq *rp, long nbytes){	uchar cmd[10];	long n; 	if((nbytes % rp->lbsize)){		rp->status = Status_BADARG;		return -1;	}	memset(cmd, 0, sizeof(cmd));	cmd[0] = ScmdTreserve;	n = nbytes/rp->lbsize;	cmd[5] = n>>24;	cmd[6] = n>>16;	cmd[7] = n>>8;	cmd[8] = n;	rp->cmd.p = cmd;	rp->cmd.count = sizeof(cmd);	rp->data.p = cmd;	rp->data.count = 0;	rp->data.write = 1;	return SRrequest(rp);} longSRtinfo(ScsiReq *rp, uchar track, uchar *data){	uchar cmd[10]; 	memset(cmd, 0, sizeof(cmd));	cmd[0] = ScmdTinfo;	cmd[5] = track;	cmd[8] = MaxDirData;	rp->cmd.p = cmd;	rp->cmd.count = sizeof(cmd);	rp->data.p = data;	rp->data.count = MaxDirData;	rp->data.write = 0;	return SRrequest(rp);} longSRwtrack(ScsiReq *rp, void *buf, long nbytes, uchar track, uchar mode){	uchar cmd[10];	long m, n; 	if((nbytes % rp->lbsize) || nbytes > maxiosize){		rp->status = Status_BADARG;		return -1;	}	memset(cmd, 0, sizeof(cmd));	cmd[0] = ScmdTwrite;	cmd[5] = track;	cmd[6] = mode;	n = nbytes/rp->lbsize;	cmd[7] = n>>8;	cmd[8] = n;	rp->cmd.p = cmd;	rp->cmd.count = sizeof(cmd);	rp->data.p = buf;	rp->data.count = nbytes;	rp->data.write = 1;	m = SRrequest(rp);	if(m < 0)		return -1;	rp->offset += n;	return m;} longSRmload(ScsiReq *rp, uchar code){	uchar cmd[12]; 	memset(cmd, 0, sizeof(cmd));	cmd[0] = ScmdMload;	cmd[8] = code;	rp->cmd.p = cmd;	rp->cmd.count = sizeof(cmd);	rp->data.p = cmd;	rp->data.count = 0;	rp->data.write = 1;	return SRrequest(rp);} longSRfixation(ScsiReq *rp, uchar type){	uchar cmd[10]; 	memset(cmd, 0, sizeof(cmd));	cmd[0] = ScmdFixation;	cmd[8] = type;	rp->cmd.p = cmd;	rp->cmd.count = sizeof(cmd);	rp->data.p = cmd;	rp->data.count = 0;	rp->data.write = 1;	return SRrequest(rp);}