📄 aspi.c
字号:
int SCSIRead(adapter, target_id, lun, buf, len, l2bf, sili, fixed, sense)
int adapter;
int target_id;
int lun;
char far *buf;
DWORD len;
int l2bf;
int sili;
int fixed;
unsigned char *sense;
{
DWORD length;
struct _srbio *srb;
int i;
/* allocate a SCSI Request Block (SRB) in the lower 1 MB */
if ( (srb=calloc((DWORD) sizeof(struct _srbio), 1)) == 0 ) return(E$NoMem);
length = ( fixed ) ? len>>l2bf : len;
srb->h.cmd = 2; /* scsi I/O request */
srb->h.adapter = adapter;
srb->h.flags = (1<<3);
srb->target_id = target_id;
srb->lun = lun;
srb->alloc_len = len;
srb->sense_len = 14;
srb->buf_seg = FP_SEG(buf);
srb->buf_off = FP_OFF(buf);
srb->cdb_len = 6;
srb->ccb.rdwr.cmd = 0x08;
srb->ccb.rdwr.fixed = fixed;
srb->ccb.rdwr.sili = sili;
srb->ccb.rdwr.lun = lun;
srb->ccb.rdwr.len_0 = (length & 0xff);
srb->ccb.rdwr.len_1 = ((length>>8) & 0xff);
srb->ccb.rdwr.len_2 = ((length>>16) & 0xff);
if ( (i=aspireq(srb)) ) {
if ( sense ) for(i=0; i<14; ++i) sense[i] = srb->ccb.rdwr.sense[i];
i = ScsiIoError(srb->h.status, srb->adapter_status,
srb->target_status, srb->ccb.rdwr.sense);
}
( void ) free(srb);
return(i);
}
int SCSIReadBlockLimits(adapter, target_id, lun, lim, sense)
int adapter;
int target_id;
int lun;
blocklimit *lim;
unsigned char *sense;
{
struct _srbio *srb;
char *buf;
unsigned char far *block;
int i, j;
/* allocate a SCSI Request Block (SRB) */
if ( (srb=calloc(sizeof(struct _srbio), 1)) == 0 ) return(E$NoMem);
/* allocate small data buffer */
if ( (buf=calloc(64, 1)) == 0 ) return(E$NoMem);
block = ( unsigned char far * ) buf;
srb->h.cmd = 2;
srb->h.adapter = adapter;
srb->h.flags = (1<<3);
srb->target_id = target_id;
srb->lun = lun;
srb->alloc_len = 6;
srb->sense_len = 14;
srb->buf_seg = FP_SEG(block);
srb->buf_off = FP_OFF(block);
srb->cdb_len = 6;
srb->ccb.c6.cmd = 0x05;
srb->ccb.c6.lun = lun;
if ( (i=aspireq(srb)) ) {
if ( sense ) for(i=0; i<14; ++i) sense[i] = srb->ccb.c6.sense[i];
i = ScsiIoError(srb->h.status, srb->adapter_status,
srb->target_status, srb->ccb.c6.sense);
} else {
lim->max = ( ((( DWORD ) buf[1])<<16) |
((( DWORD ) buf[2])<<8) |
((( DWORD ) buf[3])) );
lim->min = ( ((( DWORD ) buf[4])<<8) |
((( DWORD ) buf[5])) );
}
( void ) free(buf);
( void ) free(srb);
return(i);
}
int SCSIRewind(adapter, target_id, lun, immediate, sense)
int adapter;
int target_id;
int lun;
int immediate;
unsigned char *sense;
{
struct _srbio *srb;
int i;
/* allocate a SCSI Request Block (SRB) */
if ( (srb=calloc(sizeof(struct _srbio), 1)) == 0 ) return(E$NoMem);
srb->h.cmd = 2;
srb->h.adapter = adapter;
srb->target_id = target_id;
srb->lun = lun;
srb->sense_len = 14;
srb->cdb_len = 6;
srb->ccb.c6.cmd = 0x01;
srb->ccb.c6.lun = lun;
srb->ccb.c6.flag0 = immediate;
if ( (i=aspireq(srb)) ) {
if ( sense ) for(i=0; i<14; ++i) sense[i] = srb->ccb.c6.sense[i];
i = ScsiIoError(srb->h.status, srb->adapter_status,
srb->target_status, srb->ccb.c6.sense);
}
( void ) free(srb);
return(i);
}
int SCSISpace(adapter, target_id, lun, code, count, sense)
int adapter;
int target_id;
int lun;
int code;
long count;
unsigned char *sense;
{
DWORD lcount;
struct _srbio *srb;
int i;
/* allocate a SCSI Request Block (SRB) */
if ( (srb=calloc(sizeof(struct _srbio), 1)) == 0 ) return(E$NoMem);
lcount = count;
srb->h.cmd = 2;
srb->h.adapter = adapter;
srb->target_id = target_id;
srb->lun = lun;
srb->sense_len = 14;
srb->cdb_len = 6;
srb->ccb.spc.cmd = 0x11;
srb->ccb.spc.code = code;
srb->ccb.spc.lun = lun;
srb->ccb.spc.cnt0 = (lcount & 0xff);
srb->ccb.spc.cnt1 = ((lcount>>8) & 0xff);
srb->ccb.spc.cnt2 = ((lcount>>16) & 0xff);
if ( (i=aspireq(srb)) ) {
if ( sense ) for(i=0; i<14; ++i) sense[i] = srb->ccb.spc.sense[i];
i = ScsiIoError(srb->h.status, srb->adapter_status,
srb->target_status, srb->ccb.spc.sense);
}
( void ) free(srb);
return(i);
}
int SCSIWrite(adapter, target_id, lun, buf, len, l2bf, fixed, sense)
int adapter;
int target_id;
int lun;
char far *buf;
DWORD len;
int l2bf;
int fixed;
unsigned char *sense;
{
DWORD length;
struct _srbio *srb;
int i;
/* allocate a SCSI Request Block (SRB) in the lower 1 MB */
if ( (srb=calloc(sizeof(struct _srbio), 1)) == 0 ) return(E$NoMem);
length = ( fixed ) ? len>>l2bf : len;
srb->h.cmd = 2; /* scsi I/O request */
srb->h.adapter = adapter;
srb->h.flags = (1<<4);
srb->target_id = target_id;
srb->lun = lun;
srb->alloc_len = len;
srb->sense_len = 14;
srb->buf_seg = FP_SEG(buf);
srb->buf_off = FP_OFF(buf);
srb->cdb_len = 6;
srb->ccb.rdwr.cmd = 0x0a;
srb->ccb.rdwr.fixed = fixed;
srb->ccb.rdwr.lun = lun;
srb->ccb.rdwr.len_0 = (length & 0xff);
srb->ccb.rdwr.len_1 = ((length>>8) & 0xff);
srb->ccb.rdwr.len_2 = ((length>>16) & 0xff);
if ( (i=aspireq(srb)) ) {
if ( sense ) for(i=0; i<14; ++i) sense[i] = srb->ccb.rdwr.sense[i];
i = ScsiIoError(srb->h.status, srb->adapter_status,
srb->target_status, srb->ccb.rdwr.sense);
}
( void ) free(srb);
return(i);
}
int SCSIWriteFilemarks(adapter, target_id, lun, len, setmark, immediate, sense)
int adapter;
int target_id;
int lun;
DWORD len;
int setmark;
int immediate;
unsigned char *sense;
{
DWORD length;
struct _srbio *srb;
int i;
/* allocate a SCSI Request Block (SRB) */
if ( (srb=calloc(sizeof(struct _srbio), 1)) == 0 ) return(E$NoMem);
length = len;
srb->h.cmd = 2; /* scsi I/O request */
srb->h.adapter = adapter;
srb->target_id = target_id;
srb->lun = lun;
srb->sense_len = 14;
srb->cdb_len = 6;
srb->ccb.rdwr.cmd = 0x10;
srb->ccb.rdwr.fixed = immediate;
srb->ccb.rdwr.sili = setmark;
srb->ccb.rdwr.lun = lun;
srb->ccb.rdwr.len_0 = (length & 0xff);
srb->ccb.rdwr.len_1 = ((length>>8) & 0xff);
srb->ccb.rdwr.len_2 = ((length>>16) & 0xff);
if ( (i=aspireq(srb)) ) {
if ( sense ) for(i=0; i<14; ++i) sense[i] = srb->ccb.rdwr.sense[i];
i = ScsiIoError(srb->h.status, srb->adapter_status,
srb->target_status, srb->ccb.rdwr.sense);
}
( void ) free(srb);
return(i);
}
#ifdef TEST_ASPI
main()
{
aspiinquiry inq;
scsiinquiry sinq;
int i, j;
long l;
char *buf;
aspiinit();
inq.adapter_num = 0;
HostAdapterInquiry(&inq);
printf("%d adapters, target:%d\n", inq.adapters, inq.target_id);
printf("Manager id: %s\n", inq.manager_id);
printf("adapter id: %s\n", inq.adapter_id);
printf("\nrecsize: %ld, log2(recsize)= %d\n", recsize, logrec);
if ( (i=SCSIInquiry(TARGET, &sinq, 0)) != E$NoErr ) {
printf("Scsi Inquiry returned %d\n", i);
} else {
printf("type,pqual,dqual: %d, %d, %d\n", sinq.per_type,
sinq.per_qualify, sinq.dev_qualify);
printf("vendor_id:%.8s\n", sinq.vendor_id);
printf("product_id:%.16s\n", sinq.product_id);
printf("revision:%.4s\n", sinq.revision);
printf("vendor:%.20s\n", sinq.vendor);
}
if ( (buf=malloc(32768)) == 0 ) {
printf("can't alloc buf\n");
exit(0);
}
printf("\nBlocklimits, max:%ld min:%ld\n", lim.max, lim.min);
i = SCSILoad(TARGET, 0, 1, 0, 0, 0);
printf("\nLoad returned %d\n -->", i);
#if 0
printf("seeking to tape file 2...\n");
if ( (i=SCSISpace(TARGET, 1, ( DWORD ) 1, 0)) )
printf("Error %d\n", i );
else printf("OK\n");
printf("seeking to tape block 400 on file 2...\n");
if ( (i=SCSISpace(TARGET, 0, ( DWORD ) 400, 0)) )
printf("Error %d\n", i );
else printf("OK\n");
printf("Writing two sectors..(this should return an error)...\n");
i = SCSIWrite(TARGET, buf, 1024l, 9, 1, 0);
printf("Write returned %d\n", i);
printf("seeking back two sectors...\n");
if ( (i=SCSISpace(TARGET, 0, -2l, 0)) )
printf("Error %d\n", i );
else printf("OK\n");
printf("reading back the two sectors...\n");
i = SCSIRead(TARGET, buf, 1024l, 9, 0, 1, 0);
printf("Read returned %d\n", i);
printf("rewinding the tape...\n");
i = SCSIRewind(TARGET, 0, 0);
printf("Rewind returned %d\n", i);
printf("seeking to the end of the data...\n");
if ( (i=SCSISpace(TARGET, 3, 0l, 0)) )
printf("Error %d\n", i );
else printf("OK\n");
printf("Writing two sectors...\n");
i = SCSIWrite(TARGET, buf, 1024l, 9, 1, 0);
printf("Write returned %d\n", i);
printf("Writing two sectors...\n");
i = SCSIWrite(TARGET, buf, 1024l, 9, 1, 0);
printf("Write returned %d\n", i);
printf("Writing a file mark !\n");
i = SCSIWriteFilemarks(TARGET, 1l, 0, 0, 0);
printf("Write returned %d\n", i);
printf("rewinding the tape...\n");
i = SCSIRewind(TARGET, 0, 0);
printf("Rewind returned %d\n", i);
printf("Now counting files ...\n");
i = 0;
while ( !SCSISpace(TARGET, 1, 1l, 0) ) ++ i;
printf("... there are %d files on the tape now\n",i);
printf("rewinding the tape...\n");
i = SCSIRewind(TARGET, 0, 0);
printf("Rewind returned %d\n", i);
printf("eraseing the tape...\n");
i = SCSIErase(TARGET, 0, 0, 0);
printf("erase returned %d\n", i);
#endif
l = 0l;
printf("Now see what kind of errors we get at Overflow\n");
while ( l < 4080l ) {
i = SCSIRead(TARGET, buf, 32768l, 9, 0, 1, rsense);
if ( i ) {
printf("reading block # %ld: errno: %d rsense:", l, i);
for(j=0; j<14; ++j) printf(" %02x", rsense[j]);
printf("\n");
}
++l;
}
/*
while ( !(i=SCSIWrite(TARGET, buf, 32768l, 9, 1, rsense)) ) ++l;
printf("last block was %ld\n", l);
printf("errno: %d sense:", i);
for(j=0; j<14; ++j) printf(" %02x", rsense[j]);
printf("\n");
*/
i = SCSILoad(TARGET, 0, 0, 0, 0, 0);
printf("Unload returned %d\n -->", i);
free(buf);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -