version 1.7, 2006/06/01 07:53:01 |
version 1.8, 2006/06/06 20:48:07 |
|
|
#include <sys/limits.h> |
#include <sys/limits.h> |
#include <sys/types.h> |
#include <sys/types.h> |
#include <sys/scsiio.h> |
#include <sys/scsiio.h> |
|
#include <scsi/cd.h> |
|
#include <scsi/scsi_all.h> |
|
#include <scsi/scsi_disk.h> |
#include <err.h> |
#include <err.h> |
#include <errno.h> |
#include <errno.h> |
#include <fcntl.h> |
#include <fcntl.h> |
|
|
int |
int |
blank(void) |
blank(void) |
{ |
{ |
|
struct scsi_blank *scb; |
scsireq_t scr; |
scsireq_t scr; |
int r; |
int r; |
|
|
bzero(&scr, sizeof(scr)); |
bzero(&scr, sizeof(scr)); |
scr.cmd[0] = 0xa1; |
scb = (struct scsi_blank *)scr.cmd; |
scr.cmd[1] = 0x01; |
scb->opcode = BLANK; |
scr.cmdlen = 12; |
scb->byte2 |= BLANK_MINIMAL; |
|
scr.cmdlen = sizeof(*scb); |
scr.datalen = 0; |
scr.datalen = 0; |
scr.timeout = 120000; |
scr.timeout = 120000; |
scr.flags = SCCMD_ESCAPE; |
scr.flags = SCCMD_ESCAPE; |
|
|
int |
int |
unit_ready(void) |
unit_ready(void) |
{ |
{ |
|
struct scsi_test_unit_ready *scb; |
scsireq_t scr; |
scsireq_t scr; |
int r; |
int r; |
|
|
bzero(&scr, sizeof(scr)); |
bzero(&scr, sizeof(scr)); |
scr.cmd[0] = 0x00; |
scb = (struct scsi_test_unit_ready *)scr.cmd; |
scr.cmdlen = 6; |
scb->opcode = TEST_UNIT_READY; |
|
scr.cmdlen = sizeof(*scb); |
scr.datalen = 0; |
scr.datalen = 0; |
scr.timeout = 120000; |
scr.timeout = 120000; |
scr.flags = SCCMD_ESCAPE; |
scr.flags = SCCMD_ESCAPE; |
|
|
int |
int |
synchronize_cache(void) |
synchronize_cache(void) |
{ |
{ |
|
struct scsi_synchronize_cache *scb; |
scsireq_t scr; |
scsireq_t scr; |
int r; |
int r; |
|
|
bzero(&scr, sizeof(scr)); |
bzero(&scr, sizeof(scr)); |
scr.cmd[0] = 0x35; |
scb = (struct scsi_synchronize_cache *)scr.cmd; |
scr.cmdlen = 10; |
scb->opcode = SYNCHRONIZE_CACHE; |
|
scr.cmdlen = sizeof(*scb); |
scr.datalen = 0; |
scr.datalen = 0; |
scr.timeout = 120000; |
scr.timeout = 120000; |
scr.flags = SCCMD_ESCAPE; |
scr.flags = SCCMD_ESCAPE; |
|
|
int |
int |
close_session(void) |
close_session(void) |
{ |
{ |
|
struct scsi_close_track *scb; |
scsireq_t scr; |
scsireq_t scr; |
int r; |
int r; |
|
|
bzero(&scr, sizeof(scr)); |
bzero(&scr, sizeof(scr)); |
scr.cmd[0] = 0x5b; |
scb = (struct scsi_close_track *)scr.cmd; |
scr.cmd[2] = 0x02; /* close session */ |
scb->opcode = CLOSE_TRACK; |
scr.cmd[5] = 0x00; /* track number */ |
scb->closefunc = CT_CLOSE_SESS; |
scr.cmdlen = 10; |
scr.cmdlen = sizeof(*scb); |
scr.datalen = 0; |
scr.datalen = 0; |
scr.timeout = 120000; |
scr.timeout = 120000; |
scr.flags = SCCMD_ESCAPE; |
scr.flags = SCCMD_ESCAPE; |
|
|
int |
int |
mode_sense_write(unsigned char buf[]) |
mode_sense_write(unsigned char buf[]) |
{ |
{ |
|
struct scsi_mode_sense_big *scb; |
scsireq_t scr; |
scsireq_t scr; |
int r; |
int r; |
|
|
bzero(&scr, sizeof(scr)); |
bzero(&scr, sizeof(scr)); |
|
scb = (struct scsi_mode_sense_big *)scr.cmd; |
|
scb->opcode = MODE_SENSE_BIG; |
|
/* XXX: need to set disable block descriptors and check SCSI drive */ |
|
scb->page = WRITE_PARAM_PAGE; |
|
scb->length[1] = 0x46; /* 16 for the header + size from pg. 89 mmc-r10a.pdf */ |
|
scr.cmdlen = sizeof(*scb); |
scr.timeout = 4000; |
scr.timeout = 4000; |
scr.senselen = SENSEBUFLEN; |
scr.senselen = SENSEBUFLEN; |
scr.cmd[0] = 0x5a; |
|
scr.cmd[1] = 0x00; |
|
scr.cmd[2] = 0x05; /* Write parameters mode page */ |
|
scr.cmd[7] = 0x00; |
|
scr.cmd[8] = 0x46; /* 16 for the header + size from pg. 89 mmc-r10a.pdf */ |
|
scr.cmdlen = 10; |
|
scr.datalen= 0x46; |
scr.datalen= 0x46; |
scr.flags = SCCMD_ESCAPE|SCCMD_READ; |
scr.flags = SCCMD_ESCAPE|SCCMD_READ; |
scr.databuf = (caddr_t)buf; |
scr.databuf = (caddr_t)buf; |
|
|
int |
int |
mode_select_write(unsigned char buf[]) |
mode_select_write(unsigned char buf[]) |
{ |
{ |
|
struct scsi_mode_select_big *scb; |
scsireq_t scr; |
scsireq_t scr; |
int r; |
int r; |
|
|
bzero(&scr, sizeof(scr)); |
bzero(&scr, sizeof(scr)); |
|
scb = (struct scsi_mode_select_big *)scr.cmd; |
|
scb->opcode = MODE_SELECT_BIG; |
|
/* |
|
* INF-8020 says bit 4 in byte 2 is '1' |
|
* INF-8090 refers to it as 'PF(1)' then doesn't |
|
* describe it. |
|
*/ |
|
scb->byte2 = 0x10; |
|
scb->length[1] = 2 + buf[1] + 256 * buf[0]; |
scr.timeout = 4000; |
scr.timeout = 4000; |
scr.senselen = SENSEBUFLEN; |
scr.senselen = SENSEBUFLEN; |
scr.cmd[0] = 0x55; |
scr.cmdlen = sizeof(*scb); |
scr.cmd[1] = 0x10; /* pages aren't vendor specific */ |
|
scr.cmd[2] = 0x00; |
|
scr.cmd[7] = 0x00; |
|
scr.cmd[8] = 2 + buf[1] + 256 * buf[0]; |
|
scr.cmdlen = 10; |
|
scr.datalen = 2 + buf[1] + 256 * buf[0]; |
scr.datalen = 2 + buf[1] + 256 * buf[0]; |
scr.flags = SCCMD_ESCAPE|SCCMD_WRITE; |
scr.flags = SCCMD_ESCAPE|SCCMD_WRITE; |
scr.databuf = (caddr_t)buf; |
scr.databuf = (caddr_t)buf; |
|
|
get_disc_size(off_t *availblk) |
get_disc_size(off_t *availblk) |
{ |
{ |
u_char databuf[28]; |
u_char databuf[28]; |
|
struct scsi_read_track_info *scb; |
scsireq_t scr; |
scsireq_t scr; |
int r,tmp; |
int r,tmp; |
|
|
bzero(&scr, sizeof(scr)); |
bzero(&scr, sizeof(scr)); |
|
scb = (struct scsi_read_track_info *)scr.cmd; |
scr.timeout = 4000; |
scr.timeout = 4000; |
scr.senselen = SENSEBUFLEN; |
scr.senselen = SENSEBUFLEN; |
scr.cmd[0] = 0x52; /* READ TRACK INFO */ |
scb->opcode = READ_TRACK_INFO; |
scr.cmd[1] = 0x01; |
scb->addrtype = RTI_TRACK; |
scr.cmd[5] = 0x01; /* Track 01 */ |
scb->addr[1] = 1; |
scr.cmd[7] = 0x00; |
scb->data_len[3] = 0x1c; |
scr.cmd[8] = 0x1c; |
scr.cmdlen = sizeof(*scb); |
scr.cmdlen = 10; |
|
scr.datalen= 0x1c; |
scr.datalen= 0x1c; |
scr.flags = SCCMD_ESCAPE|SCCMD_READ; |
scr.flags = SCCMD_ESCAPE|SCCMD_READ; |
scr.databuf = (caddr_t)databuf; |
scr.databuf = (caddr_t)databuf; |